]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: reject NULL as source-expr in ALLOCATE with SOURCE= or MOLD= [PR71884]
authorHarald Anlauf <anlauf@gmx.de>
Wed, 15 Jan 2025 18:42:52 +0000 (19:42 +0100)
committerHarald Anlauf <anlauf@gmx.de>
Wed, 15 Jan 2025 18:42:52 +0000 (19:42 +0100)
PR fortran/71884

gcc/fortran/ChangeLog:

* resolve.cc (resolve_allocate_expr): Reject intrinsic NULL as
source-expr.

gcc/testsuite/ChangeLog:

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

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

index 3e74a2e50883ed4c8e5eca0a49a67aa8956d119f..124f4ac4edcdca5406fd6b0e0e24cde95c4e5485 100644 (file)
@@ -9433,6 +9433,18 @@ resolve_allocate_expr (gfc_expr *e, gfc_code *code, bool *array_alloc_wo_spec)
   /* Some checks for the SOURCE tag.  */
   if (code->expr3)
     {
+      /* Check F03:C632: "The source-expr shall be a scalar or have the same
+        rank as allocate-object".  This would require the MOLD argument to
+        NULL() as source-expr for subsequent checking.  However, even the
+        resulting disassociated pointer or unallocated array has no shape that
+        could be used for SOURCE= or MOLD=.  */
+      if (code->expr3->expr_type == EXPR_NULL)
+       {
+         gfc_error ("The intrinsic NULL cannot be used as source-expr at %L",
+                    &code->expr3->where);
+         goto failure;
+       }
+
       /* Check F03:C631.  */
       if (!gfc_type_compatible (&e->ts, &code->expr3->ts))
        {
diff --git a/gcc/testsuite/gfortran.dg/pr71884.f90 b/gcc/testsuite/gfortran.dg/pr71884.f90
new file mode 100644 (file)
index 0000000..015a102
--- /dev/null
@@ -0,0 +1,16 @@
+! { dg-do compile }
+! PR fortran/71884 - reject NULL as source-expr in ALLOCATE with SOURCE= or MOLD=
+!
+! Contributed by G.Steinmetz
+
+program p
+  real,     allocatable :: a
+  real,     pointer     :: b
+  class(*), allocatable :: x
+  class(*), pointer     :: y
+
+  allocate (x, source=null())  ! { dg-error "NULL cannot be used as source-expr" }
+  allocate (y, source=null(b)) ! { dg-error "NULL cannot be used as source-expr" }
+  allocate (x, mold=null(b))   ! { dg-error "NULL cannot be used as source-expr" }
+  allocate (y, mold=null())    ! { dg-error "NULL cannot be used as source-expr" }
+end