Skip to content

Commit 7af840f

Browse files
author
surechen
committed
Simplify the collecting of ? Trait bounds in where clause
1 parent b41936b commit 7af840f

File tree

1 file changed

+20
-33
lines changed
  • compiler/rustc_ast_lowering/src

1 file changed

+20
-33
lines changed

compiler/rustc_ast_lowering/src/item.rs

+20-33
Original file line numberDiff line numberDiff line change
@@ -1373,50 +1373,37 @@ impl<'hir> LoweringContext<'_, 'hir> {
13731373
itctx: ImplTraitContext<'_, 'hir>,
13741374
) -> GenericsCtor<'hir> {
13751375
// Collect `?Trait` bounds in where clause and move them to parameter definitions.
1376-
// FIXME: this could probably be done with less rightward drift. It also looks like two
1377-
// control paths where `report_error` is called are the only paths that advance to after the
1378-
// match statement, so the error reporting could probably just be moved there.
13791376
let mut add_bounds: NodeMap<Vec<_>> = Default::default();
13801377
for pred in &generics.where_clause.predicates {
13811378
if let WherePredicate::BoundPredicate(ref bound_pred) = *pred {
13821379
'next_bound: for bound in &bound_pred.bounds {
13831380
if let GenericBound::Trait(_, TraitBoundModifier::Maybe) = *bound {
1384-
let report_error = |this: &mut Self| {
1385-
this.diagnostic().span_err(
1386-
bound_pred.bounded_ty.span,
1387-
"`?Trait` bounds are only permitted at the \
1388-
point where a type parameter is declared",
1389-
);
1390-
};
13911381
// Check if the where clause type is a plain type parameter.
1392-
match bound_pred.bounded_ty.kind {
1393-
TyKind::Path(None, ref path)
1394-
if path.segments.len() == 1
1395-
&& bound_pred.bound_generic_params.is_empty() =>
1396-
{
1397-
if let Some(Res::Def(DefKind::TyParam, def_id)) = self
1398-
.resolver
1399-
.get_partial_res(bound_pred.bounded_ty.id)
1400-
.map(|d| d.base_res())
1382+
match self
1383+
.resolver
1384+
.get_partial_res(bound_pred.bounded_ty.id)
1385+
.map(|d| (d.base_res(), d.unresolved_segments()))
1386+
{
1387+
Some((Res::Def(DefKind::TyParam, def_id), 0))
1388+
if bound_pred.bound_generic_params.is_empty() =>
14011389
{
1402-
if let Some(def_id) = def_id.as_local() {
1403-
for param in &generics.params {
1404-
if let GenericParamKind::Type { .. } = param.kind {
1405-
if def_id == self.resolver.local_def_id(param.id) {
1406-
add_bounds
1407-
.entry(param.id)
1408-
.or_default()
1409-
.push(bound.clone());
1410-
continue 'next_bound;
1411-
}
1412-
}
1390+
for param in &generics.params {
1391+
if def_id == self.resolver.local_def_id(param.id).to_def_id() {
1392+
add_bounds
1393+
.entry(param.id)
1394+
.or_default()
1395+
.push(bound.clone());
1396+
continue 'next_bound;
14131397
}
14141398
}
14151399
}
1416-
report_error(self)
1417-
}
1418-
_ => report_error(self),
1400+
_ => {}
14191401
}
1402+
self.diagnostic().span_err(
1403+
bound_pred.bounded_ty.span,
1404+
"`?Trait` bounds are only permitted at the \
1405+
point where a type parameter is declared",
1406+
);
14201407
}
14211408
}
14221409
}

0 commit comments

Comments
 (0)