| // RUN: %clang_cc1 -emit-llvm -triple i386-linux-gnu %s -o - | FileCheck %s | |
| // RUN: %clang_cc1 -x c++ -emit-pch -triple i386-linux-gnu -o %t %s | |
| // RUN: %clang_cc1 -include-pch %t %s -triple i386-linux-gnu -emit-llvm -o - | FileCheck %s | |
| // expected-no-diagnostics | |
| #ifndef HEADER | |
| #define HEADER | |
| /// foo: declarations only | |
| [[omp::assume("foo:before1")]] void foo(); | |
| [[omp::assume("foo:before2")]] | |
| [[omp::assume("foo:before3")]] void | |
| foo(); | |
| /// baz: static function declarations and a definition | |
| [[omp::assume("baz:before1")]] static void baz(); | |
| [[omp::assume("baz:before2")]] | |
| [[omp::assume("baz:before3")]] static void | |
| baz(); | |
| // Definition | |
| [[omp::assume("baz:def1,baz:def2")]] static void baz() { foo(); } | |
| [[omp::assume("baz:after")]] static void baz(); | |
| /// bar: external function declarations and a definition | |
| [[omp::assume("bar:before1")]] void bar(); | |
| [[omp::assume("bar:before2")]] | |
| [[omp::assume("bar:before3")]] void | |
| bar(); | |
| // Definition | |
| [[omp::assume("bar:def1,bar:def2")]] void bar() { baz(); } | |
| [[omp::assume("bar:after")]] void bar(); | |
| /// back to foo | |
| [[omp::assume("foo:after")]] void foo(); | |
| /// class tests | |
| class C { | |
| [[omp::assume("C:private_method")]] void private_method(); | |
| [[omp::assume("C:private_static")]] static void private_static(); | |
| public: | |
| [[omp::assume("C:public_method1")]] void public_method(); | |
| [[omp::assume("C:public_static1")]] static void public_static(); | |
| }; | |
| [[omp::assume("C:public_method2")]] void C::public_method() { | |
| private_method(); | |
| } | |
| [[omp::assume("C:public_static2")]] void C::public_static() { | |
| private_static(); | |
| } | |
| /// template tests | |
| template <typename T> | |
| [[omp::assume("template_func<T>")]] void template_func() {} | |
| template <> | |
| [[omp::assume("template_func<float>")]] void template_func<float>() {} | |
| template <> | |
| void template_func<int>() {} | |
| template <typename T> | |
| struct S { | |
| [[omp::assume("S<T>::method")]] void method(); | |
| }; | |
| template <> | |
| [[omp::assume("S<float>::method")]] void S<float>::method() {} | |
| template <> | |
| void S<int>::method() {} | |
| // CHECK: define{{.*}} void @_Z3barv() #0 | |
| // CHECK: define{{.*}} void @_ZL3bazv() #1 | |
| // CHECK: define{{.*}} void @_ZN1C13public_methodEv({{.*}}) #2 | |
| // CHECK: declare{{.*}} void @_ZN1C14private_methodEv({{.*}}) #3 | |
| // CHECK: define{{.*}} void @_ZN1C13public_staticEv() #4 | |
| // CHECK: declare{{.*}} void @_ZN1C14private_staticEv() #5 | |
| // CHECK: define{{.*}} void @_Z13template_funcIfEvv() #6 | |
| // CHECK: define{{.*}} void @_Z13template_funcIiEvv() #7 | |
| // CHECK: define{{.*}} void @_ZN1SIfE6methodEv({{.*}}) #8 | |
| // CHECK: define{{.*}} void @_ZN1SIiE6methodEv({{.*}}) #9 | |
| // CHECK: declare{{.*}} void @_Z3foov() #10 | |
| // CHECK: attributes #0 | |
| // CHECK-SAME: "llvm.assume"="bar:before1,bar:before2,bar:before3,bar:def1,bar:def2" | |
| // CHECK: attributes #1 | |
| // CHECK-SAME: "llvm.assume"="baz:before1,baz:before2,baz:before3,baz:def1,baz:def2,baz:after" | |
| // CHECK: attributes #2 | |
| // CHECK-SAME: "llvm.assume"="C:public_method1,C:public_method2" | |
| // CHECK: attributes #3 | |
| // CHECK-SAME: "llvm.assume"="C:private_method" | |
| // CHECK: attributes #4 | |
| // CHECK-SAME: "llvm.assume"="C:public_static1,C:public_static2" | |
| // CHECK: attributes #5 | |
| // CHECK-SAME: "llvm.assume"="C:private_static" | |
| // CHECK: attributes #6 | |
| // CHECK-SAME: "llvm.assume"="template_func<T>,template_func<float>" | |
| // CHECK: attributes #7 | |
| // CHECK-SAME: "llvm.assume"="template_func<T>" | |
| // CHECK: attributes #8 | |
| // CHECK-SAME: "llvm.assume"="S<T>::method,S<float>::method" | |
| // CHECK: attributes #9 | |
| // CHECK-SAME: "llvm.assume"="S<T>::method" | |
| // CHECK: attributes #10 | |
| // CHECK-SAME: "llvm.assume"="foo:before1,foo:before2,foo:before3" | |
| #endif |