Commit 927171bf by Paul Thomas

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
parent d3837072
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
* trans-decl.c (init_intent_out_dt): New function.
(gfc_trans_deferred_vars): Remove the code for default
......
......@@ -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;
......
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
* gfortran.dg/intent_out_2.f90: New test.
! { 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment