re PR fortran/28526 ('end' is recognized as a variable incorrectly)
2006-09-18 Paul Thomas <pault@gcc.gnu.org> PR fortran/28526 * primary.c (match_variable): If the compiler is in a module specification block, an interface block or a contains section, reset host_flag to force the changed symbols mechanism. PR fortran/29101 * trans-stmt.c (gfc_trans_character_select): Add the post block for the expression to the main block, after the call to select_string and the last label. 2006-09-18 Paul Thomas <pault@gcc.gnu.org> PR fortran/28526 * gfortran.dg/keyword_symbol_1.f90: New test. * gfortran.dg/spread_shape_1.f90: Add missing warning with pedantic compilation option. From-SVN: r117034
This commit is contained in:
parent
eb496303d7
commit
fd2aa7ad9f
@ -1,3 +1,15 @@
|
||||
2006-09-18 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/28526
|
||||
* primary.c (match_variable): If the compiler is in a module
|
||||
specification block, an interface block or a contains section,
|
||||
reset host_flag to force the changed symbols mechanism.
|
||||
|
||||
PR fortran/29101
|
||||
* trans-stmt.c (gfc_trans_character_select): Add the post block
|
||||
for the expression to the main block, after the call to
|
||||
select_string and the last label.
|
||||
|
||||
2006-09-18 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/29060
|
||||
|
@ -2283,6 +2283,17 @@ match_variable (gfc_expr ** result, int equiv_flag, int host_flag)
|
||||
locus where;
|
||||
match m;
|
||||
|
||||
/* Since nothing has any business being an lvalue in a module
|
||||
specification block, an interface block or a contains section,
|
||||
we force the changed_symbols mechanism to work by setting
|
||||
host_flag to 0. This prevents valid symbols that have the name
|
||||
of keywords, such as 'end', being turned into variables by
|
||||
failed matching to assignments for, eg., END INTERFACE. */
|
||||
if (gfc_current_state () == COMP_MODULE
|
||||
|| gfc_current_state () == COMP_INTERFACE
|
||||
|| gfc_current_state () == COMP_CONTAINS)
|
||||
host_flag = 0;
|
||||
|
||||
m = gfc_match_sym_tree (&st, host_flag);
|
||||
if (m != MATCH_YES)
|
||||
return m;
|
||||
|
@ -1475,6 +1475,8 @@ gfc_trans_character_select (gfc_code *code)
|
||||
if (n != 0)
|
||||
gfc_free (labels);
|
||||
|
||||
gfc_add_block_to_block (&block, &se.post);
|
||||
|
||||
return gfc_finish_block (&block);
|
||||
}
|
||||
|
||||
|
@ -1,3 +1,11 @@
|
||||
2006-09-18 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/28526
|
||||
* gfortran.dg/keyword_symbol_1.f90: New test.
|
||||
|
||||
* gfortran.dg/spread_shape_1.f90: Add missing warning with
|
||||
pedantic compilation option.
|
||||
|
||||
2006-09-18 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/29060
|
||||
|
57
gcc/testsuite/gfortran.dg/keyword_symbol_1.f90
Normal file
57
gcc/testsuite/gfortran.dg/keyword_symbol_1.f90
Normal file
@ -0,0 +1,57 @@
|
||||
! ' dg-do compile }
|
||||
! This tests the fix for PR28526, in which a public interface named
|
||||
! 'end' would be treated as a variable because the matcher tried
|
||||
! 'END INTERFACE' as an assignment and left the symbol modified in
|
||||
! failing. The various pitfalls that were encountered in developing
|
||||
! the fix are checked here.
|
||||
!
|
||||
! Contributed by Paul Thomas <pault@gcc.gnu.org>
|
||||
!
|
||||
module blahblah
|
||||
public function, end
|
||||
|
||||
! The original PR from Yusuke IGUCHI <iguchi@coral.t.u-tokyo.ac.jp>
|
||||
interface end
|
||||
module procedure foo1
|
||||
end interface
|
||||
|
||||
! A contribution to the PR from Tobias Schlueter <tobi@gcc.gnu.org>
|
||||
interface function
|
||||
module procedure foo2 ! { dg-error "is neither function nor" }
|
||||
end interface
|
||||
|
||||
interface function
|
||||
module procedure foo3
|
||||
end interface
|
||||
|
||||
interface
|
||||
function foo4 ()
|
||||
real foo4
|
||||
x = 1.0 ! { dg-error "in INTERFACE" }
|
||||
end function foo4
|
||||
end interface
|
||||
|
||||
interface
|
||||
x = 2.0 ! { dg-error "in INTERFACE block" }
|
||||
function foo5 ()
|
||||
real foo5
|
||||
end function foo5
|
||||
end interface
|
||||
|
||||
x = 3.0 ! { dg-error "in MODULE" }
|
||||
|
||||
contains
|
||||
|
||||
subroutine foo1
|
||||
end subroutine foo1
|
||||
|
||||
function foo2 ! { dg-error "Expected formal argument list" }
|
||||
foo2 = 0 ! { dg-error "already been host associated" }
|
||||
end function foo2 ! { dg-error "Expecting END MODULE" }
|
||||
|
||||
function foo3 ()
|
||||
real foo3
|
||||
end function foo3
|
||||
|
||||
x = 4.0 ! { dg-error "in CONTAINS section" }
|
||||
end module blahblah
|
@ -4,7 +4,7 @@
|
||||
!
|
||||
! Contributed by Paul Thomas <pault@gcc.gnu.org>
|
||||
real,dimension(:, :),pointer :: ptr
|
||||
real,dimension(2, 2),parameter :: u = &
|
||||
real,dimension(2, 2),parameter :: u = & ! { dg-warning "nonstandard" }
|
||||
reshape((/0.25, 0.5, 0.75, 1.00/),(/2,2/))
|
||||
allocate (ptr(2,2))
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user