aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2007-09-22 15:46:41 +0000
committerPaul Thomas <pault@gcc.gnu.org>2007-09-22 15:46:41 +0000
commitfdc55763b63d833dccd47781ff5d4b09dd96c1c1 (patch)
tree67fbb65e9ee062ee2344f0156c199922dd6c94dc /gcc/fortran
parenta3b2d4e56c6086a6af1aae2ef3a540171609e153 (diff)
downloadgcc-fdc55763b63d833dccd47781ff5d4b09dd96c1c1.zip
gcc-fdc55763b63d833dccd47781ff5d4b09dd96c1c1.tar.gz
gcc-fdc55763b63d833dccd47781ff5d4b09dd96c1c1.tar.bz2
re PR fortran/33337 (ICE in gfc_finish_var_decl, at fortran/trans-decl.c:510)
2007-09-22 Paul Thomas <pault@gcc.gnu.org> PR fortran/33337 PR fortran/33376 * trans-decl.c (gfc_create_module_variable): Output derived type parameters. * arith.c (gfc_parentheses): Return the argument if it is a constant expression. * primary.c (gfc_match_rvalue): Remove the clearing of the module name and the use_assoc attribute for derived type parameter expressions. 2007-09-22 Paul Thomas <pault@gcc.gnu.org> PR fortran/33337 * gfortran.dg/derived_comp_array_ref_3.f90: New test. PR fortran/33376 * gfortran.dg/derived_comp_array_ref_4.f90: New test. From-SVN: r128672
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog12
-rw-r--r--gcc/fortran/arith.c3
-rw-r--r--gcc/fortran/primary.c13
-rw-r--r--gcc/fortran/trans-decl.c6
4 files changed, 25 insertions, 9 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 36904b2..cb8f7cc 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,15 @@
+2007-09-22 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/33337
+ PR fortran/33376
+ * trans-decl.c (gfc_create_module_variable): Output
+ derived type parameters.
+ * arith.c (gfc_parentheses): Return the argument if
+ it is a constant expression.
+ * primary.c (gfc_match_rvalue): Remove the clearing of
+ the module name and the use_assoc attribute for derived
+ type parameter expressions.
+
2007-09-22 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
PR fortran/33502
diff --git a/gcc/fortran/arith.c b/gcc/fortran/arith.c
index 149f93f..7e3d0a4 100644
--- a/gcc/fortran/arith.c
+++ b/gcc/fortran/arith.c
@@ -1793,6 +1793,9 @@ eval_intrinsic_f3 (gfc_intrinsic_op operator,
gfc_expr *
gfc_parentheses (gfc_expr *op)
{
+ if (gfc_is_constant_expr (op))
+ return op;
+
return eval_intrinsic_f2 (INTRINSIC_PARENTHESES, gfc_arith_identity,
op, NULL);
}
diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c
index f622996..575a4c7 100644
--- a/gcc/fortran/primary.c
+++ b/gcc/fortran/primary.c
@@ -2148,11 +2148,12 @@ gfc_match_rvalue (gfc_expr **result)
if (sym->ts.is_c_interop || sym->ts.is_iso_c)
break;
- /* Variable array references to derived type parameters cause
- all sorts of headaches in simplification. Make them variable
- and scrub any module identity because they do not appear to
- be referencable from the module. */
- if (sym->value && sym->ts.type == BT_DERIVED && e->ref)
+ /* 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)
{
for (ref = e->ref; ref; ref = ref->next)
if (ref->type == REF_ARRAY)
@@ -2168,8 +2169,6 @@ gfc_match_rvalue (gfc_expr **result)
e->expr_type = EXPR_VARIABLE;
e->symtree = symtree;
e->ref = ref;
- sym->attr.use_assoc = 0;
- sym->module = NULL;
}
break;
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index 854ca54..e27a04b 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -2764,9 +2764,11 @@ gfc_create_module_variable (gfc_symbol * sym)
&& sym->ts.type == BT_DERIVED)
sym->backend_decl = gfc_typenode_for_spec (&(sym->ts));
- /* Only output variables and array valued parameters. */
+ /* Only output variables and array valued, or derived type,
+ parameters. */
if (sym->attr.flavor != FL_VARIABLE
- && (sym->attr.flavor != FL_PARAMETER || sym->attr.dimension == 0))
+ && !(sym->attr.flavor == FL_PARAMETER
+ && (sym->attr.dimension || sym->ts.type == BT_DERIVED)))
return;
/* Don't generate variables from other modules. Variables from