summaryrefslogtreecommitdiffstats
path: root/tests/ui/async-await/in-trait
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/async-await/in-trait')
-rw-r--r--tests/ui/async-await/in-trait/async-associated-types2.rs30
-rw-r--r--tests/ui/async-await/in-trait/async-lifetimes-and-bounds.rs2
-rw-r--r--tests/ui/async-await/in-trait/async-lifetimes.rs2
-rw-r--r--tests/ui/async-await/in-trait/missing-feature-flag.current.stderr30
-rw-r--r--tests/ui/async-await/in-trait/missing-feature-flag.next.stderr30
-rw-r--r--tests/ui/async-await/in-trait/missing-feature-flag.rs23
-rw-r--r--tests/ui/async-await/in-trait/normalize-opaque-with-bound-vars.rs64
-rw-r--r--tests/ui/async-await/in-trait/return-not-existing-pair.current.stderr39
-rw-r--r--tests/ui/async-await/in-trait/return-not-existing-pair.next.stderr39
-rw-r--r--tests/ui/async-await/in-trait/return-not-existing-pair.rs19
-rw-r--r--tests/ui/async-await/in-trait/return-not-existing-type-wrapping-rpitit.current.stderr9
-rw-r--r--tests/ui/async-await/in-trait/return-not-existing-type-wrapping-rpitit.next.stderr9
-rw-r--r--tests/ui/async-await/in-trait/return-not-existing-type-wrapping-rpitit.rs20
13 files changed, 286 insertions, 30 deletions
diff --git a/tests/ui/async-await/in-trait/async-associated-types2.rs b/tests/ui/async-await/in-trait/async-associated-types2.rs
deleted file mode 100644
index b889f616a..000000000
--- a/tests/ui/async-await/in-trait/async-associated-types2.rs
+++ /dev/null
@@ -1,30 +0,0 @@
-// check-pass
-// edition: 2021
-// [next] compile-flags: -Zlower-impl-trait-in-trait-to-assoc-ty
-// revisions: current next
-
-#![feature(async_fn_in_trait)]
-#![feature(impl_trait_in_assoc_type)]
-#![allow(incomplete_features)]
-
-use std::future::Future;
-
-trait MyTrait {
- type Fut<'a>: Future<Output = i32>
- where
- Self: 'a;
-
- fn foo<'a>(&'a self) -> Self::Fut<'a>;
-}
-
-impl MyTrait for i32 {
- type Fut<'a> = impl Future<Output = i32> + 'a
- where
- Self: 'a;
-
- fn foo<'a>(&'a self) -> Self::Fut<'a> {
- async { *self }
- }
-}
-
-fn main() {}
diff --git a/tests/ui/async-await/in-trait/async-lifetimes-and-bounds.rs b/tests/ui/async-await/in-trait/async-lifetimes-and-bounds.rs
index d5481d277..9869a8d71 100644
--- a/tests/ui/async-await/in-trait/async-lifetimes-and-bounds.rs
+++ b/tests/ui/async-await/in-trait/async-lifetimes-and-bounds.rs
@@ -1,5 +1,7 @@
// check-pass
// edition: 2021
+// [next] compile-flags: -Zlower-impl-trait-in-trait-to-assoc-ty
+// revisions: current next
#![feature(async_fn_in_trait)]
#![allow(incomplete_features)]
diff --git a/tests/ui/async-await/in-trait/async-lifetimes.rs b/tests/ui/async-await/in-trait/async-lifetimes.rs
index f298e45d2..ecbd1910a 100644
--- a/tests/ui/async-await/in-trait/async-lifetimes.rs
+++ b/tests/ui/async-await/in-trait/async-lifetimes.rs
@@ -1,5 +1,7 @@
// check-pass
// edition: 2021
+// [next] compile-flags: -Zlower-impl-trait-in-trait-to-assoc-ty
+// revisions: current next
#![feature(async_fn_in_trait)]
#![allow(incomplete_features)]
diff --git a/tests/ui/async-await/in-trait/missing-feature-flag.current.stderr b/tests/ui/async-await/in-trait/missing-feature-flag.current.stderr
new file mode 100644
index 000000000..e6ac9bc22
--- /dev/null
+++ b/tests/ui/async-await/in-trait/missing-feature-flag.current.stderr
@@ -0,0 +1,30 @@
+error[E0046]: not all trait items implemented, missing: `foo`
+ --> $DIR/missing-feature-flag.rs:14:1
+ |
+LL | async fn foo(_: T) -> &'static str;
+ | ----------------------------------- `foo` from trait
+...
+LL | impl<T> MyTrait<T> for MyStruct {}
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `foo` in implementation
+
+error[E0520]: `foo` specializes an item from a parent `impl`, but that item is not marked `default`
+ --> $DIR/missing-feature-flag.rs:18:5
+ |
+LL | impl<T> MyTrait<T> for MyStruct {}
+ | ------------------------------- parent `impl` is here
+...
+LL | async fn foo(_: i32) -> &'static str {}
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot specialize default item `foo`
+ |
+ = note: to specialize, `foo` in the parent `impl` must be marked `default`
+
+error[E0308]: mismatched types
+ --> $DIR/missing-feature-flag.rs:18:42
+ |
+LL | async fn foo(_: i32) -> &'static str {}
+ | ^^ expected `&str`, found `()`
+
+error: aborting due to 3 previous errors
+
+Some errors have detailed explanations: E0046, E0308, E0520.
+For more information about an error, try `rustc --explain E0046`.
diff --git a/tests/ui/async-await/in-trait/missing-feature-flag.next.stderr b/tests/ui/async-await/in-trait/missing-feature-flag.next.stderr
new file mode 100644
index 000000000..e6ac9bc22
--- /dev/null
+++ b/tests/ui/async-await/in-trait/missing-feature-flag.next.stderr
@@ -0,0 +1,30 @@
+error[E0046]: not all trait items implemented, missing: `foo`
+ --> $DIR/missing-feature-flag.rs:14:1
+ |
+LL | async fn foo(_: T) -> &'static str;
+ | ----------------------------------- `foo` from trait
+...
+LL | impl<T> MyTrait<T> for MyStruct {}
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `foo` in implementation
+
+error[E0520]: `foo` specializes an item from a parent `impl`, but that item is not marked `default`
+ --> $DIR/missing-feature-flag.rs:18:5
+ |
+LL | impl<T> MyTrait<T> for MyStruct {}
+ | ------------------------------- parent `impl` is here
+...
+LL | async fn foo(_: i32) -> &'static str {}
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot specialize default item `foo`
+ |
+ = note: to specialize, `foo` in the parent `impl` must be marked `default`
+
+error[E0308]: mismatched types
+ --> $DIR/missing-feature-flag.rs:18:42
+ |
+LL | async fn foo(_: i32) -> &'static str {}
+ | ^^ expected `&str`, found `()`
+
+error: aborting due to 3 previous errors
+
+Some errors have detailed explanations: E0046, E0308, E0520.
+For more information about an error, try `rustc --explain E0046`.
diff --git a/tests/ui/async-await/in-trait/missing-feature-flag.rs b/tests/ui/async-await/in-trait/missing-feature-flag.rs
new file mode 100644
index 000000000..6481f4a70
--- /dev/null
+++ b/tests/ui/async-await/in-trait/missing-feature-flag.rs
@@ -0,0 +1,23 @@
+// edition:2018
+// [next] compile-flags: -Zlower-impl-trait-in-trait-to-assoc-ty
+// revisions: current next
+
+#![feature(async_fn_in_trait)]
+#![feature(min_specialization)]
+
+struct MyStruct;
+
+trait MyTrait<T> {
+ async fn foo(_: T) -> &'static str;
+}
+
+impl<T> MyTrait<T> for MyStruct {}
+//~^ ERROR: not all trait items implemented, missing: `foo` [E0046]
+
+impl MyTrait<i32> for MyStruct {
+ async fn foo(_: i32) -> &'static str {}
+ //~^ ERROR: `foo` specializes an item from a parent `impl`, but that item is not marked `default` [E0520]
+ //~| ERROR: mismatched types [E0308]
+}
+
+fn main() {}
diff --git a/tests/ui/async-await/in-trait/normalize-opaque-with-bound-vars.rs b/tests/ui/async-await/in-trait/normalize-opaque-with-bound-vars.rs
new file mode 100644
index 000000000..c4008f2b7
--- /dev/null
+++ b/tests/ui/async-await/in-trait/normalize-opaque-with-bound-vars.rs
@@ -0,0 +1,64 @@
+// build-pass
+// edition:2021
+// compile-flags: -Cdebuginfo=2
+
+// We were not normalizing opaques with escaping bound vars during codegen,
+// leading to later errors during debuginfo computation.
+
+#![feature(async_fn_in_trait)]
+
+#[derive(Clone, Copy)]
+pub struct SharedState {}
+
+pub trait State {
+ async fn execute(self, shared_state: &SharedState);
+}
+
+pub trait StateComposer {
+ fn and_then<T, F>(self, map_fn: F) -> AndThen<Self, F>
+ where
+ Self: State + Sized,
+ T: State,
+ F: FnOnce() -> T,
+ {
+ AndThen { previous: self, map_fn }
+ }
+}
+
+impl<T> StateComposer for T where T: State {}
+pub struct AndThen<T, F> {
+ previous: T,
+ map_fn: F,
+}
+
+impl<T, U, F> State for AndThen<T, F>
+where
+ T: State,
+ U: State,
+ F: FnOnce() -> U,
+{
+ async fn execute(self, shared_state: &SharedState)
+ where
+ Self: Sized,
+ {
+ self.previous.execute(shared_state).await;
+ (self.map_fn)().execute(shared_state).await
+ }
+}
+
+pub struct SomeState {}
+
+impl State for SomeState {
+ async fn execute(self, shared_state: &SharedState) {}
+}
+
+pub fn main() {
+ let shared_state = SharedState {};
+ async {
+ SomeState {}
+ .and_then(|| SomeState {})
+ .and_then(|| SomeState {})
+ .execute(&shared_state)
+ .await;
+ };
+}
diff --git a/tests/ui/async-await/in-trait/return-not-existing-pair.current.stderr b/tests/ui/async-await/in-trait/return-not-existing-pair.current.stderr
new file mode 100644
index 000000000..56973a1d1
--- /dev/null
+++ b/tests/ui/async-await/in-trait/return-not-existing-pair.current.stderr
@@ -0,0 +1,39 @@
+error[E0726]: implicit elided lifetime not allowed here
+ --> $DIR/return-not-existing-pair.rs:12:20
+ |
+LL | impl<'a, 'b, T, U> MyTrait<T> for U {
+ | ^^^^^^^^^^ expected lifetime parameters
+ |
+help: indicate the anonymous lifetimes
+ |
+LL | impl<'a, 'b, T, U> MyTrait<'_, '_, T> for U {
+ | +++++++
+
+error[E0412]: cannot find type `ConnImpl` in this scope
+ --> $DIR/return-not-existing-pair.rs:8:48
+ |
+LL | async fn foo(&'a self, key: &'b T) -> (&'a ConnImpl, &'b T);
+ | ^^^^^^^^ not found in this scope
+
+error[E0186]: method `foo` has a `&self` declaration in the trait, but not in the impl
+ --> $DIR/return-not-existing-pair.rs:14:5
+ |
+LL | async fn foo(&'a self, key: &'b T) -> (&'a ConnImpl, &'b T);
+ | ------------------------------------------------------------ `&self` used in trait
+...
+LL | async fn foo(_: T) -> (&'a U, &'b T) {}
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `&self` in impl
+
+error[E0308]: mismatched types
+ --> $DIR/return-not-existing-pair.rs:14:42
+ |
+LL | async fn foo(_: T) -> (&'a U, &'b T) {}
+ | ^^ expected `(&U, &T)`, found `()`
+ |
+ = note: expected tuple `(&'a U, &'b T)`
+ found unit type `()`
+
+error: aborting due to 4 previous errors
+
+Some errors have detailed explanations: E0186, E0308, E0412, E0726.
+For more information about an error, try `rustc --explain E0186`.
diff --git a/tests/ui/async-await/in-trait/return-not-existing-pair.next.stderr b/tests/ui/async-await/in-trait/return-not-existing-pair.next.stderr
new file mode 100644
index 000000000..56973a1d1
--- /dev/null
+++ b/tests/ui/async-await/in-trait/return-not-existing-pair.next.stderr
@@ -0,0 +1,39 @@
+error[E0726]: implicit elided lifetime not allowed here
+ --> $DIR/return-not-existing-pair.rs:12:20
+ |
+LL | impl<'a, 'b, T, U> MyTrait<T> for U {
+ | ^^^^^^^^^^ expected lifetime parameters
+ |
+help: indicate the anonymous lifetimes
+ |
+LL | impl<'a, 'b, T, U> MyTrait<'_, '_, T> for U {
+ | +++++++
+
+error[E0412]: cannot find type `ConnImpl` in this scope
+ --> $DIR/return-not-existing-pair.rs:8:48
+ |
+LL | async fn foo(&'a self, key: &'b T) -> (&'a ConnImpl, &'b T);
+ | ^^^^^^^^ not found in this scope
+
+error[E0186]: method `foo` has a `&self` declaration in the trait, but not in the impl
+ --> $DIR/return-not-existing-pair.rs:14:5
+ |
+LL | async fn foo(&'a self, key: &'b T) -> (&'a ConnImpl, &'b T);
+ | ------------------------------------------------------------ `&self` used in trait
+...
+LL | async fn foo(_: T) -> (&'a U, &'b T) {}
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `&self` in impl
+
+error[E0308]: mismatched types
+ --> $DIR/return-not-existing-pair.rs:14:42
+ |
+LL | async fn foo(_: T) -> (&'a U, &'b T) {}
+ | ^^ expected `(&U, &T)`, found `()`
+ |
+ = note: expected tuple `(&'a U, &'b T)`
+ found unit type `()`
+
+error: aborting due to 4 previous errors
+
+Some errors have detailed explanations: E0186, E0308, E0412, E0726.
+For more information about an error, try `rustc --explain E0186`.
diff --git a/tests/ui/async-await/in-trait/return-not-existing-pair.rs b/tests/ui/async-await/in-trait/return-not-existing-pair.rs
new file mode 100644
index 000000000..d1b3832d1
--- /dev/null
+++ b/tests/ui/async-await/in-trait/return-not-existing-pair.rs
@@ -0,0 +1,19 @@
+// edition:2021
+// [next] compile-flags: -Zlower-impl-trait-in-trait-to-assoc-ty
+// revisions: current next
+
+#![feature(async_fn_in_trait)]
+
+trait MyTrait<'a, 'b, T> {
+ async fn foo(&'a self, key: &'b T) -> (&'a ConnImpl, &'b T);
+ //~^ ERROR: cannot find type `ConnImpl` in this scope [E0412]
+}
+
+impl<'a, 'b, T, U> MyTrait<T> for U {
+ //~^ ERROR: implicit elided lifetime not allowed here [E0726]
+ async fn foo(_: T) -> (&'a U, &'b T) {}
+ //~^ ERROR: method `foo` has a `&self` declaration in the trait, but not in the impl [E0186]
+ //~| ERROR: mismatched types [E0308]
+}
+
+fn main() {}
diff --git a/tests/ui/async-await/in-trait/return-not-existing-type-wrapping-rpitit.current.stderr b/tests/ui/async-await/in-trait/return-not-existing-type-wrapping-rpitit.current.stderr
new file mode 100644
index 000000000..2564d68d5
--- /dev/null
+++ b/tests/ui/async-await/in-trait/return-not-existing-type-wrapping-rpitit.current.stderr
@@ -0,0 +1,9 @@
+error[E0412]: cannot find type `Missing` in this scope
+ --> $DIR/return-not-existing-type-wrapping-rpitit.rs:10:25
+ |
+LL | fn bar() -> Wrapper<Missing<impl Sized>>;
+ | ^^^^^^^ not found in this scope
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0412`.
diff --git a/tests/ui/async-await/in-trait/return-not-existing-type-wrapping-rpitit.next.stderr b/tests/ui/async-await/in-trait/return-not-existing-type-wrapping-rpitit.next.stderr
new file mode 100644
index 000000000..2564d68d5
--- /dev/null
+++ b/tests/ui/async-await/in-trait/return-not-existing-type-wrapping-rpitit.next.stderr
@@ -0,0 +1,9 @@
+error[E0412]: cannot find type `Missing` in this scope
+ --> $DIR/return-not-existing-type-wrapping-rpitit.rs:10:25
+ |
+LL | fn bar() -> Wrapper<Missing<impl Sized>>;
+ | ^^^^^^^ not found in this scope
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0412`.
diff --git a/tests/ui/async-await/in-trait/return-not-existing-type-wrapping-rpitit.rs b/tests/ui/async-await/in-trait/return-not-existing-type-wrapping-rpitit.rs
new file mode 100644
index 000000000..37c02827e
--- /dev/null
+++ b/tests/ui/async-await/in-trait/return-not-existing-type-wrapping-rpitit.rs
@@ -0,0 +1,20 @@
+// edition:2021
+// [next] compile-flags: -Zlower-impl-trait-in-trait-to-assoc-ty
+// revisions: current next
+
+#![feature(return_position_impl_trait_in_trait)]
+
+struct Wrapper<T>(T);
+
+trait Foo {
+ fn bar() -> Wrapper<Missing<impl Sized>>;
+ //~^ ERROR: cannot find type `Missing` in this scope [E0412]
+}
+
+impl Foo for () {
+ fn bar() -> Wrapper<i32> {
+ Wrapper(0)
+ }
+}
+
+fn main() {}