2
0
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:
Paul Thomas 2007-10-02 08:12:11 +00:00
parent d383707213
commit 927171bfea
4 changed files with 53 additions and 7 deletions

@ -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

@ -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