diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2010-01-31 12:05:22 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2010-01-31 12:05:22 +0000 |
commit | b7d1d8b460bcc996883f2aa089d49598736620a5 (patch) | |
tree | c8dec18636f40d47646ddb667f434ea8cb76305e /gcc/fortran/expr.c | |
parent | 9b7b903efdb5a1a1b15c2a5c87618a67c36f82fa (diff) | |
download | gcc-b7d1d8b460bcc996883f2aa089d49598736620a5.zip gcc-b7d1d8b460bcc996883f2aa089d49598736620a5.tar.gz gcc-b7d1d8b460bcc996883f2aa089d49598736620a5.tar.bz2 |
re PR fortran/38324 (Wrong lbound given to allocatable components)
2010-01-31 Paul Thomas <pault@gcc.gnu.org>
PR fortran/38324
* expr.c (gfc_get_full_arrayspec_from_expr): New function.
* gfortran.h : Add prototype for above.
* trans-expr.c (gfc_trans_alloc_subarray_assign): New function.
(gfc_trans_subcomponent_assign): Call new function to replace
the code to deal with allocatable components.
* trans-intrinsic.c (gfc_conv_intrinsic_bound): Call
gfc_get_full_arrayspec_from_expr to replace existing code.
2010-01-31 Paul Thomas <pault@gcc.gnu.org>
PR fortran/38324
* gfortran.dg/alloc_comp_basics_1.f90: Remove option -O2.
* gfortran.dg/alloc_comp_bounds_1.f90: New test.
From-SVN: r156399
Diffstat (limited to 'gcc/fortran/expr.c')
-rw-r--r-- | gcc/fortran/expr.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index d846c0f..6d3ca84 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -3489,6 +3489,58 @@ gfc_get_variable_expr (gfc_symtree *var) } +/* Returns the array_spec of a full array expression. A NULL is + returned otherwise. */ +gfc_array_spec * +gfc_get_full_arrayspec_from_expr (gfc_expr *expr) +{ + gfc_array_spec *as; + gfc_ref *ref; + + if (expr->rank == 0) + return NULL; + + /* Follow any component references. */ + if (expr->expr_type == EXPR_VARIABLE + || expr->expr_type == EXPR_CONSTANT) + { + as = expr->symtree->n.sym->as; + for (ref = expr->ref; ref; ref = ref->next) + { + switch (ref->type) + { + case REF_COMPONENT: + as = ref->u.c.component->as; + continue; + + case REF_SUBSTRING: + continue; + + case REF_ARRAY: + { + switch (ref->u.ar.type) + { + case AR_ELEMENT: + case AR_SECTION: + case AR_UNKNOWN: + as = NULL; + continue; + + case AR_FULL: + break; + } + break; + } + } + } + } + else + as = NULL; + + return as; +} + + /* General expression traversal function. */ bool |