about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_hir_analysis/src/check/compare_impl_item/refine.rs8
-rw-r--r--tests/ui/impl-trait/in-trait/refine-resolution-errors.rs23
-rw-r--r--tests/ui/impl-trait/in-trait/refine-resolution-errors.stderr16
3 files changed, 43 insertions, 4 deletions
diff --git a/compiler/rustc_hir_analysis/src/check/compare_impl_item/refine.rs b/compiler/rustc_hir_analysis/src/check/compare_impl_item/refine.rs
index 6cdbd692f73..ad3324f79e2 100644
--- a/compiler/rustc_hir_analysis/src/check/compare_impl_item/refine.rs
+++ b/compiler/rustc_hir_analysis/src/check/compare_impl_item/refine.rs
@@ -171,10 +171,10 @@ pub(super) fn check_refining_return_position_impl_trait_in_trait<'tcx>(
     }
     // Resolve any lifetime variables that may have been introduced during normalization.
     let Ok((trait_bounds, impl_bounds)) = infcx.fully_resolve((trait_bounds, impl_bounds)) else {
-        // This code path is not reached in any tests, but may be reachable. If
-        // this is triggered, it should be converted to `delayed_bug` and the
-        // triggering case turned into a test.
-        tcx.dcx().bug("encountered errors when checking RPITIT refinement (resolution)");
+        // If resolution didn't fully complete, we cannot continue checking RPITIT refinement, and
+        // delay a bug as the original code contains load-bearing errors.
+        tcx.dcx().delayed_bug("encountered errors when checking RPITIT refinement (resolution)");
+        return;
     };
 
     // For quicker lookup, use an `IndexSet` (we don't use one earlier because
diff --git a/tests/ui/impl-trait/in-trait/refine-resolution-errors.rs b/tests/ui/impl-trait/in-trait/refine-resolution-errors.rs
new file mode 100644
index 00000000000..a9936c7bc3f
--- /dev/null
+++ b/tests/ui/impl-trait/in-trait/refine-resolution-errors.rs
@@ -0,0 +1,23 @@
+// This is a non-regression test for issue #126670 where RPITIT refinement checking encountered
+// errors during resolution and ICEd.
+
+//@ edition: 2018
+
+pub trait Mirror {
+    type Assoc;
+}
+impl<T: ?Sized> Mirror for () {
+    //~^ ERROR the type parameter `T` is not constrained
+    type Assoc = T;
+}
+
+pub trait First {
+    async fn first() -> <() as Mirror>::Assoc;
+    //~^ ERROR type annotations needed
+}
+
+impl First for () {
+    async fn first() {}
+}
+
+fn main() {}
diff --git a/tests/ui/impl-trait/in-trait/refine-resolution-errors.stderr b/tests/ui/impl-trait/in-trait/refine-resolution-errors.stderr
new file mode 100644
index 00000000000..0f5573dda04
--- /dev/null
+++ b/tests/ui/impl-trait/in-trait/refine-resolution-errors.stderr
@@ -0,0 +1,16 @@
+error[E0207]: the type parameter `T` is not constrained by the impl trait, self type, or predicates
+  --> $DIR/refine-resolution-errors.rs:9:6
+   |
+LL | impl<T: ?Sized> Mirror for () {
+   |      ^ unconstrained type parameter
+
+error[E0282]: type annotations needed
+  --> $DIR/refine-resolution-errors.rs:15:5
+   |
+LL |     async fn first() -> <() as Mirror>::Assoc;
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type
+
+error: aborting due to 2 previous errors
+
+Some errors have detailed explanations: E0207, E0282.
+For more information about an error, try `rustc --explain E0207`.