1 | // RUN: %clang_cc1 -triple thumbv7-windows-msvc -fdeclspec -std=c++11 -fobjc-runtime=ios-6.0 -o - -emit-llvm %s | FileCheck %s |
2 | |
3 | @class I; |
4 | |
5 | id kid; |
6 | // CHECK: @"?kid@@3PAUobjc_object@@A" = dso_local global |
7 | |
8 | Class klass; |
9 | // CHECK: @"?klass@@3PAUobjc_class@@A" = dso_local global |
10 | |
11 | I *kI; |
12 | // CHECK: @"?kI@@3PAUI@@A" = dso_local global |
13 | |
14 | void f(I *) {} |
15 | // CHECK-LABEL: "?f@@YAXPAUI@@@Z" |
16 | |
17 | void f(const I *) {} |
18 | // CHECK-LABEL: "?f@@YAXPBUI@@@Z" |
19 | |
20 | void f(I &) {} |
21 | // CHECK-LABEL: "?f@@YAXAAUI@@@Z" |
22 | |
23 | void f(const I &) {} |
24 | // CHECK-LABEL: "?f@@YAXABUI@@@Z" |
25 | |
26 | void f(const I &&) {} |
27 | // CHECK-LABEL: "?f@@YAX$$QBUI@@@Z" |
28 | |
29 | void g(id) {} |
30 | // CHECK-LABEL: "?g@@YAXPAUobjc_object@@@Z" |
31 | |
32 | void g(id &) {} |
33 | // CHECK-LABEL: "?g@@YAXAAPAUobjc_object@@@Z" |
34 | |
35 | void g(const id &) {} |
36 | // CHECK-LABEL: "?g@@YAXABQAUobjc_object@@@Z" |
37 | |
38 | void g(id &&) {} |
39 | // CHECK-LABEL: "?g@@YAX$$QAPAUobjc_object@@@Z" |
40 | |
41 | void h(Class) {} |
42 | // CHECK-LABEL: "?h@@YAXPAUobjc_class@@@Z" |
43 | |
44 | void h(Class &) {} |
45 | // CHECK-LABEL: "?h@@YAXAAPAUobjc_class@@@Z" |
46 | |
47 | void h(const Class &) {} |
48 | // CHECK-LABEL: "?h@@YAXABQAUobjc_class@@@Z" |
49 | |
50 | void h(Class &&) {} |
51 | // CHECK-LABEL: "?h@@YAX$$QAPAUobjc_class@@@Z" |
52 | |
53 | I *i() { return nullptr; } |
54 | // CHECK-LABEL: "?i@@YAPAUI@@XZ" |
55 | |
56 | const I *j() { return nullptr; } |
57 | // CHECK-LABEL: "?j@@YAPBUI@@XZ" |
58 | |
59 | I &k() { return *kI; } |
60 | // CHECK-LABEL: "?k@@YAAAUI@@XZ" |
61 | |
62 | const I &l() { return *kI; } |
63 | // CHECK-LABEL: "?l@@YAABUI@@XZ" |
64 | |
65 | void m(const id) {} |
66 | // CHECK-LABEL: "?m@@YAXQAUobjc_object@@@Z" |
67 | |
68 | void m(const I *) {} |
69 | // CHECK-LABEL: "?m@@YAXPBUI@@@Z" |
70 | |
71 | void n(SEL) {} |
72 | // CHECK-LABEL: "?n@@YAXPAUobjc_selector@@@Z" |
73 | |
74 | void n(SEL *) {} |
75 | // CHECK-LABEL: "?n@@YAXPAPAUobjc_selector@@@Z" |
76 | |
77 | void n(const SEL *) {} |
78 | // CHECK-LABEL: "?n@@YAXPBQAUobjc_selector@@@Z" |
79 | |
80 | void n(SEL &) {} |
81 | // CHECK-LABEL: "?n@@YAXAAPAUobjc_selector@@@Z" |
82 | |
83 | void n(const SEL &) {} |
84 | // CHECK-LABEL: "?n@@YAXABQAUobjc_selector@@@Z" |
85 | |
86 | void n(SEL &&) {} |
87 | // CHECK-LABEL: "?n@@YAX$$QAPAUobjc_selector@@@Z" |
88 | |
89 | struct __declspec(dllexport) s { |
90 | struct s &operator=(const struct s &) = delete; |
91 | |
92 | void m(I *) {} |
93 | // CHECK-LABEL: "?m@s@@QAAXPAUI@@@Z" |
94 | |
95 | void m(const I *) {} |
96 | // CHECK-LABEL: "?m@s@@QAAXPBUI@@@Z" |
97 | |
98 | void m(I &) {} |
99 | // CHECK-LABEL: "?m@s@@QAAXAAUI@@@Z" |
100 | |
101 | void m(const I &) {} |
102 | // CHECK-LABEL: "?m@s@@QAAXABUI@@@Z" |
103 | |
104 | void m(I &&) {} |
105 | // CHECK-LABEL: "?m@s@@QAAX$$QAUI@@@Z" |
106 | |
107 | void m(const I &&) {} |
108 | // CHECK-LABEL: "?m@s@@QAAX$$QBUI@@@Z" |
109 | |
110 | void m(id) {} |
111 | // CHECK-LABEL: "?m@s@@QAAXPAUobjc_object@@@Z" |
112 | |
113 | void m(id &) {} |
114 | // CHECK-LABEL: "?m@s@@QAAXAAPAUobjc_object@@@Z" |
115 | |
116 | void m(id &&) {} |
117 | // CHECK-LABEL: "?m@s@@QAAX$$QAPAUobjc_object@@@Z" |
118 | |
119 | void m(const id &) {} |
120 | // CHECK-LABEL: "?m@s@@QAAXABQAUobjc_object@@@Z" |
121 | |
122 | void m(const id &&) {} |
123 | // CHECK-LABEL: "?m@s@@QAAX$$QBQAUobjc_object@@@Z" |
124 | |
125 | void m(Class *) {} |
126 | // CHECK-LABEL: "?m@s@@QAAXPAPAUobjc_class@@@Z" |
127 | |
128 | void m(const Class *) {} |
129 | // CHECK-LABEL: "?m@s@@QAAXPBQAUobjc_class@@@Z" |
130 | |
131 | void m(Class) {} |
132 | // CHECK-LABEL: "?m@s@@QAAXPAUobjc_class@@@Z" |
133 | |
134 | void m(Class &) {} |
135 | // CHECK-LABEL: "?m@s@@QAAXAAPAUobjc_class@@@Z" |
136 | |
137 | void m(const Class &) {} |
138 | // CHECK-LABEL: "?m@s@@QAAXABQAUobjc_class@@@Z" |
139 | |
140 | void m(Class &&) {} |
141 | // CHECK-LABEL: "?m@s@@QAAX$$QAPAUobjc_class@@@Z" |
142 | |
143 | void m(const Class &&) {} |
144 | // CHECK-LABEL: "?m@s@@QAAX$$QBQAUobjc_class@@@Z" |
145 | |
146 | void m(SEL) {} |
147 | // CHECK-LABEL: "?m@s@@QAAXPAUobjc_selector@@@Z" |
148 | |
149 | void m(SEL *) {} |
150 | // CHECK-LABEL: "?m@s@@QAAXPAPAUobjc_selector@@@Z" |
151 | |
152 | void m(const SEL *) {} |
153 | // CHECK-LABEL: "?m@s@@QAAXPBQAUobjc_selector@@@Z" |
154 | |
155 | void m(SEL &) {} |
156 | // CHECK-LABEL: "?m@s@@QAAXAAPAUobjc_selector@@@Z" |
157 | |
158 | void m(const SEL &) {} |
159 | // CHECK-LABEL: "?m@s@@QAAXABQAUobjc_selector@@@Z" |
160 | |
161 | void m(SEL &&) {} |
162 | // CHECK-LABEL: "?m@s@@QAAX$$QAPAUobjc_selector@@@Z" |
163 | |
164 | void m(const SEL &&) {} |
165 | // CHECK-LABEL: "?m@s@@QAAX$$QBQAUobjc_selector@@@Z" |
166 | }; |
167 | |
168 | template <typename T> |
169 | struct remove_pointer { typedef T type; }; |
170 | |
171 | template <typename T> |
172 | struct remove_pointer<T *> { |
173 | typedef T type; |
174 | }; |
175 | |
176 | template <typename T> |
177 | struct t { |
178 | t() {} |
179 | }; |
180 | |
181 | template struct t<id>; |
182 | // CHECK-LABEL: "??0?$t@PAUobjc_object@@@@QAA@XZ" |
183 | |
184 | template struct t<remove_pointer<id>::type>; |
185 | // CHECK-LABEL: "??0?$t@Uobjc_object@@@@QAA@XZ" |
186 | |
187 | template struct t<SEL>; |
188 | // CHECK-LABEL: "??0?$t@PAUobjc_selector@@@@QAA@XZ" |
189 | |
190 | template struct t<remove_pointer<SEL>::type>; |
191 | // CHECK-LABEL: "??0?$t@Uobjc_selector@@@@QAA@XZ" |
192 | |
193 | |