Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add a couple more ice tests #122943

Merged
merged 9 commits into from
Mar 24, 2024
26 changes: 26 additions & 0 deletions tests/ui/borrowck/opaque-types-patterns-subtyping-ice-104779.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// issue: rust-lang/rust#104779
// ICE region infer, IndexMap: key not found

struct Inv<'a>(&'a mut &'a ());
enum Foo<T> {
Bar,
Var(T),
}
type Subtype = Foo<for<'a, 'b> fn(Inv<'a>, Inv<'b>)>;
type Supertype = Foo<for<'a> fn(Inv<'a>, Inv<'a>)>;

fn foo() -> impl Sized {
//~^ WARN function cannot return without recursing
loop {
match foo() {
//~^ ERROR higher-ranked subtype error
//~^^ ERROR higher-ranked subtype error
Subtype::Bar => (),
//~^ ERROR higher-ranked subtype error
//~^^ ERROR higher-ranked subtype error
Supertype::Var(x) => {}
}
}
}

pub fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
warning: function cannot return without recursing
--> $DIR/opaque-types-patterns-subtyping-ice-104779.rs:12:1
|
LL | fn foo() -> impl Sized {
| ^^^^^^^^^^^^^^^^^^^^^^ cannot return without recursing
...
LL | match foo() {
| ----- recursive call site
|
= help: a `loop` may express intention better if this is on purpose
= note: `#[warn(unconditional_recursion)]` on by default

error: higher-ranked subtype error
--> $DIR/opaque-types-patterns-subtyping-ice-104779.rs:15:15
|
LL | match foo() {
| ^^^^^

error: higher-ranked subtype error
--> $DIR/opaque-types-patterns-subtyping-ice-104779.rs:15:15
|
LL | match foo() {
| ^^^^^
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`

error: higher-ranked subtype error
--> $DIR/opaque-types-patterns-subtyping-ice-104779.rs:18:13
|
LL | Subtype::Bar => (),
| ^^^^^^^^^^^^

error: higher-ranked subtype error
--> $DIR/opaque-types-patterns-subtyping-ice-104779.rs:18:13
|
LL | Subtype::Bar => (),
| ^^^^^^^^^^^^
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`

error: aborting due to 4 previous errors; 1 warning emitted

Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// issue: rust-lang/rust#106423
// ICE collection encountered polymorphic constant: UnevaluatedConst {..}
//@ edition:2021
//@ check-pass

#![feature(generic_const_exprs, generic_arg_infer)]
#![allow(incomplete_features)]
#![allow(unused)]

use core::mem::MaybeUninit;

pub struct Arr<T, const N: usize> {
v: [MaybeUninit<T>; N],
}

impl<T, const N: usize> Arr<T, N> {
const ELEM: MaybeUninit<T> = MaybeUninit::uninit();
const INIT: [MaybeUninit<T>; N] = [Self::ELEM; N]; // important for optimization of `new`

fn new() -> Self {
Arr { v: Self::INIT }
}
}

pub struct BaFormatFilter<const N: usize> {}

pub enum DigitalFilter<const N: usize>
where
[(); N * 2 + 1]: Sized,
[(); N * 2]: Sized,
{
Ba(BaFormatFilter<{ N * 2 + 1 }>),
}

pub fn iirfilter_st_copy<const N: usize, const M: usize>(_: [f32; M]) -> DigitalFilter<N>
where
[(); N * 2 + 1]: Sized,
[(); N * 2]: Sized,
{
let zpk = zpk2tf_st(&Arr::<f32, { N * 2 }>::new(), &Arr::<f32, { N * 2 }>::new());
DigitalFilter::Ba(zpk)
}

pub fn zpk2tf_st<const N: usize>(
_z: &Arr<f32, N>,
_p: &Arr<f32, N>,
) -> BaFormatFilter<{ N + 1 }>
where
[(); N + 1]: Sized,
{
BaFormatFilter {}
}


fn main() {
iirfilter_st_copy::<4, 2>([10., 50.,]);
}
16 changes: 16 additions & 0 deletions tests/ui/drop/norm-ice-106444.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// issue: rust-lang/rust#106444
// ICE failed to normalize
//@ compile-flags: -Zmir-opt-level=3
//@ check-pass

#![crate_type="lib"]

pub trait A {
type B;
}

pub struct S<T: A>(T::B);

pub fn foo<T: A>(p: *mut S<T>) {
unsafe { core::ptr::drop_in_place(p) };
}
12 changes: 12 additions & 0 deletions tests/ui/impl-trait/recursive-ice-101862.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// issue: rust-lang/rust#101852
// ICE opaque type with non-universal region substs

pub fn ice(x: impl AsRef<str>) -> impl IntoIterator<Item = ()> {
//~^ WARN function cannot return without recursing
vec![].append(&mut ice(x.as_ref()));
//~^ ERROR expected generic type parameter, found `&str`

Vec::new()
}

fn main() {}
24 changes: 24 additions & 0 deletions tests/ui/impl-trait/recursive-ice-101862.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
warning: function cannot return without recursing
--> $DIR/recursive-ice-101862.rs:4:1
|
LL | pub fn ice(x: impl AsRef<str>) -> impl IntoIterator<Item = ()> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot return without recursing
LL |
LL | vec![].append(&mut ice(x.as_ref()));
| --------------- recursive call site
|
= help: a `loop` may express intention better if this is on purpose
= note: `#[warn(unconditional_recursion)]` on by default

error[E0792]: expected generic type parameter, found `&str`
--> $DIR/recursive-ice-101862.rs:6:5
|
LL | pub fn ice(x: impl AsRef<str>) -> impl IntoIterator<Item = ()> {
| --------------- this generic parameter must be used with a generic type parameter
LL |
LL | vec![].append(&mut ice(x.as_ref()));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to 1 previous error; 1 warning emitted

For more information about this error, try `rustc --explain E0792`.
48 changes: 48 additions & 0 deletions tests/ui/nll/ice-106874.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// issue: rust-lang/rust#106874
// ICE BoundUniversalRegionError

use std::marker::PhantomData;
use std::rc::Rc;

pub fn func<V, F: Fn(&mut V)>(f: F) -> A<impl X> {
A(B(C::new(D::new(move |st| f(st)))))
//~^ ERROR implementation of `FnOnce` is not general enough
//~^^ ERROR implementation of `Fn` is not general enough
//~^^^ ERROR implementation of `FnOnce` is not general enough
//~^^^^ ERROR implementation of `FnOnce` is not general enough
//~^^^^^ ERROR implementation of `Fn` is not general enough
//~^^^^^^ ERROR implementation of `FnOnce` is not general enough
//~^^^^^^^ ERROR implementation of `Fn` is not general enough
//~^^^^^^^^ ERROR implementation of `FnOnce` is not general enough
//~^^^^^^^^^ ERROR higher-ranked subtype error
//~^^^^^^^^^^ ERROR higher-ranked subtype error
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
//~^^ ERROR implementation of `Fn` is not general enough
//~^^^ ERROR implementation of `FnOnce` is not general enough
//~^^^^ ERROR implementation of `FnOnce` is not general enough
//~^^^^^ ERROR implementation of `Fn` is not general enough
//~^^^^^^ ERROR implementation of `FnOnce` is not general enough
//~^^^^^^^ ERROR implementation of `Fn` is not general enough
//~^^^^^^^^ ERROR implementation of `FnOnce` is not general enough
//~^^^^^^^^^ ERROR higher-ranked subtype error
//~^^^^^^^^^^ ERROR higher-ranked subtype error
//~| ERROR implementation of `Fn` is not general enough
//~| ERROR implementation of `FnOnce` is not general enough
//~| ERROR implementation of `FnOnce` is not general enough
//~| ERROR implementation of `Fn` is not general enough
//~| ERROR implementation of `FnOnce` is not general enough
//~| ERROR implementation of `Fn` is not general enough
//~| ERROR implementation of `FnOnce` is not general enough
//~| ERROR higher-ranked subtype error
//~| ERROR higher-ranked subtype error

}

trait X {}
trait Y {
type V;
}

struct A<T>(T);

struct B<T>(Rc<T>);
impl<T> X for B<T> {}

struct C<T: Y>(T::V);
impl<T: Y> C<T> {
fn new(_: T) -> Rc<Self> {
todo!()
}
}
struct D<V, F>(F, PhantomData<fn(&mut V)>);

impl<V, F> D<V, F> {
fn new(_: F) -> Self {
todo!()
}
}
impl<V, F: Fn(&mut V)> Y for D<V, F> {
type V = V;
}

pub fn main() {}
90 changes: 90 additions & 0 deletions tests/ui/nll/ice-106874.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
error: implementation of `FnOnce` is not general enough
--> $DIR/ice-106874.rs:8:5
|
LL | A(B(C::new(D::new(move |st| f(st)))))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `FnOnce` is not general enough
|
= note: closure with signature `fn(&'0 mut V)` must implement `FnOnce<(&mut V,)>`, for some specific lifetime `'0`...
= note: ...but it actually implements `FnOnce<(&'1 mut V,)>`, for some specific lifetime `'1`

error: implementation of `FnOnce` is not general enough
--> $DIR/ice-106874.rs:8:5
|
LL | A(B(C::new(D::new(move |st| f(st)))))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `FnOnce` is not general enough
|
= note: closure with signature `fn(&'0 mut V)` must implement `FnOnce<(&mut V,)>`, for some specific lifetime `'0`...
= note: ...but it actually implements `FnOnce<(&'1 mut V,)>`, for some specific lifetime `'1`
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`

error: implementation of `Fn` is not general enough
--> $DIR/ice-106874.rs:8:7
|
LL | A(B(C::new(D::new(move |st| f(st)))))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Fn` is not general enough
|
= note: closure with signature `fn(&'2 mut V)` must implement `Fn<(&'1 mut V,)>`, for any lifetime `'1`...
= note: ...but it actually implements `Fn<(&'2 mut V,)>`, for some specific lifetime `'2`

error: implementation of `FnOnce` is not general enough
--> $DIR/ice-106874.rs:8:7
|
LL | A(B(C::new(D::new(move |st| f(st)))))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `FnOnce` is not general enough
|
= note: closure with signature `fn(&'2 mut V)` must implement `FnOnce<(&'1 mut V,)>`, for any lifetime `'1`...
= note: ...but it actually implements `FnOnce<(&'2 mut V,)>`, for some specific lifetime `'2`

error: implementation of `Fn` is not general enough
--> $DIR/ice-106874.rs:8:7
|
LL | A(B(C::new(D::new(move |st| f(st)))))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Fn` is not general enough
|
= note: closure with signature `fn(&'2 mut V)` must implement `Fn<(&'1 mut V,)>`, for any lifetime `'1`...
= note: ...but it actually implements `Fn<(&'2 mut V,)>`, for some specific lifetime `'2`
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`

error: implementation of `FnOnce` is not general enough
--> $DIR/ice-106874.rs:8:9
|
LL | A(B(C::new(D::new(move |st| f(st)))))
| ^^^^^^ implementation of `FnOnce` is not general enough
|
= note: closure with signature `fn(&'2 mut V)` must implement `FnOnce<(&'1 mut V,)>`, for any lifetime `'1`...
= note: ...but it actually implements `FnOnce<(&'2 mut V,)>`, for some specific lifetime `'2`

error: implementation of `Fn` is not general enough
--> $DIR/ice-106874.rs:8:9
|
LL | A(B(C::new(D::new(move |st| f(st)))))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Fn` is not general enough
|
= note: closure with signature `fn(&'2 mut V)` must implement `Fn<(&'1 mut V,)>`, for any lifetime `'1`...
= note: ...but it actually implements `Fn<(&'2 mut V,)>`, for some specific lifetime `'2`

error: implementation of `FnOnce` is not general enough
--> $DIR/ice-106874.rs:8:9
|
LL | A(B(C::new(D::new(move |st| f(st)))))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `FnOnce` is not general enough
|
= note: closure with signature `fn(&'2 mut V)` must implement `FnOnce<(&'1 mut V,)>`, for any lifetime `'1`...
= note: ...but it actually implements `FnOnce<(&'2 mut V,)>`, for some specific lifetime `'2`

error: higher-ranked subtype error
--> $DIR/ice-106874.rs:8:41
|
LL | A(B(C::new(D::new(move |st| f(st)))))
| ^

error: higher-ranked subtype error
--> $DIR/ice-106874.rs:8:41
|
LL | A(B(C::new(D::new(move |st| f(st)))))
| ^
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`

error: aborting due to 10 previous errors

15 changes: 15 additions & 0 deletions tests/ui/raw-ref-op/const-eval-compare-ice-105047.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// issue: rust-lang/rust#105047
// ICE raw ptr comparison should already be caught in the trait systems

#![feature(raw_ref_op)]

const RCZ: *const i32 = &raw const *&0;

const fn f() {
if let RCZ = &raw const *&0 { }
//~^ WARN function pointers and raw pointers not derived from integers in patterns
//~^^ ERROR pointers cannot be reliably compared during const eval
//~^^^ WARN this was previously accepted by the compiler but is being phased out
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
//~^^ ERROR pointers cannot be reliably compared during const eval
//~^^^ WARN this was previously accepted by the compiler but is being phased out
//~| ERROR pointers cannot be reliably compared during const eval
//~| WARN this was previously accepted by the compiler but is being phased out

}

fn main() {}
31 changes: 31 additions & 0 deletions tests/ui/raw-ref-op/const-eval-compare-ice-105047.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
warning: function pointers and raw pointers not derived from integers in patterns behave unpredictably and should not be relied upon. See https://github.com/rust-lang/rust/issues/70861 for details.
--> $DIR/const-eval-compare-ice-105047.rs:9:12
|
LL | if let RCZ = &raw const *&0 { }
| ^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #120362 <https://github.com/rust-lang/rust/issues/120362>
= note: `#[warn(pointer_structural_match)]` on by default

error: pointers cannot be reliably compared during const eval
--> $DIR/const-eval-compare-ice-105047.rs:9:12
|
LL | if let RCZ = &raw const *&0 { }
| ^^^
|
= note: see issue #53020 <https://github.com/rust-lang/rust/issues/53020> for more information

error: aborting due to 1 previous error; 1 warning emitted

Future incompatibility report: Future breakage diagnostic:
warning: function pointers and raw pointers not derived from integers in patterns behave unpredictably and should not be relied upon. See https://github.com/rust-lang/rust/issues/70861 for details.
--> $DIR/const-eval-compare-ice-105047.rs:9:12
|
LL | if let RCZ = &raw const *&0 { }
| ^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #120362 <https://github.com/rust-lang/rust/issues/120362>
= note: `#[warn(pointer_structural_match)]` on by default

28 changes: 28 additions & 0 deletions tests/ui/specialization/broken-mir-drop-glue-107228.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// issue: rust-lang/rust#107228
// ICE broken MIR in DropGlue
//@ compile-flags: -Zvalidate-mir
//@ check-pass

#![feature(specialization)]
#![crate_type="lib"]
#![allow(incomplete_features)]

pub(crate) trait SpecTrait {
type Assoc;
}

impl<C> SpecTrait for C {
default type Assoc = Vec<Self>;
}

pub(crate) struct AssocWrap<C: SpecTrait> {
_assoc: C::Assoc,
}

fn instantiate<C: SpecTrait>() -> AssocWrap<C> {
loop {}
}

pub fn main() {
instantiate::<()>();
}
Loading
Loading