diff options
| author | Matthew Jasper <mjjasper1@gmail.com> | 2019-10-07 21:08:39 +0100 |
|---|---|---|
| committer | Matthew Jasper <mjjasper1@gmail.com> | 2019-10-27 21:25:35 +0000 |
| commit | 170718c93f3defba2edee69bae7abd64d1672355 (patch) | |
| tree | 113d98102bc52d32c2d72f333a44606dcfc7114f /src | |
| parent | 95f437b3cfb2fec966d7eaf69d7c2e36f9c274d1 (diff) | |
| download | rust-170718c93f3defba2edee69bae7abd64d1672355.tar.gz rust-170718c93f3defba2edee69bae7abd64d1672355.zip | |
Stabilize `const_constructor`
Diffstat (limited to 'src')
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() {} |
