diff options
author | Tobias Burnus <burnus@net-b.de> | 2018-10-16 20:32:11 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2018-10-16 20:32:11 +0200 |
commit | 91ab2a1d6e137c2eaa6f8f5966b611bca700ef96 (patch) | |
tree | 93de0face33e8641d8622699028847418d7c8095 /gcc | |
parent | 21cebf90b6547434d1ccb3f09287d02c1e8d2004 (diff) | |
download | gcc-91ab2a1d6e137c2eaa6f8f5966b611bca700ef96.zip gcc-91ab2a1d6e137c2eaa6f8f5966b611bca700ef96.tar.gz gcc-91ab2a1d6e137c2eaa6f8f5966b611bca700ef96.tar.bz2 |
Handle form_team w/ function args
PR fortran/87556
* trans-stmt.c (form_team, change_team, sync_team):
Don't ignore argse.pre/argse.post.
From-SVN: r265211
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/trans-stmt.c | 59 |
2 files changed, 44 insertions, 21 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 4c5f17a..af57bde 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2018-10-16 Tobias Burnus <burnus@net-b.de> + + PR fortran/87556 + * trans-stmt.c (form_team, change_team, sync_team): + Don't ignore argse.pre/argse.post. + 2018-10-15 Paul Thomas <pault@gcc.gnu.org> Tobias Burnus <burnus@gcc.gnu.org> diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c index 6256e3f..130e67b 100644 --- a/gcc/fortran/trans-stmt.c +++ b/gcc/fortran/trans-stmt.c @@ -707,19 +707,30 @@ gfc_trans_form_team (gfc_code *code) { if (flag_coarray == GFC_FCOARRAY_LIB) { - gfc_se argse; - tree team_id,team_type; - gfc_init_se (&argse, NULL); - gfc_conv_expr_val (&argse, code->expr1); - team_id = fold_convert (integer_type_node, argse.expr); - gfc_init_se (&argse, NULL); - gfc_conv_expr_val (&argse, code->expr2); - team_type = gfc_build_addr_expr (ppvoid_type_node, argse.expr); + gfc_se se; + gfc_se argse1, argse2; + tree team_id, team_type, tmp; - return build_call_expr_loc (input_location, - gfor_fndecl_caf_form_team, 3, - team_id, team_type, - build_int_cst (integer_type_node, 0)); + gfc_init_se (&se, NULL); + gfc_init_se (&argse1, NULL); + gfc_init_se (&argse2, NULL); + gfc_start_block (&se.pre); + + gfc_conv_expr_val (&argse1, code->expr1); + gfc_conv_expr_val (&argse2, code->expr2); + team_id = fold_convert (integer_type_node, argse1.expr); + team_type = gfc_build_addr_expr (ppvoid_type_node, argse2.expr); + + gfc_add_block_to_block (&se.pre, &argse1.pre); + gfc_add_block_to_block (&se.pre, &argse2.pre); + tmp = build_call_expr_loc (input_location, + gfor_fndecl_caf_form_team, 3, + team_id, team_type, + build_int_cst (integer_type_node, 0)); + gfc_add_expr_to_block (&se.pre, tmp); + gfc_add_block_to_block (&se.pre, &argse1.post); + gfc_add_block_to_block (&se.pre, &argse2.post); + return gfc_finish_block (&se.pre); } else { @@ -738,15 +749,18 @@ gfc_trans_change_team (gfc_code *code) if (flag_coarray == GFC_FCOARRAY_LIB) { gfc_se argse; - tree team_type; + tree team_type, tmp; gfc_init_se (&argse, NULL); gfc_conv_expr_val (&argse, code->expr1); team_type = gfc_build_addr_expr (ppvoid_type_node, argse.expr); - return build_call_expr_loc (input_location, - gfor_fndecl_caf_change_team, 2, team_type, - build_int_cst (integer_type_node, 0)); + tmp = build_call_expr_loc (input_location, + gfor_fndecl_caf_change_team, 2, team_type, + build_int_cst (integer_type_node, 0)); + gfc_add_expr_to_block (&argse.pre, tmp); + gfc_add_block_to_block (&argse.pre, &argse.post); + return gfc_finish_block (&argse.pre); } else { @@ -785,16 +799,19 @@ gfc_trans_sync_team (gfc_code *code) if (flag_coarray == GFC_FCOARRAY_LIB) { gfc_se argse; - tree team_type; + tree team_type, tmp; gfc_init_se (&argse, NULL); gfc_conv_expr_val (&argse, code->expr1); team_type = gfc_build_addr_expr (ppvoid_type_node, argse.expr); - return build_call_expr_loc (input_location, - gfor_fndecl_caf_sync_team, 2, - team_type, - build_int_cst (integer_type_node, 0)); + tmp = build_call_expr_loc (input_location, + gfor_fndecl_caf_sync_team, 2, + team_type, + build_int_cst (integer_type_node, 0)); + gfc_add_expr_to_block (&argse.pre, tmp); + gfc_add_block_to_block (&argse.pre, &argse.post); + return gfc_finish_block (&argse.pre); } else { |