Skip to content

Commit

Permalink
Unrolled build for rust-lang#123579
Browse files Browse the repository at this point in the history
Rollup merge of rust-lang#123579 - matthiaskrgr:I_Love_Tests, r=jieyouxu

add some more tests

Fixes rust-lang#115806
Fixes rust-lang#116710
Fixes rust-lang#123145
Fixes rust-lang#105488
Fixes rust-lang#122488
Fixes rust-lang#123078
  • Loading branch information
rust-timer committed Apr 7, 2024
2 parents 0e3235f + 88aa71f commit 0df4d37
Show file tree
Hide file tree
Showing 12 changed files with 245 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// ICE unknown alias DefKind: AnonConst
// issue: rust-lang/rust#116710
#![feature(generic_const_exprs)]
#![allow(incomplete_features)]

struct A<const N: u32 = 1, const M: u32 = u8>;
//~^ ERROR expected value, found builtin type `u8`

trait Trait {}
impl<const N: u32> Trait for A<N> {}

impl<const N: u32> Trait for A<N> {}
//~^ ERROR conflicting implementations of trait `Trait` for type `A<_>`

pub fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
error[E0423]: expected value, found builtin type `u8`
--> $DIR/unknown-alias-defkind-anonconst-ice-116710.rs:6:43
|
LL | struct A<const N: u32 = 1, const M: u32 = u8>;
| ^^ not a value

