https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120753
--- Comment #7 from Tobias Burnus <burnus at gcc dot gnu.org> --- BTW: Workaround: double *tmp = u.t; #pragma omp target is_device_ptr(tmp) tmp[i] = 20; Additionally, a simple 'map(u)' will not map pointer members, keeping the address the same such that effectively* no 'is_device_ptr' is needed. Doing, e.g., map(u.A, u.t[:A]) would map the pointer do the attachment. [* there are few assumptions like sizeof(*void) being the same, 'unified_address' also does not harm, and I think there is no wording for it, but in practice is should work.]