diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 45c3ad3..01a2977 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -7137,7 +7137,12 @@ gfc_resolve_expr (gfc_expr *e) /* Also try to expand a constructor. */ if (t) { + t = gfc_simplify_expr (e, 1); + if (!t) + break; gfc_expression_rank (e); + if (e->expr_type != EXPR_ARRAY) + break; if (gfc_is_constant_expr (e) || gfc_is_expandable_expr (e)) gfc_expand_constructor (e, false); } diff --git a/gcc/testsuite/gfortran.dg/PR100683.f90 b/gcc/testsuite/gfortran.dg/PR100683.f90 new file mode 100644 index 0000000..6929bb5 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/PR100683.f90 @@ -0,0 +1,36 @@ +! { dg-do run } +! +! Test the fix for PR100683 +! + +program main_p + + implicit none + + integer :: i + integer, parameter :: n = 11 + integer, parameter :: u(*) = [(i, i=1,n)] + + type :: foo_t + integer :: i + end type foo_t + + type, extends(foo_t) :: bar_t + integer :: a(n) + end type bar_t + + type(bar_t), parameter :: a(*) = [(bar_t(i, u), i=1,n)] + type(bar_t) :: b(n) = [(bar_t(i, u), i=1,n)] + + if(any(a(:)%i/=u)) stop 1 + do i = 1, n + if(any(a(i)%a/=u)) stop 2 + end do + if(any(b(:)%i/=u)) stop 3 + do i = 1, n + if(any(b(i)%a/=u)) stop 4 + end do + stop + +end program main_p + diff --git a/gcc/testsuite/gfortran.dg/pr87993.f90 b/gcc/testsuite/gfortran.dg/pr87993.f90 index 96d353d..abc6d0d 100644 --- a/gcc/testsuite/gfortran.dg/pr87993.f90 +++ b/gcc/testsuite/gfortran.dg/pr87993.f90 @@ -2,7 +2,15 @@ ! Code contributed by Gerhard Steinmetz program p integer, parameter :: a(2) = 1 - integer, parameter :: b = a%kind + character, parameter :: b(2) = "X" + integer, parameter :: i = a%kind + integer, parameter :: j = a(2)%kind + integer, parameter :: k = b%kind + integer, parameter :: l = b(2)%kind if (any(a /= 1)) stop 1 - if (b /= kind(a)) stop 2 + if (any(b /= "X")) stop 2 + if (i /= kind(a)) stop 3 + if (j /= kind(a)) stop 4 + if (k /= kind(b)) stop 5 + if (l /= kind(b)) stop 6 end