PR fortran.91959
authorSteven G. Kargl <kargl@gcc.gnu.org>
Fri, 4 Oct 2019 21:21:21 +0000 (21:21 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Fri, 4 Oct 2019 21:21:21 +0000 (21:21 +0000)
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.

From-SVN: r276601

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr91959.f90 [new file with mode: 0644]

index 196b40b..dc1e19a 100644 (file)
@@ -1,3 +1,8 @@
+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  Tobias Burnus  <tobias@codesourcery.com>
 
        * error (error_print, gfc_format_decoder): Fix off-by one issue with %C.
index 96b6f3f..d439906 100644 (file)
@@ -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)
+           {
+             gfc_error ("%qs entity cannot have attributes at %C", "%FILL");
+             m = MATCH_ERROR;
+             goto cleanup;
+           }
 
-      if (attr_seen)
+         /* %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 4248c81..f9eefad 100644 (file)
@@ -1,3 +1,8 @@
+2019-10-04  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran.91959
+       * gfortran.dg/pr91959.f90: New test.
+
 2019-10-04  Rafael Tsuha  <rafael.tsuha@usp.br>
 
         * gcc.dg/sinhovercosh-1.c: New test.
diff --git a/gcc/testsuite/gfortran.dg/pr91959.f90 b/gcc/testsuite/gfortran.dg/pr91959.f90
new file mode 100644 (file)
index 0000000..788b413
--- /dev/null
@@ -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