Re: [PATCH v3] 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]> |
Dear all, since Gonzalo asked my off-list to do the honors, I pushed his patch for him as r16-7604-g84ef4948609260 . Best, Harald On 2/19/26 21:39, Harald Anlauf wrote: > Hi Gonzalo, > > yes, this is OK now. Thanks for the patch! > > Do you have write access, or do you need assistance? > > Harald > > On 2/19/26 20:23, 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. >> >> gcc/testsuite/ChangeLog: >> >> * gfortran.dg/pr80012.f90: New test. >> >> Signed-off-by: Gonzalosilvalde <[email protected]> >> --- >> Hi Harald, >> I hope there are no more format errors. >> >> Thanks for your review and help. >> gcc/fortran/symbol.cc | 23 ++++++++++++----------- >> gcc/testsuite/gfortran.dg/pr80012.f90 | 14 ++++++++++++++ >> 2 files changed, 26 insertions(+), 11 deletions(-) >> create mode 100644 gcc/testsuite/gfortran.dg/pr80012.f90 >> >> diff --git a/gcc/fortran/symbol.cc b/gcc/fortran/symbol.cc >> index 5a68f44ca63..4a9672f86be 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" >> @@ -1886,19 +1887,19 @@ gfc_add_procedure (symbol_attribute *attr, >> procedure_type t, >> if (attr->proc != PROC_UNKNOWN && !attr->module_procedure >> && attr->access == ACCESS_UNKNOWN) >> { >> - 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", >> + 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)); >> - else >> - gfc_error ("%s procedure at %L is already declared as %s " >> - "procedure", gfc_code2string (procedures, t), where, >> - gfc_code2string (procedures, attr->proc)); >> + if (attr->proc == PROC_ST_FUNCTION && t == PROC_INTERNAL >> + && !gfc_notification_std (GFC_STD_F2008)) >> + { >> + 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"); >> + } >> return false; >> } >> 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 > >