https://gcc.gnu.org/g:84ef4948609260266f365c63ce429476fd31262f

commit r16-7604-g84ef4948609260266f365c63ce429476fd31262f
Author: Gonzalo Silvalde Blanco <[email protected]>
Date:   Fri Feb 20 20:30:55 2026 +0100

    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 <[email protected]>

Diff:
---
 gcc/fortran/symbol.cc                 | 23 ++++++++++++-----------
 gcc/testsuite/gfortran.dg/pr80012.f90 | 14 ++++++++++++++
 2 files changed, 26 insertions(+), 11 deletions(-)

diff --git a/gcc/fortran/symbol.cc b/gcc/fortran/symbol.cc
index 5ff14e27b942..34c8a969fdae 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"
@@ -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;
     }
diff --git a/gcc/testsuite/gfortran.dg/pr80012.f90 
b/gcc/testsuite/gfortran.dg/pr80012.f90
new file mode 100644
index 000000000000..da626d565d89
--- /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

Reply via email to