From d4b29c1370b2d3a6092b3f016618d8b7b0a53f06 Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Mon, 14 Jul 2014 22:40:12 +0200 Subject: [PATCH] trans-intrinsic.c (conv_intrinsic_atomic_ref): Fix handling for kind mismatch with -fcoarray=lib. 2014-06-14 Tobias Burnus * trans-intrinsic.c (conv_intrinsic_atomic_ref): Fix handling for kind mismatch with -fcoarray=lib. From-SVN: r212525 --- gcc/fortran/ChangeLog | 5 +++++ gcc/fortran/trans-intrinsic.c | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 44bc5e00768..2c362916a56 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2014-06-14 Tobias Burnus + + * trans-intrinsic.c (conv_intrinsic_atomic_ref): Fix handling + for kind mismatch with -fcoarray=lib. + 2014-07-12 Paul Thomas PR fortran/61780 diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c index 57b7f4d1b30..3de0b096759 100644 --- a/gcc/fortran/trans-intrinsic.c +++ b/gcc/fortran/trans-intrinsic.c @@ -8563,7 +8563,8 @@ conv_intrinsic_atomic_ref (gfc_code *code) atom = argse.expr; gfc_init_se (&argse, NULL); - if (gfc_option.coarray == GFC_FCOARRAY_LIB) + if (gfc_option.coarray == GFC_FCOARRAY_LIB + && code->ext.actual->expr->ts.kind == atom_expr->ts.kind) argse.want_pointer = 1; gfc_conv_expr (&argse, code->ext.actual->expr); gfc_add_block_to_block (&block, &argse.pre); @@ -8589,6 +8590,7 @@ conv_intrinsic_atomic_ref (gfc_code *code) if (gfc_option.coarray == GFC_FCOARRAY_LIB) { tree image_index, caf_decl, offset, token; + tree orig_value = NULL_TREE, vardecl = NULL_TREE; caf_decl = gfc_get_tree_for_caf_expr (atom_expr); if (TREE_CODE (TREE_TYPE (caf_decl)) == REFERENCE_TYPE) @@ -8601,6 +8603,14 @@ conv_intrinsic_atomic_ref (gfc_code *code) get_caf_token_offset (&token, &offset, caf_decl, atom, atom_expr); + /* Different type, need type conversion. */ + if (!POINTER_TYPE_P (TREE_TYPE (value))) + { + vardecl = gfc_create_var (TREE_TYPE (TREE_TYPE (atom)), "value"); + orig_value = value; + value = gfc_build_addr_expr (NULL_TREE, vardecl); + } + tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_atomic_ref, 7, token, offset, image_index, value, stat, build_int_cst (integer_type_node, @@ -8608,6 +8618,9 @@ conv_intrinsic_atomic_ref (gfc_code *code) build_int_cst (integer_type_node, (int) atom_expr->ts.kind)); gfc_add_expr_to_block (&block, tmp); + if (vardecl != NULL_TREE) + gfc_add_modify (&block, orig_value, + fold_convert (TREE_TYPE (orig_value), vardecl)); gfc_add_block_to_block (&block, &post_block); return gfc_finish_block (&block); }