aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans.c
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2010-07-29 20:14:16 +0200
committerJanus Weil <janus@gcc.gnu.org>2010-07-29 20:14:16 +0200
commitb2a5eb7501657692da7d9d294758753e122b3691 (patch)
treea67dba99dceef9faa3716776308033df861b23c1 /gcc/fortran/trans.c
parenta3378ceac91930adf5d5f2f95ca2874c14b6f6f1 (diff)
downloadgcc-b2a5eb7501657692da7d9d294758753e122b3691.zip
gcc-b2a5eb7501657692da7d9d294758753e122b3691.tar.gz
gcc-b2a5eb7501657692da7d9d294758753e122b3691.tar.bz2
re PR fortran/45004 ([OOP] Segfault with allocatable scalars and move_alloc)
2010-07-29 Janus Weil <janus@gcc.gnu.org> PR fortran/45004 * trans-stmt.h (gfc_trans_class_init_assign): New prototype. (gfc_trans_class_assign): Modified prototype. * trans.h (gfc_conv_intrinsic_move_alloc): New prototype. * trans-expr.c (gfc_trans_class_init_assign): Split off from ... (gfc_trans_class_assign): ... here. Modified actual arguments. * trans-intrinsic.c (gfc_conv_intrinsic_move_alloc): New function to handle the MOVE_ALLOC intrinsic with scalar and class arguments. * trans.c (trans_code): Call 'gfc_conv_intrinsic_move_alloc'. 2010-07-29 Janus Weil <janus@gcc.gnu.org> PR fortran/45004 * gfortran.dg/move_alloc_2.f90: New. From-SVN: r162688
Diffstat (limited to 'gcc/fortran/trans.c')
-rw-r--r--gcc/fortran/trans.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/gcc/fortran/trans.c b/gcc/fortran/trans.c
index 4bd4f3b..e266be8 100644
--- a/gcc/fortran/trans.c
+++ b/gcc/fortran/trans.c
@@ -1093,7 +1093,7 @@ trans_code (gfc_code * code, tree cond)
case EXEC_ASSIGN:
if (code->expr1->ts.type == BT_CLASS)
- res = gfc_trans_class_assign (code);
+ res = gfc_trans_class_assign (code->expr1, code->expr2, code->op);
else
res = gfc_trans_assign (code);
break;
@@ -1104,14 +1104,14 @@ trans_code (gfc_code * code, tree cond)
case EXEC_POINTER_ASSIGN:
if (code->expr1->ts.type == BT_CLASS)
- res = gfc_trans_class_assign (code);
+ res = gfc_trans_class_assign (code->expr1, code->expr2, code->op);
else
res = gfc_trans_pointer_assign (code);
break;
case EXEC_INIT_ASSIGN:
if (code->expr1->ts.type == BT_CLASS)
- res = gfc_trans_class_assign (code);
+ res = gfc_trans_class_init_assign (code);
else
res = gfc_trans_init_assign (code);
break;
@@ -1157,8 +1157,12 @@ trans_code (gfc_code * code, tree cond)
if (code->resolved_isym
&& code->resolved_isym->id == GFC_ISYM_MVBITS)
is_mvbits = true;
- res = gfc_trans_call (code, is_mvbits, NULL_TREE,
- NULL_TREE, false);
+ if (code->resolved_isym
+ && code->resolved_isym->id == GFC_ISYM_MOVE_ALLOC)
+ res = gfc_conv_intrinsic_move_alloc (code);
+ else
+ res = gfc_trans_call (code, is_mvbits, NULL_TREE,
+ NULL_TREE, false);
}
break;