This email follows the previous without subject (sorry about that). The attached patch solves the problem raised by the following code:
program atomic use iso_fortran_env implicit none integer :: me integer(atomic_int_kind) :: atom[*] me = this_image() call atomic_define(atom[1],0) sync all call ATOMIC_ADD (atom[1], me) if(me == 1) call atomic_ref(me,atom[1]) sync all write(*,*) me end program Ok for trunk?
2014-09-08 Alessandro Fanfarillo <fanfarillo....@gmail.com> Tobias Burnus <bur...@net-b.de> * trans-intrinsic.c (conv_intrinsic_atomic_op): Check for indirect reference for caf_atomic_op value. Index: gcc/fortran/trans-intrinsic.c =================================================================== *** gcc/fortran/trans-intrinsic.c (revision 215016) --- gcc/fortran/trans-intrinsic.c (working copy) *************** conv_intrinsic_atomic_op (gfc_code *code *** 8397,8407 **** image_index = integer_zero_node; if (TREE_TYPE (TREE_TYPE (atom)) != TREE_TYPE (TREE_TYPE (value))) ! { ! tmp = gfc_create_var (TREE_TYPE (TREE_TYPE (atom)), "value"); ! gfc_add_modify (&block, tmp, fold_convert (TREE_TYPE (tmp), value)); ! value = gfc_build_addr_expr (NULL_TREE, tmp); ! } gfc_get_caf_token_offset (&token, &offset, caf_decl, atom, atom_expr); --- 8397,8409 ---- image_index = integer_zero_node; if (TREE_TYPE (TREE_TYPE (atom)) != TREE_TYPE (TREE_TYPE (value))) ! { ! tmp = gfc_create_var (TREE_TYPE (TREE_TYPE (atom)), "value"); ! if (POINTER_TYPE_P (TREE_TYPE (value))) ! value = build_fold_indirect_ref_loc (input_location, value); ! gfc_add_modify (&block, tmp, fold_convert (TREE_TYPE (tmp), value)); ! value = gfc_build_addr_expr (NULL_TREE, tmp); ! } gfc_get_caf_token_offset (&token, &offset, caf_decl, atom, atom_expr);