diff options
author | Harald Anlauf <anlauf@gmx.de> | 2025-02-10 18:47:45 +0100 |
---|---|---|
committer | Harald Anlauf <anlauf@gmx.de> | 2025-02-10 18:47:45 +0100 |
commit | 118a6c3247bb30ef932341cec3ca15e2c6304b69 (patch) | |
tree | 7e555722abc99a7c7407b2b5da56b8ecfc44711f /gcc | |
parent | 4ce8ad684b90606a74f0cccfd9455184046c6c4e (diff) | |
download | gcc-118a6c3247bb30ef932341cec3ca15e2c6304b69.zip gcc-118a6c3247bb30ef932341cec3ca15e2c6304b69.tar.gz gcc-118a6c3247bb30ef932341cec3ca15e2c6304b69.tar.bz2 |
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/resolve.cc | 12 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/derived_constructor_comps_2.f90 | 4 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/derived_constructor_comps_8.f90 | 20 |
3 files changed, 33 insertions, 3 deletions
diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc index 7adbf95..1a4799d 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 a5e951a..04bd955 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 0000000..ce53eef --- /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 |