Alessandro Fanfarillo wrote:
This email follows the previous without subject (sorry about that).
I think I'd prefer the following patch, which avoids a temporary if none is required. "value" is a pointer if the kind is the same (see kind check before) and if it is not a literal. Otherwise, it isn't a pointer and one needs to generate a temporary.
I do not quite understand why the current check doesn't work as both are integer(kind=4) but for some reasons one has a variant.
Additionally, I wonder whether one should add a test case – one probably should do – and of which kind (run test + fdump-tree-original?).
Tobias --- a/gcc/fortran/trans-intrinsic.c +++ b/gcc/fortran/trans-intrinsic.c @@ -8398,3 +8398,3 @@ conv_intrinsic_atomic_op (gfc_code *code) - if (TREE_TYPE (TREE_TYPE (atom)) != TREE_TYPE (TREE_TYPE (value))) + if (!POINTER_TYPE_P (TREE_TYPE (value))) {
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?