https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113905
--- Comment #1 from Tobias Burnus <burnus at gcc dot gnu.org> --- Ups, testcase was lost. Re-written from scratch: ------------------- int var1() { return 1; } int var2() { return 2; } #pragma omp declare variant (var1) match(construct={target}) #pragma omp declare variant (var2) match(construct={parallel}) int foo() { return 42; } #pragma omp declare variant (var2) match(construct={parallel}) #pragma omp declare variant (var2) match(construct={target}) int bar() { return 99; } int main() { __builtin_printf("foo: %d (expected: 42)\n", foo()); __builtin_printf("bar: %d (expected: 99)\n", bar()); #pragma omp parallel if(0) { __builtin_printf("foo<parallel>: %d (expected: 2)\n", foo()); __builtin_printf("bar<parallel>: %d (expected: 1)\n", bar()); } #pragma omp target //device(-1 /*omp_initial_device*/) { __builtin_printf("foo<target>: %d (expected: 1)\n", foo()); __builtin_printf("bar<target>: %d (expected: 2)\n", bar()); } }