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