[Patch, fortran] PR121204 - Explicit interfaces in module are incorrectly passed to submodule

Paul Richard Thomas <[email protected]>
Newsgroups gmane.comp.gcc.patches,gmane.comp.gcc.fortran
Message-ID <CAGkQGi+SUNP-YPXtz0E9Ld-JRKBDk5+tzfjnzrxHk8yd4rjnxg@mail.gmail.com>
Hello All,

The attached patch fixes PR121204 and passes regression testing on FC44/x86_64.

I was working in the right place but completely missed the lack of the
always_explicit attribute. claude found it right away.

The patch passes regetesting on FC44/x86_64.

As it is a trivial one liner, I intend to push it in the next hour or
so and to backport with a sensible delay.

Regards

Paul
submit.diff (text/x-patch, 2.8 KB)
From 3b2d9f162a07e9d7b6b4a8b4acacf080ce89f9b6 Mon Sep 17 00:00:00 2001
From: Paul Thomas <[email protected]>
Date: Thu, 4 Jun 2026 11:55:50 +0100
Subject: [PATCH] Fortran: fix always_explicit not copied by gfc_copy_attr
 [PR119882]

gfc_copy_attr omitted the always_explicit attribute, so when
gfc_copy_dummy_sym created a fresh copy of a dummy procedure symbol in
a submodule module procedure (gfc_match_submod_proc), the flag was
silently lost.  At translation time nodesc_arg was set true for calls
through that dummy procedure, causing array constructors to be passed
as raw data pointers instead of array descriptors.  Callers with
assumed-shape dummy arguments then read garbage bounds.

gcc/fortran/ChangeLog:

	* symbol.cc (gfc_copy_attr): Copy the always_explicit attribute.

gcc/testsuite/ChangeLog:

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

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
---
 gcc/fortran/symbol.cc                      |  2 ++
 gcc/testsuite/gfortran.dg/submodule_36.f90 | 38 ++++++++++++++++++++++
 2 files changed, 40 insertions(+)
 create mode 100644 gcc/testsuite/gfortran.dg/submodule_36.f90

diff --git a/gcc/fortran/symbol.cc b/gcc/fortran/symbol.cc
index 26e4b40d48e..d2e93755c53 100644
--- a/gcc/fortran/symbol.cc
+++ b/gcc/fortran/symbol.cc
@@ -2224,6 +2224,8 @@ gfc_copy_attr (symbol_attribute *dest, symbol_attribute *src, locus *where)
     goto fail;
   if (src->recursive && !gfc_add_recursive (dest, where))
     goto fail;
+  if (src->always_explicit)
+    dest->always_explicit = 1;
 
   if (src->flavor != FL_UNKNOWN
       && !gfc_add_flavor (dest, src->flavor, NULL, where))
diff --git a/gcc/testsuite/gfortran.dg/submodule_36.f90 b/gcc/testsuite/gfortran.dg/submodule_36.f90
new file mode 100644
index 00000000000..ac80e2bddda
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/submodule_36.f90
@@ -0,0 +1,38 @@
+! { dg-do run }
+!
+! Test fix for a bug where the always_explicit attribute was not copied
+! by gfc_copy_attr, causing array descriptors not to be passed when
+! calling a dummy procedure with an assumed-shape argument from a
+! submodule module procedure.
+!
+module test_m
+   implicit none (type, external)
+   interface
+      module subroutine call_proc (proc)
+         interface
+            subroutine proc (a)
+               real, intent(in) :: a(:)
+            end subroutine proc
+         end interface
+      end subroutine call_proc
+   end interface
+end module test_m
+
+submodule (test_m) test_sm
+   implicit none (type, external)
+contains
+   module procedure call_proc
+      call proc ([1., 2., .3])
+   end procedure call_proc
+end submodule test_sm
+
+program test
+   use test_m
+   implicit none (type, external)
+   call call_proc (print_proc)
+contains
+   subroutine print_proc (a)
+      real, intent(in) :: a(:)
+      if (size (a, 1) /= 3) stop 1
+   end subroutine print_proc
+end program test
-- 
2.54.0
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.