https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96810
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|RESOLVED |REOPENED Last reconfirmed| |2020-08-28 Resolution|INVALID |--- Ever confirmed|0 |1 --- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Actually sorry, the diagnostics clang emits is not about the bug mentioned in the testcase, but about something different. And while the bug described in the comment is really hard to diagnose at compile time and in most cases impossible, what clang diagnoses is the fact that the target construct has implicit map(tofrom:A) clause and because the target data maps only a small part of it, it mapping in target construct will fail. Still, clang implements it incorrectly, it e.g. rejects: int A[30]; void foo (void) { #pragma omp target data map (A[0:4]) #pragma omp target A[2] = 0; } int main () { #pragma omp target data map (A) foo (); return 0; } or void bar (int *, int); void foo (void) { int A[30]; bar (A, 0); #pragma omp target data map (A[0:4]) #pragma omp target A[2] = 0; bar (A, 1); } Both are completely valid and e.g. the latter could work just fine at runtime if bar performs #pragma omp target enter data (arg1[:30]) for arg2 0 and exit data for arg2 non-zero. Perhaps a warning might be ok, but it still can have many false positives (unless the compiler can prove that the array can't be mapped before the outer target data).