re PR fortran/92899 ([OpenMP] ICE in gfc_trans_omp_atomic, at fortran/trans-openmp...
authorJakub Jelinek <jakub@gcc.gnu.org>
Wed, 11 Dec 2019 23:58:04 +0000 (00:58 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 11 Dec 2019 23:58:04 +0000 (00:58 +0100)
PR fortran/92899
* trans-openmp.c (gfc_trans_omp_atomic): For GFC_OMP_ATOMIC_SWAP,
do look through conversion on expr2 if any.

* testsuite/libgomp.fortran/atomic1.f90: New test.

From-SVN: r279266

gcc/fortran/ChangeLog
gcc/fortran/trans-openmp.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.fortran/atomic1.f90 [new file with mode: 0644]

index 474c0a4b676d5ebec319987b6c5c76e1b84cd8cc..5fae7f295e139dc707fd4daf6fa950d448c25f7f 100644 (file)
@@ -1,4 +1,10 @@
-2019-12-11 Steven G. Kargl  <kargl@gcc.gnu.org>
+2019-12-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR fortran/92899
+       * trans-openmp.c (gfc_trans_omp_atomic): For GFC_OMP_ATOMIC_SWAP,
+       do look through conversion on expr2 if any.
+
+2019-12-11  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/92897
        * array.c (gfc_set_array_spec):  Remove invalid assert() triggered
index 356fd04e6c3ee0e9b44fcf2b58a24162a1438e39..b6da7b983d5e79115dc0e18676df91bb5bb67fd0 100644 (file)
@@ -3534,7 +3534,6 @@ gfc_trans_omp_atomic (gfc_code *code)
   expr2 = code->expr2;
   if (((atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_MASK)
        != GFC_OMP_ATOMIC_WRITE)
-      && (atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_SWAP) == 0
       && expr2->expr_type == EXPR_FUNCTION
       && expr2->value.function.isym
       && expr2->value.function.isym->id == GFC_ISYM_CONVERSION)
index e5fb05aea6dd72c44c1851ccfffea5386b0d0653..dda2d9a09fc6f3c7b2933479c7661ac95cf8984f 100644 (file)
@@ -1,3 +1,8 @@
+2019-12-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR fortran/92899
+       * testsuite/libgomp.fortran/atomic1.f90: New test.
+
 2019-12-11  Thomas Schwinge  <thomas@codesourcery.com>
 
        PR libgomp/92843
diff --git a/libgomp/testsuite/libgomp.fortran/atomic1.f90 b/libgomp/testsuite/libgomp.fortran/atomic1.f90
new file mode 100644 (file)
index 0000000..e0c1353
--- /dev/null
@@ -0,0 +1,46 @@
+! PR fortran/92899
+
+program pr92899
+  real :: x = 1.0
+  double precision :: y
+  integer(kind=4) :: z = 4
+  integer(kind=8) :: w
+  !$omp atomic capture
+  y = x
+  x = 2.0
+  !$omp end atomic
+  if (y /= 1.0 .or. x /= 2.0) stop 1
+  !$omp atomic capture
+  x = y
+  y = 3.0
+  !$omp end atomic
+  if (x /= 1.0 .or. y /= 3.0) stop 2
+  !$omp atomic capture
+  w = z
+  z = 5
+  !$omp end atomic
+  if (w /= 4 .or. z /= 5) stop 3
+  !$omp atomic capture
+  z = w
+  w = 6
+  !$omp end atomic
+  if (z /= 4 .or. w /= 6) stop 4
+  !$omp atomic write
+  x = y
+  !$omp end atomic
+  if (x /= 3.0 .or. y /= 3.0) stop 5
+  x = 7.0
+  !$omp atomic write
+  y = x
+  !$omp end atomic
+  if (x /= 7.0 .or. y /= 7.0) stop 6
+  !$omp atomic write
+  z = w
+  !$omp end atomic
+  if (z /= 6 .or. w /= 6) stop 7
+  z = 8
+  !$omp atomic write
+  w = z
+  !$omp end atomic
+  if (z /= 8 .or. w /= 8) stop 8
+end