Rollup merge of #133660 - compiler-errors:trait-obj-missing-assoc, r=lcnr
Do not create trait object type if missing associated types r? lcnr
This commit is contained in:
commit
4d5ad194d5
15 changed files with 35 additions and 205 deletions
|
@ -219,11 +219,13 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
def_ids.retain(|def_id| !tcx.generics_require_sized_self(def_id));
|
||||
}
|
||||
|
||||
self.complain_about_missing_assoc_tys(
|
||||
if let Err(guar) = self.check_for_required_assoc_tys(
|
||||
associated_types,
|
||||
potential_assoc_types,
|
||||
hir_trait_bounds,
|
||||
);
|
||||
) {
|
||||
return Ty::new_error(tcx, guar);
|
||||
}
|
||||
|
||||
// De-duplicate auto traits so that, e.g., `dyn Trait + Send + Send` is the same as
|
||||
// `dyn Trait + Send`.
|
||||
|
|
|
@ -714,14 +714,14 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
/// reasonable suggestion on how to write it. For the case of multiple associated types in the
|
||||
/// same trait bound have the same name (as they come from different supertraits), we instead
|
||||
/// emit a generic note suggesting using a `where` clause to constraint instead.
|
||||
pub(crate) fn complain_about_missing_assoc_tys(
|
||||
pub(crate) fn check_for_required_assoc_tys(
|
||||
&self,
|
||||
associated_types: FxIndexMap<Span, FxIndexSet<DefId>>,
|
||||
potential_assoc_types: Vec<usize>,
|
||||
trait_bounds: &[hir::PolyTraitRef<'_>],
|
||||
) {
|
||||
) -> Result<(), ErrorGuaranteed> {
|
||||
if associated_types.values().all(|v| v.is_empty()) {
|
||||
return;
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let tcx = self.tcx();
|
||||
|
@ -739,7 +739,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
// Account for things like `dyn Foo + 'a`, like in tests `issue-22434.rs` and
|
||||
// `issue-22560.rs`.
|
||||
let mut trait_bound_spans: Vec<Span> = vec![];
|
||||
let mut dyn_compatibility_violations = false;
|
||||
let mut dyn_compatibility_violations = Ok(());
|
||||
for (span, items) in &associated_types {
|
||||
if !items.is_empty() {
|
||||
trait_bound_spans.push(*span);
|
||||
|
@ -752,13 +752,20 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
let violations =
|
||||
dyn_compatibility_violations_for_assoc_item(tcx, trait_def_id, *assoc_item);
|
||||
if !violations.is_empty() {
|
||||
report_dyn_incompatibility(tcx, *span, None, trait_def_id, &violations).emit();
|
||||
dyn_compatibility_violations = true;
|
||||
dyn_compatibility_violations = Err(report_dyn_incompatibility(
|
||||
tcx,
|
||||
*span,
|
||||
None,
|
||||
trait_def_id,
|
||||
&violations,
|
||||
)
|
||||
.emit());
|
||||
}
|
||||
}
|
||||
}
|
||||
if dyn_compatibility_violations {
|
||||
return;
|
||||
|
||||
if let Err(guar) = dyn_compatibility_violations {
|
||||
return Err(guar);
|
||||
}
|
||||
|
||||
// related to issue #91997, turbofishes added only when in an expr or pat
|
||||
|
@ -965,7 +972,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
}
|
||||
}
|
||||
|
||||
err.emit();
|
||||
Err(err.emit())
|
||||
}
|
||||
|
||||
/// On ambiguous associated type, look for an associated function whose name matches the
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue