[Fortran] PR104626 ICE in gfc_format_decoder, at fortran/error.cc:1071
Checks
Commit Message
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
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
@@ -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;
b/gcc/testsuite/gfortran.dg/pr104626.f90
new file mode 100644
@@ -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