re PR fortran/92899 ([OpenMP] ICE in gfc_trans_omp_atomic, at fortran/trans-openmp.c:3769)

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
This commit is contained in:
Jakub Jelinek 2019-12-12 00:58:04 +01:00
parent f5c03155aa
commit f8ac7d8f35
4 changed files with 58 additions and 2 deletions

View 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

View 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)

View 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

View file

@ -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