diff options
Diffstat (limited to 'src/test/ui/symbol-names/const-generics-structural-demangling.rs')
-rw-r--r-- | src/test/ui/symbol-names/const-generics-structural-demangling.rs | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/src/test/ui/symbol-names/const-generics-structural-demangling.rs b/src/test/ui/symbol-names/const-generics-structural-demangling.rs new file mode 100644 index 000000000..df09ba494 --- /dev/null +++ b/src/test/ui/symbol-names/const-generics-structural-demangling.rs @@ -0,0 +1,96 @@ +// build-fail +// compile-flags: -C symbol-mangling-version=v0 --crate-name=c + +// NOTE(eddyb) we need `core` for `core::option::Option`, normalize away its +// disambiguator hash, which can/should change (including between stage{1,2}). +// normalize-stderr-test: "core\[[0-9a-f]+\]" -> "core[HASH]" +// normalize-stderr-test: "c\[[0-9a-f]+\]" -> "c[HASH]" + +#![feature(adt_const_params, decl_macro, rustc_attrs)] +#![allow(incomplete_features)] + +pub struct RefByte<const RB: &'static u8>; + +#[rustc_symbol_name] +//~^ ERROR symbol-name +//~| ERROR demangling +//~| ERROR demangling-alt(<c::RefByte<{&123}>>) +impl RefByte<{&123}> {} + +// FIXME(eddyb) this was supposed to be `RefMutZst` with `&mut []`, +// but that is currently not allowed in const generics. +pub struct RefZst<const RMZ: &'static [u8; 0]>; + +#[rustc_symbol_name] +//~^ ERROR symbol-name +//~| ERROR demangling +//~| ERROR demangling-alt(<c::RefZst<{&[]}>>) +impl RefZst<{&[]}> {} + +pub struct Array3Bytes<const A3B: [u8; 3]>; + +#[rustc_symbol_name] +//~^ ERROR symbol-name +//~| ERROR demangling +//~| ERROR demangling-alt(<c::Array3Bytes<{[1, 2, 3]}>>) +impl Array3Bytes<{[1, 2, 3]}> {} + +pub struct TupleByteBool<const TBB: (u8, bool)>; + +#[rustc_symbol_name] +//~^ ERROR symbol-name +//~| ERROR demangling +//~| ERROR demangling-alt(<c::TupleByteBool<{(1, false)}>>) +impl TupleByteBool<{(1, false)}> {} + +pub struct OptionUsize<const OU: Option<usize>>; + +// HACK(eddyb) the full mangling is only in `.stderr` because we can normalize +// the `core` disambiguator hash away there, but not here. +#[rustc_symbol_name] +//~^ ERROR symbol-name +//~| ERROR demangling +//~| ERROR demangling-alt(<c::OptionUsize<{core::option::Option::<usize>::None}>>) +impl OptionUsize<{None}> {} + +// HACK(eddyb) the full mangling is only in `.stderr` because we can normalize +// the `core` disambiguator hash away there, but not here. +#[rustc_symbol_name] +//~^ ERROR symbol-name +//~| ERROR demangling +//~| ERROR demangling-alt(<c::OptionUsize<{core::option::Option::<usize>::Some(0)}>>) +impl OptionUsize<{Some(0)}> {} + +#[derive(PartialEq, Eq)] +pub struct Foo { + s: &'static str, + ch: char, + slice: &'static [u8], +} +pub struct Foo_<const F: Foo>; + +#[rustc_symbol_name] +//~^ ERROR symbol-name +//~| ERROR demangling +//~| ERROR demangling-alt(<c::Foo_<{c::Foo { s: "abc", ch: 'x', slice: &[1, 2, 3] }}>>) +impl Foo_<{Foo { s: "abc", ch: 'x', slice: &[1, 2, 3] }}> {} + +// NOTE(eddyb) this tests specifically the use of disambiguators in field names, +// using macros 2.0 hygiene to create a `struct` with conflicting field names. +macro duplicate_field_name_test($x:ident) { + #[derive(PartialEq, Eq)] + pub struct Bar { + $x: u8, + x: u16, + } + pub struct Bar_<const B: Bar>; + + #[rustc_symbol_name] + //~^ ERROR symbol-name + //~| ERROR demangling + //~| ERROR demangling-alt(<c::Bar_<{c::Bar { x: 123, x: 4096 }}>>) + impl Bar_<{Bar { $x: 123, x: 4096 }}> {} +} +duplicate_field_name_test!(x); + +fn main() {} |