re PR fortran/77500 (ICE in gfc_trans_omp_atomic, at fortran/trans-openmp.c:2822)
authorJakub Jelinek <jakub@redhat.com>
Thu, 8 Sep 2016 12:19:21 +0000 (14:19 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 8 Sep 2016 12:19:21 +0000 (14:19 +0200)
PR fortran/77500
* trans-openmp.c (gfc_trans_omp_atomic): For atomic write or
swap, don't try to look through GFC_ISYM_CONVERSION.  In other cases,
check that value.function.isym is non-NULL before dereferencing it.

* gfortran.dg/gomp/pr77500.f90: New test.

From-SVN: r240038

gcc/fortran/ChangeLog
gcc/fortran/trans-openmp.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/gomp/pr77500.f90 [new file with mode: 0644]

index 82513f4c5025f07a26828534ef6d37bbb322f624..a0be0741ff16a1e665fe02d6e0784f802b850a40 100644 (file)
@@ -1,3 +1,10 @@
+2016-09-08  Jakub Jelinek  <jakub@redhat.com>
+
+       PR fortran/77500
+       * trans-openmp.c (gfc_trans_omp_atomic): For atomic write or
+       swap, don't try to look through GFC_ISYM_CONVERSION.  In other cases,
+       check that value.function.isym is non-NULL before dereferencing it.
+
 2016-09-04  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/77391
index c0d676178712343601689efdb15ecf43d2816bda..e4a2975719e6676e1bca804337b6a572d4024022 100644 (file)
@@ -2818,7 +2818,11 @@ gfc_trans_omp_atomic (gfc_code *code)
   gfc_start_block (&block);
 
   expr2 = code->expr2;
-  if (expr2->expr_type == EXPR_FUNCTION
+  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)
     expr2 = expr2->value.function.actual->expr;
 
@@ -2857,6 +2861,7 @@ gfc_trans_omp_atomic (gfc_code *code)
          var = code->expr1->symtree->n.sym;
          expr2 = code->expr2;
          if (expr2->expr_type == EXPR_FUNCTION
+             && expr2->value.function.isym
              && expr2->value.function.isym->id == GFC_ISYM_CONVERSION)
            expr2 = expr2->value.function.actual->expr;
        }
@@ -2914,6 +2919,7 @@ gfc_trans_omp_atomic (gfc_code *code)
        }
       e = expr2->value.op.op1;
       if (e->expr_type == EXPR_FUNCTION
+         && e->value.function.isym
          && e->value.function.isym->id == GFC_ISYM_CONVERSION)
        e = e->value.function.actual->expr;
       if (e->expr_type == EXPR_VARIABLE
@@ -2927,6 +2933,7 @@ gfc_trans_omp_atomic (gfc_code *code)
        {
          e = expr2->value.op.op2;
          if (e->expr_type == EXPR_FUNCTION
+             && e->value.function.isym
              && e->value.function.isym->id == GFC_ISYM_CONVERSION)
            e = e->value.function.actual->expr;
          gcc_assert (e->expr_type == EXPR_VARIABLE
@@ -3041,6 +3048,7 @@ gfc_trans_omp_atomic (gfc_code *code)
          code = code->next;
          expr2 = code->expr2;
          if (expr2->expr_type == EXPR_FUNCTION
+             && expr2->value.function.isym
              && expr2->value.function.isym->id == GFC_ISYM_CONVERSION)
            expr2 = expr2->value.function.actual->expr;
 
index 9075d486511ef72cac21266ee7e1352947f1fadf..7cbb87abd0464813e5dc1008cc93fc110b87c674 100644 (file)
@@ -1,5 +1,8 @@
 2016-09-08  Jakub Jelinek  <jakub@redhat.com>
 
+       PR fortran/77500
+       * gfortran.dg/gomp/pr77500.f90: New test.
+
        PR fortran/77516
        * gfortran.dg/gomp/pr77516.f90: New test.
 
diff --git a/gcc/testsuite/gfortran.dg/gomp/pr77500.f90 b/gcc/testsuite/gfortran.dg/gomp/pr77500.f90
new file mode 100644 (file)
index 0000000..1572d5c
--- /dev/null
@@ -0,0 +1,9 @@
+! PR fortran/77500
+! { dg-do compile }
+
+program pr77500
+   real :: x
+!$omp atomic write
+   x = f()
+!$omp end atomic
+end