diff options
author | Janus Weil <janus@gcc.gnu.org> | 2010-07-29 20:14:16 +0200 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2010-07-29 20:14:16 +0200 |
commit | b2a5eb7501657692da7d9d294758753e122b3691 (patch) | |
tree | a67dba99dceef9faa3716776308033df861b23c1 /gcc/fortran/trans.c | |
parent | a3378ceac91930adf5d5f2f95ca2874c14b6f6f1 (diff) | |
download | gcc-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.c | 14 |
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; |