Auto merge of #87375 - fee1-dead:move-constness-to-traitpred, r=oli-obk
Try filtering out non-const impls when we expect const impls **TL;DR**: Associated types on const impls are now bounded; we now disallow calling a const function with bounds when the specified type param only has a non-const impl. r? `@oli-obk`
This commit is contained in:
commit
136eaa1b25
68 changed files with 517 additions and 211 deletions
|
@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -2688,10 +2689,10 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||
category: ConstraintCategory,
|
||||
) {
|
||||
self.prove_predicates(
|
||||
Some(ty::PredicateKind::Trait(
|
||||
ty::TraitPredicate { trait_ref },
|
||||
hir::Constness::NotConst,
|
||||
)),
|
||||
Some(ty::PredicateKind::Trait(ty::TraitPredicate {
|
||||
trait_ref,
|
||||
constness: hir::Constness::NotConst,
|
||||
})),
|
||||
locations,
|
||||
category,
|
||||
);
|
||||
|
|
|
@ -423,7 +423,7 @@ impl Checker<'mir, 'tcx> {
|
|||
ty::PredicateKind::Subtype(_) => {
|
||||
bug!("subtype predicate on function: {:#?}", predicate)
|
||||
}
|
||||
ty::PredicateKind::Trait(pred, _constness) => {
|
||||
ty::PredicateKind::Trait(pred) => {
|
||||
if Some(pred.def_id()) == tcx.lang_items().sized_trait() {
|
||||
continue;
|
||||
}
|
||||
|
@ -817,7 +817,10 @@ impl Visitor<'tcx> for Checker<'mir, 'tcx> {
|
|||
let obligation = Obligation::new(
|
||||
ObligationCause::dummy(),
|
||||
param_env,
|
||||
Binder::dummy(TraitPredicate { trait_ref }),
|
||||
Binder::dummy(TraitPredicate {
|
||||
trait_ref,
|
||||
constness: hir::Constness::Const,
|
||||
}),
|
||||
);
|
||||
|
||||
let implsrc = tcx.infer_ctxt().enter(|infcx| {
|
||||
|
|
|
@ -132,7 +132,7 @@ impl<'a, 'tcx> FunctionItemRefChecker<'a, 'tcx> {
|
|||
|
||||
/// If the given predicate is the trait `fmt::Pointer`, returns the bound parameter type.
|
||||
fn is_pointer_trait(&self, bound: &PredicateKind<'tcx>) -> Option<Ty<'tcx>> {
|
||||
if let ty::PredicateKind::Trait(predicate, _) = bound {
|
||||
if let ty::PredicateKind::Trait(predicate) = bound {
|
||||
if self.tcx.is_diagnostic_item(sym::pointer_trait, predicate.def_id()) {
|
||||
Some(predicate.trait_ref.self_ty())
|
||||
} else {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue