//@ min-lldb-version: 1800 //@ ignore-gdb //@ compile-flags:-g // === LLDB TESTS ================================================================================== // lldb-command:run // lldb-command:v a // lldbg-check:(core::option::Option) a = { value = { 0 = Low } } // lldb-command:v b // lldbg-check:(core::option::Option) b = { value = $discr$ = '\x01' } // lldb-command:v c // lldbg-check:(msvc_pretty_enums::NicheLayoutEnum) c = { value = $discr$ = '\x11' } // lldb-command:v d // lldbg-check:(msvc_pretty_enums::NicheLayoutEnum) d = { value = { my_data = High } } // lldb-command:v e // lldbg-check:(msvc_pretty_enums::NicheLayoutEnum) e = { value = $discr$ = '\x13' } // lldb-command:v h // lldbg-check:(core::option::Option) h = { value = { 0 = 12 } $discr$ = 1 } // lldb-command:v i // lldbg-check:(core::option::Option) i = { value = $discr$ = 0 } // lldb-command:v j // lldbg-check:(msvc_pretty_enums::CStyleEnum) j = High // lldb-command:v k // lldbg-check:(core::option::Option) k = { value = { 0 = "IAMA optional string!" { vec = size=21 { [0] = 'I' [1] = 'A' [2] = 'M' [3] = 'A' [4] = ' ' [5] = 'o' [6] = 'p' [7] = 't' [8] = 'i' [9] = 'o' [10] = 'n' [11] = 'a' [12] = 'l' [13] = ' ' [14] = 's' [15] = 't' [16] = 'r' [17] = 'i' [18] = 'n' [19] = 'g' [20] = '!' } } } } // lldb-command:v l // lldbg-check:(core::result::Result) l = { value = { 0 = {} } } // lldb-command:v niche128_some // lldbg-check:(core::option::Option>) niche128_some = { value = $discr$ = 123456 } // lldb-command:v niche128_none // lldbg-check:(core::option::Option>) niche128_none = { value = $discr$ = 0 } // lldb-command:v wrapping_niche128_untagged // lldbg-check:(msvc_pretty_enums::Wrapping128Niche) wrapping_niche128_untagged = { value = { 0 = { 0 = 340282366920938463463374607431768211454 } } } // lldb-command:v wrapping_niche128_none1 // lldbg-check:(msvc_pretty_enums::Wrapping128Niche) wrapping_niche128_none1 = { value = { 0 = { 0 = 2 } } } // lldb-command:v direct_tag_128_a // lldbg-check:(msvc_pretty_enums::DirectTag128) direct_tag_128_a = { value = { 0 = 42 } $discr$ = 0 } // lldb-command:v direct_tag_128_b // lldbg-check:(msvc_pretty_enums::DirectTag128) direct_tag_128_b = { value = { 0 = 137 } $discr$ = 1 } // &u32 is incorrectly formatted and LLDB thinks it's a char* so skipping niche_w_fields_1_some // lldb-command:v niche_w_fields_1_none // lldbg-check:(msvc_pretty_enums::NicheLayoutWithFields1) niche_w_fields_1_none = { value = { 0 = 99 } $discr$ = 1 } // lldb-command:v niche_w_fields_2_some // lldbg-check:(msvc_pretty_enums::NicheLayoutWithFields2) niche_w_fields_2_some = { value = { 0 = 800 { __0 = { 0 = 800 } } 1 = 900 } $discr$ = 0 } // lldb-command:v niche_w_fields_3_some // lldbg-check:(msvc_pretty_enums::NicheLayoutWithFields3) niche_w_fields_3_some = { value = { 0 = '\x89' 1 = true } } // lldb-command:v niche_w_fields_3_niche3 // lldbg-check:(msvc_pretty_enums::NicheLayoutWithFields3) niche_w_fields_3_niche3 = { value = { 0 = '"' } $discr$ = '\x04' } // lldb-command:v arbitrary_discr1 // lldbg-check:(msvc_pretty_enums::ArbitraryDiscr) arbitrary_discr1 = { value = { 0 = 1234 } $discr$ = 1000 } // lldb-command:v arbitrary_discr2 // lldbg-check:(msvc_pretty_enums::ArbitraryDiscr) arbitrary_discr2 = { value = { 0 = 5678 } $discr$ = 5000000 } // === CDB TESTS ================================================================================== // cdb-command: g // // cdb-command: dx a // cdb-check:a : Some [Type: enum2$ >] // cdb-check: [+0x000] __0 : Low (0x2) [Type: msvc_pretty_enums::CStyleEnum] // // cdb-command: dx b // cdb-check:b : None [Type: enum2$ >] // // cdb-command: dx c // cdb-check:c : Tag1 [Type: enum2$] // // cdb-command: dx d // cdb-check:d : Data [Type: enum2$] // cdb-check: [+0x000] my_data : High (0x10) [Type: msvc_pretty_enums::CStyleEnum] // // cdb-command: dx e // cdb-check:e : Tag2 [Type: enum2$] // // cdb-command: dx f // cdb-check:f : Some [Type: enum2$ > >] // cdb-check: [+0x000] __0 : 0x[...] : 0x1 [Type: unsigned int *] // // cdb-command: dx g // cdb-check:g : None [Type: enum2$ > >] // // cdb-command: dx h // cdb-check:h : Some [Type: enum2$ >] // cdb-check: [+0x004] __0 : 0xc [Type: unsigned int] // // cdb-command: dx i // cdb-check:i : None [Type: enum2$ >] // // cdb-command: dx j // cdb-check:j : High (0x10) [Type: msvc_pretty_enums::CStyleEnum] // // cdb-command: dx k // cdb-check:k : Some [Type: enum2$ >] // cdb-check: [+0x000] __0 : "IAMA optional string!" [Type: alloc::string::String] // // cdb-command: dx l // cdb-check:l : Ok [Type: enum2$ > >] // cdb-check: [+0x000] __0 : 0x2a [Type: unsigned int] // // cdb-command: dx niche128_some // cdb-check: niche128_some : Some [Type: enum2$ > >] // Note: we can't actually read the value of the field because CDB cannot handle 128 bit integers. // cdb-check: [+0x000] __0 [...] [Type: core::num::nonzero::NonZero] // // cdb-command: dx niche128_none // cdb-check: niche128_none : None [Type: enum2$ > >] // // cdb-command: dx wrapping_niche128_untagged // cdb-check: wrapping_niche128_untagged : X [Type: enum2$] // cdb-check: [+0x[...]] __0 [Type: msvc_pretty_enums::Wrapping128] // // cdb-command: dx wrapping_niche128_none1 // cdb-check: wrapping_niche128_none1 : Y [Type: enum2$] // cdb-check: [+0x[...]] __0 [Type: msvc_pretty_enums::Wrapping128] // // cdb-command: dx wrapping_niche128_none2 // cdb-check: wrapping_niche128_none2 : Z [Type: enum2$] // cdb-check: [+0x[...]] __0 [Type: msvc_pretty_enums::Wrapping128] // // cdb-command: dx direct_tag_128_a,d // cdb-check: direct_tag_128_a,d : A [Type: enum2$] // cdb-check: [+0x[...]] __0 : 42 [Type: unsigned int] // // cdb-command: dx direct_tag_128_b,d // cdb-check: direct_tag_128_b,d : B [Type: enum2$] // cdb-check: [+0x[...]] __0 : 137 [Type: unsigned int] // // cdb-command: dx niche_w_fields_1_some,d // cdb-check: niche_w_fields_1_some,d : A [Type: enum2$] // cdb-check: [+0x[...]] __0 : 0x[...] : 77 [Type: unsigned char *] // cdb-check: [+0x[...]] __1 : 7 [Type: unsigned int] // // cdb-command: dx niche_w_fields_1_none,d // cdb-check: niche_w_fields_1_none,d : B [Type: enum2$] // cdb-check: [+0x[...]] __0 : 99 [Type: unsigned int] // // cdb-command: dx niche_w_fields_2_some,d // cdb-check: niche_w_fields_2_some,d : A [Type: enum2$] // cdb-check: [+0x[...]] __0 : 800 [Type: core::num::nonzero::NonZero] // cdb-check: [+0x[...]] __1 : 900 [Type: unsigned __int64] // // cdb-command: dx niche_w_fields_2_none,d // cdb-check: niche_w_fields_2_none,d : B [Type: enum2$] // cdb-check: [+0x[...]] __0 : 1000 [Type: unsigned __int64] // // cdb-command: dx niche_w_fields_3_some,d // cdb-check: niche_w_fields_3_some,d : A [Type: enum2$] // cdb-check: [+0x[...]] __0 : 137 [Type: unsigned char] // cdb-check: [+0x[...]] __1 : true [Type: bool] // // cdb-command: dx niche_w_fields_3_niche1,d // cdb-check: niche_w_fields_3_niche1,d : B [Type: enum2$] // cdb-check: [+0x[...]] __0 : 12 [Type: unsigned char] // // cdb-command: dx niche_w_fields_3_niche2,d // cdb-check: niche_w_fields_3_niche2,d : C [Type: enum2$] // cdb-check: [+0x[...]] __0 : false [Type: bool] // // cdb-command: dx niche_w_fields_3_niche3,d // cdb-check: niche_w_fields_3_niche3,d : D [Type: enum2$] // cdb-check: [+0x[...]] __0 : 34 [Type: unsigned char] // // cdb-command: dx niche_w_fields_3_niche4,d // cdb-check: niche_w_fields_3_niche4,d : E [Type: enum2$] // cdb-check: [+0x[...]] __0 : 56 [Type: unsigned char] // // cdb-command: dx niche_w_fields_3_niche5,d // cdb-check: niche_w_fields_3_niche5,d : F [Type: enum2$] // // cdb-command: dx -r3 niche_w_fields_std_result_ok,d // cdb-check: niche_w_fields_std_result_ok,d : Ok [Type: enum2$,alloc::alloc::Global>,u64> >] // cdb-check: [+0x[...]] __0 [Type: alloc::boxed::Box,alloc::alloc::Global>] // cdb-check: [+0x[...]] data_ptr : [...] // cdb-check: [+0x[...]] length : 3 [...] // // cdb-command: dx -r3 niche_w_fields_std_result_err,d // cdb-check: niche_w_fields_std_result_err,d : Err [Type: enum2$,alloc::alloc::Global>,u64> >] // cdb-check: [+0x[...]] __0 : 789 [Type: unsigned __int64] // // cdb-command: dx -r2 arbitrary_discr1,d // cdb-check: arbitrary_discr1,d : Abc [Type: enum2$] // cdb-check: [+0x[...]] __0 : 1234 [Type: unsigned int] // // cdb-command: dx -r2 arbitrary_discr2,d // cdb-check: arbitrary_discr2,d : Def [Type: enum2$] // cdb-check: [+0x[...]] __0 : 5678 [Type: unsigned int] // // cdb-command: dx c_style_u128_a // cdb-check: c_style_u128_a : A [Type: enum2$] // // cdb-command: dx c_style_u128_b // cdb-check: c_style_u128_b : B [Type: enum2$] // // cdb-command: dx c_style_u128_c // cdb-check: c_style_u128_c : C [Type: enum2$] // // cdb-command: dx c_style_u128_d // cdb-check: c_style_u128_d : D [Type: enum2$] // // cdb-command: dx c_style_i128_a // cdb-check: c_style_i128_a : A [Type: enum2$] // // cdb-command: dx c_style_i128_b // cdb-check: c_style_i128_b : B [Type: enum2$] // // cdb-command: dx c_style_i128_c // cdb-check: c_style_i128_c : C [Type: enum2$] // // cdb-command: dx c_style_i128_d // cdb-check: c_style_i128_d : D [Type: enum2$] #![feature(rustc_attrs)] #![feature(repr128)] #![feature(arbitrary_enum_discriminant)] use std::num::NonZero; pub enum CStyleEnum { Low = 2, High = 16, } pub enum NicheLayoutEnum { Tag1, Data { my_data: CStyleEnum }, Tag2, } pub enum Empty {} // The following three types will use a niche layout once // https://github.com/rust-lang/rust/pull/94075 is merged: enum NicheLayoutWithFields1<'a> { A(&'a u8, u32), B(u32), } enum NicheLayoutWithFields2 { A(NonZero, u64), B(u64), } enum NicheLayoutWithFields3 { A(u8, bool), B(u8), C(bool), D(u8), E(u8), F, } #[rustc_layout_scalar_valid_range_start(340282366920938463463374607431768211454)] #[rustc_layout_scalar_valid_range_end(1)] #[repr(transparent)] struct Wrapping128(u128); // #[rustc_layout(debug)] enum Wrapping128Niche { X(Wrapping128), Y, Z, } #[repr(i128)] enum DirectTag128 { A(u32), B(u32), } #[repr(u32)] enum ArbitraryDiscr { Abc(u32) = 1000, Def(u32) = 5000_000, } #[repr(u128)] pub enum CStyleU128 { A = 0_u128, B = 1_u128, C = u64::MAX as u128 + 1, D = u128::MAX, } #[repr(i128)] pub enum CStyleI128 { A = 0_i128, B = -1_i128, C = i128::MIN, D = i128::MAX, } fn main() { let a = Some(CStyleEnum::Low); let b = Option::::None; let c = NicheLayoutEnum::Tag1; let d = NicheLayoutEnum::Data { my_data: CStyleEnum::High }; let e = NicheLayoutEnum::Tag2; let f = Some(&1u32); let g = Option::<&'static u32>::None; let h = Some(12u32); let i = Option::::None; let j = CStyleEnum::High; let k = Some("IAMA optional string!".to_string()); let l = Result::::Ok(42); let niche128_some = NonZero::new(123456i128); let niche128_none: Option> = None; let wrapping_niche128_untagged = unsafe { Wrapping128Niche::X(Wrapping128(340282366920938463463374607431768211454)) }; let wrapping_niche128_none1 = Wrapping128Niche::Y; let wrapping_niche128_none2 = Wrapping128Niche::Z; let direct_tag_128_a = DirectTag128::A(42); let direct_tag_128_b = DirectTag128::B(137); let niche_w_fields_1_some = NicheLayoutWithFields1::A(&77, 7); let niche_w_fields_1_none = NicheLayoutWithFields1::B(99); let niche_w_fields_2_some = NicheLayoutWithFields2::A(NonZero::new(800).unwrap(), 900); let niche_w_fields_2_none = NicheLayoutWithFields2::B(1000); let niche_w_fields_3_some = NicheLayoutWithFields3::A(137, true); let niche_w_fields_3_niche1 = NicheLayoutWithFields3::B(12); let niche_w_fields_3_niche2 = NicheLayoutWithFields3::C(false); let niche_w_fields_3_niche3 = NicheLayoutWithFields3::D(34); let niche_w_fields_3_niche4 = NicheLayoutWithFields3::E(56); let niche_w_fields_3_niche5 = NicheLayoutWithFields3::F; let niche_w_fields_std_result_ok: Result, u64> = Ok(vec![1, 2, 3].into()); let niche_w_fields_std_result_err: Result, u64> = Err(789); let arbitrary_discr1 = ArbitraryDiscr::Abc(1234); let arbitrary_discr2 = ArbitraryDiscr::Def(5678); let c_style_u128_a = CStyleU128::A; let c_style_u128_b = CStyleU128::B; let c_style_u128_c = CStyleU128::C; let c_style_u128_d = CStyleU128::D; let c_style_i128_a = CStyleI128::A; let c_style_i128_b = CStyleI128::B; let c_style_i128_c = CStyleI128::C; let c_style_i128_d = CStyleI128::D; zzz(); // #break } fn zzz() { () }