about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorMatthew Jasper <mjjasper1@gmail.com>2019-10-07 21:08:39 +0100
committerMatthew Jasper <mjjasper1@gmail.com>2019-10-27 21:25:35 +0000
commit170718c93f3defba2edee69bae7abd64d1672355 (patch)
tree113d98102bc52d32c2d72f333a44606dcfc7114f /src
parent95f437b3cfb2fec966d7eaf69d7c2e36f9c274d1 (diff)
downloadrust-170718c93f3defba2edee69bae7abd64d1672355.tar.gz
rust-170718c93f3defba2edee69bae7abd64d1672355.zip
Stabilize `const_constructor`
Diffstat (limited to 'src')
-rw-r--r--src/librustc/ty/constness.rs11
-rw-r--r--src/libsyntax/feature_gate/accepted.rs2
-rw-r--r--src/libsyntax/feature_gate/active.rs3
-rw-r--r--src/test/ui/consts/const_constructor/const-construct-call.rs2
-rw-r--r--src/test/ui/consts/const_constructor/const_constructor_qpath.rs40
-rw-r--r--src/test/ui/consts/const_constructor/feature-gate-const_constructor.const_fn.stderr34
-rw-r--r--src/test/ui/consts/const_constructor/feature-gate-const_constructor.min_const_fn.stderr34
-rw-r--r--src/test/ui/consts/const_constructor/feature-gate-const_constructor.rs28
8 files changed, 45 insertions, 109 deletions
diff --git a/src/librustc/ty/constness.rs b/src/librustc/ty/constness.rs
index e4022bb24ad..676916f530a 100644
--- a/src/librustc/ty/constness.rs
+++ b/src/librustc/ty/constness.rs
@@ -2,7 +2,7 @@ use crate::ty::query::Providers;
 use crate::hir::def_id::DefId;
 use crate::hir;
 use crate::ty::TyCtxt;
-use syntax_pos::symbol::{sym, Symbol};
+use syntax_pos::symbol::Symbol;
 use crate::hir::map::blocks::FnLikeNode;
 use syntax::attr;
 
