1db39021cSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck %s
2db39021cSAlexey Bataev // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s
3db39021cSAlexey Bataev // RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
4a8a9153aSAlexey Bataev
5a8a9153aSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s | FileCheck %s
6a8a9153aSAlexey Bataev // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s
7a8a9153aSAlexey Bataev // RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
8d1e40fbfSAlexey Bataev // expected-no-diagnostics
9d1e40fbfSAlexey Bataev
10d1e40fbfSAlexey Bataev #ifndef HEADER
11d1e40fbfSAlexey Bataev #define HEADER
12d1e40fbfSAlexey Bataev
foo()13d1e40fbfSAlexey Bataev void foo() {}
14d1e40fbfSAlexey Bataev
15e122da19SAlexey Bataev struct SS {
16e122da19SAlexey Bataev int a;
17e122da19SAlexey Bataev int b : 4;
18e122da19SAlexey Bataev int &c;
SSSS19e122da19SAlexey Bataev SS(int &d) : a(0), b(0), c(d) {
20e122da19SAlexey Bataev #pragma omp parallel firstprivate(a, b, c)
21e122da19SAlexey Bataev #pragma omp single copyprivate(a, this->b, (this)->c)
22e122da19SAlexey Bataev // CHECK: #pragma omp parallel firstprivate(this->a,this->b,this->c)
23cbecfdfeSAlexey Bataev // CHECK-NEXT: #pragma omp single copyprivate(this->a,this->b,this->c){{$}}
24e122da19SAlexey Bataev ++this->a, --b, (this)->c /= 1;
25e122da19SAlexey Bataev }
26e122da19SAlexey Bataev };
27e122da19SAlexey Bataev
28e122da19SAlexey Bataev template<typename T>
29e122da19SAlexey Bataev struct SST {
30e122da19SAlexey Bataev T a;
SSTSST31e122da19SAlexey Bataev SST() : a(T()) {
32e122da19SAlexey Bataev // CHECK: #pragma omp parallel firstprivate(this->a)
33e122da19SAlexey Bataev // CHECK-NEXT: #pragma omp single copyprivate(this->a)
34e122da19SAlexey Bataev // CHECK: #pragma omp parallel firstprivate(this->a)
35e122da19SAlexey Bataev // CHECK-NEXT: #pragma omp single copyprivate(this->a)
36e122da19SAlexey Bataev #pragma omp parallel firstprivate(a)
37e122da19SAlexey Bataev #pragma omp single copyprivate(this->a)
38e122da19SAlexey Bataev ++this->a;
39e122da19SAlexey Bataev }
40e122da19SAlexey Bataev };
41e122da19SAlexey Bataev
42d1e40fbfSAlexey Bataev template <class T, int N>
tmain(T argc)43d1e40fbfSAlexey Bataev T tmain(T argc) {
44d1e40fbfSAlexey Bataev T b = argc, c, d, e, f, g;
45d1e40fbfSAlexey Bataev static T a;
46e122da19SAlexey Bataev SST<T> sst;
47d1e40fbfSAlexey Bataev // CHECK: static T a;
48bae9a793SAlexey Bataev #pragma omp parallel private(g)
49*e04483eeSAlexey Bataev #pragma omp single private(argc, b), firstprivate(c, d), nowait allocate(d)
50d1e40fbfSAlexey Bataev foo();
51e122da19SAlexey Bataev // CHECK: #pragma omp parallel private(g)
52*e04483eeSAlexey Bataev // CHECK-NEXT: #pragma omp single private(argc,b) firstprivate(c,d) nowait allocate(d)
533255bf3aSAlexey Bataev // CHECK-NEXT: foo();
543255bf3aSAlexey Bataev #pragma omp parallel private(g)
55*e04483eeSAlexey Bataev #pragma omp single allocate(argc) private(argc, b), firstprivate(c, d), copyprivate(g)
563255bf3aSAlexey Bataev foo();
573255bf3aSAlexey Bataev // CHECK-NEXT: #pragma omp parallel private(g)
58*e04483eeSAlexey Bataev // CHECK-NEXT: #pragma omp single allocate(argc) private(argc,b) firstprivate(c,d) copyprivate(g)
59d1e40fbfSAlexey Bataev // CHECK-NEXT: foo();
60d1e40fbfSAlexey Bataev return T();
61d1e40fbfSAlexey Bataev }
62d1e40fbfSAlexey Bataev
main(int argc,char ** argv)63d1e40fbfSAlexey Bataev int main(int argc, char **argv) {
64a67a4d2fSSerge Pavlov // CHECK: int main(int argc, char **argv) {
65d1e40fbfSAlexey Bataev int b = argc, c, d, e, f, g;
66d1e40fbfSAlexey Bataev static int a;
67e122da19SAlexey Bataev SS ss(a);
68d1e40fbfSAlexey Bataev // CHECK: static int a;
69bae9a793SAlexey Bataev #pragma omp parallel private(g)
703255bf3aSAlexey Bataev #pragma omp single private(argc, b), firstprivate(argv, c), nowait
71d1e40fbfSAlexey Bataev foo();
72e122da19SAlexey Bataev // CHECK: #pragma omp parallel private(g)
733255bf3aSAlexey Bataev // CHECK-NEXT: #pragma omp single private(argc,b) firstprivate(argv,c) nowait
743255bf3aSAlexey Bataev // CHECK-NEXT: foo();
753255bf3aSAlexey Bataev #pragma omp parallel private(g)
763255bf3aSAlexey Bataev #pragma omp single private(argc, b), firstprivate(c, d), copyprivate(g)
773255bf3aSAlexey Bataev foo();
783255bf3aSAlexey Bataev // CHECK-NEXT: #pragma omp parallel private(g)
793255bf3aSAlexey Bataev // CHECK-NEXT: #pragma omp single private(argc,b) firstprivate(c,d) copyprivate(g)
80d1e40fbfSAlexey Bataev // CHECK-NEXT: foo();
81d1e40fbfSAlexey Bataev return (tmain<int, 5>(argc) + tmain<char, 1>(argv[0][0]));
82d1e40fbfSAlexey Bataev }
83d1e40fbfSAlexey Bataev
84d1e40fbfSAlexey Bataev #endif
85