Normalization can skip WF (original) (raw)

I tried this code: [playground]

trait WellUnformed { type RequestNormalize; }

impl<T: ?Sized> WellUnformed for T { type RequestNormalize = (); }

const _: <[[[[[[u8]]]]]] as WellUnformed>::RequestNormalize = (); const _: <Vec as WellUnformed>::RequestNormalize = ();

I expected this to error; [[[[[[u8]]]]]] is clearly not a well-formed type, as

error[E0277]: the size for values of type [u8] cannot be known at compilation time
= help: the trait Sized is not implemented for [u8]
= note: slice and array elements must have Sized type

Vec<str> is perhaps even more cursed.

Instead: it compiles.

This is especially relevant for blanket/builtin traits which have associated types, such as marker::DiscriminantKind and ptr::Pointee.

Meta

1.64.0-nightly (2022-07-31 f9cba63)

@rustbot label +A-associated-items

cc @eddyb who said this was
@rustbot label +I-unsound