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