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:
commit
b63d05a908
2 changed files with 47 additions and 7 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
24
src/test/rustdoc/issue-78673.rs
Normal file
24
src/test/rustdoc/issue-78673.rs
Normal 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<()> {}
|
Loading…
Add table
Add a link
Reference in a new issue