diff options
author | Andre Vehreschild <vehre@gcc.gnu.org> | 2016-12-14 13:49:45 +0100 |
---|---|---|
committer | Andre Vehreschild <vehre@gcc.gnu.org> | 2016-12-14 13:49:45 +0100 |
commit | 8c92e4522ddd3015e19ec339fa18455078c30435 (patch) | |
tree | ed8425094da3122291186b03d4e3ee9a23706911 /gcc/fortran/trans-expr.c | |
parent | eb401400f59e4d1f28bbdc788c3234e0968081d7 (diff) | |
download | gcc-8c92e4522ddd3015e19ec339fa18455078c30435.zip gcc-8c92e4522ddd3015e19ec339fa18455078c30435.tar.gz gcc-8c92e4522ddd3015e19ec339fa18455078c30435.tar.bz2 |
re PR fortran/78780 ([Coarray] ICE in conv_caf_send, at fortran/trans-intrinsic.c:1936)
gcc/testsuite/ChangeLog:
2016-12-14 Andre Vehreschild <vehre@gcc.gnu.org>
PR fortran/78780
* gfortran.dg/coarray/alloc_comp_5.f90: New test.
* gfortran.dg/coarray_42.f90: New test.
gcc/fortran/ChangeLog:
2016-12-14 Andre Vehreschild <vehre@gcc.gnu.org>
PR fortran/78780
* trans-expr.c (gfc_trans_assignment_1): Improve check whether detour
caf-runtime routines is needed.
From-SVN: r243648
Diffstat (limited to 'gcc/fortran/trans-expr.c')
-rw-r--r-- | gcc/fortran/trans-expr.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 2f45d40..f908c25 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -9718,7 +9718,7 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag, bool scalar_to_array; tree string_length; int n; - bool maybe_workshare = false; + bool maybe_workshare = false, lhs_refs_comp = false, rhs_refs_comp = false; symbol_attribute lhs_caf_attr, rhs_caf_attr, lhs_attr; bool is_poly_assign; @@ -9758,8 +9758,8 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag, mode. */ if (flag_coarray == GFC_FCOARRAY_LIB) { - lhs_caf_attr = gfc_caf_attr (expr1); - rhs_caf_attr = gfc_caf_attr (expr2); + lhs_caf_attr = gfc_caf_attr (expr1, false, &lhs_refs_comp); + rhs_caf_attr = gfc_caf_attr (expr2, false, &rhs_refs_comp); } if (lss != gfc_ss_terminator) @@ -9959,10 +9959,19 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag, } else if (flag_coarray == GFC_FCOARRAY_LIB && lhs_caf_attr.codimension && rhs_caf_attr.codimension - && lhs_caf_attr.alloc_comp && rhs_caf_attr.alloc_comp) + && ((lhs_caf_attr.allocatable && lhs_refs_comp) + || (rhs_caf_attr.allocatable && rhs_refs_comp))) { + /* Only detour to caf_send[get][_by_ref] () when the lhs or rhs is an + allocatable component, because those need to be accessed via the + caf-runtime. No need to check for coindexes here, because resolve + has rewritten those already. */ gfc_code code; gfc_actual_arglist a1, a2; + /* Clear the structures to prevent accessing garbage. */ + memset (&code, '\0', sizeof (gfc_code)); + memset (&a1, '\0', sizeof (gfc_actual_arglist)); + memset (&a2, '\0', sizeof (gfc_actual_arglist)); a1.expr = expr1; a1.next = &a2; a2.expr = expr2; |