aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2007-10-02 08:12:11 +0000
committerPaul Thomas <pault@gcc.gnu.org>2007-10-02 08:12:11 +0000
commit927171bfea8858306c990c51a61dd413006141d2 (patch)
tree409ec613fdef50ca2d2baae1ac3e2c1c7c53f2d1 /gcc
parentd383707213c835c7f50ad778229e2428fa402863 (diff)
downloadgcc-927171bfea8858306c990c51a61dd413006141d2.zip
gcc-927171bfea8858306c990c51a61dd413006141d2.tar.gz
gcc-927171bfea8858306c990c51a61dd413006141d2.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/primary.c13
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/derived_comp_array_ref_5.f9036
4 files changed, 53 insertions, 7 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 5af0989..49dec96 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,11 @@
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
diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c
index 575a4c7..d5e4b64 100644
--- a/gcc/fortran/primary.c
+++ b/gcc/fortran/primary.c
@@ -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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6218703..cb8dabb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
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.
diff --git a/gcc/testsuite/gfortran.dg/derived_comp_array_ref_5.f90 b/gcc/testsuite/gfortran.dg/derived_comp_array_ref_5.f90
new file mode 100644
index 0000000..3b0c279
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/derived_comp_array_ref_5.f90
@@ -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