about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDeadbeef <ent3rm4n@gmail.com>2024-06-25 10:44:00 +0000
committerDeadbeef <ent3rm4n@gmail.com>2024-06-28 10:57:35 +0000
commit8b2fac9612e3840f9736bed31502b3b91ba01a08 (patch)
treeb584c8dd590d17368c0cd116a48485234f46623a
parent0a2330630d223ac3601a7b53e65e0d5867b60c2c (diff)
downloadrust-8b2fac9612e3840f9736bed31502b3b91ba01a08.tar.gz
rust-8b2fac9612e3840f9736bed31502b3b91ba01a08.zip
finishing touches, move fixed ICEs to ui tests
-rw-r--r--compiler/rustc_next_trait_solver/src/solve/normalizes_to/mod.rs4
-rw-r--r--compiler/rustc_next_trait_solver/src/solve/trait_goals.rs4
-rw-r--r--src/tools/clippy/tests/ui/missing_const_for_fn/could_be_const.rs3
-rw-r--r--src/tools/clippy/tests/ui/missing_const_for_fn/could_be_const.stderr20
-rw-r--r--tests/crashes/119717.rs10
-rw-r--r--tests/crashes/123664.rs4
-rw-r--r--tests/crashes/124857.rs11
-rw-r--r--tests/crashes/126148.rs23
-rw-r--r--tests/rustdoc/rfc-2632-const-trait-impl.rs3
-rw-r--r--tests/ui/rfcs/rfc-2632-const-trait-impl/assoc-type-const-bound-usage-1.stderr8
-rw-r--r--tests/ui/rfcs/rfc-2632-const-trait-impl/assoc-type.stderr2
-rw-r--r--tests/ui/rfcs/rfc-2632-const-trait-impl/ice-119717-constant-lifetime.rs15
-rw-r--r--tests/ui/rfcs/rfc-2632-const-trait-impl/ice-119717-constant-lifetime.stderr33
-rw-r--r--tests/ui/rfcs/rfc-2632-const-trait-impl/ice-123664-unexpected-bound-var.rs7
-rw-r--r--tests/ui/rfcs/rfc-2632-const-trait-impl/ice-123664-unexpected-bound-var.stderr8
-rw-r--r--tests/ui/rfcs/rfc-2632-const-trait-impl/ice-124857-combine-effect-const-infer-vars.rs14
-rw-r--r--tests/ui/rfcs/rfc-2632-const-trait-impl/ice-124857-combine-effect-const-infer-vars.stderr12
-rw-r--r--tests/ui/rfcs/rfc-2632-const-trait-impl/ice-126148-failed-to-normalize.rs28
-rw-r--r--tests/ui/rfcs/rfc-2632-const-trait-impl/ice-126148-failed-to-normalize.stderr38
19 files changed, 182 insertions, 65 deletions
diff --git a/compiler/rustc_next_trait_solver/src/solve/normalizes_to/mod.rs b/compiler/rustc_next_trait_solver/src/solve/normalizes_to/mod.rs
index 55c0440a537..7a81c210c5d 100644
--- a/compiler/rustc_next_trait_solver/src/solve/normalizes_to/mod.rs
+++ b/compiler/rustc_next_trait_solver/src/solve/normalizes_to/mod.rs
@@ -877,7 +877,7 @@ where
 
         let mut first_non_maybe = None;
         let mut non_maybe_count = 0;
