Skip to content

Commit 3ab08c3

Browse files
Fix fast path for higher-ranked trait goals, resolve vars too
1 parent 24e172d commit 3ab08c3

File tree

2 files changed

+32
-28
lines changed

2 files changed

+32
-28
lines changed

compiler/rustc_middle/src/ty/sty.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1882,10 +1882,8 @@ impl<'tcx> Ty<'tcx> {
18821882
// Needs normalization or revealing to determine, so no is the safe answer.
18831883
ty::Alias(..) => false,
18841884

1885-
ty::Param(..) | ty::Placeholder(..) | ty::Infer(..) | ty::Error(..) => false,
1886-
1887-
ty::Bound(..) => {
1888-
bug!("`is_trivially_pure_clone_copy` applied to unexpected type: {:?}", self);
1885+
ty::Param(..) | ty::Placeholder(..) | ty::Bound(..) | ty::Infer(..) | ty::Error(..) => {
1886+
false
18891887
}
18901888
}
18911889
}

compiler/rustc_trait_selection/src/solve/delegate.rs

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,36 @@ impl<'tcx> rustc_next_trait_solver::delegate::SolverDelegate for SolverDelegate<
6161
goal: Goal<'tcx, ty::Predicate<'tcx>>,
6262
span: Span,
6363
) -> Option<Certainty> {
64-
if let Some(trait_pred) = goal.predicate.as_trait_clause()
65-
&& self.shallow_resolve(trait_pred.self_ty().skip_binder()).is_ty_var()
66-
// We don't do this fast path when opaques are defined since we may
67-
// eventually use opaques to incompletely guide inference via ty var
68-
// self types.
69-
// FIXME: Properly consider opaques here.
70-
&& self.inner.borrow_mut().opaque_types().is_empty()
71-
{
72-
return Some(Certainty::AMBIGUOUS);
64+
if let Some(trait_pred) = goal.predicate.as_trait_clause() {
65+
if self.shallow_resolve(trait_pred.self_ty().skip_binder()).is_ty_var()
66+
// We don't do this fast path when opaques are defined since we may
67+
// eventually use opaques to incompletely guide inference via ty var
68+
// self types.
69+
// FIXME: Properly consider opaques here.
70+
&& self.inner.borrow_mut().opaque_types().is_empty()
71+
{
72+
return Some(Certainty::AMBIGUOUS);
73+
}
74+
75+
if trait_pred.polarity() == ty::PredicatePolarity::Positive {
76+
match self.0.tcx.as_lang_item(trait_pred.def_id()) {
77+
Some(LangItem::Sized)
78+
if self
79+
.resolve_vars_if_possible(trait_pred.self_ty().skip_binder())
80+
.is_trivially_sized(self.0.tcx) =>
81+
{
82+
return Some(Certainty::Yes);
83+
}
84+
Some(LangItem::Copy | LangItem::Clone)
85+
if self
86+
.resolve_vars_if_possible(trait_pred.self_ty().skip_binder())
87+
.is_trivially_pure_clone_copy() =>
88+
{
89+
return Some(Certainty::Yes);
90+
}
91+
_ => {}
92+
}
93+
}
7394
}
7495

7596
let pred = goal.predicate.kind();
@@ -94,21 +115,6 @@ impl<'tcx> rustc_next_trait_solver::delegate::SolverDelegate for SolverDelegate<
94115

95116
Some(Certainty::Yes)
96117
}
97-
ty::PredicateKind::Clause(ty::ClauseKind::Trait(trait_pred)) => {
98-
match self.0.tcx.as_lang_item(trait_pred.def_id()) {
99-
Some(LangItem::Sized)
100-
if trait_pred.self_ty().is_trivially_sized(self.0.tcx) =>
101-
{
102-
Some(Certainty::Yes)
103-
}
104-
Some(LangItem::Copy | LangItem::Clone)
105-
if trait_pred.self_ty().is_trivially_pure_clone_copy() =>
106-
{
107-
Some(Certainty::Yes)
108-
}
109-
_ => None,
110-
}
111-
}
112118
ty::PredicateKind::Subtype(ty::SubtypePredicate { a, b, .. })
113119
| ty::PredicateKind::Coerce(ty::CoercePredicate { a, b }) => {
114120
if self.shallow_resolve(a).is_ty_var() && self.shallow_resolve(b).is_ty_var() {

0 commit comments

Comments
 (0)