Bubble up ErrorGuaranteed from region constraints in method item compare
This commit is contained in:
parent
6161758b6d
commit
8973b3e3cc
9 changed files with 24 additions and 40 deletions
|
@ -468,7 +468,7 @@ fn check_opaque_meets_bounds<'tcx>(
|
||||||
// Can have different predicates to their defining use
|
// Can have different predicates to their defining use
|
||||||
hir::OpaqueTyOrigin::TyAlias => {
|
hir::OpaqueTyOrigin::TyAlias => {
|
||||||
let outlives_environment = OutlivesEnvironment::new(param_env);
|
let outlives_environment = OutlivesEnvironment::new(param_env);
|
||||||
infcx.check_region_obligations_and_report_errors(
|
let _ = infcx.check_region_obligations_and_report_errors(
|
||||||
defining_use_anchor,
|
defining_use_anchor,
|
||||||
&outlives_environment,
|
&outlives_environment,
|
||||||
);
|
);
|
||||||
|
|
|
@ -589,7 +589,7 @@ pub fn collect_trait_impl_trait_tys<'tcx>(
|
||||||
infcx.check_region_obligations_and_report_errors(
|
infcx.check_region_obligations_and_report_errors(
|
||||||
impl_m.def_id.expect_local(),
|
impl_m.def_id.expect_local(),
|
||||||
&outlives_environment,
|
&outlives_environment,
|
||||||
);
|
)?;
|
||||||
|
|
||||||
let mut collected_tys = FxHashMap::default();
|
let mut collected_tys = FxHashMap::default();
|
||||||
for (def_id, (ty, substs)) in collector.types {
|
for (def_id, (ty, substs)) in collector.types {
|
||||||
|
@ -1617,9 +1617,9 @@ pub(crate) fn compare_impl_const_raw(
|
||||||
return Err(infcx.err_ctxt().report_fulfillment_errors(&errors, None));
|
return Err(infcx.err_ctxt().report_fulfillment_errors(&errors, None));
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME return `ErrorReported` if region obligations error?
|
|
||||||
let outlives_environment = OutlivesEnvironment::new(param_env);
|
let outlives_environment = OutlivesEnvironment::new(param_env);
|
||||||
infcx.check_region_obligations_and_report_errors(impl_const_item_def, &outlives_environment);
|
infcx.check_region_obligations_and_report_errors(impl_const_item_def, &outlives_environment)?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1730,7 +1730,7 @@ fn compare_type_predicate_entailment<'tcx>(
|
||||||
infcx.check_region_obligations_and_report_errors(
|
infcx.check_region_obligations_and_report_errors(
|
||||||
impl_ty.def_id.expect_local(),
|
impl_ty.def_id.expect_local(),
|
||||||
&outlives_environment,
|
&outlives_environment,
|
||||||
);
|
)?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -1944,7 +1944,7 @@ pub fn check_type_bounds<'tcx>(
|
||||||
infcx.check_region_obligations_and_report_errors(
|
infcx.check_region_obligations_and_report_errors(
|
||||||
impl_ty.def_id.expect_local(),
|
impl_ty.def_id.expect_local(),
|
||||||
&outlives_environment,
|
&outlives_environment,
|
||||||
);
|
)?;
|
||||||
|
|
||||||
let constraints = infcx.inner.borrow_mut().opaque_type_storage.take_opaque_types();
|
let constraints = infcx.inner.borrow_mut().opaque_type_storage.take_opaque_types();
|
||||||
for (key, value) in constraints {
|
for (key, value) in constraints {
|
||||||
|
|
|
@ -115,7 +115,7 @@ pub(super) fn enter_wf_checking_ctxt<'tcx, F>(
|
||||||
let outlives_environment =
|
let outlives_environment =
|
||||||
OutlivesEnvironment::with_bounds(param_env, Some(infcx), implied_bounds);
|
OutlivesEnvironment::with_bounds(param_env, Some(infcx), implied_bounds);
|
||||||
|
|
||||||
infcx.check_region_obligations_and_report_errors(body_def_id, &outlives_environment);
|
let _ = infcx.check_region_obligations_and_report_errors(body_def_id, &outlives_environment);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_well_formed(tcx: TyCtxt<'_>, def_id: hir::OwnerId) {
|
fn check_well_formed(tcx: TyCtxt<'_>, def_id: hir::OwnerId) {
|
||||||
|
|
|
@ -325,7 +325,7 @@ fn visit_implementation_of_dispatch_from_dyn(tcx: TyCtxt<'_>, impl_did: LocalDef
|
||||||
|
|
||||||
// Finally, resolve all regions.
|
// Finally, resolve all regions.
|
||||||
let outlives_env = OutlivesEnvironment::new(param_env);
|
let outlives_env = OutlivesEnvironment::new(param_env);
|
||||||
infcx.check_region_obligations_and_report_errors(impl_did, &outlives_env);
|
let _ = infcx.check_region_obligations_and_report_errors(impl_did, &outlives_env);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
|
@ -565,7 +565,7 @@ pub fn coerce_unsized_info<'tcx>(tcx: TyCtxt<'tcx>, impl_did: DefId) -> CoerceUn
|
||||||
|
|
||||||
// Finally, resolve all regions.
|
// Finally, resolve all regions.
|
||||||
let outlives_env = OutlivesEnvironment::new(param_env);
|
let outlives_env = OutlivesEnvironment::new(param_env);
|
||||||
infcx.check_region_obligations_and_report_errors(impl_did, &outlives_env);
|
let _ = infcx.check_region_obligations_and_report_errors(impl_did, &outlives_env);
|
||||||
|
|
||||||
CoerceUnsizedInfo { custom_kind: kind }
|
CoerceUnsizedInfo { custom_kind: kind }
|
||||||
}
|
}
|
||||||
|
|
|
@ -182,7 +182,7 @@ fn get_impl_substs(
|
||||||
|
|
||||||
let implied_bounds = infcx.implied_bounds_tys(param_env, impl1_hir_id, assumed_wf_types);
|
let implied_bounds = infcx.implied_bounds_tys(param_env, impl1_hir_id, assumed_wf_types);
|
||||||
let outlives_env = OutlivesEnvironment::with_bounds(param_env, Some(infcx), implied_bounds);
|
let outlives_env = OutlivesEnvironment::with_bounds(param_env, Some(infcx), implied_bounds);
|
||||||
infcx.check_region_obligations_and_report_errors(impl1_def_id, &outlives_env);
|
let _ = infcx.check_region_obligations_and_report_errors(impl1_def_id, &outlives_env);
|
||||||
let Ok(impl2_substs) = infcx.fully_resolve(impl2_substs) else {
|
let Ok(impl2_substs) = infcx.fully_resolve(impl2_substs) else {
|
||||||
let span = tcx.def_span(impl1_def_id);
|
let span = tcx.def_span(impl1_def_id);
|
||||||
tcx.sess.emit_err(SubstsOnOverriddenImpl { span });
|
tcx.sess.emit_err(SubstsOnOverriddenImpl { span });
|
||||||
|
|
|
@ -1693,7 +1693,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
&self,
|
&self,
|
||||||
generic_param_scope: LocalDefId,
|
generic_param_scope: LocalDefId,
|
||||||
outlives_env: &OutlivesEnvironment<'tcx>,
|
outlives_env: &OutlivesEnvironment<'tcx>,
|
||||||
) -> Option<ErrorGuaranteed> {
|
) -> Result<(), ErrorGuaranteed> {
|
||||||
let errors = self.resolve_regions(outlives_env);
|
let errors = self.resolve_regions(outlives_env);
|
||||||
|
|
||||||
if let None = self.tainted_by_errors() {
|
if let None = self.tainted_by_errors() {
|
||||||
|
@ -1705,9 +1705,14 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
self.report_region_errors(generic_param_scope, &errors);
|
self.report_region_errors(generic_param_scope, &errors);
|
||||||
}
|
}
|
||||||
|
|
||||||
(!errors.is_empty()).then(|| {
|
if errors.is_empty() {
|
||||||
self.tcx.sess.delay_span_bug(rustc_span::DUMMY_SP, "error should have been emitted")
|
Ok(())
|
||||||
})
|
} else {
|
||||||
|
Err(self
|
||||||
|
.tcx
|
||||||
|
.sess
|
||||||
|
.delay_span_bug(rustc_span::DUMMY_SP, "error should have been emitted"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// [Note-Type-error-reporting]
|
// [Note-Type-error-reporting]
|
||||||
|
|
|
@ -178,7 +178,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||||
&self,
|
&self,
|
||||||
generic_param_scope: LocalDefId,
|
generic_param_scope: LocalDefId,
|
||||||
outlives_env: &OutlivesEnvironment<'tcx>,
|
outlives_env: &OutlivesEnvironment<'tcx>,
|
||||||
) -> Option<ErrorGuaranteed> {
|
) -> Result<(), ErrorGuaranteed> {
|
||||||
self.process_registered_region_obligations(
|
self.process_registered_region_obligations(
|
||||||
outlives_env.region_bound_pairs(),
|
outlives_env.region_bound_pairs(),
|
||||||
outlives_env.param_env,
|
outlives_env.param_env,
|
||||||
|
|
|
@ -15,7 +15,6 @@ impl<T> Foo for Fooy<T> {
|
||||||
//~^ ERROR impl has stricter requirements than trait
|
//~^ ERROR impl has stricter requirements than trait
|
||||||
type B<'a, 'b> = (&'a(), &'b ()) where 'b: 'a;
|
type B<'a, 'b> = (&'a(), &'b ()) where 'b: 'a;
|
||||||
//~^ ERROR impl has stricter requirements than trait
|
//~^ ERROR impl has stricter requirements than trait
|
||||||
//~| ERROR lifetime bound not satisfied
|
|
||||||
type C = String where Self: Copy;
|
type C = String where Self: Copy;
|
||||||
//~^ ERROR the trait bound `T: Copy` is not satisfied
|
//~^ ERROR the trait bound `T: Copy` is not satisfied
|
||||||
fn d() where Self: Copy {}
|
fn d() where Self: Copy {}
|
||||||
|
|
|
@ -16,28 +16,8 @@ LL | type B<'a, 'b> where 'a: 'b;
|
||||||
LL | type B<'a, 'b> = (&'a(), &'b ()) where 'b: 'a;
|
LL | type B<'a, 'b> = (&'a(), &'b ()) where 'b: 'a;
|
||||||
| ^^ impl has extra requirement `'b: 'a`
|
| ^^ impl has extra requirement `'b: 'a`
|
||||||
|
|
||||||
error[E0478]: lifetime bound not satisfied
|
|
||||||
--> $DIR/impl_bounds.rs:16:22
|
|
||||||
|
|
|
||||||
LL | type B<'a, 'b> where 'a: 'b;
|
|
||||||
| -------------- definition of `B` from trait
|
|
||||||
...
|
|
||||||
LL | type B<'a, 'b> = (&'a(), &'b ()) where 'b: 'a;
|
|
||||||
| ^^^^^^^^^^^^^^^ - help: try copying this clause from the trait: `, 'a: 'b`
|
|
||||||
|
|
|
||||||
note: lifetime parameter instantiated with the lifetime `'a` as defined here
|
|
||||||
--> $DIR/impl_bounds.rs:16:12
|
|
||||||
|
|
|
||||||
LL | type B<'a, 'b> = (&'a(), &'b ()) where 'b: 'a;
|
|
||||||
| ^^
|
|
||||||
note: but lifetime parameter must outlive the lifetime `'b` as defined here
|
|
||||||
--> $DIR/impl_bounds.rs:16:16
|
|
||||||
|
|
|
||||||
LL | type B<'a, 'b> = (&'a(), &'b ()) where 'b: 'a;
|
|
||||||
| ^^
|
|
||||||
|
|
||||||
error[E0277]: the trait bound `T: Copy` is not satisfied
|
error[E0277]: the trait bound `T: Copy` is not satisfied
|
||||||
--> $DIR/impl_bounds.rs:19:33
|
--> $DIR/impl_bounds.rs:18:33
|
||||||
|
|
|
|
||||||
LL | type C = String where Self: Copy;
|
LL | type C = String where Self: Copy;
|
||||||
| ^^^^ the trait `Copy` is not implemented for `T`
|
| ^^^^ the trait `Copy` is not implemented for `T`
|
||||||
|
@ -62,7 +42,7 @@ LL | impl<T: std::marker::Copy> Foo for Fooy<T> {
|
||||||
| +++++++++++++++++++
|
| +++++++++++++++++++
|
||||||
|
|
||||||
error[E0277]: the trait bound `T: Copy` is not satisfied
|
error[E0277]: the trait bound `T: Copy` is not satisfied
|
||||||
--> $DIR/impl_bounds.rs:21:24
|
--> $DIR/impl_bounds.rs:20:24
|
||||||
|
|
|
|
||||||
LL | fn d() where Self: Copy {}
|
LL | fn d() where Self: Copy {}
|
||||||
| ^^^^ the trait `Copy` is not implemented for `T`
|
| ^^^^ the trait `Copy` is not implemented for `T`
|
||||||
|
@ -86,7 +66,7 @@ help: consider restricting type parameter `T`
|
||||||
LL | impl<T: std::marker::Copy> Foo for Fooy<T> {
|
LL | impl<T: std::marker::Copy> Foo for Fooy<T> {
|
||||||
| +++++++++++++++++++
|
| +++++++++++++++++++
|
||||||
|
|
||||||
error: aborting due to 5 previous errors
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0276, E0277, E0478.
|
Some errors have detailed explanations: E0276, E0277.
|
||||||
For more information about an error, try `rustc --explain E0276`.
|
For more information about an error, try `rustc --explain E0276`.
|
||||||
|
|
Loading…
Add table
Reference in a new issue