Skip to content

Commit

Permalink
Rollup merge of rust-lang#122895 - matthiaskrgr:ice-tests-5xxxx-to-9x…
Browse files Browse the repository at this point in the history
…xxx, r=fmease

add some ice tests 5xxxx to 9xxxx

  Fixes rust-lang#98842
  Fixes rust-lang#90691
  Fixes rust-lang#88421
  Fixes rust-lang#88212
  Fixes rust-lang#83056
  Fixes rust-lang#80125
  Fixes rust-lang#64784
  Fixes rust-lang#52334
  • Loading branch information
matthiaskrgr committed Mar 23, 2024
2 parents 4e721c0 + d7eeb71 commit 6b4f9c9
Show file tree
Hide file tree
Showing 15 changed files with 343 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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();
}
Original file line number Diff line number Diff line change
@@ -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() {}
7 changes: 7 additions & 0 deletions tests/ui/consts/ice-bad-input-type-for-cast-83056.rs
Original file line number Diff line number Diff line change
@@ -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() {}
20 changes: 20 additions & 0 deletions tests/ui/consts/ice-bad-input-type-for-cast-83056.stderr
Original file line number Diff line number Diff line change
@@ -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`.
13 changes: 13 additions & 0 deletions tests/ui/extern/extern-C-non-FFI-safe-arg-ice-52334.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// test for #52334 ICE when casting extern "C" fn when it has a non-FFI-safe argument
//@ check-pass
// issue: rust-lang/rust#52334
type Foo = extern "C" fn(::std::ffi::CStr);
//~^ WARN `extern` fn uses type `[i8]`, which is not FFI-safe
extern "C" {
fn meh(blah: Foo);
//~^ WARN `extern` block uses type `[i8]`, which is not FFI-safe
}

fn main() {
meh as usize;
}
22 changes: 22 additions & 0 deletions tests/ui/extern/extern-C-non-FFI-safe-arg-ice-52334.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
warning: `extern` fn uses type `[i8]`, which is not FFI-safe
--> $DIR/extern-C-non-FFI-safe-arg-ice-52334.rs:4: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]`, which is not FFI-safe
--> $DIR/extern-C-non-FFI-safe-arg-ice-52334.rs:7: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

15 changes: 15 additions & 0 deletions tests/ui/extern/extern-C-str-arg-ice-80125.rs
Original file line number Diff line number Diff line change
@@ -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() {}
35 changes: 35 additions & 0 deletions tests/ui/extern/extern-C-str-arg-ice-80125.stderr
Original file line number Diff line number Diff line change
@@ -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

Original file line number Diff line number Diff line change
@@ -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() {}
25 changes: 25 additions & 0 deletions tests/ui/sized/stack-overflow-trait-infer-98842.32bit.stderr
Original file line number Diff line number Diff line change
@@ -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`.
25 changes: 25 additions & 0 deletions tests/ui/sized/stack-overflow-trait-infer-98842.64bit.stderr
Original file line number Diff line number Diff line change
@@ -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`.
18 changes: 18 additions & 0 deletions tests/ui/sized/stack-overflow-trait-infer-98842.rs
Original file line number Diff line number Diff line change
@@ -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() {}
25 changes: 25 additions & 0 deletions tests/ui/sized/stack-overflow-trait-infer-98842.stderr
Original file line number Diff line number Diff line change
@@ -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`.
Original file line number Diff line number Diff line change
@@ -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
})();
}
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 6b4f9c9

Please sign in to comment.