Re: [PATCH] Fortran: Fix diagnostic for ambiguous pointer function assignment [PR80012]
Harald Anlauf <[email protected]>
| Newsgroups | gmane.comp.gcc.patches,gmane.comp.gcc.fortran |
|---|---|
| Message-ID | <[email protected]> |
Hi, On 2/15/26 19:10, Gonzalosilvalde wrote: > The error message for an ambiguous pointer function assignment contained > a FIXME and an embedded newline that the diagnostics printer does not > handle. Split the single gfc_error call into a gfc_error for the main > diagnostic and an inform note for the F2008 explanation, wrapped in an > auto_diagnostic_group. > > PR fortran/80012 > > gcc/fortran/ChangeLog: > > * symbol.cc: Include diagnostic-core.h. > (gfc_add_procedure): Split error into gfc_error and inform > using auto_diagnostic_group. if you look again at the nearby logic, you'll see that with your patch the same error message is emitted in both branches of the if statement. You could simplify the code to emit the error before the if and apply the cited condition only to the emission of the inform note. Thanks, Harald > gcc/testsuite/ChangeLog: > > * gfortran.dg/pr80012.f90: New test. > > Signed-off-by: Gonzalosilvalde <[email protected]> > --- > gcc/fortran/symbol.cc | 19 ++++++++++++------- > gcc/testsuite/gfortran.dg/pr80012.f90 | 14 ++++++++++++++ > 2 files changed, 26 insertions(+), 7 deletions(-) > create mode 100644 gcc/testsuite/gfortran.dg/pr80012.f90 > > diff --git a/gcc/fortran/symbol.cc b/gcc/fortran/symbol.cc > index 5a68f44ca63..f4a73b165d1 100644 > --- a/gcc/fortran/symbol.cc > +++ b/gcc/fortran/symbol.cc > @@ -24,6 +24,7 @@ along with GCC; see the file COPYING3. If not see > #include "coretypes.h" > #include "options.h" > #include "gfortran.h" > +#include "diagnostic-core.h" > #include "parse.h" > #include "match.h" > #include "constructor.h" > @@ -1888,13 +1889,17 @@ gfc_add_procedure (symbol_attribute *attr, procedure_type t, > { > if (attr->proc == PROC_ST_FUNCTION && t == PROC_INTERNAL > && !gfc_notification_std (GFC_STD_F2008)) > - gfc_error ("%s procedure at %L is already declared as %s " > - "procedure. \nF2008: A pointer function assignment " > - "is ambiguous if it is the first executable statement " > - "after the specification block. Please add any other " > - "kind of executable statement before it. FIXME", > - gfc_code2string (procedures, t), where, > - gfc_code2string (procedures, attr->proc)); > + { > + auto_diagnostic_group d; > + gfc_error ("%s procedure at %L is already declared as %s procedure", > + gfc_code2string (procedures, t), where, > + gfc_code2string (procedures, attr->proc)); > + inform (gfc_get_location (where), > + "F2008: A pointer function assignment is ambiguous if it is " > + "the first executable statement after the specification " > + "block. Please add any other kind of executable " > + "statement before it"); > + } > else > gfc_error ("%s procedure at %L is already declared as %s " > "procedure", gfc_code2string (procedures, t), where, > diff --git a/gcc/testsuite/gfortran.dg/pr80012.f90 b/gcc/testsuite/gfortran.dg/pr80012.f90 > new file mode 100644 > index 00000000000..da626d565d8 > --- /dev/null > +++ b/gcc/testsuite/gfortran.dg/pr80012.f90 > @@ -0,0 +1,14 @@ > +! { dg-do compile } > +! { dg-options "-std=gnu" } > +! PR fortran/80012 > +! Test that the error message for ambiguous pointer function assignment > +! is split into an error and an informational note, without FIXME. > + > +two() = 7 > +contains > + function two () ! { dg-error "INTERNAL-PROC procedure at .1. is already declared as STATEMENT-PROC procedure" } > +! { dg-message "F2008: A pointer function assignment is ambiguous" "" { target *-*-* } 9 } > + integer, pointer :: two > + allocate(two) > + end function two > +end