about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDeadbeef <ent3rm4n@gmail.com>2021-07-07 11:52:40 +0800
committerDeadbeef <ent3rm4n@gmail.com>2021-07-10 20:54:48 +0800
commit56d79adf3be666a4583ffeddd276de5c8b6ab32e (patch)
tree8b0c31f3ff1a65caf4843a8b02bb844101bc4465
parentd8d4cc3b98b78fae879b9540f237ad31268d6430 (diff)
downloadrust-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.rs14
-rw-r--r--src/test/ui/rfc-2632-const-trait-impl/const-default-method-bodies.rs6
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();
 }