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.
/* 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))
{
--- /dev/null
+! { 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