From 56d79adf3be666a4583ffeddd276de5c8b6ab32e Mon Sep 17 00:00:00 2001 From: Deadbeef Date: Wed, 7 Jul 2021 11:52:40 +0800 Subject: [PATCH] Skip check for calling functions in same trait --- .../src/transform/check_consts/validation.rs | 14 +++++++++++--- .../const-default-method-bodies.rs | 6 ++++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/compiler/rustc_mir/src/transform/check_consts/validation.rs b/compiler/rustc_mir/src/transform/check_consts/validation.rs index 6216ff6656e2..e6a4f08836ad 100644 --- a/compiler/rustc_mir/src/transform/check_consts/validation.rs +++ b/compiler/rustc_mir/src/transform/check_consts/validation.rs @@ -885,9 +885,17 @@ impl Visitor<'tcx> for Validator<'mir, 'tcx> { return; } - if !tcx.is_const_fn_raw(callee) { - self.check_op(ops::FnCallNonConst); - 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 !(caller_has_attr && in_same_trait) { + if !tcx.is_const_fn_raw(callee) { + self.check_op(ops::FnCallNonConst); + return; + } } // If the `const fn` we are trying to call is not const-stable, ensure that we have diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-default-method-bodies.rs b/src/test/ui/rfc-2632-const-trait-impl/const-default-method-bodies.rs index bc2fcf81c63e..6a1a72f29709 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/const-default-method-bodies.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/const-default-method-bodies.rs @@ -1,6 +1,8 @@ -// TODO fix this test +// check-pass +// TODO remove this^ #![feature(const_trait_impl)] +#![feature(const_fn_trait_bound)] // FIXME is this needed? #![allow(incomplete_features)] trait ConstDefaultFn: Sized { @@ -25,7 +27,7 @@ impl const ConstDefaultFn for ConstImpl { const fn test() { NonConstImpl.a(); - //~^ ERROR calls in constant functions are limited to constant functions, tuple structs and tuple variants + // TODO ~^ ERROR calls in constant functions are limited to constant functions, tuple structs and tuple variants ConstImpl.a(); }