| // RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s | 
 |  | 
 | struct X {}; | 
 |  | 
 | // CHECK: define void @_Z1f1XS_( | 
 | void f(X, X) { } | 
 |  | 
 | // CHECK: define void @_Z1fR1XS0_( | 
 | void f(X&, X&) { } | 
 |  | 
 | // CHECK: define void @_Z1fRK1XS1_( | 
 | void f(const X&, const X&) { } | 
 |  | 
 | typedef void T(); | 
 | struct S {}; | 
 |  | 
 | // CHECK: define void @_Z1fPFvvEM1SFvvE( | 
 | void f(T*, T (S::*)) {} | 
 |  | 
 | namespace A { | 
 |   struct A { }; | 
 |   struct B { }; | 
 | }; | 
 |  | 
 | // CHECK: define void @_Z1fN1A1AENS_1BE( | 
 | void f(A::A a, A::B b) { } | 
 |  | 
 | struct C { | 
 |   struct D { }; | 
 | }; | 
 |  | 
 | // CHECK: 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&) { }  | 
 | } |