]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: check type-spec in ALLOCATE of dummy with assumed length [PR119338]
authorHarald Anlauf <anlauf@gmx.de>
Mon, 17 Mar 2025 21:34:19 +0000 (22:34 +0100)
committerHarald Anlauf <anlauf@gmx.de>
Tue, 18 Mar 2025 17:56:08 +0000 (18:56 +0100)
PR fortran/119338

gcc/fortran/ChangeLog:

* resolve.cc (resolve_allocate_expr): Check F2003:C626: Type-spec
in ALLOCATE of an assumed-length character dummy argument shall be
an asterisk.

gcc/testsuite/ChangeLog:

* gfortran.dg/deferred_character_18.f90: Adjust testcase.
* gfortran.dg/allocate_assumed_charlen_5.f90: New test.

gcc/fortran/resolve.cc
gcc/testsuite/gfortran.dg/allocate_assumed_charlen_5.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/deferred_character_18.f90

index d64edff8507923b96b5364596bede92a526a2820..ddd9827023091cfc0e6c0a442220623e3d4131b6 100644 (file)
@@ -8987,6 +8987,22 @@ resolve_allocate_expr (gfc_expr *e, gfc_code *code, bool *array_alloc_wo_spec)
       goto failure;
     }
 
+  /* F2003:C626 (R623) A type-param-value in a type-spec shall be an asterisk
+     if and only if each allocate-object is a dummy argument for which the
+     corresponding type parameter is assumed.  */
+  if (code->ext.alloc.ts.type == BT_CHARACTER
+      && code->ext.alloc.ts.u.cl->length != NULL
+      && e->ts.type == BT_CHARACTER && !e->ts.deferred
+      && e->ts.u.cl->length == NULL
+      && e->symtree->n.sym->attr.dummy)
+    {
+      gfc_error ("The type parameter in ALLOCATE statement with type-spec "
+                "shall be an asterisk as allocate object %qs at %L is a "
+                "dummy argument with assumed type parameter",
+                sym->name, &e->where);
+      goto failure;
+    }
+
   /* Check F08:C632.  */
   if (code->ext.alloc.ts.type == BT_CHARACTER && !e->ts.deferred
       && !UNLIMITED_POLY (e))
diff --git a/gcc/testsuite/gfortran.dg/allocate_assumed_charlen_5.f90 b/gcc/testsuite/gfortran.dg/allocate_assumed_charlen_5.f90
new file mode 100644 (file)
index 0000000..bc75dbe
--- /dev/null
@@ -0,0 +1,17 @@
+! { dg-do compile }
+! PR fortran/119338 - check F2003:C626
+
+module m
+  implicit none
+contains
+  subroutine sub (s, c)
+    character(len=*), allocatable, intent(out) :: s(:)
+    character(len=*), allocatable, intent(out) :: c
+    allocate(s(5))                      ! OK
+    allocate(c)                         ! OK
+    allocate(character(len=*)  :: s(5)) ! OK
+    allocate(character(len=*)  :: c)    ! OK
+    allocate(character(len=10) :: s(5)) ! { dg-error "shall be an asterisk" }
+    allocate(character(len=10) :: c)    ! { dg-error "shall be an asterisk" }
+  end subroutine sub
+end module m
index 1b1457fa293c03310e8773c1decf9ffec8456d31..b1229c2485e7a6acc1d8714d09d002ad7ac938de 100644 (file)
@@ -11,7 +11,8 @@ contains
     character(*), allocatable, intent(out) :: str
 !  Note: Star ^ should have been a colon (:)
 
-    allocate (character(n)::str)
+!   allocate (character(n)::str) ! original invalid version from pr82367
+    allocate (character(*)::str) ! corrected (see F2003:C626 and pr119338)
 
   end subroutine