diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2006-09-18 20:19:50 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2006-09-18 20:19:50 +0000 |
commit | fd2aa7ad9f4fe9fdbe36bbdb3a249e55cb4080ca (patch) | |
tree | 212f8468ca7132f84be43fe535001b524f1c6632 | |
parent | eb496303d7c7e6f2acb8ab90c22453947988f06b (diff) | |
download | gcc-fd2aa7ad9f4fe9fdbe36bbdb3a249e55cb4080ca.zip gcc-fd2aa7ad9f4fe9fdbe36bbdb3a249e55cb4080ca.tar.gz gcc-fd2aa7ad9f4fe9fdbe36bbdb3a249e55cb4080ca.tar.bz2 |
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
-rw-r--r-- | gcc/fortran/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/fortran/primary.c | 11 | ||||
-rw-r--r-- | gcc/fortran/trans-stmt.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/keyword_symbol_1.f90 | 57 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/spread_shape_1.f90 | 2 |
6 files changed, 91 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 04b8c8e..44e1800 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -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 diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c index 1428f4c..6f61ad7 100644 --- a/gcc/fortran/primary.c +++ b/gcc/fortran/primary.c @@ -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; diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c index 97cb747..841b457 100644 --- a/gcc/fortran/trans-stmt.c +++ b/gcc/fortran/trans-stmt.c @@ -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); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3311a54..73889e0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/gfortran.dg/keyword_symbol_1.f90 b/gcc/testsuite/gfortran.dg/keyword_symbol_1.f90 new file mode 100644 index 0000000..7195f25 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/keyword_symbol_1.f90 @@ -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 diff --git a/gcc/testsuite/gfortran.dg/spread_shape_1.f90 b/gcc/testsuite/gfortran.dg/spread_shape_1.f90 index c9f96f3..bbef232 100644 --- a/gcc/testsuite/gfortran.dg/spread_shape_1.f90 +++ b/gcc/testsuite/gfortran.dg/spread_shape_1.f90 @@ -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)) |