2014-04-03 07:17:29 +08:00
|
|
|
// RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK --check-prefix=NORMAL
|
|
|
|
// RUN: %clang_cc1 %s -std=c++11 -fms-compatibility -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK --check-prefix=MSVCCOMPAT
|
2009-12-05 06:35:50 +08:00
|
|
|
// CHECK: ; ModuleID
|
|
|
|
|
|
|
|
struct A {
|
|
|
|
inline void f();
|
|
|
|
};
|
|
|
|
|
2014-02-16 15:28:50 +08:00
|
|
|
// CHECK-NOT: define void @_ZN1A1fEv
|
2009-12-05 06:35:50 +08:00
|
|
|
void A::f() { }
|
|
|
|
|
|
|
|
template<typename> struct B { };
|
|
|
|
|
|
|
|
template<> struct B<char> {
|
|
|
|
inline void f();
|
|
|
|
};
|
|
|
|
|
|
|
|
// CHECK-NOT: _ZN1BIcE1fEv
|
|
|
|
void B<char>::f() { }
|
|
|
|
|
|
|
|
// We need a final CHECK line here.
|
|
|
|
|
2013-08-15 14:47:53 +08:00
|
|
|
// CHECK-LABEL: define void @_Z1fv
|
2009-12-05 06:35:50 +08:00
|
|
|
void f() { }
|
2010-12-10 00:59:22 +08:00
|
|
|
|
|
|
|
// <rdar://problem/8740363>
|
|
|
|
inline void f1(int);
|
|
|
|
|
2013-08-15 14:47:53 +08:00
|
|
|
// CHECK-LABEL: define linkonce_odr void @_Z2f1i
|
2010-12-10 00:59:22 +08:00
|
|
|
void f1(int) { }
|
|
|
|
|
|
|
|
void test_f1() { f1(17); }
|
2010-12-15 12:00:32 +08:00
|
|
|
|
|
|
|
// PR8789
|
|
|
|
namespace test1 {
|
|
|
|
template <typename T> class ClassTemplate {
|
|
|
|
private:
|
|
|
|
friend void T::func();
|
|
|
|
void g() {}
|
|
|
|
};
|
|
|
|
|
2013-08-15 14:47:53 +08:00
|
|
|
// CHECK-LABEL: define linkonce_odr void @_ZN5test11C4funcEv(
|
2010-12-15 12:00:32 +08:00
|
|
|
|
|
|
|
class C {
|
|
|
|
public:
|
|
|
|
void func() {
|
|
|
|
ClassTemplate<C> ct;
|
|
|
|
ct.g();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
void f() {
|
|
|
|
C c;
|
|
|
|
c.func();
|
|
|
|
}
|
|
|
|
}
|
2012-07-03 05:05:30 +08:00
|
|
|
|
|
|
|
// PR13252
|
|
|
|
namespace test2 {
|
|
|
|
struct A;
|
|
|
|
void f(const A& a);
|
|
|
|
struct A {
|
|
|
|
friend void f(const A& a) { }
|
|
|
|
};
|
|
|
|
void g() {
|
|
|
|
A a;
|
|
|
|
f(a);
|
|
|
|
}
|
2013-08-15 14:47:53 +08:00
|
|
|
// CHECK-LABEL: define linkonce_odr void @_ZN5test21fERKNS_1AE
|
2012-07-03 05:05:30 +08:00
|
|
|
}
|
2014-04-03 07:17:29 +08:00
|
|
|
|
|
|
|
// MSVCCOMPAT-LABEL: define weak_odr void @_Z17ExternAndInlineFnv
|
|
|
|
// NORMAL-NOT: _Z17ExternAndInlineFnv
|
|
|
|
extern inline void ExternAndInlineFn() {}
|
|
|
|
|
|
|
|
// MSVCCOMPAT-LABEL: define weak_odr void @_Z18InlineThenExternFnv
|
|
|
|
// NORMAL-NOT: _Z18InlineThenExternFnv
|
|
|
|
inline void InlineThenExternFn() {}
|
|
|
|
extern void InlineThenExternFn();
|
|
|
|
|
|
|
|
// CHECK-LABEL: define void @_Z18ExternThenInlineFnv
|
|
|
|
extern void ExternThenInlineFn() {}
|
|
|
|
|
|
|
|
// MSVCCOMPAT-LABEL: define weak_odr void @_Z25ExternThenInlineThenDefFnv
|
|
|
|
// NORMAL-NOT: _Z25ExternThenInlineThenDefFnv
|
|
|
|
extern void ExternThenInlineThenDefFn();
|
|
|
|
inline void ExternThenInlineThenDefFn();
|
|
|
|
void ExternThenInlineThenDefFn() {}
|
|
|
|
|
|
|
|
// MSVCCOMPAT-LABEL: define weak_odr void @_Z25InlineThenExternThenDefFnv
|
|
|
|
// NORMAL-NOT: _Z25InlineThenExternThenDefFnv
|
|
|
|
inline void InlineThenExternThenDefFn();
|
|
|
|
extern void InlineThenExternThenDefFn();
|
|
|
|
void InlineThenExternThenDefFn() {}
|
|
|
|
|
|
|
|
// MSVCCOMPAT-LABEL: define weak_odr i32 @_Z20ExternAndConstexprFnv
|
|
|
|
// NORMAL-NOT: _Z17ExternAndConstexprFnv
|
|
|
|
extern constexpr int ExternAndConstexprFn() { return 0; }
|
|
|
|
|
|
|
|
// CHECK-NOT: _Z11ConstexprFnv
|
|
|
|
constexpr int ConstexprFn() { return 0; }
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
extern inline void ExternInlineOnPrimaryTemplate(T);
|
|
|
|
|
|
|
|
// CHECK-LABEL: define void @_Z29ExternInlineOnPrimaryTemplateIiEvT_
|
|
|
|
template <>
|
|
|
|
void ExternInlineOnPrimaryTemplate(int) {}
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
extern inline void ExternInlineOnPrimaryTemplateAndSpecialization(T);
|
|
|
|
|
|
|
|
// MSVCCOMPAT-LABEL: define weak_odr void @_Z46ExternInlineOnPrimaryTemplateAndSpecializationIiEvT_
|
|
|
|
// NORMAL-NOT: _Z46ExternInlineOnPrimaryTemplateAndSpecializationIiEvT_
|
|
|
|
template <>
|
|
|
|
extern inline void ExternInlineOnPrimaryTemplateAndSpecialization(int) {}
|
|
|
|
|
|
|
|
struct TypeWithInlineMethods {
|
|
|
|
// CHECK-NOT: _ZN21TypeWithInlineMethods9StaticFunEv
|
|
|
|
static void StaticFun() {}
|
|
|
|
// CHECK-NOT: _ZN21TypeWithInlineMethods12NonStaticFunEv
|
|
|
|
void NonStaticFun() { StaticFun(); }
|
|
|
|
};
|
2015-03-20 08:02:27 +08:00
|
|
|
|
|
|
|
namespace PR22959 {
|
|
|
|
template <typename>
|
|
|
|
struct S;
|
|
|
|
|
|
|
|
S<int> Foo();
|
|
|
|
|
|
|
|
template <typename>
|
|
|
|
struct S {
|
|
|
|
friend S<int> Foo();
|
|
|
|
};
|
|
|
|
|
|
|
|
__attribute__((used)) inline S<int> Foo() { return S<int>(); }
|
|
|
|
// CHECK-LABEL: define linkonce_odr void @_ZN7PR229593FooEv(
|
|
|
|
}
|