diff options
| author | Deadbeef <ent3rm4n@gmail.com> | 2021-07-07 11:52:40 +0800 |
|---|---|---|
| committer | Deadbeef <ent3rm4n@gmail.com> | 2021-07-10 20:54:48 +0800 |
| commit | 56d79adf3be666a4583ffeddd276de5c8b6ab32e (patch) | |
| tree | 8b0c31f3ff1a65caf4843a8b02bb844101bc4465 | |
| parent | d8d4cc3b98b78fae879b9540f237ad31268d6430 (diff) | |
| download | rust-56d79adf3be666a4583ffeddd276de5c8b6ab32e.tar.gz rust-56d79adf3be666a4583ffeddd276de5c8b6ab32e.zip | |
Skip check for calling functions in same trait
| -rw-r--r-- | compiler/rustc_mir/src/transform/check_consts/validation.rs | 14 | ||||
| -rw-r--r-- | src/test/ui/rfc-2632-const-trait-impl/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 6216ff6656e..e6a4f08836a 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 bc2fcf81c63..6a1a72f2970 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(); } |
