1 | // RUN: %clang_cc1 -triple thumbv7-windows-msvc -fobjc-runtime=ios-6.0 -fobjc-arc -o - -emit-llvm %s | FileCheck %s |
2 | |
3 | @protocol P; |
4 | @protocol Q; |
5 | |
6 | @class I; |
7 | @class J<T>; |
8 | |
9 | void f(id<P>, id, id<P>, id) {} |
10 | // CHECK-LABEL: "?f@@YAXPAU?$objc_object@U?$Protocol@UP@@@__ObjC@@@@PAUobjc_object@@01@Z" |
11 | |
12 | void f(id, id<P>, id<P>, id) {} |
13 | // CHECK-LABEL: "?f@@YAXPAUobjc_object@@PAU?$objc_object@U?$Protocol@UP@@@__ObjC@@@@10@Z" |
14 | |
15 | void f(id<P>, id<P>) {} |
16 | // CHECK-LABEL: "?f@@YAXPAU?$objc_object@U?$Protocol@UP@@@__ObjC@@@@0@Z" |
17 | |
18 | void f(id<P>) {} |
19 | // CHECK-LABEL: "?f@@YAXPAU?$objc_object@U?$Protocol@UP@@@__ObjC@@@@@Z" |
20 | |
21 | void f(id<P, Q>) {} |
22 | // CHECK-LABEL: "?f@@YAXPAU?$objc_object@U?$Protocol@UP@@@__ObjC@@U?$Protocol@UQ@@@2@@@@Z" |
23 | |
24 | void f(Class<P>) {} |
25 | // CHECK-LABEL: "?f@@YAXPAU?$objc_class@U?$Protocol@UP@@@__ObjC@@@@@Z" |
26 | |
27 | void f(Class<P, Q>) {} |
28 | // CHECK-LABEL: "?f@@YAXPAU?$objc_class@U?$Protocol@UP@@@__ObjC@@U?$Protocol@UQ@@@2@@@@Z" |
29 | |
30 | void f(I<P> *) {} |
31 | // CHECK-LABEL: "?f@@YAXPAU?$I@U?$Protocol@UP@@@__ObjC@@@@@Z" |
32 | |
33 | void f(I<P, Q> *) {} |
34 | // CHECK-LABEL: "?f@@YAXPAU?$I@U?$Protocol@UP@@@__ObjC@@U?$Protocol@UQ@@@2@@@@Z" |
35 | |
36 | template <typename> |
37 | struct S {}; |
38 | |
39 | void f(S<__unsafe_unretained id>) {} |
40 | // CHECK-LABEL: "?f@@YAXU?$S@PAUobjc_object@@@@@Z" |
41 | |
42 | void f(S<__autoreleasing id>) {} |
43 | // CHECK-LABEL: "?f@@YAXU?$S@U?$Autoreleasing@PAUobjc_object@@@__ObjC@@@@@Z" |
44 | |
45 | void f(S<__strong id>) {} |
46 | // CHECK-LABEL: "?f@@YAXU?$S@U?$Strong@PAUobjc_object@@@__ObjC@@@@@Z" |
47 | |
48 | void f(S<__weak id>) {} |
49 | // CHECK-LABEL: "?f@@YAXU?$S@U?$Weak@PAUobjc_object@@@__ObjC@@@@@Z" |
50 | |
51 | void w(__weak id) {} |
52 | // CHECK-LABEL: "?w@@YAXPAUobjc_object@@@Z" |
53 | |
54 | void s(__strong id) {} |
55 | // CHECK-LABEL: "?s@@YAXPAUobjc_object@@@Z" |
56 | |
57 | void a(__autoreleasing id) {} |
58 | // CHECK-LABEL: "?a@@YAXPAUobjc_object@@@Z" |
59 | |
60 | void u(__unsafe_unretained id) {} |
61 | // CHECK-LABEL: "?u@@YAXPAUobjc_object@@@Z" |
62 | |
63 | S<__autoreleasing id> g() { return S<__autoreleasing id>(); } |
64 | // CHECK-LABEL: "?g@@YA?AU?$S@U?$Autoreleasing@PAUobjc_object@@@__ObjC@@@@XZ" |
65 | |
66 | __autoreleasing id h() { return nullptr; } |
67 | // CHECK-LABEL: "?h@@YAPAUobjc_object@@XZ" |
68 | |
69 | void f(I *) {} |
70 | // CHECK-LABEL: "?f@@YAXPAUI@@@Z" |
71 | |
72 | void f(__kindof I *) {} |
73 | // CHECK-LABEL: "?f@@YAXPAU?$KindOf@UI@@@__ObjC@@@Z" |
74 | |
75 | void f(__kindof I<P> *) {} |
76 | // CHECK-LABEL: "?f@@YAXPAU?$KindOf@U?$I@U?$Protocol@UP@@@__ObjC@@@@@__ObjC@@@Z" |
77 | |
78 | void f(S<I *>) {} |
79 | // CHECK-LABEL: "?f@@YAXU?$S@U?$Strong@PAUI@@@__ObjC@@@@@Z" |
80 | |
81 | void f(S<__kindof I *>) {} |
82 | // CHECK-LABEL: "?f@@YAXU?$S@U?$Strong@PAU?$KindOf@UI@@@__ObjC@@@__ObjC@@@@@Z" |
83 | |
84 | void f(S<__kindof I<P> *>) {} |
85 | // CHECK-LABEL: "?f@@YAXU?$S@U?$Strong@PAU?$KindOf@U?$I@U?$Protocol@UP@@@__ObjC@@@@@__ObjC@@@__ObjC@@@@@Z" |
86 | |
87 | void f(S<__weak __kindof I *>) {} |
88 | // CHECK-LABEL: "?f@@YAXU?$S@U?$Weak@PAU?$KindOf@UI@@@__ObjC@@@__ObjC@@@@@Z" |
89 | |
90 | void f(S<__weak __kindof I<P> *>) {} |
91 | // CHECK-LABEL: "?f@@YAXU?$S@U?$Weak@PAU?$KindOf@U?$I@U?$Protocol@UP@@@__ObjC@@@@@__ObjC@@@__ObjC@@@@@Z" |
92 | |
93 | void f(J<I *> *) {} |
94 | // CHECK-LABEL: "?f@@YAXPAU?$J@PAUI@@@@@Z" |
95 | |
96 | void f(J<__kindof I *> *) {} |
97 | // CHECK-LABEL: "?f@@YAXPAU?$J@PAU?$KindOf@UI@@@__ObjC@@@@@Z" |
98 | |