mirror of https://github.com/rust-lang/rust.git
306 lines
9.7 KiB
Rust
306 lines
9.7 KiB
Rust
//@ 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>();
|
|
}
|