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 /gcc/fortran/primary.c | |
| 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
Diffstat (limited to 'gcc/fortran/primary.c')
| -rw-r--r-- | gcc/fortran/primary.c | 11 |
1 files changed, 11 insertions, 0 deletions
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; |
