diff options
author | Janus Weil <janus@gcc.gnu.org> | 2013-08-22 13:49:46 +0200 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2013-08-22 13:49:46 +0200 |
commit | a7a6a027f2034f4f92c63644744db1916c459678 (patch) | |
tree | 65f45bd5de66a632493d64ddad8b595ea9a715ec /gcc/fortran/match.c | |
parent | da6ca2b5ee8cf03215697da17fd7f1a4f21bf2ba (diff) | |
download | gcc-a7a6a027f2034f4f92c63644744db1916c459678.zip gcc-a7a6a027f2034f4f92c63644744db1916c459678.tar.gz gcc-a7a6a027f2034f4f92c63644744db1916c459678.tar.bz2 |
re PR fortran/58185 ([OOP] ICE when selector in SELECT TYPE is non-polymorphic)
2013-08-22 Janus Weil <janus@gcc.gnu.org>
PR fortran/58185
* match.c (copy_ts_from_selector_to_associate): Only build class
container for polymorphic selector. Some cleanup.
2013-08-22 Janus Weil <janus@gcc.gnu.org>
PR fortran/58185
* gfortran.dg/select_type_34.f90: New.
From-SVN: r201919
Diffstat (limited to 'gcc/fortran/match.c')
-rw-r--r-- | gcc/fortran/match.c | 42 |
1 files changed, 11 insertions, 31 deletions
diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c index 213a5a2..71e3862 100644 --- a/gcc/fortran/match.c +++ b/gcc/fortran/match.c @@ -5093,7 +5093,6 @@ copy_ts_from_selector_to_associate (gfc_expr *associate, gfc_expr *selector) { gfc_ref *ref; gfc_symbol *assoc_sym; - int i; assoc_sym = associate->symtree->n.sym; @@ -5104,9 +5103,8 @@ copy_ts_from_selector_to_associate (gfc_expr *associate, gfc_expr *selector) while (ref && ref->next) ref = ref->next; - if (selector->ts.type == BT_CLASS - && CLASS_DATA (selector)->as - && ref && ref->type == REF_ARRAY) + if (selector->ts.type == BT_CLASS && CLASS_DATA (selector)->as + && ref && ref->type == REF_ARRAY) { /* Ensure that the array reference type is set. We cannot use gfc_resolve_expr at this point, so the usable parts of @@ -5114,7 +5112,7 @@ copy_ts_from_selector_to_associate (gfc_expr *associate, gfc_expr *selector) if (ref->u.ar.type == AR_UNKNOWN) { ref->u.ar.type = AR_ELEMENT; - for (i = 0; i < ref->u.ar.dimen + ref->u.ar.codimen; i++) + for (int i = 0; i < ref->u.ar.dimen + ref->u.ar.codimen; i++) if (ref->u.ar.dimen_type[i] == DIMEN_RANGE || ref->u.ar.dimen_type[i] == DIMEN_VECTOR || (ref->u.ar.dimen_type[i] == DIMEN_UNKNOWN @@ -5133,37 +5131,19 @@ copy_ts_from_selector_to_associate (gfc_expr *associate, gfc_expr *selector) selector->rank = 0; } - if (selector->ts.type != BT_CLASS) + if (selector->rank) { - /* The correct class container has to be available. */ - if (selector->rank) - { - assoc_sym->attr.dimension = 1; - assoc_sym->as = gfc_get_array_spec (); - assoc_sym->as->rank = selector->rank; - assoc_sym->as->type = AS_DEFERRED; - } - else - assoc_sym->as = NULL; - - assoc_sym->ts.type = BT_CLASS; - assoc_sym->ts.u.derived = selector->ts.u.derived; - assoc_sym->attr.pointer = 1; - gfc_build_class_symbol (&assoc_sym->ts, &assoc_sym->attr, - &assoc_sym->as, false); + assoc_sym->attr.dimension = 1; + assoc_sym->as = gfc_get_array_spec (); + assoc_sym->as->rank = selector->rank; + assoc_sym->as->type = AS_DEFERRED; } else + assoc_sym->as = NULL; + + if (selector->ts.type == BT_CLASS) { /* The correct class container has to be available. */ - if (selector->rank) - { - assoc_sym->attr.dimension = 1; - assoc_sym->as = gfc_get_array_spec (); - assoc_sym->as->rank = selector->rank; - assoc_sym->as->type = AS_DEFERRED; - } - else - assoc_sym->as = NULL; assoc_sym->ts.type = BT_CLASS; assoc_sym->ts.u.derived = CLASS_DATA (selector)->ts.u.derived; assoc_sym->attr.pointer = 1; |