------- Comment #21 from tobi at gcc dot gnu dot org 2007-02-10 02:50 -------
Here's a much cleaner patch, which makes us give slightly worse error messages
than before. I'll submit this to the list tomorrow when I'm done testing.
2007-02-10 Tobias Schlüter <[EMAIL PROTECTED]>
PR fortran/30478
fortran/
* decl.c (gfc_match_enum): Fix typo in error message.
* parse.c (match): Remove stray semicolon from macro definition.
(decode_statement): Don't allow data declarations in ENUMs or
ENUMERATOR definitions outside.
testsuite/
* gfortran.dg/enum_2.f90: Update regexps for error messages.
Index: gcc/testsuite/gfortran.dg/enum_2.f90
===================================================================
--- gcc/testsuite/gfortran.dg/enum_2.f90 (revision 121787)
+++ gcc/testsuite/gfortran.dg/enum_2.f90 (working copy)
@@ -5,9 +5,9 @@ program main
implicit none
enum, bind (c)
enumerator :: red, black
- integer :: x ! { dg-error "Unexpected data declaration" }
+ integer :: x ! { dg-error "Unclassifiable statement" }
enumerator blue = 1 ! { dg-error "Syntax error in ENUMERATOR definition"
}
end enum
- enumerator :: sun ! { dg-error "ENUM" }
+ enumerator :: sun ! { dg-error "Unclassifiable statement" }
end program main
Index: gcc/fortran/decl.c
===================================================================
--- gcc/fortran/decl.c (revision 121787)
+++ gcc/fortran/decl.c (working copy)
@@ -4081,7 +4081,7 @@ gfc_match_enum (void)
return m;
if (gfc_notify_std (GFC_STD_F2003,
- "New in Fortran 2003: ENUM AND ENUMERATOR at %C")
+ "New in Fortran 2003: ENUM and ENUMERATOR at %C")
== FAILURE)
return MATCH_ERROR;
Index: gcc/fortran/parse.c
===================================================================
--- gcc/fortran/parse.c (revision 121787)
+++ gcc/fortran/parse.c (working copy)
@@ -84,7 +84,7 @@ match_word (const char *str, match (*sub
return st; \
else \
undo_new_statement (); \
- } while (0);
+ } while (0)
static gfc_statement
decode_statement (void)
@@ -131,8 +131,10 @@ decode_statement (void)
match (NULL, gfc_match_pointer_assignment, ST_POINTER_ASSIGNMENT);
match (NULL, gfc_match_st_function, ST_STATEMENT_FUNCTION);
- match (NULL, gfc_match_data_decl, ST_DATA_DECL);
- match (NULL, gfc_match_enumerator_def, ST_ENUMERATOR);
+ if (gfc_current_state () != COMP_ENUM)
+ match (NULL, gfc_match_data_decl, ST_DATA_DECL);
+ else
+ match (NULL, gfc_match_enumerator_def, ST_ENUMERATOR);
/* Try to match a subroutine statement, which has the same optional
prefixes that functions can have. */
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30478