xref: /aosp_15_r20/external/clang/test/CodeGenCXX/mangle-subst.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li struct X {};
4*67e74705SXin Li 
5*67e74705SXin Li // CHECK-LABEL: define void @_Z1f1XS_(
f(X,X)6*67e74705SXin Li void f(X, X) { }
7*67e74705SXin Li 
8*67e74705SXin Li // CHECK-LABEL: define void @_Z1fR1XS0_(
f(X &,X &)9*67e74705SXin Li void f(X&, X&) { }
10*67e74705SXin Li 
11*67e74705SXin Li // CHECK-LABEL: define void @_Z1fRK1XS1_(
f(const X &,const X &)12*67e74705SXin Li void f(const X&, const X&) { }
13*67e74705SXin Li 
14*67e74705SXin Li typedef void T();
15*67e74705SXin Li struct S {};
16*67e74705SXin Li 
17*67e74705SXin Li // CHECK-LABEL: define void @_Z1fPFvvEM1SFvvE(
f(T *,T (S::*))18*67e74705SXin Li void f(T*, T (S::*)) {}
19*67e74705SXin Li 
20*67e74705SXin Li namespace A {
21*67e74705SXin Li   struct A { };
22*67e74705SXin Li   struct B { };
23*67e74705SXin Li };
24*67e74705SXin Li 
25*67e74705SXin Li // CHECK-LABEL: define void @_Z1fN1A1AENS_1BE(
f(A::A a,A::B b)26*67e74705SXin Li void f(A::A a, A::B b) { }
27*67e74705SXin Li 
28*67e74705SXin Li struct C {
29*67e74705SXin Li   struct D { };
30*67e74705SXin Li };
31*67e74705SXin Li 
32*67e74705SXin Li // CHECK-LABEL: define void @_Z1fN1C1DERS_PS_S1_(
f(C::D,C &,C *,C &)33*67e74705SXin Li void f(C::D, C&, C*, C&) { }
34*67e74705SXin Li 
35*67e74705SXin Li template<typename T>
36*67e74705SXin Li struct V {
37*67e74705SXin Li   typedef int U;
38*67e74705SXin Li };
39*67e74705SXin Li 
f1(typename V<T>::U,V<T>)40*67e74705SXin Li template <typename T> void f1(typename V<T>::U, V<T>) { }
41*67e74705SXin Li 
42*67e74705SXin Li // CHECK: @_Z2f1IiEvN1VIT_E1UES2_
43*67e74705SXin Li template void f1<int>(int, V<int>);
44*67e74705SXin Li 
f2(V<T>,typename V<T>::U)45*67e74705SXin Li template <typename T> void f2(V<T>, typename V<T>::U) { }
46*67e74705SXin Li 
47*67e74705SXin Li // CHECK: @_Z2f2IiEv1VIT_ENS2_1UE
48*67e74705SXin Li template void f2<int>(V<int>, int);
49*67e74705SXin Li 
50*67e74705SXin Li namespace NS {
51*67e74705SXin Li template <typename T> struct S1 {};
ft3(S1<T>,S1<char>)52*67e74705SXin Li template<typename T> void ft3(S1<T>, S1<char>) {  }
53*67e74705SXin Li 
54*67e74705SXin Li // CHECK: @_ZN2NS3ft3IiEEvNS_2S1IT_EENS1_IcEE
55*67e74705SXin Li template void ft3<int>(S1<int>, S1<char>);
56*67e74705SXin Li }
57*67e74705SXin Li 
58*67e74705SXin Li // PR5196
59*67e74705SXin Li // CHECK: @_Z1fPKcS0_
f(const char *,const char *)60*67e74705SXin Li void f(const char*, const char*) {}
61*67e74705SXin Li 
62*67e74705SXin Li namespace NS {
63*67e74705SXin Li   class C;
64*67e74705SXin Li }
65*67e74705SXin Li 
66*67e74705SXin Li namespace NS {
67*67e74705SXin Li   // CHECK: @_ZN2NS1fERNS_1CE
f(C &)68*67e74705SXin Li   void f(C&) { }
69*67e74705SXin Li }
70*67e74705SXin Li 
71*67e74705SXin Li namespace Test1 {
72*67e74705SXin Li 
73*67e74705SXin Li struct A { };
74*67e74705SXin Li struct B { };
75*67e74705SXin Li 
76*67e74705SXin Li // CHECK: @_ZN5Test11fEMNS_1BEFvvENS_1AES3_
f(void (B::*)(),A,A)77*67e74705SXin Li void f(void (B::*)(), A, A) { }
78*67e74705SXin Li 
79*67e74705SXin Li // CHECK: @_ZN5Test11fEMNS_1BEFvvENS_1AES3_MS0_FvS3_EMS3_FvvE
f(void (B::*)(),A,A,void (B::*)(A),void (A::*)())80*67e74705SXin Li void f(void (B::*)(), A, A, void (B::*)(A), void (A::*)()) { }
81*67e74705SXin Li 
82*67e74705SXin Li }
83*67e74705SXin Li 
84*67e74705SXin Li namespace ManglePrefix {
85*67e74705SXin Li template <typename>
86*67e74705SXin Li struct X {
87*67e74705SXin Li   template <typename>
88*67e74705SXin Li   struct Y {
89*67e74705SXin Li     typedef int type;
90*67e74705SXin Li     typedef int type2;
91*67e74705SXin Li   };
92*67e74705SXin Li };
93*67e74705SXin Li template <typename T>
f(typename X<T>::template Y<T>::type2)94*67e74705SXin Li typename X<T>::template Y<T>::type f(typename X<T>::template Y<T>::type2) { return 0; }
95*67e74705SXin Li 
96*67e74705SXin Li // CHECK: @_ZN12ManglePrefix1fIiEENS_1XIT_E1YIS2_E4typeENS5_5type2E
97*67e74705SXin Li template int f<int>(int);
98*67e74705SXin Li }
99