diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2008-10-05 18:53:19 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2008-10-05 18:53:19 +0000 |
commit | ebb479cd4d397e829eed460bd7ac9040204f8b5a (patch) | |
tree | c71ab288ceb2e57f96381fd328e65086481e70be /gcc/fortran/expr.c | |
parent | 1d72ff1ac81ad458577b38453c46d115ae21da91 (diff) | |
download | gcc-ebb479cd4d397e829eed460bd7ac9040204f8b5a.zip gcc-ebb479cd4d397e829eed460bd7ac9040204f8b5a.tar.gz gcc-ebb479cd4d397e829eed460bd7ac9040204f8b5a.tar.bz2 |
re PR fortran/35680 (ICE on invalid transfer in variable declaration)
2008-10-05 Paul Thomas <pault@gcc.gnu.org>
PR fortran/35680
* gfortran.h : Add 'error' bit field to gfc_expr structure.
* expr.c (check_inquiry): When checking a restricted expression
check that arguments are either variables or restricted.
(check_restricted): Do not emit error if the expression has
'error' set. Clean up detection of host-associated variable.
2008-10-05 Paul Thomas <pault@gcc.gnu.org>
PR fortran/35680
* gfortran.dg/transfer_array_intrinsic_5.f90: New test.
From-SVN: r140892
Diffstat (limited to 'gcc/fortran/expr.c')
-rw-r--r-- | gcc/fortran/expr.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 7b741b8..7f6bf1b 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -2017,6 +2017,8 @@ check_init_expr_arguments (gfc_expr *e) return MATCH_YES; } +static gfc_try check_restricted (gfc_expr *); + /* F95, 7.1.6.1, Initialization expressions, (7) F2003, 7.1.7 Initialization expression, (8) */ @@ -2096,6 +2098,11 @@ check_inquiry (gfc_expr *e, int not_restricted) } else if (not_restricted && check_init_expr (ap->expr) == FAILURE) return MATCH_ERROR; + + if (not_restricted == 0 + && ap->expr->expr_type != EXPR_VARIABLE + && check_restricted (ap->expr) == FAILURE) + return MATCH_ERROR; } return MATCH_YES; @@ -2421,8 +2428,6 @@ gfc_match_init_expr (gfc_expr **result) } -static gfc_try check_restricted (gfc_expr *); - /* Given an actual argument list, test to see that each argument is a restricted expression and optionally if the expression type is integer or character. */ @@ -2561,14 +2566,17 @@ check_restricted (gfc_expr *e) that host associated dummy array indices are accepted (PR23446). This mechanism also does the same for the specification expressions of array-valued functions. */ - if (sym->attr.in_common - || sym->attr.use_assoc - || sym->attr.dummy - || sym->attr.implied_index - || sym->ns != gfc_current_ns - || (sym->ns->proc_name != NULL - && sym->ns->proc_name->attr.flavor == FL_MODULE) - || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns))) + if (e->error + || sym->attr.in_common + || sym->attr.use_assoc + || sym->attr.dummy + || sym->attr.implied_index + || (sym->ns && sym->ns == gfc_current_ns->parent) + || (sym->ns && gfc_current_ns->parent + && sym->ns == gfc_current_ns->parent->parent) + || (sym->ns->proc_name != NULL + && sym->ns->proc_name->attr.flavor == FL_MODULE) + || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns))) { t = SUCCESS; break; @@ -2576,7 +2584,8 @@ check_restricted (gfc_expr *e) gfc_error ("Variable '%s' cannot appear in the expression at %L", sym->name, &e->where); - + /* Prevent a repetition of the error. */ + e->error = 1; break; case EXPR_NULL: |