https://gcc.gnu.org/g:a53c029bf855fd4250076a07d0d8150b9c39bc91

commit r15-2705-ga53c029bf855fd4250076a07d0d8150b9c39bc91
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:
---
 gcc/fortran/symbol.cc                  | 16 ++++++++++------
 gcc/testsuite/gfortran.dg/pr104626.f90 |  8 ++++++++
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/gcc/fortran/symbol.cc b/gcc/fortran/symbol.cc
index a8479b862e39..b5143d9f7907 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 000000000000..faff65a8c924
--- /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