|
| 1 | +use rustc_span::def_id::DefIndex; |
| 2 | + |
| 3 | +use super::*; |
| 4 | + |
| 5 | +macro_rules! define_tests { |
| 6 | + ($($name:ident $kind:ident $variant:ident {$($init:tt)*})*) => {$( |
| 7 | + #[test] |
| 8 | + fn $name() { |
| 9 | + let unambig = $kind::$variant::<'_, ()> { $($init)* }; |
| 10 | + let unambig_to_ambig = unsafe { std::mem::transmute::<_, $kind<'_, AmbigArg>>(unambig) }; |
| 11 | + |
| 12 | + assert!(matches!(&unambig_to_ambig, $kind::$variant { $($init)* })); |
| 13 | + |
| 14 | + let ambig_to_unambig = unsafe { std::mem::transmute::<_, $kind<'_, ()>>(unambig_to_ambig) }; |
| 15 | + |
| 16 | + assert!(matches!(&ambig_to_unambig, $kind::$variant { $($init)* })); |
| 17 | + } |
| 18 | + )*}; |
| 19 | +} |
| 20 | + |
| 21 | +define_tests! { |
| 22 | + cast_never TyKind Never {} |
| 23 | + cast_tup TyKind Tup { 0: &[Ty { span: DUMMY_SP, hir_id: HirId::INVALID, kind: TyKind::Never }] } |
| 24 | + cast_ptr TyKind Ptr { 0: MutTy { ty: &Ty { span: DUMMY_SP, hir_id: HirId::INVALID, kind: TyKind::Never }, mutbl: Mutability::Not }} |
| 25 | + cast_array TyKind Array { |
| 26 | + 0: &Ty { span: DUMMY_SP, hir_id: HirId::INVALID, kind: TyKind::Never }, |
| 27 | + 1: &ConstArg { hir_id: HirId::INVALID, kind: ConstArgKind::Anon(&AnonConst { |
| 28 | + hir_id: HirId::INVALID, |
| 29 | + def_id: LocalDefId { local_def_index: DefIndex::ZERO }, |
| 30 | + body: BodyId { hir_id: HirId::INVALID }, |
| 31 | + span: DUMMY_SP, |
| 32 | + })} |
| 33 | + } |
| 34 | + |
| 35 | + cast_anon ConstArgKind Anon { |
| 36 | + 0: &AnonConst { |
| 37 | + hir_id: HirId::INVALID, |
| 38 | + def_id: LocalDefId { local_def_index: DefIndex::ZERO }, |
| 39 | + body: BodyId { hir_id: HirId::INVALID }, |
| 40 | + span: DUMMY_SP, |
| 41 | + } |
| 42 | + } |
| 43 | +} |
| 44 | + |
| 45 | +#[test] |
| 46 | +fn trait_object_roundtrips() { |
| 47 | + trait_object_roundtrips_impl(TraitObjectSyntax::Dyn); |
| 48 | + trait_object_roundtrips_impl(TraitObjectSyntax::DynStar); |
| 49 | + trait_object_roundtrips_impl(TraitObjectSyntax::None); |
| 50 | +} |
| 51 | + |
| 52 | +fn trait_object_roundtrips_impl(syntax: TraitObjectSyntax) { |
| 53 | + let unambig = TyKind::TraitObject::<'_, ()>( |
| 54 | + &[], |
| 55 | + TaggedRef::new( |
| 56 | + &const { |
| 57 | + Lifetime { |
| 58 | + hir_id: HirId::INVALID, |
| 59 | + ident: Ident::new(sym::name, DUMMY_SP), |
| 60 | + res: LifetimeName::Static, |
| 61 | + } |
| 62 | + }, |
| 63 | + syntax, |
| 64 | + ), |
| 65 | + ); |
| 66 | + let unambig_to_ambig = unsafe { std::mem::transmute::<_, TyKind<'_, AmbigArg>>(unambig) }; |
| 67 | + |
| 68 | + match unambig_to_ambig { |
| 69 | + TyKind::TraitObject(_, tagged_ref) => { |
| 70 | + assert!(tagged_ref.tag() == syntax) |
| 71 | + } |
| 72 | + _ => panic!("`TyKind::TraitObject` did not roundtrip"), |
| 73 | + }; |
| 74 | + |
| 75 | + let ambig_to_unambig = unsafe { std::mem::transmute::<_, TyKind<'_, ()>>(unambig_to_ambig) }; |
| 76 | + |
| 77 | + match ambig_to_unambig { |
| 78 | + TyKind::TraitObject(_, tagged_ref) => { |
| 79 | + assert!(tagged_ref.tag() == syntax) |
| 80 | + } |
| 81 | + _ => panic!("`TyKind::TraitObject` did not roundtrip"), |
| 82 | + }; |
| 83 | +} |
0 commit comments