2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-04-24 19:21:12 +08:00

Fortran: skip compile-time shape check if constructor shape is not known

gcc/fortran/ChangeLog:

	PR fortran/104619
	* resolve.cc (resolve_structure_cons): Skip shape check if shape
	of constructor cannot be determined at compile time.

gcc/testsuite/ChangeLog:

	PR fortran/104619
	* gfortran.dg/derived_constructor_comps_7.f90: New test.
This commit is contained in:
Harald Anlauf 2022-02-21 22:49:05 +01:00
parent 9d1796d82d
commit bc66b471d1
2 changed files with 30 additions and 0 deletions
gcc
fortran
testsuite/gfortran.dg

@ -1472,6 +1472,8 @@ resolve_structure_cons (gfc_expr *expr, int init)
t = false;
break;
};
if (cons->expr->shape == NULL)
continue;
mpz_set_ui (len, 1);
mpz_add (len, len, comp->as->upper[n]->value.integer);
mpz_sub (len, len, comp->as->lower[n]->value.integer);

@ -0,0 +1,28 @@
! { dg-do run }
! PR fortran/104619
module m
implicit none
type :: item
real :: x
end type item
type :: container
type(item) :: items(3)
end type container
end module
program p
use m
implicit none
type(item), allocatable :: items(:)
type(container) :: c
integer :: i, n
items = [item(3.0), item(4.0), item(5.0)]
c = container(items=[(items(i), i = 1, size(items))])
if (any (c%items% x /= items% x)) stop 1
n = size (items)
c = container(items=[(items(i), i = 1, n)])
if (any (c%items% x /= items% x)) stop 2
c = container(items=[(items(i), i = 1, 3)])
if (any (c%items% x /= items% x)) stop 3
end program