Auto merge of #77956 - JohnTitor:more-tests, r=nagisa
Add some more regression tests This is another round of #77741. Tested with `debug-assertions=true` and it passed on my local. Closes #70877 Closes #70944 Closes #71659 Closes #74816 Closes #75707 Closes #75983 (Skipped #63355 because I'm not sure about the error.)
This commit is contained in:
commit
cbc42a0f3e
23
src/test/ui/generic-associated-types/issue-74816.rs
Normal file
23
src/test/ui/generic-associated-types/issue-74816.rs
Normal file
@ -0,0 +1,23 @@
|
||||
#![feature(associated_type_defaults)]
|
||||
#![feature(generic_associated_types)]
|
||||
#![allow(incomplete_features)]
|
||||
|
||||
trait Trait1 {
|
||||
fn foo();
|
||||
}
|
||||
|
||||
trait Trait2 {
|
||||
type Associated: Trait1 = Self;
|
||||
//~^ ERROR: the trait bound `Self: Trait1` is not satisfied
|
||||
//~| the size for values of type `Self` cannot be known
|
||||
}
|
||||
|
||||
impl Trait2 for () {}
|
||||
|
||||
fn call_foo<T: Trait2>() {
|
||||
T::Associated::foo()
|
||||
}
|
||||
|
||||
fn main() {
|
||||
call_foo::<()>()
|
||||
}
|
31
src/test/ui/generic-associated-types/issue-74816.stderr
Normal file
31
src/test/ui/generic-associated-types/issue-74816.stderr
Normal file
@ -0,0 +1,31 @@
|
||||
error[E0277]: the trait bound `Self: Trait1` is not satisfied
|
||||
--> $DIR/issue-74816.rs:10:5
|
||||
|
|
||||
LL | type Associated: Trait1 = Self;
|
||||
| ^^^^^^^^^^^^^^^^^------^^^^^^^^
|
||||
| | |
|
||||
| | required by this bound in `Trait2::Associated`
|
||||
| the trait `Trait1` is not implemented for `Self`
|
||||
|
|
||||
help: consider further restricting `Self`
|
||||
|
|
||||
LL | trait Trait2: Trait1 {
|
||||
| ^^^^^^^^
|
||||
|
||||
error[E0277]: the size for values of type `Self` cannot be known at compilation time
|
||||
--> $DIR/issue-74816.rs:10:5
|
||||
|
|
||||
LL | type Associated: Trait1 = Self;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| doesn't have a size known at compile-time
|
||||
| required by this bound in `Trait2::Associated`
|
||||
|
|
||||
help: consider further restricting `Self`
|
||||
|
|
||||
LL | trait Trait2: Sized {
|
||||
| ^^^^^^^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
38
src/test/ui/impl-trait/issues/issue-70877.rs
Normal file
38
src/test/ui/impl-trait/issues/issue-70877.rs
Normal file
@ -0,0 +1,38 @@
|
||||
#![feature(type_alias_impl_trait)]
|
||||
#![feature(impl_trait_in_bindings)]
|
||||
#![allow(incomplete_features)]
|
||||
|
||||
type FooArg<'a> = &'a dyn ToString;
|
||||
type FooRet = impl std::fmt::Debug;
|
||||
|
||||
type FooItem = Box<dyn Fn(FooArg) -> FooRet>;
|
||||
type Foo = impl Iterator<Item = FooItem>; //~ ERROR: type mismatch
|
||||
|
||||
#[repr(C)]
|
||||
struct Bar(u8);
|
||||
|
||||
impl Iterator for Bar {
|
||||
type Item = FooItem;
|
||||
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
Some(Box::new(quux))
|
||||
}
|
||||
}
|
||||
|
||||
fn quux(st: FooArg) -> FooRet {
|
||||
Some(st.to_string())
|
||||
}
|
||||
|
||||
fn ham() -> Foo {
|
||||
Bar(1)
|
||||
}
|
||||
|
||||
fn oof() -> impl std::fmt::Debug {
|
||||
let mut bar = ham();
|
||||
let func = bar.next().unwrap();
|
||||
return func(&"oof");
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let _ = oof();
|
||||
}
|
15
src/test/ui/impl-trait/issues/issue-70877.stderr
Normal file
15
src/test/ui/impl-trait/issues/issue-70877.stderr
Normal file
@ -0,0 +1,15 @@
|
||||
error[E0271]: type mismatch resolving `<Bar as Iterator>::Item == Box<(dyn for<'r> Fn(&'r (dyn ToString + 'r)) -> Option<String> + 'static)>`
|
||||
--> $DIR/issue-70877.rs:9:12
|
||||
|
|
||||
LL | type FooRet = impl std::fmt::Debug;
|
||||
| -------------------- the expected opaque type
|
||||
...
|
||||
LL | type Foo = impl Iterator<Item = FooItem>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected opaque type, found enum `Option`
|
||||
|
|
||||
= note: expected struct `Box<(dyn for<'r> Fn(&'r (dyn ToString + 'r)) -> impl Debug + 'static)>`
|
||||
found struct `Box<(dyn for<'r> Fn(&'r (dyn ToString + 'r)) -> Option<String> + 'static)>`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0271`.
|
23
src/test/ui/traits/issue-70944.rs
Normal file
23
src/test/ui/traits/issue-70944.rs
Normal file
@ -0,0 +1,23 @@
|
||||
// check-pass
|
||||
// Regression test of #70944, should compile fine.
|
||||
|
||||
use std::ops::Index;
|
||||
|
||||
pub struct KeyA;
|
||||
pub struct KeyB;
|
||||
pub struct KeyC;
|
||||
|
||||
pub trait Foo: Index<KeyA> + Index<KeyB> + Index<KeyC> {}
|
||||
pub trait FooBuilder {
|
||||
type Inner: Foo;
|
||||
fn inner(&self) -> &Self::Inner;
|
||||
}
|
||||
|
||||
pub fn do_stuff(foo: &impl FooBuilder) {
|
||||
let inner = foo.inner();
|
||||
&inner[KeyA];
|
||||
&inner[KeyB];
|
||||
&inner[KeyC];
|
||||
}
|
||||
|
||||
fn main() {}
|
17
src/test/ui/traits/trait-alias/issue-75983.rs
Normal file
17
src/test/ui/traits/trait-alias/issue-75983.rs
Normal file
@ -0,0 +1,17 @@
|
||||
// check-pass
|
||||
|
||||
#![feature(trait_alias)]
|
||||
|
||||
struct Bar;
|
||||
trait Foo {}
|
||||
impl Foo for Bar {}
|
||||
|
||||
trait Baz = Foo where Bar: Foo;
|
||||
|
||||
fn new() -> impl Baz {
|
||||
Bar
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let _ = new();
|
||||
}
|
32
src/test/ui/unsized/issue-71659.rs
Normal file
32
src/test/ui/unsized/issue-71659.rs
Normal file
@ -0,0 +1,32 @@
|
||||
#![feature(unsize)]
|
||||
|
||||
use std::marker::Unsize;
|
||||
|
||||
pub trait CastTo<T: ?Sized>: Unsize<T> {
|
||||
fn cast_to(&self) -> &T;
|
||||
}
|
||||
|
||||
impl<T: ?Sized, U: ?Sized + Unsize<T>> CastTo<T> for U {
|
||||
fn cast_to(&self) -> &T {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: ?Sized> Cast for T {}
|
||||
pub trait Cast {
|
||||
fn cast<T: ?Sized>(&self) -> &T
|
||||
where
|
||||
Self: CastTo<T>,
|
||||
{
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
pub trait Foo: CastTo<[i32]> {}
|
||||
impl Foo for [i32; 0] {}
|
||||
|
||||
fn main() {
|
||||
let x: &dyn Foo = &[];
|
||||
let x = x.cast::<[i32]>();
|
||||
//~^ ERROR: the trait bound `dyn Foo: CastTo<[i32]>` is not satisfied
|
||||
}
|
9
src/test/ui/unsized/issue-71659.stderr
Normal file
9
src/test/ui/unsized/issue-71659.stderr
Normal file
@ -0,0 +1,9 @@
|
||||
error[E0277]: the trait bound `dyn Foo: CastTo<[i32]>` is not satisfied
|
||||
--> $DIR/issue-71659.rs:30:15
|
||||
|
|
||||
LL | let x = x.cast::<[i32]>();
|
||||
| ^^^^ the trait `CastTo<[i32]>` is not implemented for `dyn Foo`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
17
src/test/ui/unsized/issue-75707.rs
Normal file
17
src/test/ui/unsized/issue-75707.rs
Normal file
@ -0,0 +1,17 @@
|
||||
pub trait Callback {
|
||||
fn cb();
|
||||
}
|
||||
|
||||
pub trait Processing {
|
||||
type Call: Callback;
|
||||
}
|
||||
|
||||
fn f<P: Processing + ?Sized>() {
|
||||
P::Call::cb();
|
||||
}
|
||||
|
||||
fn main() {
|
||||
struct MyCall;
|
||||
f::<dyn Processing<Call = MyCall>>();
|
||||
//~^ ERROR: the trait bound `MyCall: Callback` is not satisfied
|
||||
}
|
12
src/test/ui/unsized/issue-75707.stderr
Normal file
12
src/test/ui/unsized/issue-75707.stderr
Normal file
@ -0,0 +1,12 @@
|
||||
error[E0277]: the trait bound `MyCall: Callback` is not satisfied
|
||||
--> $DIR/issue-75707.rs:15:5
|
||||
|
|
||||
LL | fn f<P: Processing + ?Sized>() {
|
||||
| ---------- required by this bound in `f`
|
||||
...
|
||||
LL | f::<dyn Processing<Call = MyCall>>();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Callback` is not implemented for `MyCall`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
Loading…
Reference in New Issue
Block a user