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:
Paul Thomas 2006-09-18 20:19:50 +00:00
parent eb496303d7
commit fd2aa7ad9f
6 changed files with 91 additions and 1 deletions

View File

@ -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

View File

@ -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;

View File

@ -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);
}

View File

@ -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

View 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

View File

@ -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))