1
Fork 0

Auto merge of #78683 - Nemo157:issue-78673, r=lcnr

Check predicates from blanket trait impls while testing if they apply

fixes #78673
This commit is contained in:
bors 2020-11-13 23:12:01 +00:00
commit b63d05a908
2 changed files with 47 additions and 7 deletions

View file

@ -62,14 +62,30 @@ impl<'a, 'tcx> BlanketImplFinder<'a, 'tcx> {
"invoking predicate_may_hold: param_env={:?}, trait_ref={:?}, ty={:?}", "invoking predicate_may_hold: param_env={:?}, trait_ref={:?}, ty={:?}",
param_env, trait_ref, ty param_env, trait_ref, ty
); );
match infcx.evaluate_obligation(&traits::Obligation::new( let predicates = self
cause, .cx
param_env, .tcx
trait_ref.without_const().to_predicate(infcx.tcx), .predicates_of(impl_def_id)
)) { .instantiate(self.cx.tcx, impl_substs)
Ok(eval_result) => eval_result.may_apply(), .predicates
Err(traits::OverflowError) => true, // overflow doesn't mean yes *or* no .into_iter()
.chain(Some(trait_ref.without_const().to_predicate(infcx.tcx)));
for predicate in predicates {
debug!("testing predicate {:?}", predicate);
let obligation = traits::Obligation::new(
traits::ObligationCause::dummy(),
param_env,
predicate,
);
match infcx.evaluate_obligation(&obligation) {
Ok(eval_result) if eval_result.may_apply() => {}
Err(traits::OverflowError) => {}
_ => {
return false;
}
}
} }
true
} else { } else {
false false
} }

View file

@ -0,0 +1,24 @@
#![crate_name = "issue_78673"]
pub trait Something {}
pub trait AnAmazingTrait {}
impl<T: Something> AnAmazingTrait for T {}
// @has 'issue_78673/struct.MyStruct.html'
// @has - '//*[@class="impl"]' 'AnAmazingTrait for MyStruct'
// @!has - '//*[@class="impl"]' 'AnAmazingTrait for T'
pub struct MyStruct;
impl AnAmazingTrait for MyStruct {}
// generic structs may have _both_ specific and blanket impls that apply
// @has 'issue_78673/struct.AnotherStruct.html'
// @has - '//*[@class="impl"]' 'AnAmazingTrait for AnotherStruct<()>'
// @has - '//*[@class="impl"]' 'AnAmazingTrait for T'
pub struct AnotherStruct<T>(T);
impl<T: Something> Something for AnotherStruct<T> {}
impl AnAmazingTrait for AnotherStruct<()> {}