Dear all,

I've committed the attached obvious patch to reject an invalid NULL
in ALLOCATE after it was OK'ed in the PR by Steve.

Regtested on x86_64-pc-linux-gnu.  Pushed as r15-6925-g8923099994f1fe .

Thanks,
Harald

From 8923099994f1fe3e808b9f498353c144f1ae0591 Mon Sep 17 00:00:00 2001
From: Harald Anlauf <anl...@gmx.de>
Date: Wed, 15 Jan 2025 19:42:52 +0100
Subject: [PATCH] Fortran: reject NULL as source-expr in ALLOCATE with SOURCE=
 or MOLD= [PR71884]

	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                | 12 ++++++++++++
 gcc/testsuite/gfortran.dg/pr71884.f90 | 16 ++++++++++++++++
 2 files changed, 28 insertions(+)
 create mode 100644 gcc/testsuite/gfortran.dg/pr71884.f90

diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc
index 3e74a2e5088..124f4ac4edc 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -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
index 00000000000..015a10290a1
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr71884.f90
@@ -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
-- 
2.43.0

Reply via email to