Hi Gonzalo, this is basically OK for mainline. But please check the indentation; in my mail reader it appears that the part starting with
> + auto_diagnostic_group d; is off by 2 columns. Thanks, Harald On 2/16/26 22:25, 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, Thanks for the quick review. Here is the patch with the suggestion. 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..a1f1b151a96 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) { + 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)); 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)); - else - 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"); + }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
