Auto merge of #86857 - fee1-dead:add-attr, r=oli-obk

Add #[default_method_body_is_const]

`@rustbot` label F-const_trait_impl
This commit is contained in:
bors
2021-07-13 06:59:34 +00:00
19 changed files with 265 additions and 34 deletions

View File

@@ -886,8 +886,34 @@ impl Visitor<'tcx> for Validator<'mir, 'tcx> {
}
if !tcx.is_const_fn_raw(callee) {
self.check_op(ops::FnCallNonConst);
return;
let mut permitted = false;
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;
}
}
// If the `const fn` we are trying to call is not const-stable, ensure that we have