|  | // RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s | 
|  |  | 
|  | struct X {}; | 
|  |  | 
|  | // CHECK-LABEL: define void @_Z1f1XS_( | 
|  | void f(X, X) { } | 
|  |  | 
|  | // CHECK-LABEL: define void @_Z1fR1XS0_( | 
|  | void f(X&, X&) { } | 
|  |  | 
|  | // CHECK-LABEL: define void @_Z1fRK1XS1_( | 
|  | void f(const X&, const X&) { } | 
|  |  | 
|  | typedef void T(); | 
|  | struct S {}; | 
|  |  | 
|  | // CHECK-LABEL: define void @_Z1fPFvvEM1SFvvE( | 
|  | void f(T*, T (S::*)) {} | 
|  |  | 
|  | namespace A { | 
|  | struct A { }; | 
|  | struct B { }; | 
|  | }; | 
|  |  | 
|  | // CHECK-LABEL: define void @_Z1fN1A1AENS_1BE( | 
|  | void f(A::A a, A::B b) { } | 
|  |  | 
|  | struct C { | 
|  | struct D { }; | 
|  | }; | 
|  |  | 
|  | // CHECK-LABEL: define void @_Z1fN1C1DERS_PS_S1_( | 
|  | void f(C::D, C&, C*, C&) { } | 
|  |  | 
|  | template<typename T> | 
|  | struct V { | 
|  | typedef int U; | 
|  | }; | 
|  |  | 
|  | template <typename T> void f1(typename V<T>::U, V<T>) { } | 
|  |  | 
|  | // CHECK: @_Z2f1IiEvN1VIT_E1UES2_ | 
|  | template void f1<int>(int, V<int>); | 
|  |  | 
|  | template <typename T> void f2(V<T>, typename V<T>::U) { } | 
|  |  | 
|  | // CHECK: @_Z2f2IiEv1VIT_ENS2_1UE | 
|  | template void f2<int>(V<int>, int); | 
|  |  | 
|  | namespace NS { | 
|  | template <typename T> struct S1 {}; | 
|  | template<typename T> void ft3(S1<T>, S1<char>) {  } | 
|  |  | 
|  | // CHECK: @_ZN2NS3ft3IiEEvNS_2S1IT_EENS1_IcEE | 
|  | template void ft3<int>(S1<int>, S1<char>); | 
|  | } | 
|  |  | 
|  | // PR5196 | 
|  | // CHECK: @_Z1fPKcS0_ | 
|  | void f(const char*, const char*) {} | 
|  |  | 
|  | namespace NS { | 
|  | class C; | 
|  | } | 
|  |  | 
|  | namespace NS { | 
|  | // CHECK: @_ZN2NS1fERNS_1CE | 
|  | void f(C&) { } | 
|  | } | 
|  |  | 
|  | namespace Test1 { | 
|  |  | 
|  | struct A { }; | 
|  | struct B { }; | 
|  |  | 
|  | // CHECK: @_ZN5Test11fEMNS_1BEFvvENS_1AES3_ | 
|  | void f(void (B::*)(), A, A) { } | 
|  |  | 
|  | // CHECK: @_ZN5Test11fEMNS_1BEFvvENS_1AES3_MS0_FvS3_EMS3_FvvE | 
|  | void f(void (B::*)(), A, A, void (B::*)(A), void (A::*)()) { } | 
|  |  | 
|  | } | 
|  |  | 
|  | namespace ManglePrefix { | 
|  | template <typename> | 
|  | struct X { | 
|  | template <typename> | 
|  | struct Y { | 
|  | typedef int type; | 
|  | typedef int type2; | 
|  | }; | 
|  | }; | 
|  | template <typename T> | 
|  | typename X<T>::template Y<T>::type f(typename X<T>::template Y<T>::type2) { return 0; } | 
|  |  | 
|  | // CHECK: @_ZN12ManglePrefix1fIiEENS_1XIT_E1YIS2_E4typeENS5_5type2E | 
|  | template int f<int>(int); | 
|  | } |