https://gcc.gnu.org/g:2a4f36222246480d3b66957be3582db084698a32
commit r17-3180-g2a4f36222246480d3b66957be3582db084698a32 Author: Christopher Albert <[email protected]> Date: Mon Aug 10 03:10:52 2026 +0200 fortran: Diagnose allocatable PROCEDURE results early [PR102333] A function result declared by a PROCEDURE statement can be redirected to a hidden procedure pointer result before attribute conflicts are checked. Check the PROCEDURE and ALLOCATABLE conflict before this redirection so the original attributes produce the correct diagnostic. Fixes #7 Assisted-by: GPT-5.6-sol (OpenAI) PR fortran/102333 gcc/fortran/ChangeLog: * decl.cc (match_procedure_decl): Diagnose the PROCEDURE and ALLOCATABLE conflict before creating a hidden result. gcc/testsuite/ChangeLog: * gfortran.dg/pr102333_2.f90: New test. Signed-off-by: Christopher Albert <[email protected]> Diff: --- gcc/fortran/decl.cc | 7 +++++++ gcc/testsuite/gfortran.dg/pr102333_2.f90 | 13 +++++++++++++ 2 files changed, 20 insertions(+) diff --git a/gcc/fortran/decl.cc b/gcc/fortran/decl.cc index 5bd1e3de2d94..4871737458ef 100644 --- a/gcc/fortran/decl.cc +++ b/gcc/fortran/decl.cc @@ -7885,6 +7885,13 @@ match_procedure_decl (void) if (m == MATCH_ERROR) return MATCH_ERROR; + if (current_attr.allocatable) + { + current_attr.procedure = 1; + gfc_check_conflict (¤t_attr, NULL, &gfc_current_locus); + return MATCH_ERROR; + } + if (proc_if && proc_if->attr.is_bind_c && !current_attr.is_bind_c) { current_attr.is_bind_c = 1; diff --git a/gcc/testsuite/gfortran.dg/pr102333_2.f90 b/gcc/testsuite/gfortran.dg/pr102333_2.f90 new file mode 100644 index 000000000000..3b30d5971d1a --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr102333_2.f90 @@ -0,0 +1,13 @@ +! { dg-do compile } +! PR fortran/102333 + +function factory() result(payload) + class(*), allocatable :: payload +contains + function pointer_callback() + procedure(factory), pointer :: pointer_callback + end function pointer_callback + function allocatable_callback() + procedure(factory), allocatable :: allocatable_callback ! { dg-error "PROCEDURE attribute conflicts with ALLOCATABLE" } + end function allocatable_callback +end function factory
