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

Gonzalosilvalde <[email protected]>
Newsgroups gmane.comp.gcc.patches,gmane.comp.gcc.fortran
Message-ID <[email protected]>
From: Gonzalo Silvalde Blanco <[email protected]>

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.

	PR fortran/80012

gcc/fortran/ChangeLog:

	* symbol.cc (gfc_add_procedure): Split error into gfc_error and
	inform.

gcc/testsuite/ChangeLog:

	* gfortran.dg/pr80012.f90: New test.

Signed-off-by: Gonzalo Silvalde Blanco <[email protected]>
---
Hi Harald,

I investigated the regression caused by my previous commit and I
believe I found the root cause.

The problem was the use of auto_diagnostic_group in gfc_add_procedure.
When that object is created, it increments the diagnostic group nesting
counter. Then, when gfc_error internally calls set_diagnostic_buffer,
it hits this assert in diagnostics/buffering.cc:50:

    gcc_assert (m_diagnostic_groups.m_group_nesting_depth == 0);

...which I think causes the ICE, since the nesting depth is no longer
0 at that point.

Looking at other uses of inform() in the Fortran frontend, none of them
wrap the call in an auto_diagnostic_group, and they work fine. So I
simply removed the auto_diagnostic_group wrapper.

I ran make check-fortran on both my patched version and a clean
mainline checkout. Both now give identical results in my PC.

Best regards,
Gonzalo

 gcc/fortran/symbol.cc                 | 22 +++++++++++-----------
 gcc/testsuite/gfortran.dg/pr80012.f90 | 14 ++++++++++++++
 2 files changed, 25 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 5ff14e27b94..9edfb8e9eeb 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,18 @@ 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",
+      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
-- 
2.47.3
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.