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

Harald Anlauf anlauf@gmx.de
Thu Feb 19 20:39:19 GMT 2026


Hi Gonzalo,

yes, this is OK now.  Thanks for the patch!

Do you have write access, or do you need assistance?

Harald

On 2/19/26 20:23, 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.
> 
> gcc/testsuite/ChangeLog:
> 
> 	* gfortran.dg/pr80012.f90: New test.
> 
> Signed-off-by: Gonzalosilvalde <gonzalo.silvalde@gmail.com>
> ---
> Hi Harald,
> I hope there are no more format errors.
> 
> Thanks for your review and help.
>   gcc/fortran/symbol.cc                 | 23 ++++++++++++-----------
>   gcc/testsuite/gfortran.dg/pr80012.f90 | 14 ++++++++++++++
>   2 files changed, 26 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 5a68f44ca63..4a9672f86be 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"
> @@ -1886,19 +1887,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 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



More information about the Fortran mailing list