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?