diff options
| -rw-r--r-- | compiler/rustc_mir/src/borrow_check/type_check/mod.rs | 5 | ||||
| -rw-r--r-- | compiler/rustc_traits/src/type_op.rs | 16 |
2 files changed, 17 insertions, 4 deletions
diff --git a/compiler/rustc_mir/src/borrow_check/type_check/mod.rs b/compiler/rustc_mir/src/borrow_check/type_check/mod.rs index 51a6f5bf1ab..86dcb9c9c1b 100644 --- a/compiler/rustc_mir/src/borrow_check/type_check/mod.rs +++ b/compiler/rustc_mir/src/borrow_check/type_check/mod.rs @@ -1084,11 +1084,12 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { 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, ); } } diff --git a/compiler/rustc_traits/src/type_op.rs b/compiler/rustc_traits/src/type_op.rs index 2c55ea7f5c1..f4a0cc6767f 100644 --- a/compiler/rustc_traits/src/type_op.rs +++ b/compiler/rustc_traits/src/type_op.rs @@ -6,7 +6,9 @@ use rustc_infer::infer::{InferCtxt, TyCtxtInferExt}; 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 @@ impl AscribeUserTypeCx<'me, 'tcx> { 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 @@ impl AscribeUserTypeCx<'me, 'tcx> { // 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); |
