diff options
author | Janus Weil <janus@gcc.gnu.org> | 2013-08-06 10:20:17 +0200 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2013-08-06 10:20:17 +0200 |
commit | 2cc6320da1118c535569815d208a07323a566e56 (patch) | |
tree | 36ce544e7013ec1c1973b3bcade5a12c30dd0bc1 /gcc/fortran/trans-expr.c | |
parent | 67d6162ac857b0ad8f2f86be7dca054af52f28d4 (diff) | |
download | gcc-2cc6320da1118c535569815d208a07323a566e56.zip gcc-2cc6320da1118c535569815d208a07323a566e56.tar.gz gcc-2cc6320da1118c535569815d208a07323a566e56.tar.bz2 |
re PR fortran/57306 ([OOP] [F08] ICE on valid with class pointer initialization)
2013-08-06 Janus Weil <janus@gcc.gnu.org>
PR fortran/57306
* class.c (gfc_class_null_initializer): Rename to
'gfc_class_initializer'. Treat non-NULL init-exprs.
* gfortran.h (gfc_class_null_initializer): Update prototype.
* trans-decl.c (gfc_get_symbol_decl): Treat class variables.
* trans-expr.c (gfc_conv_initializer): Ditto.
(gfc_trans_subcomponent_assign): Renamed gfc_class_null_initializer.
2013-08-06 Janus Weil <janus@gcc.gnu.org>
PR fortran/57306
* gfortran.dg/pointer_init_8.f90: New.
From-SVN: r201521
Diffstat (limited to 'gcc/fortran/trans-expr.c')
-rw-r--r-- | gcc/fortran/trans-expr.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 74e95b0..0801eee 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -5664,7 +5664,15 @@ gfc_conv_initializer (gfc_expr * expr, gfc_typespec * ts, tree type, } else if (pointer || procptr) { - if (!expr || expr->expr_type == EXPR_NULL) + if (ts->type == BT_CLASS && !procptr) + { + gfc_init_se (&se, NULL); + gfc_conv_structure (&se, gfc_class_initializer (ts, expr), 1); + gcc_assert (TREE_CODE (se.expr) == CONSTRUCTOR); + TREE_STATIC (se.expr) = 1; + return se.expr; + } + else if (!expr || expr->expr_type == EXPR_NULL) return fold_convert (type, null_pointer_node); else { @@ -5683,7 +5691,7 @@ gfc_conv_initializer (gfc_expr * expr, gfc_typespec * ts, tree type, case BT_CLASS: gfc_init_se (&se, NULL); if (ts->type == BT_CLASS && expr->expr_type == EXPR_NULL) - gfc_conv_structure (&se, gfc_class_null_initializer(ts, expr), 1); + gfc_conv_structure (&se, gfc_class_initializer (ts, expr), 1); else gfc_conv_structure (&se, expr, 1); gcc_assert (TREE_CODE (se.expr) == CONSTRUCTOR); @@ -5993,7 +6001,7 @@ gfc_trans_subcomponent_assign (tree dest, gfc_component * cm, gfc_expr * expr) { /* NULL initialization for CLASS components. */ tmp = gfc_trans_structure_assign (dest, - gfc_class_null_initializer (&cm->ts, expr)); + gfc_class_initializer (&cm->ts, expr)); gfc_add_expr_to_block (&block, tmp); } else if (cm->attr.dimension && !cm->attr.proc_pointer) |