openmp: Fix ICE in [PR103705]
authorChung-Lin Tang <cltang@codesourcery.com>
Fri, 14 Jan 2022 13:58:34 +0000 (21:58 +0800)
committerChung-Lin Tang <cltang@codesourcery.com>
Fri, 14 Jan 2022 13:58:34 +0000 (21:58 +0800)
Fix ICE for cases like:
  #pragma omp target update from(s[0].a[0:1])

where multiple ARRAY_REF nodes exist and require more than one peeling
during [c_]finish_omp_clauses.

PR c++/103705

gcc/c/ChangeLog:

* c-typeck.c (c_finish_omp_clauses): Also continue peeling off of
outer node for ARRAY_REFs.

gcc/cp/ChangeLog:

* semantics.c (finish_omp_clauses): Also continue peeling off of
outer node for ARRAY_REFs.

gcc/testsuite/ChangeLog:

* c-c++-common/gomp/pr103705.c: New test.

gcc/c/c-typeck.c
gcc/cp/semantics.c
gcc/testsuite/c-c++-common/gomp/pr103705.c [new file with mode: 0644]

index 8b492cf..ac6618e 100644 (file)
@@ -14929,7 +14929,8 @@ c_finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
                                t = TREE_OPERAND (t, 0);
                            }
                        }
-                     while (TREE_CODE (t) == COMPONENT_REF);
+                     while (TREE_CODE (t) == COMPONENT_REF
+                            || TREE_CODE (t) == ARRAY_REF);
 
                      if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
                          && OMP_CLAUSE_MAP_IMPLICIT (c)
index 00100b0..089ea5f 100644 (file)
@@ -7942,7 +7942,8 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
                                t = TREE_OPERAND (t, 0);
                            }
                        }
-                     while (TREE_CODE (t) == COMPONENT_REF);
+                     while (TREE_CODE (t) == COMPONENT_REF
+                            || TREE_CODE (t) == ARRAY_REF);
 
                      if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
                          && OMP_CLAUSE_MAP_IMPLICIT (c)
diff --git a/gcc/testsuite/c-c++-common/gomp/pr103705.c b/gcc/testsuite/c-c++-common/gomp/pr103705.c
new file mode 100644 (file)
index 0000000..bf4c706
--- /dev/null
@@ -0,0 +1,14 @@
+/* PR c++/103705 */
+/* { dg-do compile } */
+
+struct S
+{
+  int a[2];
+};
+
+int main (void)
+{
+  struct S s[1];
+  #pragma omp target update from(s[0].a[0:1])
+  return 0;
+}