forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			151 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			4.2 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 @"\01?f@A@@QEAAXXZ"
 | 
						|
void A::f() { }
 | 
						|
 | 
						|
template<typename> struct B { };
 | 
						|
 | 
						|
template<> struct B<char> {
 | 
						|
  inline void f();
 | 
						|
};
 | 
						|
 | 
						|
// NORMAL-NOT: _ZN1BIcE1fEv
 | 
						|
// MSVCCOMPAT-NOT: @"\01?f@?$B@D@@QEAAXXZ"
 | 
						|
void B<char>::f() { }
 | 
						|
 | 
						|
// We need a final CHECK line here.
 | 
						|
 | 
						|
// NORMAL-LABEL: define void @_Z1fv
 | 
						|
// MSVCCOMPAT-LABEL: define void @"\01?f@@YAXXZ"
 | 
						|
void f() { }
 | 
						|
 | 
						|
// <rdar://problem/8740363>
 | 
						|
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 <typename T> 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<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 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 <typename T>
 | 
						|
extern inline void ExternInlineOnPrimaryTemplate(T);
 | 
						|
 | 
						|
// NORMAL-LABEL: define void @_Z29ExternInlineOnPrimaryTemplateIiEvT_
 | 
						|
// MSVCCOMPAT-LABEL: define void @"\01??$ExternInlineOnPrimaryTemplate@H@@YAXH@Z"
 | 
						|
template <>
 | 
						|
void ExternInlineOnPrimaryTemplate(int) {}
 | 
						|
 | 
						|
template <typename T>
 | 
						|
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 <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 i8 @"\01?Foo@PR22959@@YA?AU?$S@H@1@XZ"(
 | 
						|
}
 |