@@ -139,3 +139,138 @@ inline const Immortal *_Nonnull castToImmortal(
139139 const DerivedFromImmortal *_Nonnull immortal) {
140140 return static_cast <const Immortal *>(immortal);
141141}
142+
143+ // A1
144+ // / \
145+ // B1 B2
146+ // / \
147+ // C1 C2
148+
149+ struct IMMORTAL_FRT A1 {
150+ virtual int virtualMethod () const { return 111 ; }
151+
152+ __attribute__ ((swift_name(" swiftFooRename()" )))
153+ virtual int fooRename () const { return 112 ; }
154+
155+ __attribute__ ((swift_name(" swiftBarRename()" )))
156+ virtual int barRename () const { return 113 ; }
157+
158+ __attribute__ ((swift_name(" swiftParamsRename(a1:)" )))
159+ virtual int paramsRename (int i) const { return i; }
160+
161+ static A1 *_Nonnull create () { return new A1 (); }
162+ };
163+
164+ struct B1 : A1 {
165+ __attribute__ ((swift_name(" swiftVirtualMethod()" )))
166+ virtual int virtualMethod () const override { return 211 ; }
167+
168+ virtual int fooRename () const override { return 212 ; }
169+
170+ __attribute__ ((swift_name(" B1BarRename()" )))
171+ virtual int barRename () const override { return 213 ; }
172+
173+ __attribute__ ((swift_name(" swiftParamsRename(b1:)" )))
174+ virtual int paramsRename (int i) const override { return i; }
175+
176+ static B1 *_Nonnull create () { return new B1 (); }
177+ };
178+
179+ struct B2 : A1 {
180+ int virtualMethod () const { return 221 ; }
181+
182+ int fooRename () const { return 222 ; }
183+
184+ __attribute__ ((swift_name(" B2BarRename()" ))) int barRename () const {
185+ return 223 ;
186+ }
187+
188+ static B2 *_Nonnull create () { return new B2 (); }
189+ };
190+
191+ struct C1 : B1 {
192+ __attribute__ ((swift_name(" swiftFooRename()" )))
193+ virtual int fooRename () const override { return 312 ; }
194+
195+ __attribute__ ((swift_name(" swiftBarRename()" )))
196+ virtual int barRename () const override { return 313 ; }
197+
198+ virtual int paramsRename (int i) const override { return i; }
199+
200+ static C1 *_Nonnull create () { return new C1 (); }
201+ };
202+
203+ struct C2 : B1 {
204+ __attribute__ ((swift_name(" swiftVirtualMethod()" )))
205+ virtual int virtualMethod () const override { return 321 ; }
206+
207+ __attribute__ ((swift_name(" C2FooRename()" )))
208+ virtual int fooRename () const override { return 322 ; }
209+
210+ __attribute__ ((swift_name(" B1BarRename()" )))
211+ virtual int barRename () const override { return 323 ; }
212+
213+ __attribute__ ((swift_name(" swiftParamsRename(b1:)" )))
214+ virtual int paramsRename (int i) const override { return i; }
215+
216+ static C2 *_Nonnull create () { return new C2 (); }
217+ };
218+
219+ struct IMMORTAL_FRT A2 {
220+ __attribute__ ((swift_name(" swiftVirtualMethod()" )))
221+ virtual int virtualMethod () const { return 121 ; }
222+
223+ __attribute__ ((swift_name(" swiftFooRename()" )))
224+ virtual int fooRename () const { return 122 ; }
225+
226+ __attribute__ ((swift_name(" A2BarRename()" )))
227+ virtual int barRename () const { return 123 ; }
228+
229+ __attribute__ ((swift_name(" swiftParamsRename(a2:)" ))) virtual int
230+ paramsRename (int i) const {
231+ return i + 1 ;
232+ }
233+
234+ static A2 *_Nonnull create () { return new A2 (); }
235+ };
236+
237+ // A1 A2
238+ // \ /
239+ // D1
240+
241+ struct D1 : A1, A2 {
242+ static D1 *_Nonnull create () { return new D1 (); }
243+ };
244+
245+ // A1 A2
246+ // \ /
247+ // B1 /
248+ // \ /
249+ // D2
250+
251+ struct D2 : B1, A2 {
252+ __attribute__ ((swift_name(" swiftVirtualMethod()" )))
253+ virtual int virtualMethod () const override { return 411 ; }
254+
255+ virtual int fooRename () const override { return 412 ; }
256+
257+ virtual int barRename () const override { return 413 ; }
258+
259+ virtual int paramsRename (int i) const override { return i; }
260+ };
261+
262+ // A1
263+ // / \
264+ // / \
265+ // B1 B2
266+ // |\ /|
267+ // | \ / |
268+ // | D3 |
269+ // C1 |
270+ // \ |
271+ // \ /
272+ // D4
273+
274+ struct D3 : B1, B2 {};
275+
276+ struct D4 : C1, B2 {};
0 commit comments