diff options
author | Tobias Burnus <burnus@net-b.de> | 2010-04-10 16:24:46 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2010-04-10 16:24:46 +0200 |
commit | 687ea68f03359b93fd19fa6fd7666a2867aaa22c (patch) | |
tree | e2073cb1cb60b55156ee63c56140969f388c8595 /gcc/fortran/expr.c | |
parent | 85c9bcd4184b9c088323e1b46d455d5f0b1067a1 (diff) | |
download | gcc-687ea68f03359b93fd19fa6fd7666a2867aaa22c.zip gcc-687ea68f03359b93fd19fa6fd7666a2867aaa22c.tar.gz gcc-687ea68f03359b93fd19fa6fd7666a2867aaa22c.tar.bz2 |
re PR fortran/43591 (PPC: internal compiler error: in gfc_traverse_expr, at fortran/expr.c:3604)
2010-04-10 Tobias Burnus <burnus@net-b.de>
PR fortran/43591
* expr.c (gfc_is_constant_expr, gfc_traverse_expr): Handle
proc-pointers and type-bound procedures.
(gfc_specification_expr): Check proc-pointers for pureness.
2010-04-10 Tobias Burnus <burnus@net-b.de>
PR fortran/43591
* gfortran.dg/spec_expr_6.f90: New test.
From-SVN: r158191
Diffstat (limited to 'gcc/fortran/expr.c')
-rw-r--r-- | gcc/fortran/expr.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 2200a80..9e2beb6 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -782,6 +782,8 @@ gfc_is_constant_expr (gfc_expr *e) break; case EXPR_FUNCTION: + case EXPR_PPC: + case EXPR_COMPCALL: /* Specification functions are constant. */ if (check_specification_function (e) == MATCH_YES) { @@ -2808,6 +2810,7 @@ check_restricted (gfc_expr *e) gfc_try gfc_specification_expr (gfc_expr *e) { + gfc_component *comp; if (e == NULL) return SUCCESS; @@ -2822,7 +2825,9 @@ gfc_specification_expr (gfc_expr *e) if (e->expr_type == EXPR_FUNCTION && !e->value.function.isym && !e->value.function.esym - && !gfc_pure (e->symtree->n.sym)) + && !gfc_pure (e->symtree->n.sym) + && (!gfc_is_proc_ptr_comp (e, &comp) + || !comp->attr.pure)) { gfc_error ("Function '%s' at %L must be PURE", e->symtree->n.sym->name, &e->where); @@ -3588,6 +3593,8 @@ gfc_traverse_expr (gfc_expr *expr, gfc_symbol *sym, switch (expr->expr_type) { + case EXPR_PPC: + case EXPR_COMPCALL: case EXPR_FUNCTION: for (args = expr->value.function.actual; args; args = args->next) { |