Hi all,

Doing some catchup here. I plan to commit the following shortly. This is one of Steve's patches posted on bugzilla.

I have created a new test case.

Regression tested on linux x86-64.

git show:

commit 4d4549937b789afe4037c2f8f80dfc2285504a1e (HEAD -> master)
Author: Steve Kargl <kar...@comcast.net>
Date:   Thu Aug 1 21:50:49 2024 -0700

    Fortran: Fix ICE on invalid in gfc_format_decoder.

            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.

diff --git a/gcc/fortran/symbol.cc b/gcc/fortran/symbol.cc
index a8479b862e3..b5143d9f790 100644
--- a/gcc/fortran/symbol.cc
+++ b/gcc/fortran/symbol.cc
@@ -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
index 00000000000..faff65a8c92
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr104626.f90
@@ -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

Reply via email to