164 lines · cpp
1// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=60 -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -triple x86_64-unknown-unknown -o - | FileCheck %s2// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=60 -ast-print %s | FileCheck %s --check-prefix=AST3// RUN: %clang_cc1 -fopenmp -fopenmp-version=60 -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -verify -o %t %s4// RUN: %clang_cc1 -fopenmp -fopenmp-version=60 -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify=pch %s -emit-llvm -o - | FileCheck %s5// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -fopenmp-version=60 -fexceptions -fcxx-exceptions -debug-info-kind=line-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s6// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=60 -fopenmp-enable-irbuilder -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -triple x86_64-unknown-unknown -o - | FileCheck %s7// RUN: %clang_cc1 -fopenmp -fopenmp-version=60 -fopenmp-enable-irbuilder -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -verify -o %t %s8// RUN: %clang_cc1 -fopenmp -fopenmp-version=60 -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 %s9 10// pch-no-diagnostics11 12#ifndef HEADER13#define HEADER14 15void 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_openmp_constructs', '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_openmp21 22#pragma omp begin assumes ext_range_bar_only23 24#pragma omp begin assumes ext_range_bar_only_225 26class BAR {27public:28 BAR() {}29 30 void bar1() {31 }32 33 static void bar2() {34 }35};36 37void bar() { BAR b; }38 39#pragma omp end assumes40#pragma omp end assumes41 42#pragma omp begin assumes ext_not_seen43#pragma omp end assumes44 45#pragma omp begin assumes ext_123446void baz();47 48template<typename T>49class BAZ {50public:51 BAZ() {}52 53 void baz1() {54 }55 56 static void baz2() {57 }58};59 60void baz() { BAZ<float> b; }61#pragma omp end assumes62 63#pragma omp begin assumes ext_lambda_assumption64int lambda_outer() {65 auto lambda_inner = []() { return 42; };66 return lambda_inner();67}68#pragma omp end assumes69 70// AST{LITERAL}: void foo() [[omp::assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses")]] [[omp::assume("omp_no_openmp")]] {71// AST-NEXT{LITERAL}: }72// AST-NEXT{LITERAL}: class BAR {73// AST-NEXT{LITERAL}: public:74// AST-NEXT{LITERAL}: [[omp::assume("ompx_range_bar_only")]] [[omp::assume("ompx_range_bar_only_2")]] [[omp::assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses")]] [[omp::assume("omp_no_openmp")]] BAR() {75// AST-NEXT{LITERAL}: }76// AST-NEXT{LITERAL}: [[omp::assume("ompx_range_bar_only")]] [[omp::assume("ompx_range_bar_only_2")]] [[omp::assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses")]] [[omp::assume("omp_no_openmp")]] void bar1() {77// AST-NEXT{LITERAL}: }78// AST-NEXT{LITERAL}: [[omp::assume("ompx_range_bar_only")]] [[omp::assume("ompx_range_bar_only_2")]] [[omp::assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses")]] [[omp::assume("omp_no_openmp")]] static void bar2() {79// AST-NEXT{LITERAL}: }80// AST-NEXT{LITERAL}: };81// AST-NEXT{LITERAL}: [[omp::assume("ompx_range_bar_only")]] [[omp::assume("ompx_range_bar_only_2")]] [[omp::assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses")]] [[omp::assume("omp_no_openmp")]] void bar() {82// AST-NEXT{LITERAL}: BAR b;83// AST-NEXT{LITERAL}: }84// AST-NEXT{LITERAL}: [[omp::assume("ompx_1234")]] [[omp::assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses")]] [[omp::assume("omp_no_openmp")]] void baz();85// AST-NEXT{LITERAL}: template <typename T> class BAZ {86// AST-NEXT{LITERAL}: public:87// AST-NEXT{LITERAL}: [[omp::assume("ompx_1234")]] [[omp::assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses")]] [[omp::assume("omp_no_openmp")]] BAZ<T>() {88// AST-NEXT{LITERAL}: }89// AST-NEXT{LITERAL}: [[omp::assume("ompx_1234")]] [[omp::assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses")]] [[omp::assume("omp_no_openmp")]] void baz1() {90// AST-NEXT{LITERAL}: }91// AST-NEXT{LITERAL}: [[omp::assume("ompx_1234")]] [[omp::assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses")]] [[omp::assume("omp_no_openmp")]] static void baz2() {92// AST-NEXT{LITERAL}: }93// AST-NEXT{LITERAL}: };94// AST-NEXT{LITERAL}: template<> class BAZ<float> {95// AST-NEXT{LITERAL}: public:96// AST-NEXT{LITERAL}: [[omp::assume("ompx_1234")]] [[omp::assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses")]] [[omp::assume("omp_no_openmp")]] [[omp::assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses")]] [[omp::assume("omp_no_openmp")]] BAZ() {97// AST-NEXT{LITERAL}: }98// AST-NEXT{LITERAL}: [[omp::assume("ompx_1234")]] [[omp::assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses")]] [[omp::assume("omp_no_openmp")]] [[omp::assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses")]] [[omp::assume("omp_no_openmp")]] void baz1();99// AST-NEXT{LITERAL}: [[omp::assume("ompx_1234")]] [[omp::assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses")]] [[omp::assume("omp_no_openmp")]] [[omp::assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses")]] [[omp::assume("omp_no_openmp")]] static void baz2();100// AST-NEXT{LITERAL}: };101// AST-NEXT{LITERAL}: [[omp::assume("ompx_1234")]] [[omp::assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses")]] [[omp::assume("omp_no_openmp")]] void baz() {102// AST-NEXT{LITERAL}: BAZ<float> b;103// AST-NEXT{LITERAL}: }104// AST-NEXT{LITERAL}: [[omp::assume("ompx_lambda_assumption")]] [[omp::assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses")]] [[omp::assume("omp_no_openmp")]] int lambda_outer() {105// AST-NEXT{LITERAL}: auto lambda_inner = []() {106// AST-NEXT{LITERAL}: return 42;107// AST-NEXT{LITERAL}: };108// AST-NEXT{LITERAL}: return lambda_inner();109// AST-NEXT{LITERAL}: }110 111#endif112 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(ptr{{.*}} %b)118// CHECK-SAME: [[attr8:#[0-9]]]119// CHECK: define{{.*}} void @_ZN3BARC1Ev(ptr{{.*}} %this)120// CHECK-SAME: [[attr1:#[0-9]]]121// CHECK: call{{.*}} @_ZN3BARC2Ev(ptr{{.*}} %this1)122// CHECK-SAME: [[attr8]]123// CHECK: define{{.*}} void @_ZN3BARC2Ev(ptr{{.*}} %this)124// CHECK-SAME: [[attr2:#[0-9]]]125// CHECK: define{{.*}} void @_Z3bazv()126// CHECK-SAME: [[attr3:#[0-9]]]127// CHECK: call{{.*}} @_ZN3BAZIfEC1Ev(ptr{{.*}} %b)128// CHECK-SAME: [[attr9:#[0-9]]]129// CHECK: define{{.*}} void @_ZN3BAZIfEC1Ev(ptr{{.*}} %this)130// CHECK-SAME: [[attr4:#[0-9]]]131// CHECK: call{{.*}} @_ZN3BAZIfEC2Ev(ptr{{.*}} %this1)132// CHECK-SAME: [[attr9]]133// CHECK: define{{.*}} void @_ZN3BAZIfEC2Ev(ptr{{.*}} %this)134// CHECK-SAME: [[attr5:#[0-9]]]135// CHECK: define{{.*}} i32 @_Z12lambda_outerv()136// CHECK-SAME: [[attr6:#[0-9]]]137// CHECK: call{{.*}} @"_ZZ12lambda_outervENK3$_0clEv"138// CHECK-SAME: [[attr10:#[0-9]]]139// CHECK: define{{.*}} i32 @"_ZZ12lambda_outervENK3$_0clEv"(ptr{{.*}} %this)140// CHECK-SAME: [[attr7:#[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_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"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,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_lambda_assumption,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_range_bar_only,ompx_range_bar_only_2,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"160// CHECK: attributes [[attr9]]161// 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"162// CHECK: attributes [[attr10]]163// CHECK-SAME: "llvm.assume"="ompx_lambda_assumption,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"164