https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118694
Bug ID: 118694
Summary: OpenMP: target/metadirective/teams directive nesting
gives error
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
Assignee: unassigned at gcc dot gnu.org
Reporter: sandra at gcc dot gnu.org
CC: burnus at gcc dot gnu.org
Target Milestone: ---
As noted by Tobias here:
https://gcc.gnu.org/pipermail/gcc-patches/2025-January/674546.html
<snip>
* Unless it is quickly fixable, we agreed on deferring the bogus message
"Error: ‘target’ construct with nested ‘teams’ construct contains directives
outside of the ‘teams’ construct"
to a new PR. That's for:
OpenMP_VV's tests/5.0/metadirective/test_metadirective_arch_is_nvidia.F90
tests/5.0/metadirective/test_metadirective_arch_is_nvidia.F90:42:84:
42 | !$omp target map(to:v1,v2) map(from:v3,target_device_num)
device(default_device)
|
^
Error: ‘target’ construct with nested ‘teams’ construct
contains directives outside of the ‘teams’ construct
Likewise with the OpenMP examples document:
program_control/sources/metadirective.1.f90:12:53:
12 | !$omp target map(to:v1,v2) map(from:v3) device(0)
| ^
Error: ‘target’ construct with nested ‘teams’ construct contains directives
outside of the ‘teams’ construct
</snip>
The issue here is that the OpenMP spec says (version 6.0, bottom of page 395)
"A teams region must be a strictly nested region of the implicit parallel
region that surrounds the whole OpenMP program or a target region. If a teams
region is nested inside a target region, the corresponding target construct
must not contain any statements, declarations or directives outside of the
corresponding teams construct."
It's not clear to me that this language permits "metadirective" between
"target" and "teams", but the existence of examples seems to indicate that's
the intent. When the metadirective contains only static selectors and can be
resolved in the front end or during gimplification, this is accepted, but if it
requires late resolution and/or includes dynamic selectors, then the gimplifier
inserts some additional code around the directive variants, which triggers the
error. I'm doubtful that anything can be done about the dynamic selector case
except maybe a better error message, though.