about summary refs log tree commit diff
diff options
context:
space:
mode:
authorChristoph Schmidler <c.schmidler@gmail.com>2019-12-12 17:23:14 +0100
committerChristoph Schmidler <c.schmidler@gmail.com>2020-03-05 08:09:52 +0100
commit337af5ef7a31855fd7f6d6b77c9e52d6d747c350 (patch)
tree336c013d30a7e338a35ac597f406b0c45f104a23
parent75cf41afb468152611212271bae026948cd3ba46 (diff)
downloadrust-337af5ef7a31855fd7f6d6b77c9e52d6d747c350.tar.gz
rust-337af5ef7a31855fd7f6d6b77c9e52d6d747c350.zip
Prepare const_limit feature gate and attribute
-rw-r--r--src/doc/unstable-book/src/language-features/const-limit.md7
-rw-r--r--src/librustc/middle/limits.rs (renamed from src/librustc/middle/recursion_limit.rs)3
-rw-r--r--src/librustc_feature/active.rs3
-rw-r--r--src/librustc_feature/builtin_attrs.rs4
-rw-r--r--src/librustc_session/session.rs4
-rw-r--r--src/librustc_span/symbol.rs1
-rw-r--r--src/test/ui/consts/const_limit/feature-gate-const_limit.rs12
-rw-r--r--src/test/ui/consts/const_limit/feature-gate-const_limit.stderr12
8 files changed, 45 insertions, 1 deletions
diff --git a/src/doc/unstable-book/src/language-features/const-limit.md b/src/doc/unstable-book/src/language-features/const-limit.md
new file mode 100644
index 00000000000..2fc5963dc6e
--- /dev/null
+++ b/src/doc/unstable-book/src/language-features/const-limit.md
@@ -0,0 +1,7 @@
+# `const_limit`
+
+The tracking issue for this feature is: [#67217]
+
+[#57563]: https://github.com/rust-lang/rust/issues/67217
+
+The `const_limit` allows someone to limit the evaluation steps the CTFE undertakes to evaluate a `const fn`.
\ No newline at end of file
diff --git a/src/librustc/middle/recursion_limit.rs b/src/librustc/middle/limits.rs
index ae31a2cc63d..a831d99d4ed 100644
--- a/src/librustc/middle/recursion_limit.rs
+++ b/src/librustc/middle/limits.rs
@@ -1,4 +1,4 @@
-// Recursion limit.
+// Registering limits, recursion_limit, type_length_limit and const_limit
 //
 // There are various parts of the compiler that must impose arbitrary limits
 // on how deeply they recurse to prevent stack overflow. Users can override
@@ -16,6 +16,7 @@ use rustc_data_structures::sync::Once;
 pub fn update_limits(sess: &Session, krate: &ast::Crate) {
     update_limit(sess, krate, &sess.recursion_limit, sym::recursion_limit, 128);
     update_limit(sess, krate, &sess.type_length_limit, sym::type_length_limit, 1048576);
+    update_limit(sess, krate, &sess.const_limit, sym::const_limit, 128);
 }
 
 fn update_limit(
diff --git a/src/librustc_feature/active.rs b/src/librustc_feature/active.rs
index 0082f4f1a6e..2f9394cd566 100644
--- a/src/librustc_feature/active.rs
+++ b/src/librustc_feature/active.rs
@@ -532,6 +532,9 @@ declare_features! (
     /// Allows using `&mut` in constant functions.
     (active, const_mut_refs, "1.41.0", Some(57349), None),
 
+    // Allows limiting the evaluation steps of const expressions
+    (active, const_limit, "1.41.0", Some(67217), None),
+
     /// Allows the use of `loop` and `while` in constants.
     (active, const_loop, "1.41.0", Some(52000), None),
 
diff --git a/src/librustc_feature/builtin_attrs.rs b/src/librustc_feature/builtin_attrs.rs
index e2e061c185c..2b79f6bd942 100644
--- a/src/librustc_feature/builtin_attrs.rs
+++ b/src/librustc_feature/builtin_attrs.rs
@@ -239,6 +239,10 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
     // Limits:
     ungated!(recursion_limit, CrateLevel, template!(NameValueStr: "N")),
     ungated!(type_length_limit, CrateLevel, template!(NameValueStr: "N")),
+    gated!(
+        const_limit, CrateLevel, template!(NameValueStr: "N"), const_limit,
+        experimental!(const_limit)
+    ),
 
     // Entry point:
     ungated!(main, Normal, template!(Word)),
diff --git a/src/librustc_session/session.rs b/src/librustc_session/session.rs
index 2fb7977dce9..a8879f00c80 100644
--- a/src/librustc_session/session.rs
+++ b/src/librustc_session/session.rs
@@ -88,6 +88,9 @@ pub struct Session {
     /// The maximum length of types during monomorphization.
     pub type_length_limit: Once<usize>,
 
+    /// The maximum blocks a const expression can evaluate.
+    pub const_limit: Once<usize>,
+
     /// Map from imported macro spans (which consist of
     /// the localized span for the macro body) to the
     /// macro name and definition span in the source crate.
@@ -1053,6 +1056,7 @@ fn build_session_(
         features: Once::new(),
         recursion_limit: Once::new(),
         type_length_limit: Once::new(),
+        const_limit: Once::new(),
         imported_macro_spans: OneThread::new(RefCell::new(FxHashMap::default())),
         incr_comp_session: OneThread::new(RefCell::new(IncrCompSession::NotInitialized)),
         cgu_reuse_tracker,
diff --git a/src/librustc_span/symbol.rs b/src/librustc_span/symbol.rs
index d6232f32f4c..e92e2fc1d43 100644
--- a/src/librustc_span/symbol.rs
+++ b/src/librustc_span/symbol.rs
@@ -208,6 +208,7 @@ symbols! {
         console,
         const_compare_raw_pointers,
         const_constructor,
+        const_limit,
         const_extern_fn,
         const_fn,
         const_fn_union,
diff --git a/src/test/ui/consts/const_limit/feature-gate-const_limit.rs b/src/test/ui/consts/const_limit/feature-gate-const_limit.rs
new file mode 100644
index 00000000000..11d2b6af25d
--- /dev/null
+++ b/src/test/ui/consts/const_limit/feature-gate-const_limit.rs
@@ -0,0 +1,12 @@
+#![const_limit="1"]
+//~^ ERROR the `#[const_limit]` attribute is an experimental feature [E0658]
+
+const CONSTANT: usize = limit();
+
+fn main() {}
+
+const fn limit() -> usize {
+    let x = 42;
+
+    x * 42
+}
diff --git a/src/test/ui/consts/const_limit/feature-gate-const_limit.stderr b/src/test/ui/consts/const_limit/feature-gate-const_limit.stderr
new file mode 100644
index 00000000000..db248994b47
--- /dev/null
+++ b/src/test/ui/consts/const_limit/feature-gate-const_limit.stderr
@@ -0,0 +1,12 @@
+error[E0658]: the `#[const_limit]` attribute is an experimental feature
+  --> $DIR/feature-gate-const_limit.rs:1:1
+   |
+LL | #![const_limit="1"]
+   | ^^^^^^^^^^^^^^^^^^^
+   |
+   = note: for more information, see https://github.com/rust-lang/rust/issues/67217
+   = help: add `#![feature(const_limit)]` to the crate attributes to enable
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0658`.