Fortran: checking of pointer targets for structure constructors [PR56423]

Message ID 264c79e9-0641-4116-91ed-942bda0fbb7b@gmx.de
State New
Headers
Series Fortran: checking of pointer targets for structure constructors [PR56423] |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_simplebootstrap_build--master-arm-bootstrap success Build passed
linaro-tcwg-bot/tcwg_gcc_build--master-arm fail Patch failed to apply
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 fail Patch failed to apply
linaro-tcwg-bot/tcwg_simplebootstrap_build--master-aarch64-bootstrap fail Patch failed to apply

Commit Message

Harald Anlauf Feb. 10, 2025, 6 p.m. UTC
  Dear all,

the attached patch enhances the checking of pointer targets in structure
constructors to catch the following invalid cases (before we ICE :)
- different rank
- vector subscript of target

Regtested on x86_64-pc-linux-gnu.  OK for mainline?

Thanks,
Harald
  

Comments

Thomas Koenig Feb. 10, 2025, 7:26 p.m. UTC | #1
Hello Harld,

> the attached patch enhances the checking of pointer targets in structure
> constructors to catch the following invalid cases (before we ICE :)
> - different rank
> - vector subscript of target
> 
> Regtested on x86_64-pc-linux-gnu.  OK for mainline?

OK (and bordering on obvious).

Thanks for the patch!

Best regards

	Thomas
  
Harald Anlauf Feb. 10, 2025, 7:47 p.m. UTC | #2
Hi Thomas,

Am 10.02.25 um 20:26 schrieb Thomas Koenig:
> Hello Harld,
> 
>> the attached patch enhances the checking of pointer targets in structure
>> constructors to catch the following invalid cases (before we ICE :)
>> - different rank
>> - vector subscript of target
>>
>> Regtested on x86_64-pc-linux-gnu.  OK for mainline?
> 
> OK (and bordering on obvious).
> 
> Thanks for the patch!
> 
> Best regards
> 
>      Thomas
> 
> 

Pushed as r15-7459-g118a6c3247bb30 .

Thanks for the review!

Harald
  

Patch

From 118a6c3247bb30ef932341cec3ca15e2c6304b69 Mon Sep 17 00:00:00 2001
From: Harald Anlauf <anlauf@gmx.de>
Date: Mon, 10 Feb 2025 18:47:45 +0100
Subject: [PATCH] Fortran: checking of pointer targets for structure
 constructors [PR56423]

Check the target of a pointer component in a structure constructor for same
ranks, and that the initial-data-target does not have vector subscripts.

	PR fortran/56423

gcc/fortran/ChangeLog:

	* resolve.cc (resolve_structure_cons): Check rank of pointer target;
	reject pointer target with vector subscripts.

gcc/testsuite/ChangeLog:

	* gfortran.dg/derived_constructor_comps_2.f90: Adjust test.
	* gfortran.dg/derived_constructor_comps_8.f90: New test.
---
 gcc/fortran/resolve.cc                        | 12 ++++++++++-
 .../derived_constructor_comps_2.f90           |  4 ++--
 .../derived_constructor_comps_8.f90           | 20 +++++++++++++++++++
 3 files changed, 33 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/derived_constructor_comps_8.f90

diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc
index 7adbf958aec..1a4799dac78 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -1370,7 +1370,7 @@  resolve_structure_cons (gfc_expr *expr, int init)
 	  gfc_find_vtab (&cons->expr->ts);
 
       if (cons->expr->expr_type != EXPR_NULL && rank != cons->expr->rank
-	  && (comp->attr.allocatable || cons->expr->rank))
+	  && (comp->attr.allocatable || comp->attr.pointer || cons->expr->rank))
 	{
 	  gfc_error ("The rank of the element in the structure "
 		     "constructor at %L does not match that of the "
@@ -1583,6 +1583,16 @@  resolve_structure_cons (gfc_expr *expr, int init)
 	    }
 	}
 
+      /* F2023:C770: A designator that is an initial-data-target shall ...
+	 not have a vector subscript.  */
+      if (comp->attr.pointer && (a.pointer || a.target)
+	  && gfc_has_vector_index (cons->expr))
+	{
+	  gfc_error ("Pointer assignment target at %L has a vector subscript",
+		     &cons->expr->where);
+	  t = false;
+	}
+
       /* F2003, C1272 (3).  */
       bool impure = cons->expr->expr_type == EXPR_VARIABLE
 		    && (gfc_impure_variable (cons->expr->symtree->n.sym)
diff --git a/gcc/testsuite/gfortran.dg/derived_constructor_comps_2.f90 b/gcc/testsuite/gfortran.dg/derived_constructor_comps_2.f90
index a5e951ad102..04bd95559ea 100644
--- a/gcc/testsuite/gfortran.dg/derived_constructor_comps_2.f90
+++ b/gcc/testsuite/gfortran.dg/derived_constructor_comps_2.f90
@@ -1,5 +1,5 @@ 
 ! { dg-do compile }
-! Tests fix for PR29115, in which an ICE would be produced by 
+! Tests fix for PR29115, in which an ICE would be produced by
 ! non-pointer elements being supplied to the pointer components
 ! in a derived type constructor.
 !
@@ -9,7 +9,7 @@ 
     integer, pointer :: bart(:)
   end type homer
   type(homer) :: marge
-  integer :: duff_beer
+  integer :: duff_beer(1)
   marge = homer (duff_beer) ! { dg-error "should be a POINTER or a TARGET" }
 end
 
diff --git a/gcc/testsuite/gfortran.dg/derived_constructor_comps_8.f90 b/gcc/testsuite/gfortran.dg/derived_constructor_comps_8.f90
new file mode 100644
index 00000000000..ce53eef7503
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/derived_constructor_comps_8.f90
@@ -0,0 +1,20 @@ 
+! { dg-do compile }
+! PR fortran/56423
+!
+! Check constraints on pointer targets for derived type constructors
+!
+! Contributed by Tobias Burnus and Gerhard Steinmetz
+
+program p
+  integer, target :: x(3) = [7, 8, 9]
+  type t
+     integer, pointer :: a(:)
+  end type
+  type(t) :: z
+  z = t(x)
+  z = t(x(1:3))
+  z = t(x(3:1:-1))
+  z = t(x(2))     ! { dg-error "rank of the element in the structure constructor" }
+  z = t(x([1,3])) ! { dg-error "has a vector subscript" }
+  print *, z%a
+end
-- 
2.43.0