Auto merge of #133393 - compiler-errors:dyn-tweaks, r=lcnr,spastorino
Some minor dyn-related tweaks Each commit should be self-explanatory, but I'm happy to explain what's going on if not. These are tweaks I pulled out of #133388, but they can be reviewed sooner than that. r? types
This commit is contained in:
commit
c322cd5c5a
4 changed files with 11 additions and 74 deletions
|
@ -136,7 +136,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
||||||
|
|
||||||
for (base_trait_ref, original_span) in regular_traits_refs_spans {
|
for (base_trait_ref, original_span) in regular_traits_refs_spans {
|
||||||
let base_pred: ty::Predicate<'tcx> = base_trait_ref.upcast(tcx);
|
let base_pred: ty::Predicate<'tcx> = base_trait_ref.upcast(tcx);
|
||||||
for ClauseWithSupertraitSpan { pred, original_span, supertrait_span } in
|
for ClauseWithSupertraitSpan { pred, supertrait_span } in
|
||||||
traits::elaborate(tcx, [ClauseWithSupertraitSpan::new(base_pred, original_span)])
|
traits::elaborate(tcx, [ClauseWithSupertraitSpan::new(base_pred, original_span)])
|
||||||
.filter_only_self()
|
.filter_only_self()
|
||||||
{
|
{
|
||||||
|
@ -204,7 +204,6 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
||||||
for def_ids in associated_types.values_mut() {
|
for def_ids in associated_types.values_mut() {
|
||||||
for (projection_bound, span) in &projection_bounds {
|
for (projection_bound, span) in &projection_bounds {
|
||||||
let def_id = projection_bound.projection_def_id();
|
let def_id = projection_bound.projection_def_id();
|
||||||
// FIXME(#120456) - is `swap_remove` correct?
|
|
||||||
def_ids.swap_remove(&def_id);
|
def_ids.swap_remove(&def_id);
|
||||||
if tcx.generics_require_sized_self(def_id) {
|
if tcx.generics_require_sized_self(def_id) {
|
||||||
tcx.emit_node_span_lint(
|
tcx.emit_node_span_lint(
|
||||||
|
|
|
@ -727,7 +727,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
||||||
let tcx = self.tcx();
|
let tcx = self.tcx();
|
||||||
// FIXME: Marked `mut` so that we can replace the spans further below with a more
|
// FIXME: Marked `mut` so that we can replace the spans further below with a more
|
||||||
// appropriate one, but this should be handled earlier in the span assignment.
|
// appropriate one, but this should be handled earlier in the span assignment.
|
||||||
let mut associated_types: FxIndexMap<Span, Vec<_>> = associated_types
|
let associated_types: FxIndexMap<Span, Vec<_>> = associated_types
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(span, def_ids)| {
|
.map(|(span, def_ids)| {
|
||||||
(span, def_ids.into_iter().map(|did| tcx.associated_item(did)).collect())
|
(span, def_ids.into_iter().map(|did| tcx.associated_item(did)).collect())
|
||||||
|
@ -769,39 +769,6 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
||||||
hir::Node::Expr(_) | hir::Node::Pat(_) => true,
|
hir::Node::Expr(_) | hir::Node::Pat(_) => true,
|
||||||
_ => false,
|
_ => false,
|
||||||
};
|
};
|
||||||
match bound.trait_ref.path.segments {
|
|
||||||
// FIXME: `trait_ref.path.span` can point to a full path with multiple
|
|
||||||
// segments, even though `trait_ref.path.segments` is of length `1`. Work
|
|
||||||
// around that bug here, even though it should be fixed elsewhere.
|
|
||||||
// This would otherwise cause an invalid suggestion. For an example, look at
|
|
||||||
// `tests/ui/issues/issue-28344.rs` where instead of the following:
|
|
||||||
//
|
|
||||||
// error[E0191]: the value of the associated type `Output`
|
|
||||||
// (from trait `std::ops::BitXor`) must be specified
|
|
||||||
// --> $DIR/issue-28344.rs:4:17
|
|
||||||
// |
|
|
||||||
// LL | let x: u8 = BitXor::bitor(0 as u8, 0 as u8);
|
|
||||||
// | ^^^^^^ help: specify the associated type:
|
|
||||||
// | `BitXor<Output = Type>`
|
|
||||||
//
|
|
||||||
// we would output:
|
|
||||||
//
|
|
||||||
// error[E0191]: the value of the associated type `Output`
|
|
||||||
// (from trait `std::ops::BitXor`) must be specified
|
|
||||||
// --> $DIR/issue-28344.rs:4:17
|
|
||||||
// |
|
|
||||||
// LL | let x: u8 = BitXor::bitor(0 as u8, 0 as u8);
|
|
||||||
// | ^^^^^^^^^^^^^ help: specify the associated type:
|
|
||||||
// | `BitXor::bitor<Output = Type>`
|
|
||||||
[segment] if segment.args.is_none() => {
|
|
||||||
trait_bound_spans = vec![segment.ident.span];
|
|
||||||
associated_types = associated_types
|
|
||||||
.into_values()
|
|
||||||
.map(|items| (segment.ident.span, items))
|
|
||||||
.collect();
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// We get all the associated items that _are_ set,
|
// We get all the associated items that _are_ set,
|
||||||
|
|
|
@ -963,30 +963,7 @@ impl<'a, 'tcx> TypeVisitor<TyCtxt<'tcx>> for WfPredicates<'a, 'tcx> {
|
||||||
/// bounds that must hold on the elided self type. These are derived
|
/// bounds that must hold on the elided self type. These are derived
|
||||||
/// from the declarations of `SomeTrait`, `Send`, and friends -- if
|
/// from the declarations of `SomeTrait`, `Send`, and friends -- if
|
||||||
/// they declare `trait SomeTrait : 'static`, for example, then
|
/// they declare `trait SomeTrait : 'static`, for example, then
|
||||||
/// `'static` would appear in the list. The hard work is done by
|
/// `'static` would appear in the list.
|
||||||
/// `infer::required_region_bounds`, see that for more information.
|
|
||||||
pub fn object_region_bounds<'tcx>(
|
|
||||||
tcx: TyCtxt<'tcx>,
|
|
||||||
existential_predicates: &'tcx ty::List<ty::PolyExistentialPredicate<'tcx>>,
|
|
||||||
) -> Vec<ty::Region<'tcx>> {
|
|
||||||
let predicates = existential_predicates.iter().filter_map(|predicate| {
|
|
||||||
if let ty::ExistentialPredicate::Projection(_) = predicate.skip_binder() {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
Some(predicate.with_self_ty(tcx, tcx.types.trait_object_dummy_self))
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
required_region_bounds(tcx, tcx.types.trait_object_dummy_self, predicates)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Given a set of predicates that apply to an object type, returns
|
|
||||||
/// the region bounds that the (erased) `Self` type must
|
|
||||||
/// outlive. Precisely *because* the `Self` type is erased, the
|
|
||||||
/// parameter `erased_self_ty` must be supplied to indicate what type
|
|
||||||
/// has been used to represent `Self` in the predicates
|
|
||||||
/// themselves. This should really be a unique type; `FreshTy(0)` is a
|
|
||||||
/// popular choice.
|
|
||||||
///
|
///
|
||||||
/// N.B., in some cases, particularly around higher-ranked bounds,
|
/// N.B., in some cases, particularly around higher-ranked bounds,
|
||||||
/// this function returns a kind of conservative approximation.
|
/// this function returns a kind of conservative approximation.
|
||||||
|
@ -996,13 +973,14 @@ pub fn object_region_bounds<'tcx>(
|
||||||
///
|
///
|
||||||
/// Requires that trait definitions have been processed so that we can
|
/// Requires that trait definitions have been processed so that we can
|
||||||
/// elaborate predicates and walk supertraits.
|
/// elaborate predicates and walk supertraits.
|
||||||
#[instrument(skip(tcx, predicates), level = "debug", ret)]
|
pub fn object_region_bounds<'tcx>(
|
||||||
pub(crate) fn required_region_bounds<'tcx>(
|
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
erased_self_ty: Ty<'tcx>,
|
existential_predicates: &'tcx ty::List<ty::PolyExistentialPredicate<'tcx>>,
|
||||||
predicates: impl Iterator<Item = ty::Clause<'tcx>>,
|
|
||||||
) -> Vec<ty::Region<'tcx>> {
|
) -> Vec<ty::Region<'tcx>> {
|
||||||
assert!(!erased_self_ty.has_escaping_bound_vars());
|
let erased_self_ty = tcx.types.trait_object_dummy_self;
|
||||||
|
|
||||||
|
let predicates =
|
||||||
|
existential_predicates.iter().map(|predicate| predicate.with_self_ty(tcx, erased_self_ty));
|
||||||
|
|
||||||
traits::elaborate(tcx, predicates)
|
traits::elaborate(tcx, predicates)
|
||||||
.filter_map(|pred| {
|
.filter_map(|pred| {
|
||||||
|
|
|
@ -45,14 +45,12 @@ pub trait Elaboratable<I: Interner> {
|
||||||
|
|
||||||
pub struct ClauseWithSupertraitSpan<I: Interner> {
|
pub struct ClauseWithSupertraitSpan<I: Interner> {
|
||||||
pub pred: I::Predicate,
|
pub pred: I::Predicate,
|
||||||
// Span of the original elaborated predicate.
|
|
||||||
pub original_span: I::Span,
|
|
||||||
// Span of the supertrait predicatae that lead to this clause.
|
// Span of the supertrait predicatae that lead to this clause.
|
||||||
pub supertrait_span: I::Span,
|
pub supertrait_span: I::Span,
|
||||||
}
|
}
|
||||||
impl<I: Interner> ClauseWithSupertraitSpan<I> {
|
impl<I: Interner> ClauseWithSupertraitSpan<I> {
|
||||||
pub fn new(pred: I::Predicate, span: I::Span) -> Self {
|
pub fn new(pred: I::Predicate, span: I::Span) -> Self {
|
||||||
ClauseWithSupertraitSpan { pred, original_span: span, supertrait_span: span }
|
ClauseWithSupertraitSpan { pred, supertrait_span: span }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl<I: Interner> Elaboratable<I> for ClauseWithSupertraitSpan<I> {
|
impl<I: Interner> Elaboratable<I> for ClauseWithSupertraitSpan<I> {
|
||||||
|
@ -63,7 +61,6 @@ impl<I: Interner> Elaboratable<I> for ClauseWithSupertraitSpan<I> {
|
||||||
fn child(&self, clause: <I as Interner>::Clause) -> Self {
|
fn child(&self, clause: <I as Interner>::Clause) -> Self {
|
||||||
ClauseWithSupertraitSpan {
|
ClauseWithSupertraitSpan {
|
||||||
pred: clause.as_predicate(),
|
pred: clause.as_predicate(),
|
||||||
original_span: self.original_span,
|
|
||||||
supertrait_span: self.supertrait_span,
|
supertrait_span: self.supertrait_span,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -75,11 +72,7 @@ impl<I: Interner> Elaboratable<I> for ClauseWithSupertraitSpan<I> {
|
||||||
_parent_trait_pred: crate::Binder<I, crate::TraitPredicate<I>>,
|
_parent_trait_pred: crate::Binder<I, crate::TraitPredicate<I>>,
|
||||||
_index: usize,
|
_index: usize,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
ClauseWithSupertraitSpan {
|
ClauseWithSupertraitSpan { pred: clause.as_predicate(), supertrait_span: supertrait_span }
|
||||||
pred: clause.as_predicate(),
|
|
||||||
original_span: self.original_span,
|
|
||||||
supertrait_span: supertrait_span,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue