diff options
author | Tobias Burnus <burnus@net-b.de> | 2011-01-13 17:32:33 +0100 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2011-01-13 17:32:33 +0100 |
commit | 29a63d67791eb9a7bea3c64425ff3b3494968812 (patch) | |
tree | f2bef0c7e12ae3147eefdbda3213ebc7162d7c4d /gcc/fortran/resolve.c | |
parent | b41f0b3440bc8fe4982404c16a63b41521929450 (diff) | |
download | gcc-29a63d67791eb9a7bea3c64425ff3b3494968812.zip gcc-29a63d67791eb9a7bea3c64425ff3b3494968812.tar.gz gcc-29a63d67791eb9a7bea3c64425ff3b3494968812.tar.bz2 |
re PR fortran/45848 ([OOP] ICE on invalid code in fortran/symbol.c:2410)
2011-01-13 Tobias Burnus <burnus@net-b.de>
Mikael Morin <mikael@gcc.gnu.org>
PR fortran/45848
PR fortran/47204
* gfortran.h (gfc_code): Move union ext's case_list into
the struct block.
* dump-parse-tree.c (show_code_node): Adapt by prefixing
* case_list
by "block.".
* frontend-passes.c (gfc_code_walker): Ditto.
* match.c (gfc_match_goto, gfc_match_call, gfc_match_case,
gfc_match_type_is, gfc_match_class_is): Ditto.
* resolve.c (resolve_select, resolve_select_type): Ditto.
* st.c (gfc_free_statement): Ditto.
* trans-stmt.c (gfc_trans_integer_select,
* gfc_trans_logical_select,
gfc_trans_character_select): Ditto.
* parse.c (resolve_all_program_units): For error recovery, avoid
segfault is proc_name is NULL.
2011-01-13 Tobias Burnus <burnus@net-b.de>
Mikael Morin <mikael@gcc.gnu.org>
PR fortran/45848
PR fortran/47204
* gfortran.dg/select_type_20.f90: New.
* gfortran.dg/select_type_21.f90: New.
Co-Authored-By: Mikael Morin <mikael@gcc.gnu.org>
From-SVN: r168753
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r-- | gcc/fortran/resolve.c | 45 |
1 files changed, 23 insertions, 22 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 88acb55..a1c9917 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -7361,7 +7361,7 @@ resolve_select (gfc_code *code) if (type == BT_INTEGER) for (body = code->block; body; body = body->block) - for (cp = body->ext.case_list; cp; cp = cp->next) + for (cp = body->ext.block.case_list; cp; cp = cp->next) { if (cp->low && gfc_check_integer_range (cp->low->value.integer, @@ -7389,7 +7389,7 @@ resolve_select (gfc_code *code) for (body = code->block; body; body = body->block) { /* Walk the case label list. */ - for (cp = body->ext.case_list; cp; cp = cp->next) + for (cp = body->ext.block.case_list; cp; cp = cp->next) { /* Intercept the DEFAULT case. It does not have a kind. */ if (cp->low == NULL && cp->high == NULL) @@ -7426,7 +7426,7 @@ resolve_select (gfc_code *code) /* Walk the case label list, making sure that all case labels are legal. */ - for (cp = body->ext.case_list; cp; cp = cp->next) + for (cp = body->ext.block.case_list; cp; cp = cp->next) { /* Count the number of cases in the whole construct. */ ncases++; @@ -7527,19 +7527,19 @@ resolve_select (gfc_code *code) if (seen_unreachable) { /* Advance until the first case in the list is reachable. */ - while (body->ext.case_list != NULL - && body->ext.case_list->unreachable) + while (body->ext.block.case_list != NULL + && body->ext.block.case_list->unreachable) { - gfc_case *n = body->ext.case_list; - body->ext.case_list = body->ext.case_list->next; + gfc_case *n = body->ext.block.case_list; + body->ext.block.case_list = body->ext.block.case_list->next; n->next = NULL; gfc_free_case_list (n); } /* Strip all other unreachable cases. */ - if (body->ext.case_list) + if (body->ext.block.case_list) { - for (cp = body->ext.case_list; cp->next; cp = cp->next) + for (cp = body->ext.block.case_list; cp->next; cp = cp->next) { if (cp->next->unreachable) { @@ -7575,7 +7575,7 @@ resolve_select (gfc_code *code) unreachable case labels for a block. */ for (body = code; body && body->block; body = body->block) { - if (body->block->ext.case_list == NULL) + if (body->block->ext.block.case_list == NULL) { /* Cut the unreachable block from the code chain. */ gfc_code *c = body->block; @@ -7714,7 +7714,7 @@ resolve_select_type (gfc_code *code, gfc_namespace *old_ns) /* Loop over TYPE IS / CLASS IS cases. */ for (body = code->block; body; body = body->block) { - c = body->ext.case_list; + c = body->ext.block.case_list; /* Check F03:C815. */ if ((c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS) @@ -7744,7 +7744,7 @@ resolve_select_type (gfc_code *code, gfc_namespace *old_ns) { gfc_error ("The DEFAULT CASE at %L cannot be followed " "by a second DEFAULT CASE at %L", - &default_case->ext.case_list->where, &c->where); + &default_case->ext.block.case_list->where, &c->where); error++; continue; } @@ -7799,7 +7799,7 @@ resolve_select_type (gfc_code *code, gfc_namespace *old_ns) /* Loop over TYPE IS / CLASS IS cases. */ for (body = code->block; body; body = body->block) { - c = body->ext.case_list; + c = body->ext.block.case_list; if (c->ts.type == BT_DERIVED) c->low = c->high = gfc_get_int_expr (gfc_default_integer_kind, NULL, @@ -7845,7 +7845,7 @@ resolve_select_type (gfc_code *code, gfc_namespace *old_ns) body = code; while (body && body->block) { - if (body->block->ext.case_list->ts.type == BT_CLASS) + if (body->block->ext.block.case_list->ts.type == BT_CLASS) { /* Add to class_is list. */ if (class_is == NULL) @@ -7878,8 +7878,8 @@ resolve_select_type (gfc_code *code, gfc_namespace *old_ns) tail->block = gfc_get_code (); tail = tail->block; tail->op = EXEC_SELECT_TYPE; - tail->ext.case_list = gfc_get_case (); - tail->ext.case_list->ts.type = BT_UNKNOWN; + tail->ext.block.case_list = gfc_get_case (); + tail->ext.block.case_list->ts.type = BT_UNKNOWN; tail->next = NULL; default_case = tail; } @@ -7897,15 +7897,16 @@ resolve_select_type (gfc_code *code, gfc_namespace *old_ns) { c2 = (*c1)->block; /* F03:C817 (check for doubles). */ - if ((*c1)->ext.case_list->ts.u.derived->hash_value - == c2->ext.case_list->ts.u.derived->hash_value) + if ((*c1)->ext.block.case_list->ts.u.derived->hash_value + == c2->ext.block.case_list->ts.u.derived->hash_value) { gfc_error ("Double CLASS IS block in SELECT TYPE " - "statement at %L", &c2->ext.case_list->where); + "statement at %L", + &c2->ext.block.case_list->where); return; } - if ((*c1)->ext.case_list->ts.u.derived->attr.extension - < c2->ext.case_list->ts.u.derived->attr.extension) + if ((*c1)->ext.block.case_list->ts.u.derived->attr.extension + < c2->ext.block.case_list->ts.u.derived->attr.extension) { /* Swap. */ (*c1)->block = c2->block; @@ -7940,7 +7941,7 @@ resolve_select_type (gfc_code *code, gfc_namespace *old_ns) new_st->expr1->value.function.actual->expr = gfc_get_variable_expr (code->expr1->symtree); new_st->expr1->value.function.actual->expr->where = code->loc; gfc_add_vptr_component (new_st->expr1->value.function.actual->expr); - vtab = gfc_find_derived_vtab (body->ext.case_list->ts.u.derived); + vtab = gfc_find_derived_vtab (body->ext.block.case_list->ts.u.derived); st = gfc_find_symtree (vtab->ns->sym_root, vtab->name); new_st->expr1->value.function.actual->next = gfc_get_actual_arglist (); new_st->expr1->value.function.actual->next->expr = gfc_get_variable_expr (st); |