1*2e6e4e6aSJohannes Doerfert // RUN: %clang_cc1 -verify -fopenmp -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -triple x86_64-unknown-unknown -o - | FileCheck %s
2*2e6e4e6aSJohannes Doerfert // RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck %s --check-prefix=AST
3*2e6e4e6aSJohannes Doerfert // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -verify -o %t %s
4*2e6e4e6aSJohannes 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
5*2e6e4e6aSJohannes 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
6*2e6e4e6aSJohannes 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
7*2e6e4e6aSJohannes 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
8*2e6e4e6aSJohannes 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
9*2e6e4e6aSJohannes Doerfert 
10*2e6e4e6aSJohannes Doerfert // pch-no-diagnostics
11*2e6e4e6aSJohannes Doerfert 
12*2e6e4e6aSJohannes Doerfert #ifndef HEADER
13*2e6e4e6aSJohannes Doerfert #define HEADER
14*2e6e4e6aSJohannes Doerfert 
15*2e6e4e6aSJohannes Doerfert void foo() {
16*2e6e4e6aSJohannes Doerfert }
17*2e6e4e6aSJohannes Doerfert 
18*2e6e4e6aSJohannes 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}}
19*2e6e4e6aSJohannes Doerfert 
20*2e6e4e6aSJohannes Doerfert #pragma omp assumes no_openmp
21*2e6e4e6aSJohannes Doerfert 
22*2e6e4e6aSJohannes Doerfert #pragma omp begin assumes ext_range_bar_only
23*2e6e4e6aSJohannes Doerfert 
24*2e6e4e6aSJohannes Doerfert #pragma omp begin assumes ext_range_bar_only_2
25*2e6e4e6aSJohannes Doerfert 
26*2e6e4e6aSJohannes Doerfert class BAR {
27*2e6e4e6aSJohannes Doerfert public:
28*2e6e4e6aSJohannes Doerfert   BAR() {}
29*2e6e4e6aSJohannes Doerfert 
30*2e6e4e6aSJohannes Doerfert   void bar1() {
31*2e6e4e6aSJohannes Doerfert   }
32*2e6e4e6aSJohannes Doerfert 
33*2e6e4e6aSJohannes Doerfert   static void bar2() {
34*2e6e4e6aSJohannes Doerfert   }
35*2e6e4e6aSJohannes Doerfert };
36*2e6e4e6aSJohannes Doerfert 
37*2e6e4e6aSJohannes Doerfert void bar() { BAR b; }
38*2e6e4e6aSJohannes Doerfert 
39*2e6e4e6aSJohannes Doerfert #pragma omp end assumes
40*2e6e4e6aSJohannes Doerfert #pragma omp end assumes
41*2e6e4e6aSJohannes Doerfert 
42*2e6e4e6aSJohannes Doerfert #pragma omp begin assumes ext_not_seen
43*2e6e4e6aSJohannes Doerfert #pragma omp end assumes
44*2e6e4e6aSJohannes Doerfert 
45*2e6e4e6aSJohannes Doerfert #pragma omp begin assumes ext_1234
46*2e6e4e6aSJohannes Doerfert void baz();
47*2e6e4e6aSJohannes Doerfert 
48*2e6e4e6aSJohannes Doerfert template<typename T>
49*2e6e4e6aSJohannes Doerfert class BAZ {
50*2e6e4e6aSJohannes Doerfert public:
51*2e6e4e6aSJohannes Doerfert   BAZ() {}
52*2e6e4e6aSJohannes Doerfert 
53*2e6e4e6aSJohannes Doerfert   void baz1() {
54*2e6e4e6aSJohannes Doerfert   }
55*2e6e4e6aSJohannes Doerfert 
56*2e6e4e6aSJohannes Doerfert   static void baz2() {
57*2e6e4e6aSJohannes Doerfert   }
58*2e6e4e6aSJohannes Doerfert };
59*2e6e4e6aSJohannes Doerfert 
60*2e6e4e6aSJohannes Doerfert void baz() { BAZ<float> b; }
61*2e6e4e6aSJohannes Doerfert #pragma omp end assumes
62*2e6e4e6aSJohannes Doerfert 
63*2e6e4e6aSJohannes Doerfert #pragma omp begin assumes ext_lambda_assumption
64*2e6e4e6aSJohannes Doerfert int lambda_outer() {
65*2e6e4e6aSJohannes Doerfert   auto lambda_inner = []() { return 42; };
66*2e6e4e6aSJohannes Doerfert   return lambda_inner();
67*2e6e4e6aSJohannes Doerfert }
68*2e6e4e6aSJohannes Doerfert #pragma omp end assumes
69*2e6e4e6aSJohannes Doerfert 
70*2e6e4e6aSJohannes Doerfert // AST:      void foo() __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp"))) {
71*2e6e4e6aSJohannes Doerfert // AST-NEXT: }
72*2e6e4e6aSJohannes Doerfert // AST-NEXT: class BAR {
73*2e6e4e6aSJohannes Doerfert // AST-NEXT: public:
74*2e6e4e6aSJohannes Doerfert // AST-NEXT:     BAR() __attribute__((assume("range_bar_only"))) __attribute__((assume("range_bar_only_2"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp")))     {
75*2e6e4e6aSJohannes Doerfert // AST-NEXT:     }
76*2e6e4e6aSJohannes Doerfert // AST-NEXT:     void bar1() __attribute__((assume("range_bar_only"))) __attribute__((assume("range_bar_only_2"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp")))     {
77*2e6e4e6aSJohannes Doerfert // AST-NEXT:     }
78*2e6e4e6aSJohannes Doerfert // AST-NEXT:     static void bar2() __attribute__((assume("range_bar_only"))) __attribute__((assume("range_bar_only_2"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp")))     {
79*2e6e4e6aSJohannes Doerfert // AST-NEXT:     }
80*2e6e4e6aSJohannes Doerfert // AST-NEXT: };
81*2e6e4e6aSJohannes Doerfert // AST-NEXT: void bar() __attribute__((assume("range_bar_only"))) __attribute__((assume("range_bar_only_2"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp"))) {
82*2e6e4e6aSJohannes Doerfert // AST-NEXT:     BAR b;
83*2e6e4e6aSJohannes Doerfert // AST-NEXT: }
84*2e6e4e6aSJohannes Doerfert // AST-NEXT: void baz() __attribute__((assume("1234"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp")));
85*2e6e4e6aSJohannes Doerfert // AST-NEXT: template <typename T> class BAZ {
86*2e6e4e6aSJohannes Doerfert // AST-NEXT: public:
87*2e6e4e6aSJohannes Doerfert // AST-NEXT:     BAZ<T>() __attribute__((assume("1234"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp")))     {
88*2e6e4e6aSJohannes Doerfert // AST-NEXT:     }
89*2e6e4e6aSJohannes Doerfert // AST-NEXT:     void baz1() __attribute__((assume("1234"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp")))     {
90*2e6e4e6aSJohannes Doerfert // AST-NEXT:     }
91*2e6e4e6aSJohannes Doerfert // AST-NEXT:     static void baz2() __attribute__((assume("1234"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp")))     {
92*2e6e4e6aSJohannes Doerfert // AST-NEXT:     }
93*2e6e4e6aSJohannes Doerfert // AST-NEXT: };
94*2e6e4e6aSJohannes Doerfert // AST-NEXT: template<> class BAZ<float> {
95*2e6e4e6aSJohannes Doerfert // AST-NEXT: public:
96*2e6e4e6aSJohannes Doerfert // AST-NEXT:     BAZ() __attribute__((assume("1234"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp")))    {
97*2e6e4e6aSJohannes Doerfert // AST-NEXT:     }
98*2e6e4e6aSJohannes Doerfert // AST-NEXT:     void baz1() __attribute__((assume("1234"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp")));
99*2e6e4e6aSJohannes Doerfert // AST-NEXT:     static void baz2() __attribute__((assume("1234"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp")));
100*2e6e4e6aSJohannes Doerfert // AST-NEXT: };
101*2e6e4e6aSJohannes Doerfert // AST-NEXT: void baz() __attribute__((assume("1234"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp"))) {
102*2e6e4e6aSJohannes Doerfert // AST-NEXT:     BAZ<float> b;
103*2e6e4e6aSJohannes Doerfert // AST-NEXT: }
104*2e6e4e6aSJohannes Doerfert // AST-NEXT: int lambda_outer() __attribute__((assume("lambda_assumption"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp"))) {
105*2e6e4e6aSJohannes Doerfert // AST-NEXT:     auto lambda_inner = []() {
106*2e6e4e6aSJohannes Doerfert // AST-NEXT:         return 42;
107*2e6e4e6aSJohannes Doerfert // AST-NEXT:     };
108*2e6e4e6aSJohannes Doerfert // AST-NEXT:     return lambda_inner();
109*2e6e4e6aSJohannes Doerfert // AST-NEXT: }
110*2e6e4e6aSJohannes Doerfert 
111*2e6e4e6aSJohannes Doerfert #endif
112*2e6e4e6aSJohannes Doerfert 
113*2e6e4e6aSJohannes Doerfert // CHECK: define{{.*}} void @_Z3foov()
114*2e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr0:#[0-9]]]
115*2e6e4e6aSJohannes Doerfert // CHECK: define{{.*}} void @_Z3barv()
116*2e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr1:#[0-9]]]
117*2e6e4e6aSJohannes Doerfert // CHECK:   call{{.*}} @_ZN3BARC1Ev(%class.BAR*{{.*}} %b)
118*2e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr9:#[0-9]]]
119*2e6e4e6aSJohannes Doerfert // CHECK: define{{.*}} void @_ZN3BARC1Ev(%class.BAR*{{.*}} %this)
120*2e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr2:#[0-9]]]
121*2e6e4e6aSJohannes Doerfert // CHECK:   call{{.*}} @_ZN3BARC2Ev(%class.BAR*{{.*}} %this1)
122*2e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr9]]
123*2e6e4e6aSJohannes Doerfert // CHECK: define{{.*}} void @_ZN3BARC2Ev(%class.BAR*{{.*}} %this)
124*2e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr3:#[0-9]]]
125*2e6e4e6aSJohannes Doerfert // CHECK: define{{.*}} void @_Z3bazv()
126*2e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr4:#[0-9]]]
127*2e6e4e6aSJohannes Doerfert // CHECK:   call{{.*}} @_ZN3BAZIfEC1Ev(%class.BAZ*{{.*}} %b)
128*2e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr10:#[0-9]]]
129*2e6e4e6aSJohannes Doerfert // CHECK: define{{.*}} void @_ZN3BAZIfEC1Ev(%class.BAZ*{{.*}} %this)
130*2e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr5:#[0-9]]]
131*2e6e4e6aSJohannes Doerfert // CHECK:   call{{.*}} @_ZN3BAZIfEC2Ev(%class.BAZ*{{.*}} %this1)
132*2e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr10]]
133*2e6e4e6aSJohannes Doerfert // CHECK: define{{.*}} void @_ZN3BAZIfEC2Ev(%class.BAZ*{{.*}} %this)
134*2e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr6:#[0-9]]]
135*2e6e4e6aSJohannes Doerfert // CHECK: define{{.*}} i32 @_Z12lambda_outerv()
136*2e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr7:#[0-9]]]
137*2e6e4e6aSJohannes Doerfert // CHECK: call{{.*}} @"_ZZ12lambda_outervENK3$_0clEv"
138*2e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr11:#[0-9]]]
139*2e6e4e6aSJohannes Doerfert // CHECK: define{{.*}} i32 @"_ZZ12lambda_outervENK3$_0clEv"(%class.anon*{{.*}} %this)
140*2e6e4e6aSJohannes Doerfert // CHECK-SAME: [[attr8:#[0-9]]]
141*2e6e4e6aSJohannes Doerfert 
142*2e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr0]]
143*2e6e4e6aSJohannes Doerfert // CHECK-SAME:  "llvm.assume"="no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
144*2e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr1]]
145*2e6e4e6aSJohannes Doerfert // CHECK-SAME:  "llvm.assume"="range_bar_only,range_bar_only_2,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
146*2e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr2]]
147*2e6e4e6aSJohannes Doerfert // CHECK-SAME:  "llvm.assume"="range_bar_only,range_bar_only_2,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
148*2e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr3]]
149*2e6e4e6aSJohannes Doerfert // CHECK-SAME:  "llvm.assume"="range_bar_only,range_bar_only_2,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
150*2e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr4]]
151*2e6e4e6aSJohannes Doerfert // CHECK-SAME:  "llvm.assume"="1234,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp,1234,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
152*2e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr5]]
153*2e6e4e6aSJohannes Doerfert // CHECK-SAME:  "llvm.assume"="1234,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
154*2e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr6]]
155*2e6e4e6aSJohannes Doerfert // CHECK-SAME:  "llvm.assume"="1234,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
156*2e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr7]]
157*2e6e4e6aSJohannes Doerfert // CHECK-SAME:  "llvm.assume"="lambda_assumption,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
158*2e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr8]]
159*2e6e4e6aSJohannes Doerfert // CHECK-SAME:  "llvm.assume"="lambda_assumption,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
160*2e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr9]]
161*2e6e4e6aSJohannes Doerfert // CHECK-SAME:  "llvm.assume"="range_bar_only,range_bar_only_2,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
162*2e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr10]]
163*2e6e4e6aSJohannes Doerfert // CHECK-SAME:  "llvm.assume"="1234,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
164*2e6e4e6aSJohannes Doerfert // CHECK:     attributes [[attr11]]
165*2e6e4e6aSJohannes Doerfert // CHECK-SAME:  "llvm.assume"="lambda_assumption,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
166