mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-10 01:40:47 +08:00
re PR fortran/33566 (fortran : wrong rank of derived type parameters array components)
2007-10-02 Paul Thomas <pault@gcc.gnu.org> PR fortran/33566 * primary.c (gfc_match_rvalue): Make all expressions with array references to structure parameters into variable expressions. 2007-10-02 Paul Thomas <pault@gcc.gnu.org> PR fortran/33566 * gfortran.dg/derived_comp_array_ref_5.f90: New test. From-SVN: r128951
This commit is contained in:
parent
d383707213
commit
927171bfea
gcc
@ -1,3 +1,9 @@
|
||||
2007-10-02 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/33566
|
||||
* primary.c (gfc_match_rvalue): Make all expressions with array
|
||||
references to structure parameters into variable expressions.
|
||||
|
||||
2007-10-02 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/33554
|
||||
|
@ -2148,18 +2148,17 @@ gfc_match_rvalue (gfc_expr **result)
|
||||
if (sym->ts.is_c_interop || sym->ts.is_iso_c)
|
||||
break;
|
||||
|
||||
/* Variable array references to use associated derived type
|
||||
parameters cause all sorts of headaches in simplification.
|
||||
For this reason, we write the parameter to the module and
|
||||
treat them as variable references. */
|
||||
if (sym->value && sym->ts.type == BT_DERIVED
|
||||
&& sym->attr.use_assoc && e->ref)
|
||||
/* Variable array references to derived type parameters cause
|
||||
all sorts of headaches in simplification. Treating such
|
||||
expressions as variable works just fine for all array
|
||||
references. */
|
||||
if (sym->value && sym->ts.type == BT_DERIVED && e->ref)
|
||||
{
|
||||
for (ref = e->ref; ref; ref = ref->next)
|
||||
if (ref->type == REF_ARRAY)
|
||||
break;
|
||||
|
||||
if (ref == NULL)
|
||||
if (ref == NULL || ref->u.ar.type == AR_FULL)
|
||||
break;
|
||||
|
||||
ref = e->ref;
|
||||
|
@ -1,3 +1,8 @@
|
||||
2007-10-02 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/33566
|
||||
* gfortran.dg/derived_comp_array_ref_5.f90: New test.
|
||||
|
||||
2007-10-02 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/33554
|
||||
|
36
gcc/testsuite/gfortran.dg/derived_comp_array_ref_5.f90
Normal file
36
gcc/testsuite/gfortran.dg/derived_comp_array_ref_5.f90
Normal file
@ -0,0 +1,36 @@
|
||||
! { dg-do compile }
|
||||
! Tests the fix for PR33566, in which the first variable array ref
|
||||
! to v1 would cause an incompatible ranks error and the second an ICE.
|
||||
!
|
||||
! Contributed by Mikael Morin <mikael.morin@tele2.fr>
|
||||
!
|
||||
program test_vec
|
||||
|
||||
implicit none
|
||||
|
||||
|
||||
integer :: i
|
||||
real :: x
|
||||
|
||||
type vec3
|
||||
real, dimension(3) :: coords
|
||||
end type vec3
|
||||
|
||||
type(vec3),parameter :: v1 = vec3((/ 1.0, 2.0, 3.0 /))
|
||||
type(vec3) :: v2
|
||||
|
||||
v2 = vec3((/ 1.0, 2.0, 3.0 /))
|
||||
|
||||
|
||||
x = v1%coords(1)
|
||||
|
||||
do i=1,3
|
||||
x = v1%coords(i) ! used to fail
|
||||
x = v2%coords(i)
|
||||
end do
|
||||
|
||||
i = 2
|
||||
|
||||
v2 = vec3 (v1%coords ((/i+1, i, i-1/))) ! also broken
|
||||
|
||||
end program test_vec
|
Loading…
x
Reference in New Issue
Block a user