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

Reply via email to