error[E0119]: conflicting implementations of trait `Trait` for type `A<_>`
--> $DIR/unknown-alias-defkind-anonconst-ice-116710.rs:12:1
|
LL | impl<const N: u32> Trait for A<N> {}
| --------------------------------- first implementation here
LL |
LL | impl<const N: u32> Trait for A<N> {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `A<_>`

error: aborting due to 2 previous errors

Some errors have detailed explanations: E0119, E0423.
For more information about an error, try `rustc --explain E0119`.
19 changes: 19 additions & 0 deletions tests/ui/generic-const-items/assoc-const-no-infer-ice-115806.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// ICE: assertion failed: !value.has_infer()
// issue: rust-lang/rust#115806
#![feature(associated_const_equality)]
#![allow(incomplete_features)]

pub struct NoPin;

impl<TA> Pins<TA> for NoPin {}

pub trait PinA<PER> {
const A: &'static () = &();
}

pub trait Pins<USART> {}

impl<USART, T> Pins<USART> for T where T: PinA<USART, A = { &() }> {}
//~^ ERROR conflicting implementations of trait `Pins<_>` for type `NoPin`

pub fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
error[E0119]: conflicting implementations of trait `Pins<_>` for type `NoPin`
--> $DIR/assoc-const-no-infer-ice-115806.rs:16:1
|
LL | impl<TA> Pins<TA> for NoPin {}
| --------------------------- first implementation here
...
LL | impl<USART, T> Pins<USART> for T where T: PinA<USART, A = { &() }> {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `NoPin`
|
= note: downstream crates may implement trait `PinA<_>` for type `NoPin`

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0119`.
42 changes: 42 additions & 0 deletions tests/ui/impl-trait/failed-to-resolve-instance-ice-105488.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// ICE failed to resolve instance for <fn() -> impl MyFnOnce ...
// issue: rust-lang/rust#105488
//@ build-fail
//~^^^ ERROR overflow evaluating the requirement `fn() -> impl MyFnOnce

pub trait MyFnOnce {
type Output;

fn call_my_fn_once(self) -> Self::Output;
}

pub struct WrapFnOnce<F>(F);

impl<F: FnOnce() -> D, D: MyFnOnce> MyFnOnce for WrapFnOnce<F> {
type Output = D::Output;

fn call_my_fn_once(self) -> Self::Output {
D::call_my_fn_once(self.0())
}
}

impl<F: FnOnce() -> D, D: MyFnOnce> MyFnOnce for F {
type Output = D::Output;

fn call_my_fn_once(self) -> Self::Output {
D::call_my_fn_once(self())
}
}

pub fn my_fn_1() -> impl MyFnOnce {
my_fn_2
}

pub fn my_fn_2() -> impl MyFnOnce {
WrapFnOnce(my_fn_1)
}

fn main() {
let v = my_fn_1();

let _ = v.call_my_fn_once();
}
16 changes: 16 additions & 0 deletions tests/ui/impl-trait/failed-to-resolve-instance-ice-105488.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
error[E0275]: overflow evaluating the requirement `fn() -> impl MyFnOnce {my_fn_2}: MyFnOnce`
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`failed_to_resolve_instance_ice_105488`)
note: required for `WrapFnOnce<fn() -> impl MyFnOnce {my_fn_1}>` to implement `MyFnOnce`
--> $DIR/failed-to-resolve-instance-ice-105488.rs:14:37
|
LL | impl<F: FnOnce() -> D, D: MyFnOnce> MyFnOnce for WrapFnOnce<F> {
| -------- ^^^^^^^^ ^^^^^^^^^^^^^
| |
| unsatisfied trait bound introduced here
= note: 126 redundant requirements hidden
= note: required for `WrapFnOnce<fn() -> impl MyFnOnce {my_fn_1}>` to implement `MyFnOnce`

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0275`.
20 changes: 20 additions & 0 deletions tests/ui/impl-trait/failed-to-resolve-instance-ice-123145.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// ICE failed to resolve instance for ...
// issue: rust-lang/rust#123145
//@ build-fail
//~^^^ ERROR overflow evaluating the requirement `(fn() -> impl Handler

trait Handler {
fn handle(&self) {}
}

impl<H: Handler, F: Fn() -> H> Handler for F {}

impl<L: Handler> Handler for (L,) {}

fn one() -> impl Handler {
(one,)
}

fn main() {
one.handle();
}
15 changes: 15 additions & 0 deletions tests/ui/impl-trait/failed-to-resolve-instance-ice-123145.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
error[E0275]: overflow evaluating the requirement `(fn() -> impl Handler {one},): Handler`
|
note: required for `fn() -> impl Handler {one}` to implement `Handler`
--> $DIR/failed-to-resolve-instance-ice-123145.rs:10:32
|
LL | impl<H: Handler, F: Fn() -> H> Handler for F {}
| ------- ^^^^^^^ ^
| |
| unsatisfied trait bound introduced here
= note: 2 redundant requirements hidden
= note: required for `fn() -> impl Handler {one}` to implement `Handler`

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0275`.
17 changes: 17 additions & 0 deletions tests/ui/layout/base-layout-is-sized-ice-123078.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// ICE !base.layout().is_sized()
// issue: rust-lang/rust#123078

struct S {
a: [u8],
//~^ ERROR the size for values of type `[u8]` cannot be known at compilation time
b: (),
}

const C: S = unsafe { std::mem::transmute(()) };
//~^ ERROR cannot transmute between types of different sizes, or dependently-sized types
const _: [(); {
C;
0
}] = [];

pub fn main() {}
31 changes: 31 additions & 0 deletions tests/ui/layout/base-layout-is-sized-ice-123078.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
--> $DIR/base-layout-is-sized-ice-123078.rs:5:8
|
LL | a: [u8],
| ^^^^ doesn't have a size known at compile-time
|
= help: the trait `Sized` is not implemented for `[u8]`
= note: only the last field of a struct may have a dynamically sized type
= help: change the field's type to have a statically known size
help: borrowed types always have a statically known size
|
LL | a: &[u8],
| +
help: the `Box` type always has a statically known size and allocates its contents in the heap
|
LL | a: Box<[u8]>,
| ++++ +

error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
--> $DIR/base-layout-is-sized-ice-123078.rs:10:23
|
LL | const C: S = unsafe { std::mem::transmute(()) };
| ^^^^^^^^^^^^^^^^^^^
|
= note: source type: `()` (0 bits)
= note: target type: `S` (this type does not have a fixed size)

error: aborting due to 2 previous errors

Some errors have detailed explanations: E0277, E0512.
For more information about an error, try `rustc --explain E0277`.
10 changes: 10 additions & 0 deletions tests/ui/layout/issue-unsized-tail-restatic-ice-122488.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// ICE Unexpected unsized type tail: &ReStatic [u8]
// issue: rust-lang/rust#122488
use std::ops::Deref;

struct ArenaSet<U: Deref, V: ?Sized = <U as Deref>::Target>(V, U);
//~^ ERROR the size for values of type `V` cannot be known at compilation time

const DATA: *const ArenaSet<Vec<u8>> = std::ptr::null_mut();

pub fn main() {}
27 changes: 27 additions & 0 deletions tests/ui/layout/issue-unsized-tail-restatic-ice-122488.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
error[E0277]: the size for values of type `V` cannot be known at compilation time
--> $DIR/issue-unsized-tail-restatic-ice-122488.rs:5:61
|
LL | struct ArenaSet<U: Deref, V: ?Sized = <U as Deref>::Target>(V, U);
| -------------------------------- ^ doesn't have a size known at compile-time
| |
| this type parameter needs to be `Sized`
|
= note: only the last field of a struct may have a dynamically sized type
= help: change the field's type to have a statically known size
help: consider removing the `?Sized` bound to make the type parameter `Sized`
|
LL - struct ArenaSet<U: Deref, V: ?Sized = <U as Deref>::Target>(V, U);
LL + struct ArenaSet<U: Deref, V = <U as Deref>::Target>(V, U);
|
help: borrowed types always have a statically known size
|
LL | struct ArenaSet<U: Deref, V: ?Sized = <U as Deref>::Target>(&V, U);
| +
help: the `Box` type always has a statically known size and allocates its contents in the heap
|
LL | struct ArenaSet<U: Deref, V: ?Sized = <U as Deref>::Target>(Box<V>, U);
| ++++ +

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0277`.

0 comments on commit 0df4d37

Please sign in to comment.