about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDylan MacKenzie <ecstaticmorse@gmail.com>2020-10-02 12:02:41 -0700
committerDylan MacKenzie <ecstaticmorse@gmail.com>2020-10-05 19:56:50 -0700
commite1d76818b2b505e88bcd0c965da945e7e2e4329e (patch)
treea64db42a2dabd5d889f71e0a4ccc03bc24740add
parenta1dfd2490a6cb456b92e469fa550dc217e20ad6d (diff)
downloadrust-e1d76818b2b505e88bcd0c965da945e7e2e4329e.tar.gz
rust-e1d76818b2b505e88bcd0c965da945e7e2e4329e.zip
Add `#![feature(const_fn_impl)]`
-rw-r--r--compiler/rustc_feature/src/active.rs3
-rw-r--r--compiler/rustc_mir/src/transform/check_consts/ops.rs13
-rw-r--r--compiler/rustc_span/src/symbol.rs1
3 files changed, 15 insertions, 2 deletions
diff --git a/compiler/rustc_feature/src/active.rs b/compiler/rustc_feature/src/active.rs
index cd018ae1204..19da310b3b2 100644
--- a/compiler/rustc_feature/src/active.rs
+++ b/compiler/rustc_feature/src/active.rs
@@ -596,6 +596,9 @@ declare_features! (
     /// Allows rustc to inject a default alloc_error_handler
     (active, default_alloc_error_handler, "1.48.0", Some(66741), None),
 
+    /// Allows argument and return position `impl Trait` in a `const fn`.
+    (active, const_fn_impl_trait, "1.48.0", Some(77463), None),
+
     // -------------------------------------------------------------------------
     // feature-group-end: actual feature gates
     // -------------------------------------------------------------------------
diff --git a/compiler/rustc_mir/src/transform/check_consts/ops.rs b/compiler/rustc_mir/src/transform/check_consts/ops.rs
index 9a1b77e994d..91008f00930 100644
--- a/compiler/rustc_mir/src/transform/check_consts/ops.rs
+++ b/compiler/rustc_mir/src/transform/check_consts/ops.rs
@@ -559,11 +559,20 @@ pub mod ty {
     pub struct ImplTrait;
     impl NonConstOp for ImplTrait {
         fn status_in_item(&self, ccx: &ConstCx<'_, '_>) -> Status {
-            mcf_status_in_item(ccx)
+            if ccx.const_kind() != hir::ConstContext::ConstFn {
+                Status::Allowed
+            } else {
+                Status::Unstable(sym::const_fn_impl_trait)
+            }
         }
 
         fn build_error(&self, ccx: &ConstCx<'_, 'tcx>, span: Span) -> DiagnosticBuilder<'tcx> {
-            mcf_build_error(ccx, span, "`impl Trait` in const fn is unstable")
+            feature_err(
+                &ccx.tcx.sess.parse_sess,
+                sym::const_fn_impl_trait,
+                span,
+                &format!("`impl Trait` is not allowed in {}s", ccx.const_kind()),
+            )
         }
     }
 
diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs
index 6309b00f5f5..123f1f76765 100644
--- a/compiler/rustc_span/src/symbol.rs
+++ b/compiler/rustc_span/src/symbol.rs
@@ -355,6 +355,7 @@ symbols! {
         const_fn,
         const_fn_floating_point_arithmetic,
         const_fn_fn_ptr_basics,
+        const_fn_impl_trait,
         const_fn_transmute,
         const_fn_union,
         const_generics,