Fortran: Fix diagnostic for ambiguous pointer function assignment [PR80012]

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 (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: Gonzalo Silvalde Blanco <gonzalo.silvalde@gmail.com>
This commit is contained in:
Gonzalo Silvalde Blanco
2026-02-20 20:30:55 +01:00
committed by Harald Anlauf
parent 3a17cc11cb
commit 84ef494860
2 changed files with 26 additions and 11 deletions

View File

@@ -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"
@@ -1887,19 +1888,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;
}

View File

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