// 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 @"\01?f@A@@QEAAXXZ" void A::f() { } template struct B { }; template<> struct B { inline void f(); }; // NORMAL-NOT: _ZN1BIcE1fEv // MSVCCOMPAT-NOT: @"\01?f@?$B@D@@QEAAXXZ" void B::f() { } // We need a final CHECK line here. // NORMAL-LABEL: define void @_Z1fv // MSVCCOMPAT-LABEL: define void @"\01?f@@YAXXZ" void f() { } // inline void f1(int); // NORMAL-LABEL: define linkonce_odr void @_Z2f1i // MSVCCOMPAT-LABEL: define linkonce_odr void @"\01?f1@@YAXH@Z" void f1(int) { } void test_f1() { f1(17); } // PR8789 namespace test1 { template class ClassTemplate { private: friend void T::func(); void g() {} }; // NORMAL-LABEL: define linkonce_odr void @_ZN5test11C4funcEv( // MSVCCOMPAT-LABEL: define linkonce_odr void @"\01?func@C@test1@@QEAAXXZ"( class C { public: void func() { ClassTemplate 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 void @"\01?f@test2@@YAXAEBUA@1@@Z" } // NORMAL-NOT: _Z17ExternAndInlineFnv // MSVCCOMPAT-LABEL: define weak_odr void @"\01?ExternAndInlineFn@@YAXXZ" extern inline void ExternAndInlineFn() {} // NORMAL-NOT: _Z18InlineThenExternFnv // MSVCCOMPAT-LABEL: define weak_odr void @"\01?InlineThenExternFn@@YAXXZ" inline void InlineThenExternFn() {} extern void InlineThenExternFn(); // NORMAL-LABEL: define void @_Z18ExternThenInlineFnv // MSVCCOMPAT-LABEL: define void @"\01?ExternThenInlineFn@@YAXXZ" extern void ExternThenInlineFn() {} // NORMAL-NOT: _Z25ExternThenInlineThenDefFnv // MSVCCOMPAT-LABEL: define weak_odr void @"\01?ExternThenInlineThenDefFn@@YAXXZ" extern void ExternThenInlineThenDefFn(); inline void ExternThenInlineThenDefFn(); void ExternThenInlineThenDefFn() {} // NORMAL-NOT: _Z25InlineThenExternThenDefFnv // MSVCCOMPAT-LABEL: define weak_odr void @"\01?InlineThenExternThenDefFn@@YAXXZ" inline void InlineThenExternThenDefFn(); extern void InlineThenExternThenDefFn(); void InlineThenExternThenDefFn() {} // NORMAL-NOT: _Z17ExternAndConstexprFnv // MSVCCOMPAT-LABEL: define weak_odr i32 @"\01?ExternAndConstexprFn@@YAHXZ" extern constexpr int ExternAndConstexprFn() { return 0; } // NORMAL-NOT: _Z11ConstexprFnv // MSVCCOMPAT-NOT: @"\01?ConstexprFn@@YAHXZ" constexpr int ConstexprFn() { return 0; } template extern inline void ExternInlineOnPrimaryTemplate(T); // NORMAL-LABEL: define void @_Z29ExternInlineOnPrimaryTemplateIiEvT_ // MSVCCOMPAT-LABEL: define void @"\01??$ExternInlineOnPrimaryTemplate@H@@YAXH@Z" template <> void ExternInlineOnPrimaryTemplate(int) {} template extern inline void ExternInlineOnPrimaryTemplateAndSpecialization(T); // NORMAL-NOT: _Z46ExternInlineOnPrimaryTemplateAndSpecializationIiEvT_ // MSVCCOMPAT-LABEL: define weak_odr void @"\01??$ExternInlineOnPrimaryTemplateAndSpecialization@H@@YAXH@Z" template <> extern inline void ExternInlineOnPrimaryTemplateAndSpecialization(int) {} struct TypeWithInlineMethods { // NORMAL-NOT: _ZN21TypeWithInlineMethods9StaticFunEv // MSVCCOMPAT-NOT: @"\01?StaticFun@TypeWithInlineMethods@@SAXXZ" static void StaticFun() {} // NORMAL-NOT: _ZN21TypeWithInlineMethods12NonStaticFunEv // MSVCCOMPAT-NOT: @"\01?NonStaticFun@TypeWithInlineMethods@@QEAAXXZ" void NonStaticFun() { StaticFun(); } }; namespace PR22959 { template struct S; S Foo(); template struct S { friend S Foo(); }; __attribute__((used)) inline S Foo() { return S(); } // NORMAL-LABEL: define linkonce_odr void @_ZN7PR229593FooEv( // MSVCCOMPAT-LABEL: define linkonce_odr i8 @"\01?Foo@PR22959@@YA?AU?$S@H@1@XZ"( }