@@ -13,14 +13,11 @@ impl<'tcx> TyCtxt<'tcx> {
         self.is_const_fn_raw(def_id) && match self.is_unstable_const_fn(def_id) {
             Some(feature_name) => {
                 // has a `rustc_const_unstable` attribute, check whether the user enabled the
-                // corresponding feature gate, const_constructor is not a lib feature, so has
-                // to be checked separately.
+                // corresponding feature gate.
                 self.features()
                     .declared_lib_features
                     .iter()
                     .any(|&(sym, _)| sym == feature_name)
-                    || (feature_name == sym::const_constructor
-                        && self.features().const_constructor)
             },
             // functions without const stability are either stable user written
             // const fn or the user is using feature gates and we thus don't
@@ -31,9 +28,7 @@ impl<'tcx> TyCtxt<'tcx> {
 
     /// Whether the `def_id` is an unstable const fn and what feature gate is necessary to enable it
     pub fn is_unstable_const_fn(self, def_id: DefId) -> Option<Symbol> {
-        if self.is_constructor(def_id) {
-            Some(sym::const_constructor)
-        } else if self.is_const_fn_raw(def_id) {
+        if self.is_const_fn_raw(def_id) {
             self.lookup_stability(def_id)?.const_stability
         } else {
             None
diff --git a/src/libsyntax/feature_gate/accepted.rs b/src/libsyntax/feature_gate/accepted.rs
index 36fcab8450b..d309a17298b 100644
--- a/src/libsyntax/feature_gate/accepted.rs
+++ b/src/libsyntax/feature_gate/accepted.rs
@@ -249,6 +249,8 @@ declare_features! (
     (accepted, macros_in_extern, "1.40.0", Some(49476), None),
     /// Allows future-proofing enums/structs with the `#[non_exhaustive]` attribute (RFC 2008).
     (accepted, non_exhaustive, "1.40.0", Some(44109), None),
+    /// Allows calling constructor functions in `const fn`.
+    (accepted, const_constructor, "1.40.0", Some(61456), None),
 
     // -------------------------------------------------------------------------
     // feature-group-end: accepted features
diff --git a/src/libsyntax/feature_gate/active.rs b/src/libsyntax/feature_gate/active.rs
index f6e1d6c4224..3754a3d6fe9 100644
--- a/src/libsyntax/feature_gate/active.rs
+++ b/src/libsyntax/feature_gate/active.rs
@@ -488,9 +488,6 @@ declare_features! (
     /// Allows the user of associated type bounds.
     (active, associated_type_bounds, "1.34.0", Some(52662), None),
 
-    /// Allows calling constructor functions in `const fn`.
-    (active, const_constructor, "1.37.0", Some(61456), None),
-
     /// Allows `if/while p && let q = r && ...` chains.
     (active, let_chains, "1.37.0", Some(53667), None),
 
diff --git a/src/test/ui/consts/const_constructor/const-construct-call.rs b/src/test/ui/consts/const_constructor/const-construct-call.rs
index f2d2bda53c0..d883d3fa6e4 100644
--- a/src/test/ui/consts/const_constructor/const-construct-call.rs
+++ b/src/test/ui/consts/const_constructor/const-construct-call.rs
@@ -6,8 +6,6 @@
 
 #![cfg_attr(const_fn, feature(const_fn))]
 
-#![feature(const_constructor)]
-
 // Ctor(..) is transformed to Ctor { 0: ... } in HAIR lowering, so directly
 // calling constructors doesn't require them to be const.
 
diff --git a/src/test/ui/consts/const_constructor/const_constructor_qpath.rs b/src/test/ui/consts/const_constructor/const_constructor_qpath.rs
new file mode 100644
index 00000000000..18aa3d8e816
--- /dev/null
+++ b/src/test/ui/consts/const_constructor/const_constructor_qpath.rs
@@ -0,0 +1,40 @@
+// revisions: min_const_fn const_fn
+// run-pass
+
+#![cfg_attr(const_fn, feature(const_fn))]
+
+trait ConstDefault {
+    const DEFAULT: Self;
+}
+
+#[derive(PartialEq)]
+enum E {
+    V(i32),
+    W(usize),
+}
+
+impl ConstDefault for E {
+    const DEFAULT: Self = Self::V(23);
+}
+
+impl ConstDefault for Option<i32> {
+    const DEFAULT: Self = Self::Some(23);
+}
+
+impl E {
+    const NON_DEFAULT: Self = Self::W(12);
+    const fn local_fn() -> Self {
+        Self::V(23)
+    }
+}
+
+const fn explicit_qpath() -> E {
+    let _x = <Option<usize>>::Some(23);
+    <E>::W(12)
+}
+
+fn main() {
+    assert!(E::DEFAULT == E::local_fn());
+    assert!(Option::DEFAULT == Some(23));
+    assert!(E::NON_DEFAULT == explicit_qpath());
+}
diff --git a/src/test/ui/consts/const_constructor/feature-gate-const_constructor.const_fn.stderr b/src/test/ui/consts/const_constructor/feature-gate-const_constructor.const_fn.stderr
deleted file mode 100644
index fa4f83ed01e..00000000000
--- a/src/test/ui/consts/const_constructor/feature-gate-const_constructor.const_fn.stderr
+++ /dev/null
@@ -1,34 +0,0 @@
-error: `std::prelude::v1::Some` is not yet stable as a const fn
-  --> $DIR/feature-gate-const_constructor.rs:9:37
-   |
-LL | const EXTERNAL_CONST: Option<i32> = {Some}(1);
-   |                                     ^^^^^^^^^
-   |
-   = help: add `#![feature(const_constructor)]` to the crate attributes to enable
-
-error: `E::V` is not yet stable as a const fn
-  --> $DIR/feature-gate-const_constructor.rs:12:24
-   |
-LL | const LOCAL_CONST: E = {E::V}(1);
-   |                        ^^^^^^^^^
-   |
-   = help: add `#![feature(const_constructor)]` to the crate attributes to enable
-
-error: `std::prelude::v1::Some` is not yet stable as a const fn
-  --> $DIR/feature-gate-const_constructor.rs:17:13
-   |
-LL |     let _ = {Some}(1);
-   |             ^^^^^^^^^
-   |
-   = help: add `#![feature(const_constructor)]` to the crate attributes to enable
-
-error: `E::V` is not yet stable as a const fn
-  --> $DIR/feature-gate-const_constructor.rs:23:13
-   |
-LL |     let _ = {E::V}(1);
-   |             ^^^^^^^^^
-   |
-   = help: add `#![feature(const_constructor)]` to the crate attributes to enable
-
-error: aborting due to 4 previous errors
-
diff --git a/src/test/ui/consts/const_constructor/feature-gate-const_constructor.min_const_fn.stderr b/src/test/ui/consts/const_constructor/feature-gate-const_constructor.min_const_fn.stderr
deleted file mode 100644
index fa4f83ed01e..00000000000
--- a/src/test/ui/consts/const_constructor/feature-gate-const_constructor.min_const_fn.stderr
+++ /dev/null
@@ -1,34 +0,0 @@
-error: `std::prelude::v1::Some` is not yet stable as a const fn
-  --> $DIR/feature-gate-const_constructor.rs:9:37
-   |
-LL | const EXTERNAL_CONST: Option<i32> = {Some}(1);
-   |                                     ^^^^^^^^^
-   |
-   = help: add `#![feature(const_constructor)]` to the crate attributes to enable
-
-error: `E::V` is not yet stable as a const fn
-  --> $DIR/feature-gate-const_constructor.rs:12:24
-   |
-LL | const LOCAL_CONST: E = {E::V}(1);
-   |                        ^^^^^^^^^
-   |
-   = help: add `#![feature(const_constructor)]` to the crate attributes to enable
-
-error: `std::prelude::v1::Some` is not yet stable as a const fn
-  --> $DIR/feature-gate-const_constructor.rs:17:13
-   |
-LL |     let _ = {Some}(1);
-   |             ^^^^^^^^^
-   |
-   = help: add `#![feature(const_constructor)]` to the crate attributes to enable
-
-error: `E::V` is not yet stable as a const fn
-  --> $DIR/feature-gate-const_constructor.rs:23:13
-   |
-LL |     let _ = {E::V}(1);
-   |             ^^^^^^^^^
-   |
-   = help: add `#![feature(const_constructor)]` to the crate attributes to enable
-
-error: aborting due to 4 previous errors
-
diff --git a/src/test/ui/consts/const_constructor/feature-gate-const_constructor.rs b/src/test/ui/consts/const_constructor/feature-gate-const_constructor.rs
deleted file mode 100644
index b37fd2fd243..00000000000
--- a/src/test/ui/consts/const_constructor/feature-gate-const_constructor.rs
+++ /dev/null
@@ -1,28 +0,0 @@
-// revisions: min_const_fn const_fn
-
-#![cfg_attr(const_fn, feature(const_fn))]
-
-enum E {
-    V(i32),
-}
-
-const EXTERNAL_CONST: Option<i32> = {Some}(1);
-//[min_const_fn]~^ ERROR is not yet stable as a const fn
-//[const_fn]~^^ ERROR is not yet stable as a const fn
-const LOCAL_CONST: E = {E::V}(1);
-//[min_const_fn]~^ ERROR is not yet stable as a const fn
-//[const_fn]~^^ ERROR is not yet stable as a const fn
-
-const fn external_fn() {
-    let _ = {Some}(1);
-    //[min_const_fn]~^ ERROR is not yet stable as a const fn
-    //[const_fn]~^^ ERROR is not yet stable as a const fn
-}
-
-const fn local_fn() {
-    let _ = {E::V}(1);
-    //[min_const_fn]~^ ERROR is not yet stable as a const fn
-    //[const_fn]~^^ ERROR is not yet stable as a const fn
-}
-
-fn main() {}