]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: Fix ICE on invalid in gfc_format_decoder.
authorSteve Kargl <kargls@comcast.net>
Fri, 2 Aug 2024 04:50:49 +0000 (21:50 -0700)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Sat, 3 Aug 2024 00:09:21 +0000 (17:09 -0700)
PR fortran/104626

gcc/fortran/ChangeLog:

* symbol.cc (gfc_add_save): Add checks for SAVE attribute
conflicts and duplicate SAVE attribute.

gcc/testsuite/ChangeLog:

* gfortran.dg/pr104626.f90: New test.

gcc/fortran/symbol.cc
gcc/testsuite/gfortran.dg/pr104626.f90 [new file with mode: 0644]

index a8479b862e39b1f67bb7e6fdcba246268e76dd2a..b5143d9f79078d605f02864863d48d21c96ba2bd 100644 (file)
@@ -1307,9 +1307,8 @@ gfc_add_save (symbol_attribute *attr, save_state s, const char *name,
 
   if (s == SAVE_EXPLICIT && gfc_pure (NULL))
     {
-      gfc_error
-       ("SAVE attribute at %L cannot be specified in a PURE procedure",
-        where);
+      gfc_error ("SAVE attribute at %L cannot be specified in a PURE "
+                "procedure", where);
       return false;
     }
 
@@ -1319,10 +1318,15 @@ gfc_add_save (symbol_attribute *attr, save_state s, const char *name,
   if (s == SAVE_EXPLICIT && attr->save == SAVE_EXPLICIT
       && (flag_automatic || pedantic))
     {
-       if (!gfc_notify_std (GFC_STD_LEGACY,
-                            "Duplicate SAVE attribute specified at %L",
-                            where))
+      if (!where)
+       {
+         gfc_error ("Duplicate SAVE attribute specified near %C");
          return false;
+       }
+
+      if (!gfc_notify_std (GFC_STD_LEGACY, "Duplicate SAVE attribute "
+                          "specified at %L", where))
+       return false;
     }
 
   attr->save = s;
diff --git a/gcc/testsuite/gfortran.dg/pr104626.f90 b/gcc/testsuite/gfortran.dg/pr104626.f90
new file mode 100644 (file)
index 0000000..faff65a
--- /dev/null
@@ -0,0 +1,8 @@
+! { dg-do compile }
+program p
+   procedure(g), save :: f ! { dg-error "PROCEDURE attribute conflicts" }
+   procedure(g), save :: f ! { dg-error "Duplicate SAVE attribute" }
+contains
+   subroutine g
+   end
+end