[Fortran] PR104626 ICE in gfc_format_decoder, at fortran/error.cc:1071

Message ID 4dff7320-12a2-48e7-b9eb-fadf86cd4c18@gmail.com
State New
Headers
Series [Fortran] PR104626 ICE in gfc_format_decoder, at fortran/error.cc:1071 |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-arm fail Patch failed to apply
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 fail Patch failed to apply

Commit Message

Jerry D Aug. 2, 2024, 5:44 p.m. UTC
  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 <kargls@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.
  

Comments

Andre Vehreschild Aug. 5, 2024, 9:10 a.m. UTC | #1
Hi Jerry,

looks ok to me. Thanks for taking care.

- Andre

On Fri, 2 Aug 2024 10:44:58 -0700
Jerry D <jvdelisle2@gmail.com> wrote:

> 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 <kargls@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


--
Andre Vehreschild * Email: vehre ad gmx dot de
  

Patch

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