]> git.lizzy.rs Git - rust.git/commitdiff
use check_region_obligations_and_report_errors in more places to avoid ICEs
authorMichael Goulet <michael@errs.io>
Wed, 27 Jul 2022 05:27:45 +0000 (05:27 +0000)
committerMichael Goulet <michael@errs.io>
Wed, 27 Jul 2022 05:34:29 +0000 (05:34 +0000)
compiler/rustc_typeck/src/check/compare_method.rs
compiler/rustc_typeck/src/coherence/builtin.rs
compiler/rustc_typeck/src/impl_wf_check/min_specialization.rs
src/test/ui/coercion/issue-53475.rs [new file with mode: 0644]
src/test/ui/coercion/issue-53475.stderr [new file with mode: 0644]

index af77efc3c2d57434692c14e091bf1605358c0d10..e3ac23686b6d692398543e1754e853693436c7c7 100644 (file)
@@ -1154,8 +1154,10 @@ pub(crate) fn compare_const_impl<'tcx>(
         }
 
         let outlives_environment = OutlivesEnvironment::new(param_env);
-        infcx
-            .resolve_regions_and_report_errors(impl_c.def_id.expect_local(), &outlives_environment);
+        infcx.check_region_obligations_and_report_errors(
+            impl_c.def_id.expect_local(),
+            &outlives_environment,
+        );
     });
 }
 
index d8e42729ff31d5ac53356b068534d1955a41dc34..1e404fda035af2fa00cc1f8a464dae418b9e0da4 100644 (file)
@@ -349,7 +349,7 @@ fn visit_implementation_of_dispatch_from_dyn<'tcx>(tcx: TyCtxt<'tcx>, impl_did:
 
                     // Finally, resolve all regions.
                     let outlives_env = OutlivesEnvironment::new(param_env);
-                    infcx.resolve_regions_and_report_errors(impl_did, &outlives_env);
+                    infcx.check_region_obligations_and_report_errors(impl_did, &outlives_env);
                 }
             }
             _ => {
@@ -606,7 +606,7 @@ pub fn coerce_unsized_info<'tcx>(tcx: TyCtxt<'tcx>, impl_did: DefId) -> CoerceUn
 
         // Finally, resolve all regions.
         let outlives_env = OutlivesEnvironment::new(param_env);
-        infcx.resolve_regions_and_report_errors(impl_did, &outlives_env);
+        infcx.check_region_obligations_and_report_errors(impl_did, &outlives_env);
 
         CoerceUnsizedInfo { custom_kind: kind }
     })
index f16888345e9d509d35551101ce82dca5c7387b8f..74abb71a18e76f876d51008f4efef7cdcae80349 100644 (file)
@@ -158,8 +158,7 @@ fn get_impl_substs<'tcx>(
         implied_bounds,
         tcx.hir().local_def_id_to_hir_id(impl1_def_id),
     );
-    infcx.process_registered_region_obligations(outlives_env.region_bound_pairs(), param_env);
-    infcx.resolve_regions_and_report_errors(impl1_def_id, &outlives_env);
+    infcx.check_region_obligations_and_report_errors(impl1_def_id, &outlives_env);
     let Ok(impl2_substs) = infcx.fully_resolve(impl2_substs) else {
         let span = tcx.def_span(impl1_def_id);
         tcx.sess.emit_err(SubstsOnOverriddenImpl { span });
diff --git a/src/test/ui/coercion/issue-53475.rs b/src/test/ui/coercion/issue-53475.rs
new file mode 100644 (file)
index 0000000..3770c02
--- /dev/null
@@ -0,0 +1,13 @@
+#![feature(coerce_unsized)]
+
+use std::any::Any;
+use std::ops::CoerceUnsized;
+
+struct Foo<T> {
+    data: Box<T>,
+}
+
+impl<T> CoerceUnsized<Foo<dyn Any>> for Foo<T> {}
+//~^ ERROR the parameter type `T` may not live long enough
+
+fn main() {}
diff --git a/src/test/ui/coercion/issue-53475.stderr b/src/test/ui/coercion/issue-53475.stderr
new file mode 100644 (file)
index 0000000..522c50d
--- /dev/null
@@ -0,0 +1,14 @@
+error[E0310]: the parameter type `T` may not live long enough
+  --> $DIR/issue-53475.rs:10:1
+   |
+LL | impl<T> CoerceUnsized<Foo<dyn Any>> for Foo<T> {}
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
+   |
+help: consider adding an explicit lifetime bound...
+   |
+LL | impl<T: 'static> CoerceUnsized<Foo<dyn Any>> for Foo<T> {}
+   |       +++++++++
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0310`.