openmp: Fix ICE in [PR103705]

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.
This commit is contained in:
Chung-Lin Tang 2022-01-14 21:58:34 +08:00
parent 5d7de2bf3b
commit cd7484d05c
3 changed files with 18 additions and 2 deletions

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

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

View File

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