Try to fix problem

This commit is contained in:
Deadbeef 2021-07-24 23:32:43 +08:00
parent 779eef2dae
commit a00f2bcf5c
No known key found for this signature in database
GPG Key ID: 027DF9338862ADDD
2 changed files with 17 additions and 4 deletions

View File

@ -1084,11 +1084,12 @@ fn check_user_type_annotations(&mut self) {
span_mirbug!(
self,
user_annotation,
"bad user type AscribeUserType({:?}, {:?} {:?}): {:?}",
"bad user type AscribeUserType({:?}, {:?} {:?}, type_of={:?}): {:?}",
inferred_ty,
def_id,
user_substs,
terr
self.tcx().type_of(def_id),
terr,
);
}
}

View File

@ -6,7 +6,9 @@
use rustc_infer::traits::TraitEngineExt as _;
use rustc_middle::ty::query::Providers;
use rustc_middle::ty::subst::{GenericArg, Subst, UserSelfTy, UserSubsts};
use rustc_middle::ty::{self, FnSig, Lift, PolyFnSig, Ty, TyCtxt, TypeFoldable, Variance};
use rustc_middle::ty::{
self, FnSig, Lift, PolyFnSig, PredicateKind, Ty, TyCtxt, TypeFoldable, Variance,
};
use rustc_middle::ty::{ParamEnv, ParamEnvAnd, Predicate, ToPredicate};
use rustc_span::DUMMY_SP;
use rustc_trait_selection::infer::InferCtxtBuilderExt;
@ -85,7 +87,16 @@ fn relate<T>(&mut self, a: T, variance: Variance, b: T) -> Result<(), NoSolution
Ok(())
}
fn prove_predicate(&mut self, predicate: Predicate<'tcx>) {
fn prove_predicate(&mut self, mut predicate: Predicate<'tcx>) {
if let PredicateKind::Trait(mut tr) = predicate.kind().skip_binder() {
if let hir::Constness::Const = tr.constness {
// FIXME check if we actually want to prove const predicates inside AscribeUserType
tr.constness = hir::Constness::NotConst;
predicate =
predicate.kind().rebind(PredicateKind::Trait(tr)).to_predicate(self.tcx());
}
}
self.fulfill_cx.register_predicate_obligation(
self.infcx,
Obligation::new(ObligationCause::dummy(), self.param_env, predicate),
@ -126,6 +137,7 @@ fn relate_mir_and_user_ty(
// outlives" error messages.
let instantiated_predicates =
self.tcx().predicates_of(def_id).instantiate(self.tcx(), substs);
debug!(?instantiated_predicates.predicates);
for instantiated_predicate in instantiated_predicates.predicates {
let instantiated_predicate = self.normalize(instantiated_predicate);
self.prove_predicate(instantiated_predicate);