xref: /aosp_15_r20/external/clang/test/CodeGenObjCXX/mangle.mm (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -std=c++11 -emit-llvm -fblocks -o - | FileCheck %s
2*67e74705SXin Li
3*67e74705SXin Li// CHECK: @"_ZZ11+[A shared]E1a" = internal global
4*67e74705SXin Li// CHECK: @"_ZZ11-[A(Foo) f]E1a" = internal global
5*67e74705SXin Li// CHECK: v56@0:8i16i20i24i28i32i36i40i44^i48
6*67e74705SXin Li
7*67e74705SXin Li@interface A
8*67e74705SXin Li@end
9*67e74705SXin Li
10*67e74705SXin Li@implementation A
11*67e74705SXin Li
12*67e74705SXin Li+ (A *)shared {
13*67e74705SXin Li  static A* a;
14*67e74705SXin Li
15*67e74705SXin Li  return a;
16*67e74705SXin Li}
17*67e74705SXin Li
18*67e74705SXin Li@end
19*67e74705SXin Li
20*67e74705SXin Li@interface A(Foo)
21*67e74705SXin Li@end
22*67e74705SXin Li
23*67e74705SXin Li@implementation A(Foo)
24*67e74705SXin Li- (int)f {
25*67e74705SXin Li  // FIXME: Add a member function to s and make sure that it's mangled correctly.
26*67e74705SXin Li  struct s {
27*67e74705SXin Li  };
28*67e74705SXin Li
29*67e74705SXin Li  static s a;
30*67e74705SXin Li
31*67e74705SXin Li  return 0;
32*67e74705SXin Li}
33*67e74705SXin Li@end
34*67e74705SXin Li
35*67e74705SXin Li// PR6468
36*67e74705SXin Li@interface Test
37*67e74705SXin Li- (void) process: (int)r3 :(int)r4 :(int)r5 :(int)r6 :(int)r7 :(int)r8 :(int)r9 :(int)r10 :(int &)i;
38*67e74705SXin Li@end
39*67e74705SXin Li
40*67e74705SXin Li@implementation Test
41*67e74705SXin Li- (void) process: (int)r3 :(int)r4 :(int)r5 :(int)r6 :(int)r7 :(int)r8 :(int)r9 :(int)r10 :(int &)i {
42*67e74705SXin Li}
43*67e74705SXin Li@end
44*67e74705SXin Li
45*67e74705SXin Li// rdar://9566314
46*67e74705SXin Li@interface NX
47*67e74705SXin Li- (void)Meth;
48*67e74705SXin Li@end
49*67e74705SXin Li
50*67e74705SXin Li@implementation NX
51*67e74705SXin Li- (void)Meth {
52*67e74705SXin Li  void uiIsVisible();
53*67e74705SXin Li// CHECK: call void @_Z11uiIsVisiblev
54*67e74705SXin Li  uiIsVisible();
55*67e74705SXin Li}
56*67e74705SXin Li@end
57*67e74705SXin Li
58*67e74705SXin Li// rdar://13434937
59*67e74705SXin Li//
60*67e74705SXin Li// Don't crash when mangling an enum whose semantic context
61*67e74705SXin Li// is a class extension (which looks anonymous in the AST).
62*67e74705SXin Li// The other tests here are just for coverage.
63*67e74705SXin Li@interface Test2 @end
64*67e74705SXin Li@interface Test2 ()
65*67e74705SXin Li@property (assign) enum { T2x, T2y, T2z } axis;
66*67e74705SXin Li@end
67*67e74705SXin Li@interface Test2 (a)
68*67e74705SXin Li@property (assign) enum { T2i, T2j, T2k } dimension;
69*67e74705SXin Li@end
70*67e74705SXin Li@implementation Test2 {
71*67e74705SXin Li@public
72*67e74705SXin Li  enum { T2a, T2b, T2c } alt_axis;
73*67e74705SXin Li}
74*67e74705SXin Li@end
75*67e74705SXin Litemplate <class T> struct Test2Template { Test2Template() {} }; // must have a member that we'll instantiate and mangle
76*67e74705SXin Livoid test2(Test2 *t) {
77*67e74705SXin Li  Test2Template<decltype(t.axis)> t0;
78*67e74705SXin Li  Test2Template<decltype(t.dimension)> t1;
79*67e74705SXin Li  Test2Template<decltype(t->alt_axis)> t2;
80*67e74705SXin Li}
81*67e74705SXin Li
82*67e74705SXin Li@protocol P;
83*67e74705SXin Livoid overload1(A<P>*) {}
84*67e74705SXin Li// CHECK-LABEL: define void @_Z9overload1PU11objcproto1P1A
85*67e74705SXin Livoid overload1(const A<P>*) {}
86*67e74705SXin Li// CHECK-LABEL: define void @_Z9overload1PKU11objcproto1P1A
87*67e74705SXin Livoid overload1(A<P>**) {}
88*67e74705SXin Li// CHECK-LABEL: define void @_Z9overload1PPU11objcproto1P1A
89*67e74705SXin Livoid overload1(A<P>*const*) {}
90*67e74705SXin Li// CHECK-LABEL: define void @_Z9overload1PKPU11objcproto1P1A
91*67e74705SXin Livoid overload1(A<P>***) {}
92*67e74705SXin Li// CHECK-LABEL: define void @_Z9overload1PPPU11objcproto1P1A
93*67e74705SXin Livoid overload1(void (f)(A<P>*)) {}
94*67e74705SXin Li// CHECK-LABEL: define void @_Z9overload1PFvPU11objcproto1P1AE
95*67e74705SXin Li
96*67e74705SXin Litemplate<typename T> struct X { void f(); };
97*67e74705SXin Litemplate<> void X<A*>::f() {}
98*67e74705SXin Li// CHECK-LABEL: define void @_ZN1XIP1AE1fEv
99*67e74705SXin Litemplate<> void X<A<P>*>::f() {}
100*67e74705SXin Li// CHECK-LABEL: define void @_ZN1XIPU11objcproto1P1AE1fEv
101*67e74705SXin Li
102*67e74705SXin Li// CHECK-LABEL: define void @_Z12kindof_test2PU8__kindof5Test2
103*67e74705SXin Livoid kindof_test2(__kindof Test2 *t2) { }
104*67e74705SXin Li
105*67e74705SXin Li@interface Parameterized<T, U> : A
106*67e74705SXin Li@end
107*67e74705SXin Li
108*67e74705SXin Li// CHECK-LABEL: define void @_Z19parameterized_test1P13ParameterizedIP1AP4TestE
109*67e74705SXin Livoid parameterized_test1(Parameterized<A *, Test *> *p) {}
110*67e74705SXin Li
111*67e74705SXin Li// CHECK-LABEL: define void @_Z19parameterized_test2PU8__kindof13ParameterizedIP1AP4TestE
112*67e74705SXin Livoid parameterized_test2(__kindof Parameterized<A *, Test *> *p) {}
113*67e74705SXin Li
114*67e74705SXin Li// CHECK-LABEL: define void @_Z19parameterized_test3P13Parameterized
115*67e74705SXin Livoid parameterized_test3(Parameterized *p) {}
116*67e74705SXin Li
117*67e74705SXin Li// CHECK-LABEL: define {{.*}}void @_Z1fP11objc_object
118*67e74705SXin Livoid f(__attribute__((ns_consumed)) id) {}
119*67e74705SXin Li// CHECK-LABEL: define {{.*}}void @_Z1fPFP11objc_objectS0_S0_E
120*67e74705SXin Livoid f(id (*fn)(__attribute__((ns_consumed)) id, id)) {}
121*67e74705SXin Li// CHECK-LABEL: define {{.*}}void @_Z1fU13block_pointerFvP11objc_objectE
122*67e74705SXin Livoid f(void (^)(__attribute__((ns_consumed)) id)) {}
123