[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]>
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]>
---
 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
-- 
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.