Auto merge of #122895 - matthiaskrgr:ice-tests-5xxxx-to-9xxxx, r=fmease

add some ice tests 5xxxx to 9xxxx

  Fixes rust-lang/rust#98842
  Fixes rust-lang/rust#90691
  Fixes rust-lang/rust#88421
  Fixes rust-lang/rust#88212
  Fixes rust-lang/rust#83056
  Fixes rust-lang/rust#80125
  Fixes rust-lang/rust#64784
  Fixes rust-lang/rust#52334
This commit is contained in:
bors 2024-03-24 13:38:12 +00:00
commit 6e6c721742
15 changed files with 346 additions and 0 deletions

View File

@ -0,0 +1,42 @@
// ICE #90691 Encountered error `Unimplemented` selecting ...
//@ build-pass
// issue: rust-lang/rust#90691
trait TError: std::fmt::Debug {}
impl TError for () {}
trait SuperTrait {
type Error;
}
trait Trait: SuperTrait<Error: TError> {}
impl<T> Trait for T
where
T: SuperTrait,
<T as SuperTrait>::Error: TError,
{
}
struct SomeTrait<S>(S);
struct BoxedTrait(Box<dyn Trait<Error = ()>>);
impl<S: 'static> From<SomeTrait<S>> for BoxedTrait {
fn from(other: SomeTrait<S>) -> Self {
Self(Box::new(other))
}
}
impl<S> SuperTrait for SomeTrait<S> {
type Error = ();
}
impl From<()> for BoxedTrait {
fn from(c: ()) -> Self {
Self::from(SomeTrait(c))
}
}
fn main() {
let _: BoxedTrait = ().into();
}

View File

@ -0,0 +1,36 @@
//@ check-pass
// issue: rust-lang/rust#88421
#![feature(adt_const_params)]
#![feature(generic_const_exprs)]
#![allow(incomplete_features)]
use std::ops::Index;
pub struct CellPossibilities;
pub enum CellState<const SQUARE_SIZE: usize> {
Empty(Option<CellPossibilities>),
}
pub struct Sudoku<const SQUARE_SIZE: usize>;
impl<const SQUARE_SIZE: usize> Sudoku<SQUARE_SIZE>where
[CellState<SQUARE_SIZE>; SQUARE_SIZE * SQUARE_SIZE]: Sized,
{
pub fn random() {
let CellState::Empty(_) = Self[()];
}
}
impl<const SQUARE_SIZE: usize> Index<()> for Sudoku<SQUARE_SIZE>
where
[CellState<SQUARE_SIZE>; SQUARE_SIZE * SQUARE_SIZE]: Sized,
{
type Output = CellState<SQUARE_SIZE>;
fn index(&self, _: ()) -> &Self::Output {
todo!()
}
}
pub fn main() {}

View File

@ -0,0 +1,7 @@
// #83056 ICE "bad input type for cast"
// issue: rust-lang/rust#83056
struct S([bool; f as usize]);
fn f() -> T {}
//~^ ERROR cannot find type `T` in this scope
pub fn main() {}

View File

@ -0,0 +1,20 @@
error[E0412]: cannot find type `T` in this scope
--> $DIR/ice-bad-input-type-for-cast-83056.rs:5:11
|
LL | struct S([bool; f as usize]);
| ----------------------------- similarly named struct `S` defined here
LL | fn f() -> T {}
| ^
|
help: a struct with a similar name exists
|
LL | fn f() -> S {}
| ~
help: you might be missing a type parameter
|
LL | fn f<T>() -> T {}
| +++
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0412`.

View File

@ -0,0 +1,16 @@
// test for ICE when casting extern "C" fn when it has a non-FFI-safe argument
// issue: rust-lang/rust#52334
//@ check-pass
//@ normalize-stderr-test "\[i8\]" -> "[i8 or u8 (arch dependant)]"
//@ normalize-stderr-test "\[u8\]" -> "[i8 or u8 (arch dependant)]"
type Foo = extern "C" fn(::std::ffi::CStr);
//~^ WARN `extern` fn uses type
extern "C" {
fn meh(blah: Foo);
//~^ WARN `extern` block uses type
}
fn main() {
meh as usize;
}

View File

@ -0,0 +1,22 @@
warning: `extern` fn uses type `[i8 or u8 (arch dependant)]`, which is not FFI-safe
--> $DIR/extern-C-non-FFI-safe-arg-ice-52334.rs:7:12
|
LL | type Foo = extern "C" fn(::std::ffi::CStr);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe
|
= help: consider using a raw pointer instead
= note: slices have no C equivalent
= note: `#[warn(improper_ctypes_definitions)]` on by default
warning: `extern` block uses type `[i8 or u8 (arch dependant)]`, which is not FFI-safe
--> $DIR/extern-C-non-FFI-safe-arg-ice-52334.rs:10:18
|
LL | fn meh(blah: Foo);
| ^^^ not FFI-safe
|
= help: consider using a raw pointer instead
= note: slices have no C equivalent
= note: `#[warn(improper_ctypes)]` on by default
warning: 2 warnings emitted

