1 // RUN: %clang_cc1 -verify -fopenmp -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -triple x86_64-unknown-unknown -o - | FileCheck %s
2 // RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck %s --check-prefix=AST
3 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -verify -o %t %s
4 // 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 // 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 // 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 // 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 // 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 
10 // pch-no-diagnostics
11 
12 #ifndef HEADER
13 #define HEADER
14 
15 void foo() {
16 }
17 
18 #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 
20 #pragma omp assumes no_openmp
21 
22 #pragma omp begin assumes ext_range_bar_only
23 
24 #pragma omp begin assumes ext_range_bar_only_2
25 
26 class BAR {
27 public:
28   BAR() {}
29 
30   void bar1() {
31   }
32 
33   static void bar2() {
34   }
35 };
36 
37 void bar() { BAR b; }
38 
39 #pragma omp end assumes
40 #pragma omp end assumes
41 
42 #pragma omp begin assumes ext_not_seen
43 #pragma omp end assumes
44 
45 #pragma omp begin assumes ext_1234
46 void baz();
47 
48 template<typename T>
49 class BAZ {
50 public:
51   BAZ() {}
52 
53   void baz1() {
54   }
55 
56   static void baz2() {
57   }
58 };
59 
60 void baz() { BAZ<float> b; }
61 #pragma omp end assumes
62 
63 #pragma omp begin assumes ext_lambda_assumption
64 int lambda_outer() {
65   auto lambda_inner = []() { return 42; };
66   return lambda_inner();
67 }
68 #pragma omp end assumes
69 
70 void no_assume() {
71   foo();
72 }
73 
74 #pragma omp begin assumes ext_call_site
75 void assume() {
76   foo();
77 }
78 
79 void assembly() {
80   asm ("nop");
81 }
82 #pragma omp end assumes ext_call_site
83 
84 // AST:      void foo() __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) {
85 // AST-NEXT: }
86 // AST-NEXT: class BAR {
87 // AST-NEXT: public:
88 // 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")))     {
89 // AST-NEXT:     }
90 // 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")))     {
91 // AST-NEXT:     }
92 // 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")))     {
93 // AST-NEXT:     }
94 // AST-NEXT: };
95 // 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"))) {
96 // AST-NEXT:     BAR b;
97 // AST-NEXT: }
98 // 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")));
99 // AST-NEXT: template <typename T> class BAZ {
100 // AST-NEXT: public:
101 // 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")))     {
102 // AST-NEXT:     }
103 // 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")))     {
104 // AST-NEXT:     }
105 // 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")))     {
106 // AST-NEXT:     }
107 // AST-NEXT: };
108 // AST-NEXT: template<> class BAZ<float> {
109 // AST-NEXT: public:
110 // 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")))    {
111 // AST-NEXT:     }
112 // 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")));
113 // 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")));
114 // AST-NEXT: };
115 // 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"))) {
116 // AST-NEXT:     BAZ<float> b;
117 // AST-NEXT: }
118 // 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"))) {
119 // AST-NEXT:     auto lambda_inner = []() {
120 // AST-NEXT:         return 42;
121 // AST-NEXT:     };
122 // AST-NEXT:     return lambda_inner();
123 // AST-NEXT: }
124 
125 #endif
126 
127 // CHECK: define{{.*}} void @_Z3foov()
128 // CHECK-SAME: [[attr0:#[0-9]]]
129 // CHECK: define{{.*}} void @_Z3barv()
130 // CHECK-SAME: [[attr1:#[0-9]]]
131 // CHECK:   call{{.*}} @_ZN3BARC1Ev(%class.BAR*{{.*}} %b)
132 // CHECK-SAME: [[attr10:#[0-9]]]
133 // CHECK: define{{.*}} void @_ZN3BARC1Ev(%class.BAR*{{.*}} %this)
134 // CHECK-SAME: [[attr2:#[0-9]]]
135 // CHECK:   call{{.*}} @_ZN3BARC2Ev(%class.BAR*{{.*}} %this1)
136 // CHECK-SAME: [[attr10]]
137 // CHECK: define{{.*}} void @_ZN3BARC2Ev(%class.BAR*{{.*}} %this)
138 // CHECK-SAME: [[attr3:#[0-9]]]
139 // CHECK: define{{.*}} void @_Z3bazv()
140 // CHECK-SAME: [[attr4:#[0-9]]]
141 // CHECK:   call{{.*}} @_ZN3BAZIfEC1Ev(%class.BAZ*{{.*}} %b)
142 // CHECK-SAME: [[attr11:#[0-9]]]
143 // CHECK: define{{.*}} void @_ZN3BAZIfEC1Ev(%class.BAZ*{{.*}} %this)
144 // CHECK-SAME: [[attr5:#[0-9]]]
145 // CHECK:   call{{.*}} @_ZN3BAZIfEC2Ev(%class.BAZ*{{.*}} %this1)
146 // CHECK-SAME: [[attr12:#[0-9]]]
147 // CHECK: define{{.*}} void @_ZN3BAZIfEC2Ev(%class.BAZ*{{.*}} %this)
148 // CHECK-SAME: [[attr6:#[0-9]]]
149 // CHECK: define{{.*}} i32 @_Z12lambda_outerv()
150 // CHECK-SAME: [[attr7:#[0-9]]]
151 // CHECK: call{{.*}} @"_ZZ12lambda_outervENK3$_0clEv"
152 // CHECK-SAME: [[attr13:#[0-9]]]
153 // CHECK: define{{.*}} i32 @"_ZZ12lambda_outervENK3$_0clEv"(%class.anon*{{.*}} %this)
154 // CHECK-SAME: [[attr8:#[0-9]]]
155 // CHECK: define{{.*}} void @_Z9no_assumev()
156 // CHECK-SAME: [[attr0:#[0-9]]]
157 // CHECK: call{{.*}} @_Z3foov()
158 // CHECK-SAME: [[attr14:#[0-9]]]
159 // CHECK: define{{.*}} void @_Z6assumev()
160 // CHECK-SAME: [[attr9:#[0-9]]]
161 // CHECK: call{{.*}} @_Z3foov()
162 // CHECK-SAME: [[attr15:#[0-9]]]
163 // CHECK: define{{.*}} void @_Z8assemblyv()
164 // CHECK-SAME: [[attr9:#[0-9]]]
165 // CHECK: call{{.*}} void asm sideeffect "nop", "~{dirflag},~{fpsr},~{flags}"()
166 // CHECK-SAME: [[attr16:#[0-9]]]
167 
168 // CHECK:     attributes [[attr0]]
169 // CHECK-SAME:  "llvm.assume"="omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
170 // CHECK:     attributes [[attr1]]
171 // 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"
172 // CHECK:     attributes [[attr2]]
173 // 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"
174 // CHECK:     attributes [[attr3]]
175 // 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"
176 // CHECK:     attributes [[attr4]]
177 // 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"
178 // CHECK:     attributes [[attr5]]
179 // 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"
180 // CHECK:     attributes [[attr6]]
181 // 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"
182 // CHECK:     attributes [[attr7]]
183 // CHECK-SAME:  "llvm.assume"="ompx_lambda_assumption,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
184 // CHECK:     attributes [[attr8]]
185 // CHECK-SAME:  "llvm.assume"="ompx_lambda_assumption,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
186 // CHECK:     attributes [[attr9]]
187 // CHECK-SAME:  "llvm.assume"="ompx_call_site,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
188 // CHECK:     attributes [[attr10]]
189 // 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,ompx_range_bar_only,ompx_range_bar_only_2,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
190 // CHECK:     attributes [[attr11]]
191 // 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,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"
192 // CHECK:     attributes [[attr12]]
193 // 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,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"
194 // CHECK:     attributes [[attr13]]
195 // CHECK-SAME:  "llvm.assume"="ompx_lambda_assumption,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp,ompx_lambda_assumption,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
196 // CHECK:     attributes [[attr14]]
197 // CHECK-SAME:  "llvm.assume"="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"
198 // CHECK:     attributes [[attr15]]
199 // CHECK-SAME:  "llvm.assume"="omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp,ompx_call_site,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
200 // CHECK:     attributes [[attr16]]
201 // CHECK-SAME:  "llvm.assume"="ompx_call_site,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
202