diff options
author | Janus Weil <janus@gcc.gnu.org> | 2012-10-24 17:23:25 +0200 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2012-10-24 17:23:25 +0200 |
commit | 7780fd2a1329454aab5d3cfd4b1bd77294fa5ace (patch) | |
tree | 05b82f7d04e95db5d37e6b184f6e4dfb555dd2f3 /gcc/fortran/trans-expr.c | |
parent | c2d9083df222456f5d0f15d5a6ceca7a97ded8b9 (diff) | |
download | gcc-7780fd2a1329454aab5d3cfd4b1bd77294fa5ace.zip gcc-7780fd2a1329454aab5d3cfd4b1bd77294fa5ace.tar.gz gcc-7780fd2a1329454aab5d3cfd4b1bd77294fa5ace.tar.bz2 |
re PR fortran/55037 ([OOP] ICE with local allocatable variable of abstract type)
2012-10-24 Janus Weil <janus@gcc.gnu.org>
PR fortran/55037
* trans-expr.c (gfc_conv_procedure_call): Move a piece of code and
remove an assert.
2012-10-24 Janus Weil <janus@gcc.gnu.org>
PR fortran/55037
* gfortran.dg/class_dummy_4.f03: New.
From-SVN: r192768
Diffstat (limited to 'gcc/fortran/trans-expr.c')
-rw-r--r-- | gcc/fortran/trans-expr.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index b4f9f26..b0bd7f5 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -4180,13 +4180,6 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, CLASS_DATA (fsym)->attr.class_pointer || CLASS_DATA (fsym)->attr.allocatable); - if (fsym && (fsym->ts.type == BT_DERIVED - || fsym->ts.type == BT_ASSUMED) - && e->ts.type == BT_CLASS - && !CLASS_DATA (e)->attr.dimension - && !CLASS_DATA (e)->attr.codimension) - parmse.expr = gfc_class_data_get (parmse.expr); - /* If an ALLOCATABLE dummy argument has INTENT(OUT) and is allocated on entry, it must be deallocated. */ if (fsym && fsym->attr.intent == INTENT_OUT @@ -4215,7 +4208,6 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, if (fsym->ts.type == BT_CLASS) { gfc_symbol *vtab; - gcc_assert (fsym->ts.u.derived == e->ts.u.derived); vtab = gfc_find_derived_vtab (fsym->ts.u.derived); tmp = gfc_get_symbol_decl (vtab); tmp = gfc_build_addr_expr (NULL_TREE, tmp); @@ -4241,6 +4233,13 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, gfc_add_expr_to_block (&se->pre, tmp); } + if (fsym && (fsym->ts.type == BT_DERIVED + || fsym->ts.type == BT_ASSUMED) + && e->ts.type == BT_CLASS + && !CLASS_DATA (e)->attr.dimension + && !CLASS_DATA (e)->attr.codimension) + parmse.expr = gfc_class_data_get (parmse.expr); + /* Wrap scalar variable in a descriptor. We need to convert the address of a pointer back to the pointer itself before, we can assign it to the data field. */ |