Hi!

The depend(source) clause has NULL OMP_CLAUSE_DECL, it has just the
depend kind specified and no arguments.  So copy_tree_body_r shouldn't
check TREE_CODE on it without checking it is non-NULL.

Tested on x86_64-linux, committed to trunk.

2021-06-08  Jakub Jelinek  <ja...@redhat.com>

        PR c++/100957
        * tree-inline.c (copy_tree_body_r): For OMP_CLAUSE_DEPEND don't
        check TREE_CODE if OMP_CLAUSE_DECL is NULL.

        * g++.dg/gomp/doacross-2.C: New test.

--- gcc/tree-inline.c.jj        2021-06-07 09:25:30.541217037 +0200
+++ gcc/tree-inline.c   2021-06-08 10:40:07.013853127 +0200
@@ -1458,7 +1458,8 @@ copy_tree_body_r (tree *tp, int *walk_su
                   || OMP_CLAUSE_CODE (*tp) == OMP_CLAUSE_DEPEND))
        {
          tree t = OMP_CLAUSE_DECL (*tp);
-         if (TREE_CODE (t) == TREE_LIST
+         if (t
+             && TREE_CODE (t) == TREE_LIST
              && TREE_PURPOSE (t)
              && TREE_CODE (TREE_PURPOSE (t)) == TREE_VEC)
            {
--- gcc/testsuite/g++.dg/gomp/doacross-2.C.jj   2021-06-08 10:43:22.469121933 
+0200
+++ gcc/testsuite/g++.dg/gomp/doacross-2.C      2021-06-08 10:42:39.648720282 
+0200
@@ -0,0 +1,16 @@
+// PR c++/100957
+// { dg-do compile }
+
+struct S {
+  S ()
+  {
+  #pragma omp for ordered(2)
+    for (int i = 0; i < 32; ++i)
+      for (int j = 0; j < 32; ++j)
+       {
+       #pragma omp ordered depend(source)
+         ;
+       #pragma omp ordered depend(sink: i - 1, j - 1)
+       }
+  }
+};

        Jakub

Reply via email to