1 // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -triple x86_64-unknown-unknown -o - | FileCheck %s 2 // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp -ast-print %s | FileCheck %s --check-prefix=AST 3 // RUN: %clang_cc1 -no-opaque-pointers -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -verify -o %t %s 4 // RUN: %clang_cc1 -no-opaque-pointers -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 -no-opaque-pointers -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 -no-opaque-pointers -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 -no-opaque-pointers -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 -no-opaque-pointers -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 // AST: void foo() __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) { 71 // AST-NEXT: } 72 // AST-NEXT: class BAR { 73 // AST-NEXT: public: 74 // 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"))) { 75 // AST-NEXT: } 76 // 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"))) { 77 // AST-NEXT: } 78 // 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"))) { 79 // AST-NEXT: } 80 // AST-NEXT: }; 81 // 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"))) { 82 // AST-NEXT: BAR b; 83 // AST-NEXT: } 84 // 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"))); 85 // AST-NEXT: template <typename T> class BAZ { 86 // AST-NEXT: public: 87 // 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"))) { 88 // AST-NEXT: } 89 // 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"))) { 90 // AST-NEXT: } 91 // 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"))) { 92 // AST-NEXT: } 93 // AST-NEXT: }; 94 // AST-NEXT: template<> class BAZ<float> { 95 // AST-NEXT: public: 96 // 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"))) { 97 // AST-NEXT: } 98 // 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 // 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"))); 100 // AST-NEXT: }; 101 // 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"))) { 102 // AST-NEXT: BAZ<float> b; 103 // AST-NEXT: } 104 // 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"))) { 105 // AST-NEXT: auto lambda_inner = []() { 106 // AST-NEXT: return 42; 107 // AST-NEXT: }; 108 // AST-NEXT: return lambda_inner(); 109 // AST-NEXT: } 110 111 #endif 112 113 // CHECK: define{{.*}} void @_Z3foov() 114 // CHECK-SAME: [[attr0:#[0-9]]] 115 // CHECK: define{{.*}} void @_Z3barv() 116 // CHECK-SAME: [[attr1:#[0-9]]] 117 // CHECK: call{{.*}} @_ZN3BARC1Ev(%class.BAR*{{.*}} %b) 118 // CHECK-SAME: [[attr9:#[0-9]]] 119 // CHECK: define{{.*}} void @_ZN3BARC1Ev(%class.BAR*{{.*}} %this) 120 // CHECK-SAME: [[attr2:#[0-9]]] 121 // CHECK: call{{.*}} @_ZN3BARC2Ev(%class.BAR*{{.*}} %this1) 122 // CHECK-SAME: [[attr9]] 123 // CHECK: define{{.*}} void @_ZN3BARC2Ev(%class.BAR*{{.*}} %this) 124 // CHECK-SAME: [[attr3:#[0-9]]] 125 // CHECK: define{{.*}} void @_Z3bazv() 126 // CHECK-SAME: [[attr4:#[0-9]]] 127 // CHECK: call{{.*}} @_ZN3BAZIfEC1Ev(%class.BAZ*{{.*}} %b) 128 // CHECK-SAME: [[attr10:#[0-9]]] 129 // CHECK: define{{.*}} void @_ZN3BAZIfEC1Ev(%class.BAZ*{{.*}} %this) 130 // CHECK-SAME: [[attr5:#[0-9]]] 131 // CHECK: call{{.*}} @_ZN3BAZIfEC2Ev(%class.BAZ*{{.*}} %this1) 132 // CHECK-SAME: [[attr10]] 133 // CHECK: define{{.*}} void @_ZN3BAZIfEC2Ev(%class.BAZ*{{.*}} %this) 134 // CHECK-SAME: [[attr6:#[0-9]]] 135 // CHECK: define{{.*}} i32 @_Z12lambda_outerv() 136 // CHECK-SAME: [[attr7:#[0-9]]] 137 // CHECK: call{{.*}} @"_ZZ12lambda_outervENK3$_0clEv" 138 // CHECK-SAME: [[attr11:#[0-9]]] 139 // CHECK: define{{.*}} i32 @"_ZZ12lambda_outervENK3$_0clEv"(%class.anon*{{.*}} %this) 140 // CHECK-SAME: [[attr8:#[0-9]]] 141 142 // CHECK: attributes [[attr0]] 143 // CHECK-SAME: "llvm.assume"="omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp" 144 // CHECK: attributes [[attr1]] 145 // 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" 146 // CHECK: attributes [[attr2]] 147 // 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" 148 // CHECK: attributes [[attr3]] 149 // 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" 150 // CHECK: attributes [[attr4]] 151 // 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" 152 // CHECK: attributes [[attr5]] 153 // 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" 154 // CHECK: attributes [[attr6]] 155 // 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" 156 // CHECK: attributes [[attr7]] 157 // CHECK-SAME: "llvm.assume"="ompx_lambda_assumption,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp" 158 // CHECK: attributes [[attr8]] 159 // CHECK-SAME: "llvm.assume"="ompx_lambda_assumption,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp" 160 // CHECK: attributes [[attr9]] 161 // 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" 162 // CHECK: attributes [[attr10]] 163 // 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" 164 // CHECK: attributes [[attr11]] 165 // CHECK-SAME: "llvm.assume"="ompx_lambda_assumption,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp" 166