This reverts commit d618f1c3b12effd0c2bdb7d02108d3551f389d3d. This commit wasn't reviewed ahead of time and significant concerns were raised immediately after it landed. According to our developer policy this warrants immediate revert of the commit. https://llvm.org/docs/DeveloperPolicy.html#patch-reversion-policy Differential Revision: https://reviews.llvm.org/D155509
151 lines
4.3 KiB
C++
151 lines
4.3 KiB
C++
// 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-pc-win32 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK --check-prefix=MSVCCOMPAT
|
|
// CHECK: ; ModuleID
|
|
|
|
struct A {
|
|
inline void f();
|
|
};
|
|
|
|
// NORMAL-NOT: define{{.*}} void @_ZN1A1fEv
|
|
// MSVCCOMPAT-NOT: define{{.*}} void @"?f@A@@QEAAXXZ"
|
|
void A::f() { }
|
|
|
|
template<typename> struct B { };
|
|
|
|
template<> struct B<char> {
|
|
inline void f();
|
|
};
|
|
|
|
// NORMAL-NOT: _ZN1BIcE1fEv
|
|
// MSVCCOMPAT-NOT: @"?f@?$B@D@@QEAAXXZ"
|
|
void B<char>::f() { }
|
|
|
|
// We need a final CHECK line here.
|
|
|
|
// NORMAL-LABEL: define{{.*}} void @_Z1fv
|
|
// MSVCCOMPAT-LABEL: define dso_local void @"?f@@YAXXZ"
|
|
void f() { }
|
|
|
|
// <rdar://problem/8740363>
|
|
inline void f1(int);
|
|
|
|
// NORMAL-LABEL: define linkonce_odr void @_Z2f1i
|
|
// MSVCCOMPAT-LABEL: define linkonce_odr dso_local void @"?f1@@YAXH@Z"
|
|
void f1(int) { }
|
|
|
|
void test_f1() { f1(17); }
|
|
|
|
// PR8789
|
|
namespace test1 {
|
|
template <typename T> class ClassTemplate {
|
|
private:
|
|
friend void T::func();
|
|
void g() {}
|
|
};
|
|
|
|
// NORMAL-LABEL: define linkonce_odr void @_ZN5test11C4funcEv(
|
|
// MSVCCOMPAT-LABEL: define linkonce_odr dso_local void @"?func@C@test1@@QEAAXXZ"(
|
|
|
|
class C {
|
|
public:
|
|
void func() {
|
|
ClassTemplate<C> ct;
|
|
ct.g();
|
|
}
|
|
};
|
|
|
|
void f() {
|
|
C c;
|
|
c.func();
|
|
}
|
|
}
|
|
|
|
// PR13252
|
|
namespace test2 {
|
|
struct A;
|
|
void f(const A& a);
|
|
struct A {
|
|
friend void f(const A& a) { }
|
|
};
|
|
void g() {
|
|
A a;
|
|
f(a);
|
|
}
|
|
// NORMAL-LABEL: define linkonce_odr void @_ZN5test21fERKNS_1AE
|
|
// MSVCCOMPAT-LABEL: define linkonce_odr dso_local void @"?f@test2@@YAXAEBUA@1@@Z"
|
|
}
|
|
|
|
// NORMAL-NOT: _Z17ExternAndInlineFnv
|
|
// MSVCCOMPAT-LABEL: define weak_odr dso_local void @"?ExternAndInlineFn@@YAXXZ"
|
|
extern inline void ExternAndInlineFn() {}
|
|
|
|
// NORMAL-NOT: _Z18InlineThenExternFnv
|
|
// MSVCCOMPAT-LABEL: define weak_odr dso_local void @"?InlineThenExternFn@@YAXXZ"
|
|
inline void InlineThenExternFn() {}
|
|
extern void InlineThenExternFn();
|
|
|
|
// NORMAL-LABEL: define{{.*}} void @_Z18ExternThenInlineFnv
|
|
// MSVCCOMPAT-LABEL: define dso_local void @"?ExternThenInlineFn@@YAXXZ"
|
|
extern void ExternThenInlineFn() {}
|
|
|
|
// NORMAL-NOT: _Z25ExternThenInlineThenDefFnv
|
|
// MSVCCOMPAT-LABEL: define weak_odr dso_local void @"?ExternThenInlineThenDefFn@@YAXXZ"
|
|
extern void ExternThenInlineThenDefFn();
|
|
inline void ExternThenInlineThenDefFn();
|
|
void ExternThenInlineThenDefFn() {}
|
|
|
|
// NORMAL-NOT: _Z25InlineThenExternThenDefFnv
|
|
// MSVCCOMPAT-LABEL: define weak_odr dso_local void @"?InlineThenExternThenDefFn@@YAXXZ"
|
|
inline void InlineThenExternThenDefFn();
|
|
extern void InlineThenExternThenDefFn();
|
|
void InlineThenExternThenDefFn() {}
|
|
|
|
// NORMAL-NOT: _Z17ExternAndConstexprFnv
|
|
// MSVCCOMPAT-LABEL: define weak_odr dso_local noundef i32 @"?ExternAndConstexprFn@@YAHXZ"
|
|
extern constexpr int ExternAndConstexprFn() { return 0; }
|
|
|
|
// NORMAL-NOT: _Z11ConstexprFnv
|
|
// MSVCCOMPAT-NOT: @"?ConstexprFn@@YAHXZ"
|
|
constexpr int ConstexprFn() { return 0; }
|
|
|
|
template <typename T>
|
|
extern inline void ExternInlineOnPrimaryTemplate(T);
|
|
|
|
// NORMAL-LABEL: define{{.*}} void @_Z29ExternInlineOnPrimaryTemplateIiEvT_
|
|
// MSVCCOMPAT-LABEL: define dso_local void @"??$ExternInlineOnPrimaryTemplate@H@@YAXH@Z"
|
|
template <>
|
|
void ExternInlineOnPrimaryTemplate(int) {}
|
|
|
|
template <typename T>
|
|
extern inline void ExternInlineOnPrimaryTemplateAndSpecialization(T);
|
|
|
|
// NORMAL-NOT: _Z46ExternInlineOnPrimaryTemplateAndSpecializationIiEvT_
|
|
// MSVCCOMPAT-LABEL: define weak_odr dso_local void @"??$ExternInlineOnPrimaryTemplateAndSpecialization@H@@YAXH@Z"
|
|
template <>
|
|
extern inline void ExternInlineOnPrimaryTemplateAndSpecialization(int) {}
|
|
|
|
struct TypeWithInlineMethods {
|
|
// NORMAL-NOT: _ZN21TypeWithInlineMethods9StaticFunEv
|
|
// MSVCCOMPAT-NOT: @"?StaticFun@TypeWithInlineMethods@@SAXXZ"
|
|
static void StaticFun() {}
|
|
// NORMAL-NOT: _ZN21TypeWithInlineMethods12NonStaticFunEv
|
|
// MSVCCOMPAT-NOT: @"?NonStaticFun@TypeWithInlineMethods@@QEAAXXZ"
|
|
void NonStaticFun() { StaticFun(); }
|
|
};
|
|
|
|
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>(); }
|
|
// NORMAL-LABEL: define linkonce_odr void @_ZN7PR229593FooEv(
|
|
// MSVCCOMPAT-LABEL: define linkonce_odr dso_local i8 @"?Foo@PR22959@@YA?AU?$S@H@1@XZ"(
|
|
}
|