1
Fork 0

Don't try to resolve inference variables in WF computation, just register

This commit is contained in:
Jack Huey 2022-07-10 15:25:33 -04:00
parent c4693bc946
commit 2d15f1ca42
2 changed files with 24 additions and 37 deletions

View file

@ -452,27 +452,17 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> {
predicate, predicate,
)); ));
} }
ty::ConstKind::Infer(infer) => { ty::ConstKind::Infer(_) => {
let resolved = self.infcx.shallow_resolve(infer);
// the `InferConst` changed, meaning that we made progress.
if resolved != infer {
let cause = self.cause(traits::WellFormed(None)); let cause = self.cause(traits::WellFormed(None));
let resolved_constant = self.infcx.tcx.mk_const(ty::ConstS {
kind: ty::ConstKind::Infer(resolved),
ty: constant.ty(),
});
self.out.push(traits::Obligation::with_depth( self.out.push(traits::Obligation::with_depth(
cause, cause,
self.recursion_depth, self.recursion_depth,
self.param_env, self.param_env,
ty::Binder::dummy(ty::PredicateKind::WellFormed( ty::Binder::dummy(ty::PredicateKind::WellFormed(constant.into()))
resolved_constant.into(),
))
.to_predicate(self.tcx()), .to_predicate(self.tcx()),
)); ));
} }
}
ty::ConstKind::Error(_) ty::ConstKind::Error(_)
| ty::ConstKind::Param(_) | ty::ConstKind::Param(_)
| ty::ConstKind::Bound(..) | ty::ConstKind::Bound(..)
@ -675,9 +665,6 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> {
// See also the comment on `fn obligations`, describing "livelock" // See also the comment on `fn obligations`, describing "livelock"
// prevention, which happens before this can be reached. // prevention, which happens before this can be reached.
ty::Infer(_) => { ty::Infer(_) => {
let ty = self.infcx.shallow_resolve(ty);
if let ty::Infer(ty::TyVar(_)) = ty.kind() {
// Not yet resolved, but we've made progress.
let cause = self.cause(traits::WellFormed(None)); let cause = self.cause(traits::WellFormed(None));
self.out.push(traits::Obligation::with_depth( self.out.push(traits::Obligation::with_depth(
cause, cause,
@ -686,11 +673,6 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> {
ty::Binder::dummy(ty::PredicateKind::WellFormed(ty.into())) ty::Binder::dummy(ty::PredicateKind::WellFormed(ty.into()))
.to_predicate(self.tcx()), .to_predicate(self.tcx()),
)); ));
} else {
// Yes, resolved, proceed with the result.
// FIXME(eddyb) add the type to `walker` instead of recursing.
self.compute(ty.into());
}
} }
} }
} }

View file

@ -1,8 +1,13 @@
error[E0282]: type annotations needed error[E0282]: type annotations needed for `SmallCString<N>`
--> $DIR/issue-98299.rs:4:5 --> $DIR/issue-98299.rs:4:36
| |
LL | SmallCString::try_from(p).map(|cstr| cstr); LL | SmallCString::try_from(p).map(|cstr| cstr);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type for enum `Result<SmallCString<{_: usize}>, ()>` | ^^^^
|
help: consider giving this closure parameter an explicit type, where the the value of const parameter `N` is specified
|
LL | SmallCString::try_from(p).map(|cstr: SmallCString<N>| cstr);
| +++++++++++++++++
error: aborting due to previous error error: aborting due to previous error