Permit calls to default const fns of impl const

This commit is contained in:
Deadbeef 2021-07-10 11:16:46 +08:00
parent 27e863b3df
commit 554fad7bda
No known key found for this signature in database
GPG Key ID: 6525773485376D92

View File

@ -885,14 +885,32 @@ fn visit_terminator(&mut self, terminator: &Terminator<'tcx>, location: Location
return;
}
let caller_has_attr = tcx.has_attr(caller, sym::default_method_body_is_const);
let in_same_trait = match (tcx.trait_of_item(caller), tcx.trait_of_item(callee)) {
(Some(t1), Some(t2)) => t1 == t2,
_ => false
};
if !tcx.is_const_fn_raw(callee) {
let mut permitted = false;
if !(caller_has_attr && in_same_trait) {
if !tcx.is_const_fn_raw(callee) {
let callee_trait = tcx.trait_of_item(callee);
if let Some(trait_id) = callee_trait {
if tcx.has_attr(caller, sym::default_method_body_is_const) {
// permit call to non-const fn when caller has default_method_body_is_const..
if tcx.trait_of_item(caller) == callee_trait {
// ..and caller and callee are in the same trait.
permitted = true;
}
}
let mut const_impls = true;
tcx.for_each_relevant_impl(trait_id, substs.type_at(0), |imp| {
if const_impls {
if let hir::Constness::NotConst = tcx.impl_constness(imp) {
const_impls = false;
}
}
});
if const_impls {
permitted = true;
}
}
if !permitted {
self.check_op(ops::FnCallNonConst);
return;
}