| //@ check-fail | |
| //@ edition: 2024 | |
| #![allow(incomplete_features, internal_features)] | |
| #![feature(sized_hierarchy)] | |
| #![feature(coroutines, extern_types, f16, never_type, unsized_fn_params)] | |
| use std::fmt::Debug; | |
| use std::marker::{MetaSized, PointeeSized}; | |
| // This test checks that `Sized` and `MetaSized` are automatically implemented appropriately. | |
| fn needs_sized<T: Sized>() { } | |
| fn takes_sized<T: Sized>(_t: T) { } | |
| fn needs_metasized<T: MetaSized>() { } | |
| fn takes_metasized<T: MetaSized>(_t: T) { } | |
| fn needs_pointeesized<T: PointeeSized>() { } | |
| fn takes_pointeesized<T: PointeeSized>(_t: T) { } | |
| fn main() { | |
| // `bool` | |
| needs_sized::<bool>(); | |
| needs_metasized::<bool>(); | |
| needs_pointeesized::<bool>(); | |
| // `char` | |
| needs_sized::<char>(); | |
| needs_metasized::<char>(); | |
| needs_pointeesized::<char>(); | |
| // `i8` | |
| needs_sized::<i8>(); | |
| needs_metasized::<i8>(); | |
| needs_pointeesized::<i8>(); | |
| // `i16` | |
| needs_sized::<i16>(); | |
| needs_metasized::<i16>(); | |
| needs_pointeesized::<i16>(); | |
| // `i32` | |
| needs_sized::<i32>(); | |
| needs_metasized::<i32>(); | |
| needs_pointeesized::<i32>(); | |
| // `i64` | |
| needs_sized::<i64>(); | |
| needs_metasized::<i64>(); | |
| needs_pointeesized::<i64>(); | |
| // `i128` | |
| needs_sized::<i128>(); | |
| needs_metasized::<i128>(); | |
| needs_pointeesized::<i128>(); | |
| // `u8` | |
| needs_sized::<u8>(); | |
| needs_metasized::<u8>(); | |
| needs_pointeesized::<u8>(); | |
| // `u16` | |
| needs_sized::<u16>(); | |
| needs_metasized::<u16>(); | |
| needs_pointeesized::<u16>(); | |
| // `u32` | |
| needs_sized::<u32>(); | |
| needs_metasized::<u32>(); | |
| needs_pointeesized::<u32>(); | |
| // `u64` | |
| needs_sized::<u64>(); | |
| needs_metasized::<u64>(); | |
| needs_pointeesized::<u64>(); | |
| // `u128` | |
| needs_sized::<u128>(); | |
| needs_metasized::<u128>(); | |
| needs_pointeesized::<u128>(); | |
| // `f16` | |
| needs_sized::<f16>(); | |
| needs_metasized::<f16>(); | |
| needs_pointeesized::<f16>(); | |
| // `f32` | |
| needs_sized::<f32>(); | |
| needs_metasized::<f32>(); | |
| needs_pointeesized::<f32>(); | |
| // `f64` | |
| needs_sized::<f64>(); | |
| needs_metasized::<f64>(); | |
| needs_pointeesized::<f64>(); | |
| // `*const` | |
| needs_sized::<*const u8>(); | |
| needs_metasized::<*const u8>(); | |
| needs_pointeesized::<*const u8>(); | |
| // `*mut` | |
| needs_sized::<*mut u8>(); | |
| needs_metasized::<*mut u8>(); | |
| needs_pointeesized::<*mut u8>(); | |
| // `&` | |
| needs_sized::<&u8>(); | |
| needs_metasized::<&u8>(); | |
| needs_pointeesized::<&u8>(); | |
| // `&mut` | |
| needs_sized::<&mut u8>(); | |
| needs_metasized::<&mut u8>(); | |
| needs_pointeesized::<&mut u8>(); | |
| // fn-def | |
| fn foo(x: u8) -> u8 { x } | |
| takes_sized(foo); | |
| takes_metasized(foo); | |
| takes_pointeesized(foo); | |
| // fn-ptr | |
| takes_sized::<fn(u8) -> u8>(foo); | |
| takes_metasized::<fn(u8) -> u8>(foo); | |
| takes_pointeesized::<fn(u8) -> u8>(foo); | |
| // `[T; x]` | |
| needs_sized::<[u8; 1]>(); | |
| needs_metasized::<[u8; 1]>(); | |
| needs_pointeesized::<[u8; 1]>(); | |
| // `|a| { a }` | |
| takes_sized(|a| { a }); | |
| takes_metasized(|a| { a }); | |
| takes_pointeesized(|a| { a }); | |
| // `async |a| { a }` | |
| takes_sized(async |a| { a }); | |
| takes_metasized(async |a| { a }); | |
| takes_pointeesized(async |a| { a }); | |
| // `|a| { yield a }` | |
| takes_sized(#[coroutine] |a| { yield a }); | |
| takes_metasized(#[coroutine] |a| { yield a }); | |
| takes_pointeesized(#[coroutine] |a| { yield a }); | |
| // `!` | |
| needs_sized::<!>(); | |
| needs_metasized::<!>(); | |
| needs_pointeesized::<!>(); | |
| // `str` | |
| needs_sized::<str>(); | |
| //~^ ERROR the size for values of type `str` cannot be known at compilation time | |
| needs_metasized::<str>(); | |
| needs_pointeesized::<str>(); | |
| // `[T]` | |
| needs_sized::<[u8]>(); | |
| //~^ ERROR the size for values of type `[u8]` cannot be known at compilation time | |
| needs_metasized::<[u8]>(); | |
| needs_pointeesized::<[u8]>(); | |
| // `dyn Debug` | |
| needs_sized::<dyn Debug>(); | |
| //~^ ERROR the size for values of type `dyn Debug` cannot be known at compilation time | |
| needs_metasized::<dyn Debug>(); | |
| needs_pointeesized::<dyn Debug>(); | |
| // `extern type` | |
| unsafe extern "C" { | |
| type Foo; | |
| } | |
| needs_sized::<Foo>(); | |
| //~^ ERROR the size for values of type `main::Foo` cannot be known at compilation time | |
| needs_metasized::<Foo>(); | |
| //~^ ERROR the size for values of type `main::Foo` cannot be known | |
| needs_pointeesized::<Foo>(); | |
| // empty tuple | |
| needs_sized::<()>(); | |
| needs_metasized::<()>(); | |
| needs_pointeesized::<()>(); | |
| // tuple w/ all elements sized | |
| needs_sized::<(u32, u32)>(); | |
| needs_metasized::<(u32, u32)>(); | |
| needs_pointeesized::<(u32, u32)>(); | |
| // tuple w/ all elements metasized | |
| needs_sized::<([u8], [u8])>(); | |
| //~^ ERROR the size for values of type `[u8]` cannot be known at compilation time | |
| needs_metasized::<([u8], [u8])>(); | |
| //~^ ERROR the size for values of type `[u8]` cannot be known at compilation time | |
| needs_pointeesized::<([u8], [u8])>(); | |
| //~^ ERROR the size for values of type `[u8]` cannot be known at compilation time | |
| // tuple w/ all elements pointeesized | |
| needs_sized::<(Foo, Foo)>(); | |
| //~^ ERROR the size for values of type `main::Foo` cannot be known at compilation time | |
| needs_metasized::<(Foo, Foo)>(); | |
| //~^ ERROR the size for values of type `main::Foo` cannot be known at compilation time | |
| //~| ERROR the size for values of type `main::Foo` cannot be known | |
| needs_pointeesized::<(Foo, Foo)>(); | |
| //~^ ERROR the size for values of type `main::Foo` cannot be known at compilation time | |
| // tuple w/ last element metasized | |
| needs_sized::<(u32, [u8])>(); | |
| //~^ ERROR the size for values of type `[u8]` cannot be known at compilation time | |
| needs_metasized::<(u32, [u8])>(); | |
| needs_pointeesized::<(u32, [u8])>(); | |
| // tuple w/ last element pointeesized | |
| needs_sized::<(u32, Foo)>(); | |
| //~^ ERROR the size for values of type `main::Foo` cannot be known at compilation time | |
| needs_metasized::<(u32, Foo)>(); | |
| //~^ ERROR the size for values of type `main::Foo` cannot be known | |
| needs_pointeesized::<(u32, Foo)>(); | |
| // struct w/ no fields | |
| struct StructEmpty {} | |
| needs_sized::<StructEmpty>(); | |
| needs_metasized::<StructEmpty>(); | |
| needs_pointeesized::<StructEmpty>(); | |
| // struct w/ all fields sized | |
| struct StructAllFieldsSized { x: u32, y: u32 } | |
| needs_sized::<StructAllFieldsSized>(); | |
| needs_metasized::<StructAllFieldsSized>(); | |
| needs_pointeesized::<StructAllFieldsSized>(); | |
| // struct w/ all fields metasized | |
| struct StructAllFieldsMetaSized { x: [u8], y: [u8] } | |
| //~^ ERROR the size for values of type `[u8]` cannot be known at compilation time | |
| needs_sized::<StructAllFieldsMetaSized>(); | |
| //~^ ERROR the size for values of type `[u8]` cannot be known at compilation time | |
| needs_metasized::<StructAllFieldsMetaSized>(); | |
| needs_pointeesized::<StructAllFieldsMetaSized>(); | |
| // struct w/ all fields unsized | |
| struct StructAllFieldsUnsized { x: Foo, y: Foo } | |
| //~^ ERROR the size for values of type `main::Foo` cannot be known at compilation time | |
| needs_sized::<StructAllFieldsUnsized>(); | |
| //~^ ERROR the size for values of type `main::Foo` cannot be known at compilation time | |
| needs_metasized::<StructAllFieldsUnsized>(); | |
| //~^ ERROR the size for values of type `main::Foo` cannot be known | |
| needs_pointeesized::<StructAllFieldsUnsized>(); | |
| // struct w/ last fields metasized | |
| struct StructLastFieldMetaSized { x: u32, y: [u8] } | |
| needs_sized::<StructLastFieldMetaSized>(); | |
| //~^ ERROR the size for values of type `[u8]` cannot be known at compilation time | |
| needs_metasized::<StructLastFieldMetaSized>(); | |
| needs_pointeesized::<StructLastFieldMetaSized>(); | |
| // struct w/ last fields unsized | |
| struct StructLastFieldUnsized { x: u32, y: Foo } | |
| needs_sized::<StructLastFieldUnsized>(); | |
| //~^ ERROR the size for values of type `main::Foo` cannot be known at compilation time | |
| needs_metasized::<StructLastFieldUnsized>(); | |
| //~^ ERROR the size for values of type `main::Foo` cannot be known | |
| needs_pointeesized::<StructLastFieldUnsized>(); | |
| // enum w/ no fields | |
| enum EnumEmpty {} | |
| needs_sized::<EnumEmpty>(); | |
| needs_metasized::<EnumEmpty>(); | |
| needs_pointeesized::<EnumEmpty>(); | |
| // enum w/ all variant fields sized | |
| enum EnumAllFieldsSized { Qux { x: u32, y: u32 } } | |
| needs_sized::<StructAllFieldsSized>(); | |
| needs_metasized::<StructAllFieldsSized>(); | |
| needs_pointeesized::<StructAllFieldsSized>(); | |
| // enum w/ all variant fields metasized | |
| enum EnumAllFieldsMetaSized { Qux { x: [u8], y: [u8] } } | |
| //~^ ERROR the size for values of type `[u8]` cannot be known at compilation time | |
| needs_sized::<EnumAllFieldsMetaSized>(); | |
| needs_metasized::<EnumAllFieldsMetaSized>(); | |
| needs_pointeesized::<EnumAllFieldsMetaSized>(); | |
| // enum w/ all variant fields unsized | |
| enum EnumAllFieldsUnsized { Qux { x: Foo, y: Foo } } | |
| //~^ ERROR the size for values of type `main::Foo` cannot be known at compilation time | |
| needs_sized::<EnumAllFieldsUnsized>(); | |
| needs_metasized::<EnumAllFieldsUnsized>(); | |
| needs_pointeesized::<EnumAllFieldsUnsized>(); | |
| // enum w/ last variant fields metasized | |
| enum EnumLastFieldMetaSized { Qux { x: u32, y: [u8] } } | |
| //~^ ERROR the size for values of type `[u8]` cannot be known at compilation time | |
| needs_sized::<EnumLastFieldMetaSized>(); | |
| needs_metasized::<EnumLastFieldMetaSized>(); | |
| needs_pointeesized::<EnumLastFieldMetaSized>(); | |
| // enum w/ last variant fields unsized | |
| enum EnumLastFieldUnsized { Qux { x: u32, y: Foo } } | |
| //~^ ERROR the size for values of type `main::Foo` cannot be known at compilation time | |
| needs_sized::<EnumLastFieldUnsized>(); | |
| needs_metasized::<EnumLastFieldUnsized>(); | |
| needs_pointeesized::<EnumLastFieldUnsized>(); | |
| } |