1 #![feature(trait_upcasting)]
2 #![allow(incomplete_features)]
9 vtable_mismatch_nop_cast();
12 fn vtable_mismatch_nop_cast() {
13 let ptr: &dyn std::fmt::Display = &0;
14 // Even though the vtable is for the wrong trait, this cast doesn't actually change the needed
15 // vtable so it should still be allowed.
16 let ptr: *const (dyn std::fmt::Debug + Send + Sync) = unsafe { std::mem::transmute(ptr) };
17 let _ptr2 = ptr as *const dyn std::fmt::Debug;
21 trait Foo: PartialEq<i32> + std::fmt::Debug + Send + Sync {
69 let baz: &dyn Baz = &1;
70 let _: &dyn std::fmt::Debug = baz;
72 assert_eq!(baz.a(), 100);
73 assert_eq!(baz.b(), 200);
74 assert_eq!(baz.c(), 300);
75 assert_eq!(baz.z(), 11);
76 assert_eq!(baz.y(), 12);
77 assert_eq!(baz.w(), 21);
79 let bar: &dyn Bar = baz;
80 let _: &dyn std::fmt::Debug = bar;
82 assert_eq!(bar.a(), 100);
83 assert_eq!(bar.b(), 200);
84 assert_eq!(bar.z(), 11);
85 assert_eq!(bar.y(), 12);
86 assert_eq!(bar.w(), 21);
88 let foo: &dyn Foo = baz;
89 let _: &dyn std::fmt::Debug = foo;
91 assert_eq!(foo.a(), 100);
92 assert_eq!(foo.z(), 11);
93 assert_eq!(foo.y(), 12);
95 let foo: &dyn Foo = bar;
96 let _: &dyn std::fmt::Debug = foo;
98 assert_eq!(foo.a(), 100);
99 assert_eq!(foo.z(), 11);
100 assert_eq!(foo.y(), 12);
104 trait Foo: PartialEq<i32> + std::fmt::Debug + Send + Sync {
138 trait Baz: Bar1 + Bar2 {
168 let baz: &dyn Baz = &1;
169 let _: &dyn std::fmt::Debug = baz;
171 assert_eq!(baz.a(), 100);
172 assert_eq!(baz.b(), 200);
173 assert_eq!(baz.c(), 300);
174 assert_eq!(baz.d(), 400);
175 assert_eq!(baz.z(), 11);
176 assert_eq!(baz.y(), 12);
177 assert_eq!(baz.w(), 21);
178 assert_eq!(baz.v(), 31);
180 let bar1: &dyn Bar1 = baz;
181 let _: &dyn std::fmt::Debug = bar1;
182 assert_eq!(*bar1, 1);
183 assert_eq!(bar1.a(), 100);
184 assert_eq!(bar1.b(), 200);
185 assert_eq!(bar1.z(), 11);
186 assert_eq!(bar1.y(), 12);
187 assert_eq!(bar1.w(), 21);
189 let bar2: &dyn Bar2 = baz;
190 let _: &dyn std::fmt::Debug = bar2;
191 assert_eq!(*bar2, 1);
192 assert_eq!(bar2.a(), 100);
193 assert_eq!(bar2.c(), 300);
194 assert_eq!(bar2.z(), 11);
195 assert_eq!(bar2.y(), 12);
196 assert_eq!(bar2.v(), 31);
198 let foo: &dyn Foo = baz;
199 let _: &dyn std::fmt::Debug = foo;
201 assert_eq!(foo.a(), 100);
203 let foo: &dyn Foo = bar1;
204 let _: &dyn std::fmt::Debug = foo;
206 assert_eq!(foo.a(), 100);
208 let foo: &dyn Foo = bar2;
209 let _: &dyn std::fmt::Debug = foo;
211 assert_eq!(foo.a(), 100);
218 trait Foo: PartialEq<i32> + std::fmt::Debug + Send + Sync {
269 let baz: Box<dyn Baz> = v.clone();
271 assert_eq!(baz.a(), 100);
272 assert_eq!(baz.b(), 200);
273 assert_eq!(baz.c(), 300);
274 assert_eq!(baz.z(), 11);
275 assert_eq!(baz.y(), 12);
276 assert_eq!(baz.w(), 21);
278 let baz: Box<dyn Baz> = v.clone();
279 let bar: Box<dyn Bar> = baz;
281 assert_eq!(bar.a(), 100);
282 assert_eq!(bar.b(), 200);
283 assert_eq!(bar.z(), 11);
284 assert_eq!(bar.y(), 12);
285 assert_eq!(bar.w(), 21);
287 let baz: Box<dyn Baz> = v.clone();
288 let foo: Box<dyn Foo> = baz;
290 assert_eq!(foo.a(), 100);
291 assert_eq!(foo.z(), 11);
292 assert_eq!(foo.y(), 12);
294 let baz: Box<dyn Baz> = v.clone();
295 let bar: Box<dyn Bar> = baz;
296 let foo: Box<dyn Foo> = bar;
298 assert_eq!(foo.a(), 100);
299 assert_eq!(foo.z(), 11);
300 assert_eq!(foo.y(), 12);
306 let baz: Rc<dyn Baz> = v.clone();
308 assert_eq!(baz.a(), 100);
309 assert_eq!(baz.b(), 200);
310 assert_eq!(baz.c(), 300);
311 assert_eq!(baz.z(), 11);
312 assert_eq!(baz.y(), 12);
313 assert_eq!(baz.w(), 21);
315 let baz: Rc<dyn Baz> = v.clone();
316 let bar: Rc<dyn Bar> = baz;
318 assert_eq!(bar.a(), 100);
319 assert_eq!(bar.b(), 200);
320 assert_eq!(bar.z(), 11);
321 assert_eq!(bar.y(), 12);
322 assert_eq!(bar.w(), 21);
324 let baz: Rc<dyn Baz> = v.clone();
325 let foo: Rc<dyn Foo> = baz;
327 assert_eq!(foo.a(), 100);
328 assert_eq!(foo.z(), 11);
329 assert_eq!(foo.y(), 12);
331 let baz: Rc<dyn Baz> = v.clone();
332 let bar: Rc<dyn Bar> = baz;
333 let foo: Rc<dyn Foo> = bar;
335 assert_eq!(foo.a(), 100);
336 assert_eq!(foo.z(), 11);
337 assert_eq!(foo.y(), 12);
338 assert_eq!(foo.z(), 11);
339 assert_eq!(foo.y(), 12);
345 let baz: Arc<dyn Baz> = v.clone();
347 assert_eq!(baz.a(), 100);
348 assert_eq!(baz.b(), 200);
349 assert_eq!(baz.c(), 300);
350 assert_eq!(baz.z(), 11);
351 assert_eq!(baz.y(), 12);
352 assert_eq!(baz.w(), 21);
354 let baz: Arc<dyn Baz> = v.clone();
355 let bar: Arc<dyn Bar> = baz;
357 assert_eq!(bar.a(), 100);
358 assert_eq!(bar.b(), 200);
359 assert_eq!(bar.z(), 11);
360 assert_eq!(bar.y(), 12);
361 assert_eq!(bar.w(), 21);
363 let baz: Arc<dyn Baz> = v.clone();
364 let foo: Arc<dyn Foo> = baz;
366 assert_eq!(foo.a(), 100);
367 assert_eq!(foo.z(), 11);
368 assert_eq!(foo.y(), 12);
370 let baz: Arc<dyn Baz> = v.clone();
371 let bar: Arc<dyn Bar> = baz;
372 let foo: Arc<dyn Foo> = bar;
374 assert_eq!(foo.a(), 100);
375 assert_eq!(foo.z(), 11);
376 assert_eq!(foo.y(), 12);
407 assert_eq!(42, self.0);
417 fn invoke_inner(b: &dyn B) {
421 fn invoke_outer(c: &dyn C) {