Simplify the collecting of ? Trait
bounds in where clause
This commit is contained in:
parent
b41936b92c
commit
7af840f62e
1 changed files with 20 additions and 33 deletions
|
@ -1373,50 +1373,37 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
itctx: ImplTraitContext<'_, 'hir>,
|
||||
) -> GenericsCtor<'hir> {
|
||||
// Collect `?Trait` bounds in where clause and move them to parameter definitions.
|
||||
// FIXME: this could probably be done with less rightward drift. It also looks like two
|
||||
// control paths where `report_error` is called are the only paths that advance to after the
|
||||
// match statement, so the error reporting could probably just be moved there.
|
||||
let mut add_bounds: NodeMap<Vec<_>> = Default::default();
|
||||
for pred in &generics.where_clause.predicates {
|
||||
if let WherePredicate::BoundPredicate(ref bound_pred) = *pred {
|
||||
'next_bound: for bound in &bound_pred.bounds {
|
||||
if let GenericBound::Trait(_, TraitBoundModifier::Maybe) = *bound {
|
||||
let report_error = |this: &mut Self| {
|
||||
this.diagnostic().span_err(
|
||||
bound_pred.bounded_ty.span,
|
||||
"`?Trait` bounds are only permitted at the \
|
||||
point where a type parameter is declared",
|
||||
);
|
||||
};
|
||||
// Check if the where clause type is a plain type parameter.
|
||||
match bound_pred.bounded_ty.kind {
|
||||
TyKind::Path(None, ref path)
|
||||
if path.segments.len() == 1
|
||||
&& bound_pred.bound_generic_params.is_empty() =>
|
||||
{
|
||||
if let Some(Res::Def(DefKind::TyParam, def_id)) = self
|
||||
.resolver
|
||||
.get_partial_res(bound_pred.bounded_ty.id)
|
||||
.map(|d| d.base_res())
|
||||
match self
|
||||
.resolver
|
||||
.get_partial_res(bound_pred.bounded_ty.id)
|
||||
.map(|d| (d.base_res(), d.unresolved_segments()))
|
||||
{
|
||||
Some((Res::Def(DefKind::TyParam, def_id), 0))
|
||||
if bound_pred.bound_generic_params.is_empty() =>
|
||||
{
|
||||
if let Some(def_id) = def_id.as_local() {
|
||||
for param in &generics.params {
|
||||
if let GenericParamKind::Type { .. } = param.kind {
|
||||
if def_id == self.resolver.local_def_id(param.id) {
|
||||
add_bounds
|
||||
.entry(param.id)
|
||||
.or_default()
|
||||
.push(bound.clone());
|
||||
continue 'next_bound;
|
||||
}
|
||||
}
|
||||
for param in &generics.params {
|
||||
if def_id == self.resolver.local_def_id(param.id).to_def_id() {
|
||||
add_bounds
|
||||
.entry(param.id)
|
||||
.or_default()
|
||||
.push(bound.clone());
|
||||
continue 'next_bound;
|
||||
}
|
||||
}
|
||||
}
|
||||
report_error(self)
|
||||
}
|
||||
_ => report_error(self),
|
||||
_ => {}
|
||||
}
|
||||
self.diagnostic().span_err(
|
||||
bound_pred.bounded_ty.span,
|
||||
"`?Trait` bounds are only permitted at the \
|
||||
point where a type parameter is declared",
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue