From 81a4f4bd69dc4cbf7a31154fc1598b0f7a73fd07 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Wed, 4 May 2022 09:12:50 +0900 Subject: [PATCH] Add some TAIT-related tests --- .../issue-53398-cyclic-types.rs | 9 +++++ .../issue-53398-cyclic-types.stderr | 11 ++++++ .../issue-58662-generator-with-lifetime.rs | 39 +++++++++++++++++++ .../ui/type-alias-impl-trait/issue-89952.rs | 31 +++++++++++++++ .../ui/type-alias-impl-trait/issue-94429.rs | 22 +++++++++++ .../type-alias-impl-trait/issue-94429.stderr | 11 ++++++ 6 files changed, 123 insertions(+) create mode 100644 src/test/ui/type-alias-impl-trait/issue-53398-cyclic-types.rs create mode 100644 src/test/ui/type-alias-impl-trait/issue-53398-cyclic-types.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-58662-generator-with-lifetime.rs create mode 100644 src/test/ui/type-alias-impl-trait/issue-89952.rs create mode 100644 src/test/ui/type-alias-impl-trait/issue-94429.rs create mode 100644 src/test/ui/type-alias-impl-trait/issue-94429.stderr diff --git a/src/test/ui/type-alias-impl-trait/issue-53398-cyclic-types.rs b/src/test/ui/type-alias-impl-trait/issue-53398-cyclic-types.rs new file mode 100644 index 00000000000..6c838f41003 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-53398-cyclic-types.rs @@ -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() {} diff --git a/src/test/ui/type-alias-impl-trait/issue-53398-cyclic-types.stderr b/src/test/ui/type-alias-impl-trait/issue-53398-cyclic-types.stderr new file mode 100644 index 00000000000..a9c2c18630c --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-53398-cyclic-types.stderr @@ -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`. diff --git a/src/test/ui/type-alias-impl-trait/issue-58662-generator-with-lifetime.rs b/src/test/ui/type-alias-impl-trait/issue-58662-generator-with-lifetime.rs new file mode 100644 index 00000000000..f20ddf02071 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-58662-generator-with-lifetime.rs @@ -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 + 'a; +fn rand_generator<'a>(rng: &'a ()) -> RandGenerator<'a> { + move || { + let _rng = rng; + loop { + yield 0; + } + } +} + +pub type RandGeneratorWithIndirection<'a> = impl Generator + 'a; +pub fn rand_generator_with_indirection<'a>(rng: &'a ()) -> RandGeneratorWithIndirection<'a> { + fn helper<'b>(rng: &'b ()) -> impl 'b + Generator { + 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(_) => {} + }; +} diff --git a/src/test/ui/type-alias-impl-trait/issue-89952.rs b/src/test/ui/type-alias-impl-trait/issue-89952.rs new file mode 100644 index 00000000000..dc0f19c042a --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-89952.rs @@ -0,0 +1,31 @@ +// check-pass + +#![feature(type_alias_impl_trait)] + +trait SomeTrait {} +impl SomeTrait for () {} + +trait MyFuture { + type Output; +} +impl MyFuture for T { + type Output = T; +} + +trait ReturnsFuture { + type Output: SomeTrait; + type Future: MyFuture>; + fn func() -> Self::Future; +} + +struct Foo; + +impl ReturnsFuture for Foo { + type Output = impl SomeTrait; + type Future = impl MyFuture>; + fn func() -> Self::Future { + Result::<(), ()>::Err(()) + } +} + +fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/issue-94429.rs b/src/test/ui/type-alias-impl-trait/issue-94429.rs new file mode 100644 index 00000000000..51d69c1271e --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-94429.rs @@ -0,0 +1,22 @@ +#![feature(type_alias_impl_trait, generator_trait, generators)] +use std::ops::Generator; + +trait Runnable { + type Gen: Generator; + + fn run(&mut self) -> Self::Gen; +} + +struct Implementor {} + +impl Runnable for Implementor { + type Gen = impl Generator; + + fn run(&mut self) -> Self::Gen { + move || { //~ ERROR: type mismatch resolving + yield 1; + } + } +} + +fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/issue-94429.stderr b/src/test/ui/type-alias-impl-trait/issue-94429.stderr new file mode 100644 index 00000000000..4546f82b83b --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-94429.stderr @@ -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`.