Skip to content

Commit

Permalink
Auto merge of #77956 - JohnTitor:more-tests, r=nagisa
Browse files Browse the repository at this point in the history
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.)
  • Loading branch information
bors committed Oct 18, 2020
2 parents 3b0ef34 + d80f93d commit cbc42a0
Show file tree
Hide file tree
Showing 10 changed files with 217 additions and 0 deletions.
23 changes: 23 additions & 0 deletions src/test/ui/generic-associated-types/issue-74816.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 31 additions & 0 deletions src/test/ui/generic-associated-types/issue-74816.stderr
Original file line number Diff line number Diff line change
@@ -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 changes: 38 additions & 0 deletions src/test/ui/impl-trait/issues/issue-70877.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 15 additions & 0 deletions src/test/ui/impl-trait/issues/issue-70877.stderr
Original file line number Diff line number Diff line change
@@ -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 changes: 23 additions & 0 deletions src/test/ui/traits/issue-70944.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 17 additions & 0 deletions src/test/ui/traits/trait-alias/issue-75983.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 32 additions & 0 deletions src/test/ui/unsized/issue-71659.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 9 additions & 0 deletions src/test/ui/unsized/issue-71659.stderr
Original file line number Diff line number Diff line change
@@ -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 changes: 17 additions & 0 deletions src/test/ui/unsized/issue-75707.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 12 additions & 0 deletions src/test/ui/unsized/issue-75707.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit cbc42a0

Please sign in to comment.