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