xref: /llvm-project/clang/test/OpenMP/default_firstprivate_ast_print.cpp (revision 0c6f2f629cc0017361310fa4c132090413a874db)
17aa9c393SJennifer Yu // expected-no-diagnostics
27aa9c393SJennifer Yu 
3*0c6f2f62SAnimesh Kumar //RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \
47aa9c393SJennifer Yu //RUN:   -x c++ -std=c++14 -fexceptions -fcxx-exceptions                   \
57aa9c393SJennifer Yu //RUN:   -Wno-source-uses-openmp -Wno-openmp-clauses                       \
67aa9c393SJennifer Yu //RUN:   -ast-print %s | FileCheck %s --check-prefix=PRINT
77aa9c393SJennifer Yu 
8*0c6f2f62SAnimesh Kumar //RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \
97aa9c393SJennifer Yu //RUN:   -x c++ -std=c++14 -fexceptions -fcxx-exceptions                   \
107aa9c393SJennifer Yu //RUN:   -Wno-source-uses-openmp -Wno-openmp-clauses                       \
117aa9c393SJennifer Yu //RUN:   -ast-dump %s | FileCheck %s --check-prefix=DUMP
127aa9c393SJennifer Yu 
13*0c6f2f62SAnimesh Kumar //RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \
147aa9c393SJennifer Yu //RUN:   -x c++ -std=c++14 -fexceptions -fcxx-exceptions                   \
157aa9c393SJennifer Yu //RUN:   -Wno-source-uses-openmp -Wno-openmp-clauses                       \
167aa9c393SJennifer Yu //RUN:   -emit-pch -o %t %s
177aa9c393SJennifer Yu 
18*0c6f2f62SAnimesh Kumar //RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \
197aa9c393SJennifer Yu //RUN:   -x c++ -std=c++14 -fexceptions -fcxx-exceptions                   \
207aa9c393SJennifer Yu //RUN:   -Wno-source-uses-openmp -Wno-openmp-clauses                       \
217aa9c393SJennifer Yu //RUN:   -include-pch %t -ast-print %s | FileCheck %s --check-prefix=PRINT
227aa9c393SJennifer Yu 
23*0c6f2f62SAnimesh Kumar //RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \
247aa9c393SJennifer Yu //RUN:   -x c++ -std=c++14 -fexceptions -fcxx-exceptions                   \
257aa9c393SJennifer Yu //RUN:   -Wno-source-uses-openmp -Wno-openmp-clauses                       \
267aa9c393SJennifer Yu //RUN:   -include-pch %t -ast-dump-all %s | FileCheck %s --check-prefix=DUMP
277aa9c393SJennifer Yu 
287aa9c393SJennifer Yu #ifndef HEADER
297aa9c393SJennifer Yu #define HEADER
307aa9c393SJennifer Yu 
317aa9c393SJennifer Yu struct SomeKernel {
327aa9c393SJennifer Yu   int targetDev;
337aa9c393SJennifer Yu   float devPtr;
347aa9c393SJennifer Yu   SomeKernel();
357aa9c393SJennifer Yu   ~SomeKernel();
367aa9c393SJennifer Yu 
377aa9c393SJennifer Yu   template <unsigned int nRHS>
applySomeKernel387aa9c393SJennifer Yu   void apply() {
397aa9c393SJennifer Yu #pragma omp parallel default(firstprivate)
407aa9c393SJennifer Yu     {
41927156a6SJennifer Yu       [=]() -> int {
42927156a6SJennifer Yu         return targetDev++;
43927156a6SJennifer Yu       }();
447aa9c393SJennifer Yu     }
457aa9c393SJennifer Yu     // PRINT: #pragma omp parallel default(firstprivate)
467aa9c393SJennifer Yu     // PRINT-NEXT: {
47927156a6SJennifer Yu     // PRINT-NEXT:  [=]() -> int {
48927156a6SJennifer Yu     // PRINT-NEXT:     return this->targetDev++;
49927156a6SJennifer Yu     // PRINT-NEXT:  }();
50927156a6SJennifer Yu     // PRINT-NEXT: }
517aa9c393SJennifer Yu     // DUMP: -OMPParallelDirective
52927156a6SJennifer Yu     // DUMP-NEXT: -OMPDefaultClause
53927156a6SJennifer Yu     // DUMP-NOT:   -OMPFirstprivateClause
547aa9c393SJennifer Yu   }
557aa9c393SJennifer Yu   // PRINT: template<> void apply<32U>()
567aa9c393SJennifer Yu   // PRINT: #pragma omp parallel default(firstprivate)
577aa9c393SJennifer Yu   // PRINT-NEXT: {
58927156a6SJennifer Yu   // PRINT-NEXT:  [=]() -> int {
59927156a6SJennifer Yu   // PRINT-NEXT:     return this->targetDev++;
60927156a6SJennifer Yu   // PRINT-NEXT:  }();
617aa9c393SJennifer Yu   // CHECK-NEXT: }
627aa9c393SJennifer Yu   // DUMP: -OMPParallelDirective
637aa9c393SJennifer Yu   // DUMP-NEXT: -OMPDefaultClause
64927156a6SJennifer Yu   // DUMP-NEXT: -OMPFirstprivateClause
65927156a6SJennifer Yu   // DUMP-NEXT:   -DeclRefExpr {{.*}} 'targetDev'
667aa9c393SJennifer Yu };
677aa9c393SJennifer Yu 
use_template()687aa9c393SJennifer Yu void use_template() {
697aa9c393SJennifer Yu   SomeKernel aKern;
707aa9c393SJennifer Yu   aKern.apply<32>();
717aa9c393SJennifer Yu }
727aa9c393SJennifer Yu 
foo()737aa9c393SJennifer Yu void foo() {
747aa9c393SJennifer Yu   int a;
757aa9c393SJennifer Yu #pragma omp parallel default(firstprivate)
767aa9c393SJennifer Yu   a++;
777aa9c393SJennifer Yu   // PRINT: #pragma omp parallel default(firstprivate)
787aa9c393SJennifer Yu   // PRINT-NEXT: a++;
797aa9c393SJennifer Yu   // DUMP: -OMPParallelDirective
807aa9c393SJennifer Yu   // DUMP-NEXT:  -OMPDefaultClause
817aa9c393SJennifer Yu   // DUMP-NEXT:  -OMPFirstprivateClause {{.*}} <implicit>
827aa9c393SJennifer Yu   // DUMP-NEXT:   -DeclRefExpr {{.*}} 'a'
837aa9c393SJennifer Yu }
847aa9c393SJennifer Yu 
857aa9c393SJennifer Yu struct St {
867aa9c393SJennifer Yu   int a, b;
877aa9c393SJennifer Yu   static int y;
StSt887aa9c393SJennifer Yu   St() : a(0), b(0) {}
~StSt897aa9c393SJennifer Yu   ~St() {}
907aa9c393SJennifer Yu };
917aa9c393SJennifer Yu int St::y = 0;
bar()927aa9c393SJennifer Yu void bar() {
937aa9c393SJennifer Yu   St a = St();
947aa9c393SJennifer Yu   static int yy = 0;
957aa9c393SJennifer Yu #pragma omp parallel default(firstprivate)
967aa9c393SJennifer Yu   {
977aa9c393SJennifer Yu     a.a += 1;
987aa9c393SJennifer Yu     a.b += 1;
997aa9c393SJennifer Yu     a.y++;
1007aa9c393SJennifer Yu     yy++;
1017aa9c393SJennifer Yu     St::y++;
1027aa9c393SJennifer Yu   }
1037aa9c393SJennifer Yu   // PRINT: #pragma omp parallel default(firstprivate)
1047aa9c393SJennifer Yu   // DUMP: -OMPParallelDirective
1057aa9c393SJennifer Yu   // DUMP-NEXT: -OMPDefaultClause
1067aa9c393SJennifer Yu   // DUMP-NEXT: -OMPFirstprivateClause {{.*}} <implicit>
1077aa9c393SJennifer Yu   // DUMP-NEXT: -DeclRefExpr {{.*}} 'a'
1087aa9c393SJennifer Yu   // DUMP-NEXT: -DeclRefExpr {{.*}} 'yy'
1097aa9c393SJennifer Yu   // DUMP-NEXT: -DeclRefExpr {{.*}} 'y'
1107aa9c393SJennifer Yu }
111927156a6SJennifer Yu void zoo(int);
112927156a6SJennifer Yu struct A {
113927156a6SJennifer Yu   int z;
114927156a6SJennifer Yu   int f;
115927156a6SJennifer Yu   A();
116927156a6SJennifer Yu   ~A();
fooA117927156a6SJennifer Yu   void foo() {
118927156a6SJennifer Yu #pragma omp parallel firstprivate(z) default(firstprivate)
119927156a6SJennifer Yu     {
120927156a6SJennifer Yu       z++;
121927156a6SJennifer Yu       f++;
122927156a6SJennifer Yu       zoo(z + f);
123927156a6SJennifer Yu       f++;
124927156a6SJennifer Yu     }
125927156a6SJennifer Yu   }
126927156a6SJennifer Yu   // PRINT:  #pragma omp parallel firstprivate(this->z) default(firstprivate)
127927156a6SJennifer Yu   // DUMP:   -OMPParallelDirective
128927156a6SJennifer Yu   // DUMP-NEXT: -OMPFirstprivateClause
129927156a6SJennifer Yu   // DUMP-NEXT: -DeclRefExpr {{.*}} 'z'
130927156a6SJennifer Yu   // DUMP-NEXT: -OMPDefaultClause
131927156a6SJennifer Yu   // DUMP-NEXT: -OMPFirstprivateClause {{.*}} <implicit>
132927156a6SJennifer Yu   // DUMP-NEXT: -DeclRefExpr {{.*}} 'f'
133927156a6SJennifer Yu   // DUMP:      -CXXThisExpr {{.*}} 'A *' implicit this
134927156a6SJennifer Yu   // DUMP-NEXT: -DeclRefExpr {{.*}} 'z'
135927156a6SJennifer Yu   // DUMP-NEXT: -DeclRefExpr {{.*}} 'f'
barA136927156a6SJennifer Yu   void bar() {
137927156a6SJennifer Yu #pragma omp parallel firstprivate(z) default(firstprivate)
138927156a6SJennifer Yu     {
139927156a6SJennifer Yu #pragma omp parallel private(z) default(firstprivate)
140927156a6SJennifer Yu       {
141927156a6SJennifer Yu         z++;
142927156a6SJennifer Yu         f++;
143927156a6SJennifer Yu         zoo(z + f);
144927156a6SJennifer Yu         f++;
145927156a6SJennifer Yu       }
146927156a6SJennifer Yu     }
147927156a6SJennifer Yu   }
148927156a6SJennifer Yu   // PRINT:  #pragma omp parallel firstprivate(this->z) default(firstprivate)
149927156a6SJennifer Yu   // PRINT:    #pragma omp parallel private(this->z) default(firstprivate)
150927156a6SJennifer Yu   // DUMP:     -OMPParallelDirective
151927156a6SJennifer Yu   // DUMP-NEXT: -OMPFirstprivateClause
152927156a6SJennifer Yu   // DUMP-NEXT:  -DeclRefExpr {{.*}} 'z'
153927156a6SJennifer Yu   // DUMP-NEXT:  -OMPDefaultClause
154927156a6SJennifer Yu   // DUMP:        -OMPParallelDirective
155927156a6SJennifer Yu   // DUMP-NEXT:    -OMPPrivateClaus
156927156a6SJennifer Yu   // DUMP-NEXT:     -DeclRefExpr {{.*}} 'z'
157927156a6SJennifer Yu   // DUMP-NEXT:     -OMPDefaultClause
158927156a6SJennifer Yu   // DUMP-NEXT:     -OMPFirstprivateClause {{.*}} <implicit>
159927156a6SJennifer Yu   // DUMP-NEXT:      -DeclRefExpr {{.*}} 'f'
160927156a6SJennifer Yu   // DUMP:           -CXXThisExpr {{.*}} 'A *' implicit this
161927156a6SJennifer Yu   // DUMP-NEXT:      -DeclRefExpr {{.*}} 'f'
162927156a6SJennifer Yu   // DUMP:         -MemberExpr {{.*}}
163927156a6SJennifer Yu   // DUMP-NEXT:      -CXXThisExpr
164927156a6SJennifer Yu   // DUMP:       -CXXThisExpr {{.*}} 'A *' implicit this
165927156a6SJennifer Yu   // DUMP-NEXT:  -DeclRefExpr {{.*}} 'z'
166927156a6SJennifer Yu };
1677aa9c393SJennifer Yu #endif // HEADER
168