Skip to content

Commit

Permalink
Add some TAIT-related tests
Browse files Browse the repository at this point in the history
  • Loading branch information
JohnTitor committed May 4, 2022
1 parent e1b71fe commit 81a4f4b
Show file tree
Hide file tree
Showing 6 changed files with 123 additions and 0 deletions.
9 changes: 9 additions & 0 deletions src/test/ui/type-alias-impl-trait/issue-53398-cyclic-types.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#![feature(type_alias_impl_trait)]

type Foo = impl Fn() -> Foo;

fn foo() -> Foo {
foo //~ ERROR: overflow evaluating the requirement `fn() -> Foo {foo}: Sized`
}

fn main() {}
11 changes: 11 additions & 0 deletions src/test/ui/type-alias-impl-trait/issue-53398-cyclic-types.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
error[E0275]: overflow evaluating the requirement `fn() -> Foo {foo}: Sized`
--> $DIR/issue-53398-cyclic-types.rs:6:5
|
LL | foo
| ^^^
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`issue_53398_cyclic_types`)

error: aborting due to previous error

For more information about this error, try `rustc --explain E0275`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// check-pass

#![feature(generators, generator_trait)]
#![feature(type_alias_impl_trait)]

use std::ops::{Generator, GeneratorState};
use std::pin::Pin;

type RandGenerator<'a> = impl Generator<Return = (), Yield = u64> + 'a;
fn rand_generator<'a>(rng: &'a ()) -> RandGenerator<'a> {
move || {
let _rng = rng;
loop {
yield 0;
}
}
}

pub type RandGeneratorWithIndirection<'a> = impl Generator<Return = (), Yield = u64> + 'a;
pub fn rand_generator_with_indirection<'a>(rng: &'a ()) -> RandGeneratorWithIndirection<'a> {
fn helper<'b>(rng: &'b ()) -> impl 'b + Generator<Return = (), Yield = u64> {
move || {
let _rng = rng;
loop {
yield 0;
}
}
}

helper(rng)
}

fn main() {
let mut gen = rand_generator(&());
match unsafe { Pin::new_unchecked(&mut gen) }.resume(()) {
GeneratorState::Yielded(_) => {}
GeneratorState::Complete(_) => {}
};
}
31 changes: 31 additions & 0 deletions src/test/ui/type-alias-impl-trait/issue-89952.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// check-pass

#![feature(type_alias_impl_trait)]

trait SomeTrait {}
impl SomeTrait for () {}

trait MyFuture {
type Output;
}
impl<T> MyFuture for T {
type Output = T;
}

trait ReturnsFuture {
type Output: SomeTrait;
type Future: MyFuture<Output = Result<Self::Output, ()>>;
fn func() -> Self::Future;
}

struct Foo;

impl ReturnsFuture for Foo {
type Output = impl SomeTrait;
type Future = impl MyFuture<Output = Result<Self::Output, ()>>;
fn func() -> Self::Future {
Result::<(), ()>::Err(())
}
}

fn main() {}
22 changes: 22 additions & 0 deletions src/test/ui/type-alias-impl-trait/issue-94429.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#![feature(type_alias_impl_trait, generator_trait, generators)]
use std::ops::Generator;

trait Runnable {
type Gen: Generator<Yield = (), Return = ()>;

fn run(&mut self) -> Self::Gen;
}

struct Implementor {}

impl Runnable for Implementor {
type Gen = impl Generator<Yield = (), Return = ()>;

fn run(&mut self) -> Self::Gen {
move || { //~ ERROR: type mismatch resolving
yield 1;
}
}
}

fn main() {}
11 changes: 11 additions & 0 deletions src/test/ui/type-alias-impl-trait/issue-94429.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
error[E0271]: type mismatch resolving `<[generator@$DIR/issue-94429.rs:16:9: 18:10] as Generator>::Yield == ()`
--> $DIR/issue-94429.rs:16:9
|
LL | / move || {
LL | | yield 1;
LL | | }
| |_________^ expected integer, found `()`

error: aborting due to previous error

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

0 comments on commit 81a4f4b

Please sign in to comment.