View File

@ -0,0 +1,15 @@
// issue: rust-lang/rust#80125
//@ check-pass
type ExternCallback = extern "C" fn(*const u8, u32, str);
//~^ WARN `extern` fn uses type `str`, which is not FFI-safe
pub struct Struct(ExternCallback);
#[no_mangle]
pub extern "C" fn register_something(bind: ExternCallback) -> Struct {
//~^ WARN `extern` fn uses type `str`, which is not FFI-safe
//~^^ WARN `extern` fn uses type `Struct`, which is not FFI-safe
Struct(bind)
}
fn main() {}

View File

@ -0,0 +1,35 @@
warning: `extern` fn uses type `str`, which is not FFI-safe
--> $DIR/extern-C-str-arg-ice-80125.rs:3:23
|
LL | type ExternCallback = extern "C" fn(*const u8, u32, str);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe
|
= help: consider using `*const u8` and a length instead
= note: string slices have no C equivalent
= note: `#[warn(improper_ctypes_definitions)]` on by default
warning: `extern` fn uses type `str`, which is not FFI-safe
--> $DIR/extern-C-str-arg-ice-80125.rs:9:44
|
LL | pub extern "C" fn register_something(bind: ExternCallback) -> Struct {
| ^^^^^^^^^^^^^^ not FFI-safe
|
= help: consider using `*const u8` and a length instead
= note: string slices have no C equivalent
warning: `extern` fn uses type `Struct`, which is not FFI-safe
--> $DIR/extern-C-str-arg-ice-80125.rs:9:63
|
LL | pub extern "C" fn register_something(bind: ExternCallback) -> Struct {
| ^^^^^^ not FFI-safe
|
= help: consider adding a `#[repr(C)]` or `#[repr(transparent)]` attribute to this struct
= note: this struct has unspecified layout
note: the type is defined here
--> $DIR/extern-C-str-arg-ice-80125.rs:6:1
|
LL | pub struct Struct(ExternCallback);
| ^^^^^^^^^^^^^^^^^
warning: 3 warnings emitted

View File

@ -0,0 +1,16 @@
// ICE #64784 already borrowed: BorrowMutError
//@ check-pass
// issue: rust-lang/rust#64784
#![feature(decl_macro)]
pub macro m($i:ident, $j:ident) {
mod $i {
pub use crate::$j::*;
pub struct A;
}
}
m!(x, y);
m!(y, x);
fn main() {}

View File

@ -0,0 +1,25 @@
error[E0391]: cycle detected when computing layout of `Foo`
|
= note: ...which requires computing layout of `<&'static Foo as core::ops::deref::Deref>::Target`...
= note: ...which again requires computing layout of `Foo`, completing the cycle
note: cycle used when const-evaluating + checking `_`
--> $DIR/stack-overflow-trait-infer-98842.rs:15:1
|
LL | const _: *const Foo = 0 as _;
| ^^^^^^^^^^^^^^^^^^^
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
error[E0080]: it is undefined behavior to use this value
--> $DIR/stack-overflow-trait-infer-98842.rs:15:1
|
LL | const _: *const Foo = 0 as _;
| ^^^^^^^^^^^^^^^^^^^ a cycle occurred during layout computation
|
= note: the raw bytes of the constant (size: 4, align: 4) {
00 00 00 00 │ ....
}
error: aborting due to 2 previous errors
Some errors have detailed explanations: E0080, E0391.
For more information about an error, try `rustc --explain E0080`.

View File

@ -0,0 +1,25 @@
error[E0391]: cycle detected when computing layout of `Foo`
|
= note: ...which requires computing layout of `<&'static Foo as core::ops::deref::Deref>::Target`...
= note: ...which again requires computing layout of `Foo`, completing the cycle
note: cycle used when const-evaluating + checking `_`
--> $DIR/stack-overflow-trait-infer-98842.rs:15:1
|
LL | const _: *const Foo = 0 as _;
| ^^^^^^^^^^^^^^^^^^^
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
error[E0080]: it is undefined behavior to use this value
--> $DIR/stack-overflow-trait-infer-98842.rs:15:1
|
LL | const _: *const Foo = 0 as _;
| ^^^^^^^^^^^^^^^^^^^ a cycle occurred during layout computation
|
= note: the raw bytes of the constant (size: 8, align: 8) {
00 00 00 00 00 00 00 00 │ ........
}
error: aborting due to 2 previous errors
Some errors have detailed explanations: E0080, E0391.
For more information about an error, try `rustc --explain E0080`.

View File

@ -0,0 +1,18 @@
// #98842 stack overflow in trait inference
// issue: rust-lang/rust#98842
//@ check-fail
//@ edition:2021
//@ stderr-per-bitwidth
//@ ignore-endian-big
//~^^^^^^ ERROR cycle detected when computing layout of `Foo`
// If the inner `Foo` is named through an associated type,
// the "infinite size" error does not occur.
struct Foo(<&'static Foo as ::core::ops::Deref>::Target);
// But Rust will be unable to know whether `Foo` is sized or not,
// and it will infinitely recurse somewhere trying to figure out the
// size of this pointer (is my guess):
const _: *const Foo = 0 as _;
//~^ ERROR it is undefined behavior to use this value
pub fn main() {}

View File

@ -0,0 +1,25 @@
error[E0391]: cycle detected when computing layout of `Foo`
|
= note: ...which requires computing layout of `<&'static Foo as core::ops::deref::Deref>::Target`...
= note: ...which again requires computing layout of `Foo`, completing the cycle
note: cycle used when const-evaluating + checking `_`
--> $DIR/stack-overflow-trait-infer-98842.rs:13:1
|
LL | const _: *const Foo = 0 as _;
| ^^^^^^^^^^^^^^^^^^^
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
error[E0080]: it is undefined behavior to use this value
--> $DIR/stack-overflow-trait-infer-98842.rs:13:1
|
LL | const _: *const Foo = 0 as _;
| ^^^^^^^^^^^^^^^^^^^ a cycle occurred during layout computation
|
= note: the raw bytes of the constant (size: 8, align: 8) {
00 00 00 00 00 00 00 00 │ ........
}
error: aborting due to 2 previous errors
Some errors have detailed explanations: E0080, E0391.
For more information about an error, try `rustc --explain E0080`.

View File

@ -0,0 +1,21 @@
// ICE size_and_align_of::<[closure@test.rs:15:5: 17:7]> not supported #88212
// issue: rust-lang/rust#88212
#![feature(unsized_locals)]
//~^ WARN the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes
trait Example {}
struct Foo();
impl Example for Foo {}
fn example() -> Box<dyn Example> {
Box::new(Foo())
}
fn main() {
let x: dyn Example = *example();
(move || {
let _y = x;
//~^ ERROR the size for values of type `dyn Example` cannot be known at compilation time
})();
}

View File

@ -0,0 +1,23 @@
warning: the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes
--> $DIR/ice-size_and_align_of-closure-not-supported-88212.rs:3:12
|
LL | #![feature(unsized_locals)]
| ^^^^^^^^^^^^^^
|
= note: see issue #48055 <https://github.com/rust-lang/rust/issues/48055> for more information
= note: `#[warn(incomplete_features)]` on by default
error[E0277]: the size for values of type `dyn Example` cannot be known at compilation time
--> $DIR/ice-size_and_align_of-closure-not-supported-88212.rs:18:18
|
LL | (move || {
| -- this closure captures all values by move
LL | let _y = x;
| ^ doesn't have a size known at compile-time
|
= help: the trait `Sized` is not implemented for `dyn Example`
= note: all values captured by value by a closure must have a statically known size
error: aborting due to 1 previous error; 1 warning emitted
For more information about this error, try `rustc --explain E0277`.