12e6e4e6aSJohannes Doerfert // RUN: %clang_cc1 -verify -fopenmp -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -triple x86_64-unknown-unknown -o - | FileCheck %s
22e6e4e6aSJohannes Doerfert // RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck %s --check-prefix=AST
32e6e4e6aSJohannes Doerfert // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -verify -o %t %s
42e6e4e6aSJohannes Doerfert // RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify=pch %s -emit-llvm -o - | FileCheck %s
52e6e4e6aSJohannes Doerfert // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -fexceptions -fcxx-exceptions -debug-info-kind=line-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s
62e6e4e6aSJohannes Doerfert // RUN: %clang_cc1 -verify -fopenmp -fopenmp-enable-irbuilder -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -triple x86_64-unknown-unknown -o - | FileCheck %s
72e6e4e6aSJohannes Doerfert // RUN: %clang_cc1 -fopenmp -fopenmp-enable-irbuilder -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -verify -o %t %s
82e6e4e6aSJohannes Doerfert // RUN: %clang_cc1 -fopenmp -fopenmp-enable-irbuilder -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify=pch %s -emit-llvm -o - | FileCheck %s
92e6e4e6aSJohannes Doerfert 
102e6e4e6aSJohannes Doerfert // pch-no-diagnostics
112e6e4e6aSJohannes Doerfert 
122e6e4e6aSJohannes Doerfert #ifndef HEADER
132e6e4e6aSJohannes Doerfert #define HEADER
142e6e4e6aSJohannes Doerfert 
152e6e4e6aSJohannes Doerfert void foo() {
162e6e4e6aSJohannes Doerfert }
172e6e4e6aSJohannes Doerfert 
182e6e4e6aSJohannes Doerfert #pragma omp assumes no_openmp_routines warning ext_another_warning(1) ext_after_invalid_clauses // expected-warning {{valid assumes clauses start with 'ext_', 'absent', 'contains', 'holds', 'no_openmp', 'no_openmp_routines', 'no_parallelism'; token will be ignored}} expected-warning {{'ext_another_warning' clause should not be followed by arguments; tokens will be ignored}} expected-note {{the ignored tokens spans until here}}
192e6e4e6aSJohannes Doerfert 
202e6e4e6aSJohannes Doerfert #pragma omp assumes no_openmp
212e6e4e6aSJohannes Doerfert 
222e6e4e6aSJohannes Doerfert #pragma omp begin assumes ext_range_bar_only
232e6e4e6aSJohannes Doerfert 
242e6e4e6aSJohannes Doerfert #pragma omp begin assumes ext_range_bar_only_2
252e6e4e6aSJohannes Doerfert 
262e6e4e6aSJohannes Doerfert class BAR {
272e6e4e6aSJohannes Doerfert public:
282e6e4e6aSJohannes Doerfert   BAR() {}
292e6e4e6aSJohannes Doerfert 
302e6e4e6aSJohannes Doerfert   void bar1() {
312e6e4e6aSJohannes Doerfert   }
322e6e4e6aSJohannes Doerfert 
332e6e4e6aSJohannes Doerfert   static void bar2() {
342e6e4e6aSJohannes Doerfert   }
352e6e4e6aSJohannes Doerfert };
362e6e4e6aSJohannes Doerfert 
372e6e4e6aSJohannes Doerfert void bar() { BAR b; }
382e6e4e6aSJohannes Doerfert 
392e6e4e6aSJohannes Doerfert #pragma omp end assumes
402e6e4e6aSJohannes Doerfert #pragma omp end assumes
412e6e4e6aSJohannes Doerfert 
422e6e4e6aSJohannes Doerfert #pragma omp begin assumes ext_not_seen
432e6e4e6aSJohannes Doerfert #pragma omp end assumes
442e6e4e6aSJohannes Doerfert 
452e6e4e6aSJohannes Doerfert #pragma omp begin assumes ext_1234
462e6e4e6aSJohannes Doerfert void baz();
472e6e4e6aSJohannes Doerfert 
482e6e4e6aSJohannes Doerfert template<typename T>
492e6e4e6aSJohannes Doerfert class BAZ {
502e6e4e6aSJohannes Doerfert public:
512e6e4e6aSJohannes Doerfert   BAZ() {}
522e6e4e6aSJohannes Doerfert 
532e6e4e6aSJohannes Doerfert   void baz1() {
542e6e4e6aSJohannes Doerfert   }
552e6e4e6aSJohannes Doerfert 
562e6e4e6aSJohannes Doerfert   static void baz2() {
572e6e4e6aSJohannes Doerfert   }
582e6e4e6aSJohannes Doerfert };
592e6e4e6aSJohannes Doerfert 
602e6e4e6aSJohannes Doerfert void baz() { BAZ<float> b; }
612e6e4e6aSJohannes Doerfert #pragma omp end assumes
622e6e4e6aSJohannes Doerfert 
632e6e4e6aSJohannes Doerfert #pragma omp begin assumes ext_lambda_assumption
642e6e4e6aSJohannes Doerfert int lambda_outer() {
652e6e4e6aSJohannes Doerfert   auto lambda_inner = []() { return 42; };
662e6e4e6aSJohannes Doerfert   return lambda_inner();
672e6e4e6aSJohannes Doerfert }
682e6e4e6aSJohannes Doerfert #pragma omp end assumes
692e6e4e6aSJohannes Doerfert 
70*45e8e084SJohannes Doerfert // AST:      void foo() __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) {
712e6e4e6aSJohannes Doerfert // AST-NEXT: }
722e6e4e6aSJohannes Doerfert // AST-NEXT: class BAR {
732e6e4e6aSJohannes Doerfert // AST-NEXT: public:
74*45e8e084SJohannes Doerfert // AST-NEXT:     BAR() __attribute__((assume("ompx_range_bar_only"))) __attribute__((assume("ompx_range_bar_only_2"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp")))     {
752e6e4e6aSJohannes Doerfert // AST-NEXT:     }
76*45e8e084SJohannes Doerfert // AST-NEXT:     void bar1() __attribute__((assume("ompx_range_bar_only"))) __attribute__((assume("ompx_range_bar_only_2"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp")))     {
772e6e4e6aSJohannes Doerfert // AST-NEXT:     }
78*45e8e084SJohannes Doerfert // AST-NEXT:     static void bar2() __attribute__((assume("ompx_range_bar_only"))) __attribute__((assume("ompx_range_bar_only_2"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp")))     {
792e6e4e6aSJohannes Doerfert // AST-NEXT:     }
802e6e4e6aSJohannes Doerfert // AST-NEXT: };
81*45e8e084SJohannes Doerfert // AST-NEXT: void bar() __attribute__((assume("ompx_range_bar_only"))) __attribute__((assume("ompx_range_bar_only_2"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) {
822e6e4e6aSJohannes Doerfert // AST-NEXT:     BAR b;
832e6e4e6aSJohannes Doerfert // AST-NEXT: }
84*45e8e084SJohannes Doerfert // AST-NEXT: void baz() __attribute__((assume("ompx_1234"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp")));
852e6e4e6aSJohannes Doerfert // AST-NEXT: template <typename T> class BAZ {
862e6e4e6aSJohannes Doerfert // AST-NEXT: public:
87*45e8e084SJohannes Doerfert // AST-NEXT:     BAZ<T>() __attribute__((assume("ompx_1234"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp")))     {
882e6e4e6aSJohannes Doerfert // AST-NEXT:     }
89*45e8e084SJohannes Doerfert // AST-NEXT:     void baz1() __attribute__((assume("ompx_1234"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp")))     {
902e6e4e6aSJohannes Doerfert // AST-NEXT:     }
91*45e8e084SJohannes Doerfert // AST-NEXT:     static void baz2() __attribute__((assume("ompx_1234"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp")))     {
922e6e4e6aSJohannes Doerfert // AST-NEXT:     }
932e6e4e6aSJohannes Doerfert // AST-NEXT: };
942e6e4e6aSJohannes Doerfert // AST-NEXT: template<> class BAZ<float> {
952e6e4e6aSJohannes Doerfert // AST-NEXT: public:
96*45e8e084SJohannes Doerfert // AST-NEXT:     BAZ() __attribute__((assume("ompx_1234"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp")))    {
972e6e4e6aSJohannes Doerfert // AST-NEXT:     }
98*45e8e084SJohannes Doerfert // AST-NEXT:     void baz1() __attribute__((assume("ompx_1234"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp")));
99*45e8e084SJohannes Doerfert // AST-NEXT:     static void baz2() __attribute__((assume("ompx_1234"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp")));
1002e6e4e6aSJohannes Doerfert // AST-NEXT: };
101*45e8e084SJohannes Doerfert // AST-NEXT: void baz() __attribute__((assume("ompx_1234"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) {
1022e6e4e6aSJohannes Doerfert // AST-NEXT:     BAZ<float> b;
1032e6e4e6aSJohannes Doerfert // AST-NEXT: }
104*45e8e084SJohannes Doerfert // AST-NEXT: int lambda_outer() __attribute__((assume("ompx_lambda_assumption"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) {
1052e6e4e6aSJohannes Doerfert // AST-NEXT:     auto lambda_inner = []() {
1062e6e4e6aSJohannes Doerfert // AST-NEXT:         return 42;
1072e6e4e6aSJohannes Doerfert // AST-NEXT:     };
1082e6e4e6aSJohannes Doerfert // AST-NEXT:     return lambda_inner();
1092e6e4e6aSJohannes Doerfert // AST-NEXT: }
1102e6e4e6aSJohannes Doerfert 
1112e6e4e6aSJohannes Doerfert #endif
1122e6e4e6aSJohannes Doerfert 
1132e6e4e6aSJohannes Doerfert // CHECK: define{{.*}} void @_Z3foov()
1142e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr0:#[0-9]]]
1152e6e4e6aSJohannes Doerfert // CHECK: define{{.*}} void @_Z3barv()
1162e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr1:#[0-9]]]
1172e6e4e6aSJohannes Doerfert // CHECK:   call{{.*}} @_ZN3BARC1Ev(%class.BAR*{{.*}} %b)
1182e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr9:#[0-9]]]
1192e6e4e6aSJohannes Doerfert // CHECK: define{{.*}} void @_ZN3BARC1Ev(%class.BAR*{{.*}} %this)
1202e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr2:#[0-9]]]
1212e6e4e6aSJohannes Doerfert // CHECK:   call{{.*}} @_ZN3BARC2Ev(%class.BAR*{{.*}} %this1)
1222e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr9]]
1232e6e4e6aSJohannes Doerfert // CHECK: define{{.*}} void @_ZN3BARC2Ev(%class.BAR*{{.*}} %this)
1242e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr3:#[0-9]]]
1252e6e4e6aSJohannes Doerfert // CHECK: define{{.*}} void @_Z3bazv()
1262e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr4:#[0-9]]]
1272e6e4e6aSJohannes Doerfert // CHECK:   call{{.*}} @_ZN3BAZIfEC1Ev(%class.BAZ*{{.*}} %b)
1282e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr10:#[0-9]]]
1292e6e4e6aSJohannes Doerfert // CHECK: define{{.*}} void @_ZN3BAZIfEC1Ev(%class.BAZ*{{.*}} %this)
1302e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr5:#[0-9]]]
1312e6e4e6aSJohannes Doerfert // CHECK:   call{{.*}} @_ZN3BAZIfEC2Ev(%class.BAZ*{{.*}} %this1)
1322e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr10]]
1332e6e4e6aSJohannes Doerfert // CHECK: define{{.*}} void @_ZN3BAZIfEC2Ev(%class.BAZ*{{.*}} %this)
1342e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr6:#[0-9]]]
1352e6e4e6aSJohannes Doerfert // CHECK: define{{.*}} i32 @_Z12lambda_outerv()
1362e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr7:#[0-9]]]
1372e6e4e6aSJohannes Doerfert // CHECK: call{{.*}} @"_ZZ12lambda_outervENK3$_0clEv"
1382e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr11:#[0-9]]]
1392e6e4e6aSJohannes Doerfert // CHECK: define{{.*}} i32 @"_ZZ12lambda_outervENK3$_0clEv"(%class.anon*{{.*}} %this)
1402e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr8:#[0-9]]]
1412e6e4e6aSJohannes Doerfert 
1422e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr0]]
143*45e8e084SJohannes Doerfert // CHECK-SAME:  "llvm.assume"="omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
1442e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr1]]
145*45e8e084SJohannes Doerfert // CHECK-SAME:  "llvm.assume"="ompx_range_bar_only,ompx_range_bar_only_2,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
1462e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr2]]
147*45e8e084SJohannes Doerfert // CHECK-SAME:  "llvm.assume"="ompx_range_bar_only,ompx_range_bar_only_2,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
1482e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr3]]
149*45e8e084SJohannes Doerfert // CHECK-SAME:  "llvm.assume"="ompx_range_bar_only,ompx_range_bar_only_2,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
1502e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr4]]
151*45e8e084SJohannes Doerfert // CHECK-SAME:  "llvm.assume"="ompx_1234,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp,ompx_1234,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
1522e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr5]]
153*45e8e084SJohannes Doerfert // CHECK-SAME:  "llvm.assume"="ompx_1234,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
1542e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr6]]
155*45e8e084SJohannes Doerfert // CHECK-SAME:  "llvm.assume"="ompx_1234,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
1562e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr7]]
157*45e8e084SJohannes Doerfert // CHECK-SAME:  "llvm.assume"="ompx_lambda_assumption,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
1582e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr8]]
159*45e8e084SJohannes Doerfert // CHECK-SAME:  "llvm.assume"="ompx_lambda_assumption,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
1602e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr9]]
161*45e8e084SJohannes Doerfert // CHECK-SAME:  "llvm.assume"="ompx_range_bar_only,ompx_range_bar_only_2,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
1622e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr10]]
163*45e8e084SJohannes Doerfert // CHECK-SAME:  "llvm.assume"="ompx_1234,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
1642e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr11]]
165*45e8e084SJohannes Doerfert // CHECK-SAME:  "llvm.assume"="ompx_lambda_assumption,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
166