]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: ALLOCATE with array-valued MOLD expression fails [PR122669]
authorPaul Thomas <pault@gcc.gnu.org>
Sat, 6 Dec 2025 07:54:39 +0000 (07:54 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Sat, 6 Dec 2025 07:54:39 +0000 (07:54 +0000)
2025-12-06  Paul Thomas  <pault@gcc.gnu.org>

gcc/fortran
PR fortran/122669
* resolve.cc (resolve_allocate_deallocate): Mold expressions
with an array reference and a constant size must be resolved
for each allocate object.

gcc/testsuite
PR fortran/122669
* gfortran.dg/pdt_73.f03: New test.

gcc/fortran/resolve.cc
gcc/testsuite/gfortran.dg/pdt_73.f03 [new file with mode: 0644]

index 8e076c66bedff8bbdcd287b7d8659d2c73daec66..db6b52f307608ce2c71fb5f6ee90de2695a7c615 100644 (file)
@@ -9799,8 +9799,10 @@ done_errmsg:
       /* Resolving the expr3 in the loop over all objects to allocate would
         execute loop invariant code for each loop item.  Therefore do it just
         once here.  */
+      mpz_t nelem;
       if (code->expr3 && code->expr3->mold
-         && code->expr3->ts.type == BT_DERIVED)
+         && code->expr3->ts.type == BT_DERIVED
+         && !(code->expr3->ref && gfc_array_size (code->expr3, &nelem)))
        {
          /* Default initialization via MOLD (non-polymorphic).  */
          gfc_expr *rhs = gfc_default_initializer (&code->expr3->ts);
diff --git a/gcc/testsuite/gfortran.dg/pdt_73.f03 b/gcc/testsuite/gfortran.dg/pdt_73.f03
new file mode 100644 (file)
index 0000000..63a9234
--- /dev/null
@@ -0,0 +1,18 @@
+! { dg-do compile }
+!
+! Tests the fix for pr122669, which falied with the error below.
+!
+! Contributed by Damian Rouson  <damian@archaeologic.codes>
+!
+  implicit none
+  type tensor_t
+    real, allocatable :: values_
+  end type
+  type(tensor_t) :: random_inputs(1)
+  type(tensor_t), allocatable :: outputs(:)
+
+  random_inputs = [tensor_t(1.0)]
+  allocate(outputs, mold=random_inputs) ! Error: Array specification or array-valued
+                                        ! SOURCE= expression required in ALLOCATE statement at (1)
+  print *, size(outputs)
+end