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