-        for ty in types {
+        for ty in types.iter() {
             if !matches!(ty::EffectKind::try_from_ty(cx, ty), Some(ty::EffectKind::Maybe)) {
                 first_non_maybe.get_or_insert(ty);
                 non_maybe_count += 1;
@@ -902,7 +902,7 @@ where
             _ => {
                 let mut min = ty::EffectKind::Maybe;
 
-                for ty in types {
+                for ty in types.iter() {
                     let Some(kind) = ty::EffectKind::try_from_ty(cx, ty) else {
                         return Err(NoSolution);
                     };
diff --git a/compiler/rustc_next_trait_solver/src/solve/trait_goals.rs b/compiler/rustc_next_trait_solver/src/solve/trait_goals.rs
index 73ae1c4b113..08ed729b144 100644
--- a/compiler/rustc_next_trait_solver/src/solve/trait_goals.rs
+++ b/compiler/rustc_next_trait_solver/src/solve/trait_goals.rs
@@ -717,7 +717,7 @@ where
 
         let cx = ecx.cx();
         let maybe_count = types
-            .into_iter()
+            .iter()
             .filter_map(|ty| ty::EffectKind::try_from_ty(cx, ty))
             .filter(|&ty| ty == ty::EffectKind::Maybe)
             .count();
@@ -727,7 +727,7 @@ where
         if types.len() - maybe_count > 1 {
             let mut min = ty::EffectKind::Maybe;
 
-            for ty in types {
+            for ty in types.iter() {
                 let Some(kind) = ty::EffectKind::try_from_ty(ecx.cx(), ty) else {
                     return Err(NoSolution);
                 };
diff --git a/src/tools/clippy/tests/ui/missing_const_for_fn/could_be_const.rs b/src/tools/clippy/tests/ui/missing_const_for_fn/could_be_const.rs
index 58e639cc7fd..5e4e2c58e5a 100644
--- a/src/tools/clippy/tests/ui/missing_const_for_fn/could_be_const.rs
+++ b/src/tools/clippy/tests/ui/missing_const_for_fn/could_be_const.rs
@@ -104,15 +104,18 @@ fn main() {}
 
 struct D;
 
+/* FIXME(effects)
 impl const Drop for D {
     fn drop(&mut self) {
         todo!();
     }
 }
+*/
 
 // Lint this, since it can be dropped in const contexts
 // FIXME(effects)
 fn d(this: D) {}
+//~^ ERROR: this could be a `const fn`
 
 mod msrv {
     struct Foo(*const u8, &'static u8);
diff --git a/src/tools/clippy/tests/ui/missing_const_for_fn/could_be_const.stderr b/src/tools/clippy/tests/ui/missing_const_for_fn/could_be_const.stderr
index 8999af761e3..8ba42c0e5b6 100644
--- a/src/tools/clippy/tests/ui/missing_const_for_fn/could_be_const.stderr
+++ b/src/tools/clippy/tests/ui/missing_const_for_fn/could_be_const.stderr
@@ -157,7 +157,13 @@ LL | const fn msrv_1_46() -> i32 {
    | +++++
 
 error: this could be a `const fn`
-  --> tests/ui/missing_const_for_fn/could_be_const.rs:122:9
+  --> tests/ui/missing_const_for_fn/could_be_const.rs:117:1
+   |
+LL | fn d(this: D) {}
+   | ^^^^^^^^^^^^^^^^
+
+error: this could be a `const fn`
+  --> tests/ui/missing_const_for_fn/could_be_const.rs:125:9
    |
 LL | /         fn deref_ptr_can_be_const(self) -> usize {
 LL | |
@@ -171,7 +177,7 @@ LL |         const fn deref_ptr_can_be_const(self) -> usize {
    |         +++++
 
 error: this could be a `const fn`
-  --> tests/ui/missing_const_for_fn/could_be_const.rs:127:9
+  --> tests/ui/missing_const_for_fn/could_be_const.rs:130:9
    |
 LL | /         fn deref_copied_val(self) -> usize {
 LL | |
@@ -185,7 +191,7 @@ LL |         const fn deref_copied_val(self) -> usize {
    |         +++++
 
 error: this could be a `const fn`
-  --> tests/ui/missing_const_for_fn/could_be_const.rs:138:5
+  --> tests/ui/missing_const_for_fn/could_be_const.rs:141:5
    |
 LL | /     fn union_access_can_be_const() {
 LL | |
@@ -200,7 +206,7 @@ LL |     const fn union_access_can_be_const() {
    |     +++++
 
 error: this could be a `const fn`
-  --> tests/ui/missing_const_for_fn/could_be_const.rs:152:9
+  --> tests/ui/missing_const_for_fn/could_be_const.rs:155:9
    |
 LL | /         pub fn new(strings: Vec<String>) -> Self {
 LL | |             Self { strings }
@@ -213,7 +219,7 @@ LL |         pub const fn new(strings: Vec<String>) -> Self {
    |             +++++
 
 error: this could be a `const fn`
-  --> tests/ui/missing_const_for_fn/could_be_const.rs:157:9
+  --> tests/ui/missing_const_for_fn/could_be_const.rs:160:9
    |
 LL | /         pub fn empty() -> Self {
 LL | |             Self { strings: Vec::new() }
@@ -226,7 +232,7 @@ LL |         pub const fn empty() -> Self {
    |             +++++
 
 error: this could be a `const fn`
-  --> tests/ui/missing_const_for_fn/could_be_const.rs:168:9
+  --> tests/ui/missing_const_for_fn/could_be_const.rs:171:9
    |
 LL | /         pub fn new(text: String) -> Self {
 LL | |             let vec = Vec::new();
@@ -239,5 +245,5 @@ help: make the function `const`
 LL |         pub const fn new(text: String) -> Self {
    |             +++++
 
-error: aborting due to 17 previous errors
+error: aborting due to 18 previous errors
 
diff --git a/tests/crashes/119717.rs b/tests/crashes/119717.rs
deleted file mode 100644
index 22746548e02..00000000000
--- a/tests/crashes/119717.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-//@ known-bug: #119717
-#![feature(const_trait_impl, effects)]
-
-use std::ops::{FromResidual, Try};
-
-impl const FromResidual for T {
-    fn from_residual(t: T) -> _ {
-        t
-    }
-}
diff --git a/tests/crashes/123664.rs b/tests/crashes/123664.rs
deleted file mode 100644
index 80c415fe07b..00000000000
--- a/tests/crashes/123664.rs
+++ /dev/null
@@ -1,4 +0,0 @@
-//@ known-bug: #123664
-#![feature(generic_const_exprs, effects)]
-const fn with_positive<F: ~const Fn()>() {}
-pub fn main() {}
diff --git a/tests/crashes/124857.rs b/tests/crashes/124857.rs
deleted file mode 100644
index 4b952fd64cc..00000000000
--- a/tests/crashes/124857.rs
+++ /dev/null
@@ -1,11 +0,0 @@
-//@ known-bug: rust-lang/rust#124857
-//@ compile-flags: -Znext-solver=coherence
-
-#![feature(effects)]
-
-#[const_trait]
-trait Foo {}
-
-impl const Foo for i32 {}
-
-impl<T> const Foo for T where T: ~const Foo {}
diff --git a/tests/crashes/126148.rs b/tests/crashes/126148.rs
deleted file mode 100644
index 79f8887b401..00000000000
--- a/tests/crashes/126148.rs
+++ /dev/null
@@ -1,23 +0,0 @@
-//@ known-bug: rust-lang/rust#126148
-
-#![feature(effects)]
-use std::ops::{FromResidual, Try};
-
-struct TryMe;
-struct Error;
-
-impl const FromResidual<Error> for TryMe {}
-
-impl const Try for TryMe {
-    type Output = ();
-    type Residual = Error;
-}
-
-const fn t() -> TryMe {
-    TryMe?;
-    TryMe
-}
-
-const _: () = {
-    t();
-};
diff --git a/tests/rustdoc/rfc-2632-const-trait-impl.rs b/tests/rustdoc/rfc-2632-const-trait-impl.rs
index f6a5555dbad..eb3e00af3b0 100644
--- a/tests/rustdoc/rfc-2632-const-trait-impl.rs
+++ b/tests/rustdoc/rfc-2632-const-trait-impl.rs
@@ -8,7 +8,8 @@
 //
 // FIXME(effects) add `const_trait` to `Fn` so we use `~const`
 // FIXME(effects) restore `const_trait` to `Destruct`
-#![feature(const_trait_impl)]
+#![allow(incomplete_features)]
+#![feature(const_trait_impl, effects)]
 #![crate_name = "foo"]
 
 use std::marker::Destruct;
diff --git a/tests/ui/rfcs/rfc-2632-const-trait-impl/assoc-type-const-bound-usage-1.stderr b/tests/ui/rfcs/rfc-2632-const-trait-impl/assoc-type-const-bound-usage-1.stderr
index f8bab2d4c27..48855d64b58 100644
--- a/tests/ui/rfcs/rfc-2632-const-trait-impl/assoc-type-const-bound-usage-1.stderr
+++ b/tests/ui/rfcs/rfc-2632-const-trait-impl/assoc-type-const-bound-usage-1.stderr
@@ -1,11 +1,11 @@
 error[E0277]: the trait bound `Trait::{synthetic#0}: Compat` is not satisfied
-  --> $DIR/assoc-type-const-bound-usage-1.rs:16:44
+  --> $DIR/assoc-type-const-bound-usage-1.rs:15:44
    |
 LL | fn unqualified<T: const Trait>() -> Type<{ T::Assoc::func() }> {
    |                                            ^^^^^^^^ the trait `Compat` is not implemented for `Trait::{synthetic#0}`
    |
 note: required by a bound in `Trait::func`
-  --> $DIR/assoc-type-const-bound-usage-1.rs:8:1
+  --> $DIR/assoc-type-const-bound-usage-1.rs:7:1
    |
 LL | #[const_trait]
    | ^^^^^^^^^^^^^^ required by this bound in `Trait::func`
@@ -14,13 +14,13 @@ LL |     fn func() -> i32;
    |        ---- required by a bound in this associated function
 
 error[E0277]: the trait bound `Trait::{synthetic#0}: Compat` is not satisfied
-  --> $DIR/assoc-type-const-bound-usage-1.rs:20:42
+  --> $DIR/assoc-type-const-bound-usage-1.rs:19:42
    |
 LL | fn qualified<T: const Trait>() -> Type<{ <T as Trait>::Assoc::func() }> {
    |                                          ^^^^^^^^^^^^^^^^^^^ the trait `Compat` is not implemented for `Trait::{synthetic#0}`
    |
 note: required by a bound in `Trait::func`
-  --> $DIR/assoc-type-const-bound-usage-1.rs:8:1
+  --> $DIR/assoc-type-const-bound-usage-1.rs:7:1
    |
 LL | #[const_trait]
    | ^^^^^^^^^^^^^^ required by this bound in `Trait::func`
diff --git a/tests/ui/rfcs/rfc-2632-const-trait-impl/assoc-type.stderr b/tests/ui/rfcs/rfc-2632-const-trait-impl/assoc-type.stderr
index 333215adef2..1862339cddc 100644
--- a/tests/ui/rfcs/rfc-2632-const-trait-impl/assoc-type.stderr
+++ b/tests/ui/rfcs/rfc-2632-const-trait-impl/assoc-type.stderr
@@ -8,7 +8,7 @@ LL | #![feature(const_trait_impl, effects)]
    = note: `#[warn(incomplete_features)]` on by default
 
 error[E0277]: the trait bound `Add::{synthetic#0}: Compat` is not satisfied
-  --> $DIR/assoc-type.rs:40:15
+  --> $DIR/assoc-type.rs:41:15
    |
 LL |     type Qux: Add;
    |               ^^^ the trait `Compat` is not implemented for `Add::{synthetic#0}`
diff --git a/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-119717-constant-lifetime.rs b/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-119717-constant-lifetime.rs
new file mode 100644
index 00000000000..c2f452a9925
--- /dev/null
+++ b/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-119717-constant-lifetime.rs
@@ -0,0 +1,15 @@
+#![allow(incomplete_features)]
+#![feature(const_trait_impl, effects, try_trait_v2)]
+
+use std::ops::FromResidual;
+
+impl<T> const FromResidual for T {
+    //~^ ERROR const `impl` for trait `FromResidual` which is not marked with `#[const_trait]`
+    //~| type parameter `T` must be used as the type parameter for some local type
+    fn from_residual(t: T) -> _ {
+        //~^ the placeholder `_` is not allowed
+        t
+    }
+}
+
+fn main() {}
diff --git a/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-119717-constant-lifetime.stderr b/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-119717-constant-lifetime.stderr
new file mode 100644
index 00000000000..9e22422ad3b
--- /dev/null
+++ b/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-119717-constant-lifetime.stderr
@@ -0,0 +1,33 @@
+error: const `impl` for trait `FromResidual` which is not marked with `#[const_trait]`
+  --> $DIR/ice-119717-constant-lifetime.rs:6:15
+   |
+LL | impl<T> const FromResidual for T {
+   |               ^^^^^^^^^^^^
+   |
+   = note: marking a trait with `#[const_trait]` ensures all default method bodies are `const`
+   = note: adding a non-const method body in the future would be a breaking change
+
+error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
+  --> $DIR/ice-119717-constant-lifetime.rs:6:6
+   |
+LL | impl<T> const FromResidual for T {
+   |      ^ type parameter `T` must be used as the type parameter for some local type
+   |
+   = note: implementing a foreign trait is only possible if at least one of the types for which it is implemented is local
+   = note: only traits defined in the current crate can be implemented for a type parameter
+
+error[E0121]: the placeholder `_` is not allowed within types on item signatures for functions
+  --> $DIR/ice-119717-constant-lifetime.rs:9:31
+   |
+LL |     fn from_residual(t: T) -> _ {
+   |                               ^ not allowed in type signatures
+   |
+help: try replacing `_` with the type in the corresponding trait method signature
+   |
+LL |     fn from_residual(t: T) -> T {
+   |                               ~
+
+error: aborting due to 3 previous errors
+
+Some errors have detailed explanations: E0121, E0210.
+For more information about an error, try `rustc --explain E0121`.
diff --git a/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-123664-unexpected-bound-var.rs b/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-123664-unexpected-bound-var.rs
new file mode 100644
index 00000000000..64634e7b7ac
--- /dev/null
+++ b/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-123664-unexpected-bound-var.rs
@@ -0,0 +1,7 @@
+#![allow(incomplete_features)]
+#![feature(generic_const_exprs, const_trait_impl, effects)]
+
+const fn with_positive<F: ~const Fn()>() {}
+//~^ ERROR `~const` can only be applied to `#[const_trait]` traits
+
+pub fn main() {}
diff --git a/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-123664-unexpected-bound-var.stderr b/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-123664-unexpected-bound-var.stderr
new file mode 100644
index 00000000000..19369e38964
--- /dev/null
+++ b/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-123664-unexpected-bound-var.stderr
@@ -0,0 +1,8 @@
+error: `~const` can only be applied to `#[const_trait]` traits
+  --> $DIR/ice-123664-unexpected-bound-var.rs:4:34
+   |
+LL | const fn with_positive<F: ~const Fn()>() {}
+   |                                  ^^^^
+
+error: aborting due to 1 previous error
+
diff --git a/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-124857-combine-effect-const-infer-vars.rs b/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-124857-combine-effect-const-infer-vars.rs
new file mode 100644
index 00000000000..d4fcbfb1b83
--- /dev/null
+++ b/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-124857-combine-effect-const-infer-vars.rs
@@ -0,0 +1,14 @@
+//@ compile-flags: -Znext-solver=coherence
+
+#![allow(incomplete_features)]
+#![feature(const_trait_impl, effects)]
+
+#[const_trait]
+trait Foo {}
+
+impl const Foo for i32 {}
+
+impl<T> const Foo for T where T: ~const Foo {}
+//~^ ERROR conflicting implementations of trait `Foo` for type `i32`
+
+fn main() {}
diff --git a/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-124857-combine-effect-const-infer-vars.stderr b/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-124857-combine-effect-const-infer-vars.stderr
new file mode 100644
index 00000000000..0b1f8b40898
--- /dev/null
+++ b/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-124857-combine-effect-const-infer-vars.stderr
@@ -0,0 +1,12 @@
+error[E0119]: conflicting implementations of trait `Foo` for type `i32`
+  --> $DIR/ice-124857-combine-effect-const-infer-vars.rs:11:1
+   |
+LL | impl const Foo for i32 {}
+   | ---------------------- first implementation here
+LL |
+LL | impl<T> const Foo for T where T: ~const Foo {}
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `i32`
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0119`.
diff --git a/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-126148-failed-to-normalize.rs b/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-126148-failed-to-normalize.rs
new file mode 100644
index 00000000000..717c0e7c088
--- /dev/null
+++ b/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-126148-failed-to-normalize.rs
@@ -0,0 +1,28 @@
+#![allow(incomplete_features)]
+#![feature(const_trait_impl, effects, try_trait_v2, const_try)]
+use std::ops::{FromResidual, Try};
+
+struct TryMe;
+struct Error;
+
+impl const FromResidual<Error> for TryMe {}
+//~^ ERROR const `impl` for trait `FromResidual` which is not marked with `#[const_trait]`
+//~| ERROR not all trait items implemented
+
+impl const Try for TryMe {
+    //~^ ERROR const `impl` for trait `Try` which is not marked with `#[const_trait]`
+    //~| ERROR not all trait items implemented
+    type Output = ();
+    type Residual = Error;
+}
+
+const fn t() -> TryMe {
+    TryMe?;
+    TryMe
+}
+
+const _: () = {
+    t();
+};
+
+fn main() {}
diff --git a/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-126148-failed-to-normalize.stderr b/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-126148-failed-to-normalize.stderr
new file mode 100644
index 00000000000..e641b457ef9
--- /dev/null
+++ b/tests/ui/rfcs/rfc-2632-const-trait-impl/ice-126148-failed-to-normalize.stderr
@@ -0,0 +1,38 @@
+error: const `impl` for trait `FromResidual` which is not marked with `#[const_trait]`
+  --> $DIR/ice-126148-failed-to-normalize.rs:8:12
+   |
+LL | impl const FromResidual<Error> for TryMe {}
+   |            ^^^^^^^^^^^^^^^^^^^
+   |
+   = note: marking a trait with `#[const_trait]` ensures all default method bodies are `const`
+   = note: adding a non-const method body in the future would be a breaking change
+
+error[E0046]: not all trait items implemented, missing: `from_residual`
+  --> $DIR/ice-126148-failed-to-normalize.rs:8:1
+   |
+LL | impl const FromResidual<Error> for TryMe {}
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `from_residual` in implementation
+   |
+   = help: implement the missing item: `fn from_residual(_: Error) -> Self { todo!() }`
+
+error: const `impl` for trait `Try` which is not marked with `#[const_trait]`
+  --> $DIR/ice-126148-failed-to-normalize.rs:12:12
+   |
+LL | impl const Try for TryMe {
+   |            ^^^
+   |
+   = note: marking a trait with `#[const_trait]` ensures all default method bodies are `const`
+   = note: adding a non-const method body in the future would be a breaking change
+
+error[E0046]: not all trait items implemented, missing: `from_output`, `branch`
+  --> $DIR/ice-126148-failed-to-normalize.rs:12:1
+   |
+LL | impl const Try for TryMe {
+   | ^^^^^^^^^^^^^^^^^^^^^^^^ missing `from_output`, `branch` in implementation
+   |
+   = help: implement the missing item: `fn from_output(_: <Self as Try>::Output) -> Self { todo!() }`
+   = help: implement the missing item: `fn branch(self) -> ControlFlow<<Self as Try>::Residual, <Self as Try>::Output> { todo!() }`
+
+error: aborting due to 4 previous errors
+
+For more information about this error, try `rustc --explain E0046`.