Clang implements `shared(n)` on `omp target teams` as firstprivate instead of shared. For example, n is not shared in the following example: ``` $ cat test.c #include <omp.h> #include <stdio.h> int main() { int n = 0; #pragma omp target teams shared(n) num_teams(2) #pragma omp parallel num_threads(1) { #pragma omp atomic update ++n; printf("n=%d, team=%d\n", n, omp_get_team_num()); } return 0; } $ clang -fopenmp test.c && ./a.out n=1, team=0 n=1, team=1 ``` However, if I split the `target teams` directive into two directives, I see results indicating n is shared: ``` $ cat test.c #include <omp.h> #include <stdio.h> int main() { int n = 0; #pragma omp target #pragma omp teams shared(n) num_teams(2) #pragma omp parallel num_threads(1) { #pragma omp atomic update ++n; printf("n=%d, team=%d\n", n, omp_get_team_num()); } return 0; } $ clang -fopenmp test.c && ./a.out n=1, team=0 n=2, team=1 ``` The LLVM IR shows that n is passed to the teams by value in the first case and by pointer in the second. This bugzilla was suggested at: https://reviews.llvm.org/D56113#1345047
It was already fixed. *** This bug has been marked as a duplicate of bug 43175 ***
The reproducer I reported here still reproduces the bug for me at fbaf835c5c51.
(In reply to Joel E. Denny from comment #2) > The reproducer I reported here still reproduces the bug for me at > fbaf835c5c51. Oops, marked the wrong bug as a duplicate, thanks for reopening.