1*67e74705SXin Li // RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK --check-prefix=NORMAL 2*67e74705SXin Li // 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 3*67e74705SXin Li // CHECK: ; ModuleID 4*67e74705SXin Li 5*67e74705SXin Li struct A { 6*67e74705SXin Li inline void f(); 7*67e74705SXin Li }; 8*67e74705SXin Li 9*67e74705SXin Li // NORMAL-NOT: define void @_ZN1A1fEv 10*67e74705SXin Li // MSVCCOMPAT-NOT: define void @"\01?f@A@@QEAAXXZ" f()11*67e74705SXin Livoid A::f() { } 12*67e74705SXin Li 13*67e74705SXin Li template<typename> struct B { }; 14*67e74705SXin Li 15*67e74705SXin Li template<> struct B<char> { 16*67e74705SXin Li inline void f(); 17*67e74705SXin Li }; 18*67e74705SXin Li 19*67e74705SXin Li // NORMAL-NOT: _ZN1BIcE1fEv 20*67e74705SXin Li // MSVCCOMPAT-NOT: @"\01?f@?$B@D@@QEAAXXZ" f()21*67e74705SXin Livoid B<char>::f() { } 22*67e74705SXin Li 23*67e74705SXin Li // We need a final CHECK line here. 24*67e74705SXin Li 25*67e74705SXin Li // NORMAL-LABEL: define void @_Z1fv 26*67e74705SXin Li // MSVCCOMPAT-LABEL: define void @"\01?f@@YAXXZ" f()27*67e74705SXin Livoid f() { } 28*67e74705SXin Li 29*67e74705SXin Li // <rdar://problem/8740363> 30*67e74705SXin Li inline void f1(int); 31*67e74705SXin Li 32*67e74705SXin Li // NORMAL-LABEL: define linkonce_odr void @_Z2f1i 33*67e74705SXin Li // MSVCCOMPAT-LABEL: define linkonce_odr void @"\01?f1@@YAXH@Z" f1(int)34*67e74705SXin Livoid f1(int) { } 35*67e74705SXin Li test_f1()36*67e74705SXin Livoid test_f1() { f1(17); } 37*67e74705SXin Li 38*67e74705SXin Li // PR8789 39*67e74705SXin Li namespace test1 { 40*67e74705SXin Li template <typename T> class ClassTemplate { 41*67e74705SXin Li private: 42*67e74705SXin Li friend void T::func(); g()43*67e74705SXin Li void g() {} 44*67e74705SXin Li }; 45*67e74705SXin Li 46*67e74705SXin Li // NORMAL-LABEL: define linkonce_odr void @_ZN5test11C4funcEv( 47*67e74705SXin Li // MSVCCOMPAT-LABEL: define linkonce_odr void @"\01?func@C@test1@@QEAAXXZ"( 48*67e74705SXin Li 49*67e74705SXin Li class C { 50*67e74705SXin Li public: func()51*67e74705SXin Li void func() { 52*67e74705SXin Li ClassTemplate<C> ct; 53*67e74705SXin Li ct.g(); 54*67e74705SXin Li } 55*67e74705SXin Li }; 56*67e74705SXin Li f()57*67e74705SXin Li void f() { 58*67e74705SXin Li C c; 59*67e74705SXin Li c.func(); 60*67e74705SXin Li } 61*67e74705SXin Li } 62*67e74705SXin Li 63*67e74705SXin Li // PR13252 64*67e74705SXin Li namespace test2 { 65*67e74705SXin Li struct A; 66*67e74705SXin Li void f(const A& a); 67*67e74705SXin Li struct A { f(const A & a)68*67e74705SXin Li friend void f(const A& a) { } 69*67e74705SXin Li }; g()70*67e74705SXin Li void g() { 71*67e74705SXin Li A a; 72*67e74705SXin Li f(a); 73*67e74705SXin Li } 74*67e74705SXin Li // NORMAL-LABEL: define linkonce_odr void @_ZN5test21fERKNS_1AE 75*67e74705SXin Li // MSVCCOMPAT-LABEL: define linkonce_odr void @"\01?f@test2@@YAXAEBUA@1@@Z" 76*67e74705SXin Li } 77*67e74705SXin Li 78*67e74705SXin Li // NORMAL-NOT: _Z17ExternAndInlineFnv 79*67e74705SXin Li // MSVCCOMPAT-LABEL: define weak_odr void @"\01?ExternAndInlineFn@@YAXXZ" ExternAndInlineFn()80*67e74705SXin Liextern inline void ExternAndInlineFn() {} 81*67e74705SXin Li 82*67e74705SXin Li // NORMAL-NOT: _Z18InlineThenExternFnv 83*67e74705SXin Li // MSVCCOMPAT-LABEL: define weak_odr void @"\01?InlineThenExternFn@@YAXXZ" InlineThenExternFn()84*67e74705SXin Liinline void InlineThenExternFn() {} 85*67e74705SXin Li extern void InlineThenExternFn(); 86*67e74705SXin Li 87*67e74705SXin Li // NORMAL-LABEL: define void @_Z18ExternThenInlineFnv 88*67e74705SXin Li // MSVCCOMPAT-LABEL: define void @"\01?ExternThenInlineFn@@YAXXZ" ExternThenInlineFn()89*67e74705SXin Liextern void ExternThenInlineFn() {} 90*67e74705SXin Li 91*67e74705SXin Li // NORMAL-NOT: _Z25ExternThenInlineThenDefFnv 92*67e74705SXin Li // MSVCCOMPAT-LABEL: define weak_odr void @"\01?ExternThenInlineThenDefFn@@YAXXZ" 93*67e74705SXin Li extern void ExternThenInlineThenDefFn(); 94*67e74705SXin Li inline void ExternThenInlineThenDefFn(); ExternThenInlineThenDefFn()95*67e74705SXin Livoid ExternThenInlineThenDefFn() {} 96*67e74705SXin Li 97*67e74705SXin Li // NORMAL-NOT: _Z25InlineThenExternThenDefFnv 98*67e74705SXin Li // MSVCCOMPAT-LABEL: define weak_odr void @"\01?InlineThenExternThenDefFn@@YAXXZ" 99*67e74705SXin Li inline void InlineThenExternThenDefFn(); 100*67e74705SXin Li extern void InlineThenExternThenDefFn(); InlineThenExternThenDefFn()101*67e74705SXin Livoid InlineThenExternThenDefFn() {} 102*67e74705SXin Li 103*67e74705SXin Li // NORMAL-NOT: _Z17ExternAndConstexprFnv 104*67e74705SXin Li // MSVCCOMPAT-LABEL: define weak_odr i32 @"\01?ExternAndConstexprFn@@YAHXZ" ExternAndConstexprFn()105*67e74705SXin Liextern constexpr int ExternAndConstexprFn() { return 0; } 106*67e74705SXin Li 107*67e74705SXin Li // NORMAL-NOT: _Z11ConstexprFnv 108*67e74705SXin Li // MSVCCOMPAT-NOT: @"\01?ConstexprFn@@YAHXZ" ConstexprFn()109*67e74705SXin Liconstexpr int ConstexprFn() { return 0; } 110*67e74705SXin Li 111*67e74705SXin Li template <typename T> 112*67e74705SXin Li extern inline void ExternInlineOnPrimaryTemplate(T); 113*67e74705SXin Li 114*67e74705SXin Li // NORMAL-LABEL: define void @_Z29ExternInlineOnPrimaryTemplateIiEvT_ 115*67e74705SXin Li // MSVCCOMPAT-LABEL: define void @"\01??$ExternInlineOnPrimaryTemplate@H@@YAXH@Z" 116*67e74705SXin Li template <> ExternInlineOnPrimaryTemplate(int)117*67e74705SXin Livoid ExternInlineOnPrimaryTemplate(int) {} 118*67e74705SXin Li 119*67e74705SXin Li template <typename T> 120*67e74705SXin Li extern inline void ExternInlineOnPrimaryTemplateAndSpecialization(T); 121*67e74705SXin Li 122*67e74705SXin Li // NORMAL-NOT: _Z46ExternInlineOnPrimaryTemplateAndSpecializationIiEvT_ 123*67e74705SXin Li // MSVCCOMPAT-LABEL: define weak_odr void @"\01??$ExternInlineOnPrimaryTemplateAndSpecialization@H@@YAXH@Z" 124*67e74705SXin Li template <> ExternInlineOnPrimaryTemplateAndSpecialization(int)125*67e74705SXin Liextern inline void ExternInlineOnPrimaryTemplateAndSpecialization(int) {} 126*67e74705SXin Li 127*67e74705SXin Li struct TypeWithInlineMethods { 128*67e74705SXin Li // NORMAL-NOT: _ZN21TypeWithInlineMethods9StaticFunEv 129*67e74705SXin Li // MSVCCOMPAT-NOT: @"\01?StaticFun@TypeWithInlineMethods@@SAXXZ" StaticFunTypeWithInlineMethods130*67e74705SXin Li static void StaticFun() {} 131*67e74705SXin Li // NORMAL-NOT: _ZN21TypeWithInlineMethods12NonStaticFunEv 132*67e74705SXin Li // MSVCCOMPAT-NOT: @"\01?NonStaticFun@TypeWithInlineMethods@@QEAAXXZ" NonStaticFunTypeWithInlineMethods133*67e74705SXin Li void NonStaticFun() { StaticFun(); } 134*67e74705SXin Li }; 135*67e74705SXin Li 136*67e74705SXin Li namespace PR22959 { 137*67e74705SXin Li template <typename> 138*67e74705SXin Li struct S; 139*67e74705SXin Li 140*67e74705SXin Li S<int> Foo(); 141*67e74705SXin Li 142*67e74705SXin Li template <typename> 143*67e74705SXin Li struct S { 144*67e74705SXin Li friend S<int> Foo(); 145*67e74705SXin Li }; 146*67e74705SXin Li Foo()147*67e74705SXin Li__attribute__((used)) inline S<int> Foo() { return S<int>(); } 148*67e74705SXin Li // NORMAL-LABEL: define linkonce_odr void @_ZN7PR229593FooEv( 149*67e74705SXin Li // MSVCCOMPAT-LABEL: define linkonce_odr i8 @"\01?Foo@PR22959@@YA?AU?$S@H@1@XZ"( 150*67e74705SXin Li } 151