This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] PR fortran/91959 -- Re-arrange matching of %FILL
- From: Steve Kargl <sgk at troutmask dot apl dot washington dot edu>
- To: fortran at gcc dot gnu dot org, gcc-patches at gcc dot gnu dot org
- Date: Fri, 4 Oct 2019 11:18:51 -0700
- Subject: [PATCH] PR fortran/91959 -- Re-arrange matching of %FILL
- Reply-to: sgk at troutmask dot apl dot washington dot edu
The attached patch has been tested on x86_64-*-freebsd.
OK to commit.
Apparently, DEC Fortran allows one to use %FILL as a variable name.
When the -fdec code was added to gfortran, variable_decl was updated
to match %FILL. This was done by first ilooking for the % character,
and if found, it is burned and FILL is then match. Unfortunately,
as the new testcase shows this allowed any variable starting with
% to match. The patch re-arranges the code so that an error is
issues for variables starting with %, which are not %FILL.
2019-10-04 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran.91959
* fortran/decl.c (variable_decl): Re-arrange code for matching %FILL.
2019-10-04 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran.91959
* gfortran.dg/pr91959.f90: New test.
--
Steve
Index: gcc/fortran/decl.c
===================================================================
--- gcc/fortran/decl.c (revision 276593)
+++ gcc/fortran/decl.c (working copy)
@@ -2441,6 +2441,7 @@ variable_decl (int elem)
match m;
bool t;
gfc_symbol *sym;
+ char c;
initializer = NULL;
as = NULL;
@@ -2454,40 +2455,45 @@ variable_decl (int elem)
name to be '%FILL' which gives it an anonymous (inaccessible) name. */
m = MATCH_NO;
gfc_gobble_whitespace ();
- if (gfc_peek_ascii_char () == '%')
+ c = gfc_peek_ascii_char ();
+ if (c == '%')
{
- gfc_next_ascii_char ();
+ gfc_next_ascii_char (); /* Burn % character. */
m = gfc_match ("fill");
- }
-
- if (m != MATCH_YES)
- {
- m = gfc_match_name (name);
- if (m != MATCH_YES)
- goto cleanup;
- }
-
- else
- {
- m = MATCH_ERROR;
- if (gfc_current_state () != COMP_STRUCTURE)
+ if (m == MATCH_YES)
{
- if (flag_dec_structure)
- gfc_error ("%qs not allowed outside STRUCTURE at %C", "%FILL");
- else
- gfc_error ("%qs at %C is a DEC extension, enable with "
+ if (gfc_current_state () != COMP_STRUCTURE)
+ {
+ if (flag_dec_structure)
+ gfc_error ("%qs not allowed outside STRUCTURE at %C", "%FILL");
+ else
+ gfc_error ("%qs at %C is a DEC extension, enable with "
"%<-fdec-structure%>", "%FILL");
- goto cleanup;
- }
+ m = MATCH_ERROR;
+ goto cleanup;
+ }
- if (attr_seen)
+ if (attr_seen)
+ {
+ gfc_error ("%qs entity cannot have attributes at %C", "%FILL");
+ m = MATCH_ERROR;
+ goto cleanup;
+ }
+
+ /* %FILL components are given invalid fortran names. */
+ snprintf (name, GFC_MAX_SYMBOL_LEN + 1, "%%FILL%u", fill_id++);
+ }
+ else
{
- gfc_error ("%qs entity cannot have attributes at %C", "%FILL");
- goto cleanup;
+ gfc_error ("Invalid character %qc in variable name at %C", c);
+ return MATCH_ERROR;
}
-
- /* %FILL components are given invalid fortran names. */
- snprintf (name, GFC_MAX_SYMBOL_LEN + 1, "%%FILL%u", fill_id++);
+ }
+ else
+ {
+ m = gfc_match_name (name);
+ if (m != MATCH_YES)
+ goto cleanup;
}
var_locus = gfc_current_locus;
Index: gcc/testsuite/gfortran.dg/pr91959.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr91959.f90 (nonexistent)
+++ gcc/testsuite/gfortran.dg/pr91959.f90 (working copy)
@@ -0,0 +1,9 @@
+! { dg-do compile }
+! PR fortran/91959
+! Code contributed by Gerhard Steinmetz
+program p
+ implicit none
+ integer :: %a ! { dg-error "Invalid character" }
+ a = 1 ! { dg-error "has no IMPLICIT type" }
+ print *, a
+end