diff options
| author | lcnr <rust@lcnr.de> | 2021-08-27 18:04:57 +0200 |
|---|---|---|
| committer | lcnr <rust@lcnr.de> | 2021-08-30 11:00:21 +0200 |
| commit | 0c28e028b6f45f33447f24de7dd762b8599b7a4e (patch) | |
| tree | 3a573ebc79c4aefed676f4a693ebb62d32ea4e7f /compiler | |
| parent | c0e853f274c42665373b719a5bd7b3f95afe10c2 (diff) | |
| download | rust-0c28e028b6f45f33447f24de7dd762b8599b7a4e.tar.gz rust-0c28e028b6f45f33447f24de7dd762b8599b7a4e.zip | |
`feature(const_generics)` -> `feature(const_param_types)`
Diffstat (limited to 'compiler')
19 files changed, 27 insertions, 30 deletions
diff --git a/compiler/rustc_ast/src/ast.rs b/compiler/rustc_ast/src/ast.rs index 2b86128b3f7..d0a95ea130a 100644 --- a/compiler/rustc_ast/src/ast.rs +++ b/compiler/rustc_ast/src/ast.rs @@ -332,7 +332,7 @@ pub type GenericBounds = Vec<GenericBound>; pub enum ParamKindOrd { Lifetime, Type, - // `unordered` is only `true` if `sess.has_features().const_generics` + // `unordered` is only `true` if `sess.has_features().const_generics_defaults` // is active. Specifically, if it's only `min_const_generics`, it will still require // ordering consts after types. Const { unordered: bool }, diff --git a/compiler/rustc_ast_passes/src/feature_gate.rs b/compiler/rustc_ast_passes/src/feature_gate.rs index 557271e32ad..1defb65ed87 100644 --- a/compiler/rustc_ast_passes/src/feature_gate.rs +++ b/compiler/rustc_ast_passes/src/feature_gate.rs @@ -687,7 +687,6 @@ pub fn check_crate(krate: &ast::Crate, sess: &Session) { gate_all!(trait_alias, "trait aliases are experimental"); gate_all!(associated_type_bounds, "associated type bounds are unstable"); gate_all!(crate_visibility_modifier, "`crate` visibility modifier is experimental"); - gate_all!(const_generics, "const generics are unstable"); gate_all!(decl_macro, "`macro` is experimental"); gate_all!(box_patterns, "box pattern syntax is experimental"); gate_all!(exclusive_range_pattern, "exclusive range pattern syntax is experimental"); diff --git a/compiler/rustc_error_codes/src/error_codes/E0671.md b/compiler/rustc_error_codes/src/error_codes/E0671.md index a993ce826a7..d4dbfb7a5d8 100644 --- a/compiler/rustc_error_codes/src/error_codes/E0671.md +++ b/compiler/rustc_error_codes/src/error_codes/E0671.md @@ -4,8 +4,6 @@ Const parameters cannot depend on type parameters. The following is therefore invalid: ```compile_fail,E0770 -#![feature(const_generics)] - fn const_id<T, const N: T>() -> T { // error N } diff --git a/compiler/rustc_error_codes/src/error_codes/E0741.md b/compiler/rustc_error_codes/src/error_codes/E0741.md index 91379bfe05c..510075dc779 100644 --- a/compiler/rustc_error_codes/src/error_codes/E0741.md +++ b/compiler/rustc_error_codes/src/error_codes/E0741.md @@ -3,7 +3,7 @@ A non-structural-match type was used as the type of a const generic parameter. Erroneous code example: ```compile_fail,E0741 -#![feature(const_generics)] +#![feature(const_param_types)] struct A; @@ -16,7 +16,7 @@ may be used as the types of const generic parameters. To fix the previous code example, we derive `PartialEq` and `Eq`: ``` -#![feature(const_generics)] +#![feature(const_param_types)] #[derive(PartialEq, Eq)] // We derive both traits here. struct A; diff --git a/compiler/rustc_error_codes/src/error_codes/E0770.md b/compiler/rustc_error_codes/src/error_codes/E0770.md index b39163a9de3..cd8fc481bf0 100644 --- a/compiler/rustc_error_codes/src/error_codes/E0770.md +++ b/compiler/rustc_error_codes/src/error_codes/E0770.md @@ -3,7 +3,6 @@ The type of a const parameter references other generic parameters. Erroneous code example: ```compile_fail,E0770 -#![feature(const_generics)] fn foo<T, const N: T>() {} // error! ``` diff --git a/compiler/rustc_error_codes/src/error_codes/E0771.md b/compiler/rustc_error_codes/src/error_codes/E0771.md index 824a955f6b3..c1e133673ca 100644 --- a/compiler/rustc_error_codes/src/error_codes/E0771.md +++ b/compiler/rustc_error_codes/src/error_codes/E0771.md @@ -4,7 +4,7 @@ allowed. Erroneous code example: ```compile_fail,E0771 -#![feature(const_generics)] +#![feature(const_param_types)] fn function_with_str<'a, const STRING: &'a str>() {} // error! ``` @@ -13,7 +13,7 @@ To fix this issue, the lifetime in the const generic need to be changed to `'static`: ``` -#![feature(const_generics)] +#![feature(const_param_types)] fn function_with_str<const STRING: &'static str>() {} // ok! ``` diff --git a/compiler/rustc_feature/src/accepted.rs b/compiler/rustc_feature/src/accepted.rs index 18294dfad24..725f8b8763a 100644 --- a/compiler/rustc_feature/src/accepted.rs +++ b/compiler/rustc_feature/src/accepted.rs @@ -273,7 +273,7 @@ declare_features! ( /// Allows patterns with concurrent by-move and by-ref bindings. /// For example, you can write `Foo(a, ref b)` where `a` is by-move and `b` is by-ref. (accepted, move_ref_pattern, "1.49.0", Some(68354), None), - /// The smallest useful subset of `const_generics`. + /// The smallest useful subset of const generics. (accepted, min_const_generics, "1.51.0", Some(74878), None), /// The `unsafe_op_in_unsafe_fn` lint (allowed by default): no longer treat an unsafe function as an unsafe block. (accepted, unsafe_block_in_unsafe_fn, "1.52.0", Some(71668), None), diff --git a/compiler/rustc_feature/src/active.rs b/compiler/rustc_feature/src/active.rs index 222b17615e2..e2c88835f52 100644 --- a/compiler/rustc_feature/src/active.rs +++ b/compiler/rustc_feature/src/active.rs @@ -71,7 +71,7 @@ macro_rules! declare_features { } pub fn unordered_const_ty_params(&self) -> bool { - self.const_generics || self.const_generics_defaults + self.const_generics_defaults } /// Some features are known to be incomplete and using them is likely to have @@ -453,9 +453,6 @@ declare_features! ( /// Allows using `#[ffi_returns_twice]` on foreign functions. (active, ffi_returns_twice, "1.34.0", Some(58314), None), - /// Allows const generic types (e.g. `struct Foo<const N: usize>(...);`). - (incomplete, const_generics, "1.34.0", Some(44580), None), - /// Allows using `#[optimize(X)]`. (active, optimize_attribute, "1.34.0", Some(54882), None), @@ -676,6 +673,9 @@ declare_features! ( /// Allows non-trivial generic constants which have to have wfness manually propagated to callers (incomplete, generic_const_exprs, "1.56.0", Some(76560), None), + /// Allows additional const parameter types, such as `&'static str` or user defined types + (incomplete, const_param_types, "1.56.0", Some(44580), None), + // ------------------------------------------------------------------------- // feature-group-end: actual feature gates // ------------------------------------------------------------------------- diff --git a/compiler/rustc_feature/src/removed.rs b/compiler/rustc_feature/src/removed.rs index 326daf21e40..dd17b8ab22b 100644 --- a/compiler/rustc_feature/src/removed.rs +++ b/compiler/rustc_feature/src/removed.rs @@ -102,6 +102,9 @@ declare_features! ( (removed, extern_in_paths, "1.33.0", Some(55600), None, Some("subsumed by `::foo::bar` paths")), (removed, quote, "1.33.0", Some(29601), None, None), + /// Allows const generic types (e.g. `struct Foo<const N: usize>(...);`). + (removed, const_generics, "1.34.0", Some(44580), None, + Some("removed in favor of `#![feature(const_param_types]` and `#![feature(generic_const_exprs)]`")), /// Allows `[x; N]` where `x` is a constant (RFC 2203). (removed, const_in_array_repeat_expressions, "1.37.0", Some(49147), None, Some("removed due to causing promotable bugs")), diff --git a/compiler/rustc_infer/src/infer/combine.rs b/compiler/rustc_infer/src/infer/combine.rs index 32308910aa7..a0ee212bed0 100644 --- a/compiler/rustc_infer/src/infer/combine.rs +++ b/compiler/rustc_infer/src/infer/combine.rs @@ -202,7 +202,7 @@ impl<'infcx, 'tcx> InferCtxt<'infcx, 'tcx> { /// A good example of this is the following: /// /// ```rust - /// #![feature(const_generics)] + /// #![feature(generic_const_exprs)] /// /// fn bind<const N: usize>(value: [u8; N]) -> [u8; 3 + 4] { /// todo!() diff --git a/compiler/rustc_lint/src/builtin.rs b/compiler/rustc_lint/src/builtin.rs index a5b4fa15921..88b9e92119f 100644 --- a/compiler/rustc_lint/src/builtin.rs +++ b/compiler/rustc_lint/src/builtin.rs @@ -2340,7 +2340,7 @@ declare_lint! { /// ### Example /// /// ```rust - /// #![feature(const_generics)] + /// #![feature(generic_const_exprs)] /// ``` /// /// {{produces}} diff --git a/compiler/rustc_middle/src/ty/context.rs b/compiler/rustc_middle/src/ty/context.rs index a9ee921399a..de7c6d9e095 100644 --- a/compiler/rustc_middle/src/ty/context.rs +++ b/compiler/rustc_middle/src/ty/context.rs @@ -1420,8 +1420,8 @@ impl<'tcx> TyCtxt<'tcx> { #[inline] pub fn lazy_normalization(self) -> bool { let features = self.features(); - // Note: We do not enable lazy normalization for `min_const_generics`. - features.const_generics || features.generic_const_exprs + // Note: We only use lazy normalization for generic const expressions. + features.generic_const_exprs } #[inline] diff --git a/compiler/rustc_resolve/src/diagnostics.rs b/compiler/rustc_resolve/src/diagnostics.rs index a4f75494238..0b1687d1bd8 100644 --- a/compiler/rustc_resolve/src/diagnostics.rs +++ b/compiler/rustc_resolve/src/diagnostics.rs @@ -506,8 +506,7 @@ impl<'a> Resolver<'a> { if self.session.is_nightly_build() { err.help( - "use `#![feature(const_generics)]` and `#![feature(generic_const_exprs)]` \ - to allow generic const expressions", + "use `#![feature(generic_const_exprs)]` to allow generic const expressions", ); } diff --git a/compiler/rustc_resolve/src/late/diagnostics.rs b/compiler/rustc_resolve/src/late/diagnostics.rs index b3601ecf1d3..45657f2d0f2 100644 --- a/compiler/rustc_resolve/src/late/diagnostics.rs +++ b/compiler/rustc_resolve/src/late/diagnostics.rs @@ -2245,7 +2245,7 @@ impl<'tcx> LifetimeContext<'_, 'tcx> { } /// Non-static lifetimes are prohibited in anonymous constants under `min_const_generics`. - /// This function will emit an error if `const_generics` is not enabled, the body identified by + /// This function will emit an error if `generic_const_exprs` is not enabled, the body identified by /// `body_id` is an anonymous constant and `lifetime_ref` is non-static. crate fn maybe_emit_forbidden_non_static_lifetime_error( &self, @@ -2264,7 +2264,7 @@ impl<'tcx> LifetimeContext<'_, 'tcx> { if !self.tcx.lazy_normalization() && is_anon_const && !is_allowed_lifetime { feature_err( &self.tcx.sess.parse_sess, - sym::const_generics, + sym::generic_const_exprs, lifetime_ref.span, "a non-static lifetime is not allowed in a `const`", ) diff --git a/compiler/rustc_resolve/src/late/lifetimes.rs b/compiler/rustc_resolve/src/late/lifetimes.rs index bc2c46ec0aa..e901d4c00ab 100644 --- a/compiler/rustc_resolve/src/late/lifetimes.rs +++ b/compiler/rustc_resolve/src/late/lifetimes.rs @@ -2301,7 +2301,7 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> { match *scope { Scope::Body { id, s } => { // Non-static lifetimes are prohibited in anonymous constants without - // `const_generics`. + // `generic_const_exprs`. self.maybe_emit_forbidden_non_static_lifetime_error(id, lifetime_ref); outermost_body = Some(id); diff --git a/compiler/rustc_resolve/src/lib.rs b/compiler/rustc_resolve/src/lib.rs index fc8fcf759ad..da3beac0819 100644 --- a/compiler/rustc_resolve/src/lib.rs +++ b/compiler/rustc_resolve/src/lib.rs @@ -2734,8 +2734,7 @@ impl<'a> Resolver<'a> { ConstantItemRibKind(trivial, _) => { let features = self.session.features_untracked(); // HACK(min_const_generics): We currently only allow `N` or `{ N }`. - if !(trivial || features.const_generics || features.generic_const_exprs) - { + if !(trivial || features.generic_const_exprs) { // HACK(min_const_generics): If we encounter `Self` in an anonymous constant // we can't easily tell if it's generic at this stage, so we instead remember // this and then enforce the self type to be concrete later on. @@ -2807,8 +2806,7 @@ impl<'a> Resolver<'a> { ConstantItemRibKind(trivial, _) => { let features = self.session.features_untracked(); // HACK(min_const_generics): We currently only allow `N` or `{ N }`. - if !(trivial || features.const_generics || features.generic_const_exprs) - { + if !(trivial || features.generic_const_exprs) { if record_used { self.report_error( span, diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs index 417d38e9f59..9968cd62d95 100644 --- a/compiler/rustc_span/src/symbol.rs +++ b/compiler/rustc_span/src/symbol.rs @@ -451,6 +451,7 @@ symbols! { const_mut_refs, const_panic, const_panic_fmt, + const_param_types, const_precise_live_drops, const_ptr, const_raw_ptr_deref, diff --git a/compiler/rustc_typeck/src/check/wfcheck.rs b/compiler/rustc_typeck/src/check/wfcheck.rs index 5ade3828b72..761ea6df2e1 100644 --- a/compiler/rustc_typeck/src/check/wfcheck.rs +++ b/compiler/rustc_typeck/src/check/wfcheck.rs @@ -290,7 +290,7 @@ fn check_param_wf(tcx: TyCtxt<'_>, param: &hir::GenericParam<'_>) { let err_ty_str; let mut is_ptr = true; - let err = if tcx.features().const_generics { + let err = if tcx.features().const_param_types { match ty.peel_refs().kind() { ty::FnPtr(_) => Some("function pointers"), ty::RawPtr(_) => Some("raw pointers"), @@ -328,7 +328,7 @@ fn check_param_wf(tcx: TyCtxt<'_>, param: &hir::GenericParam<'_>) { err.note("the only supported types are integers, `bool` and `char`"); if tcx.sess.is_nightly_build() { err.help( - "more complex types are supported with `#![feature(const_generics)]`", + "more complex types are supported with `#![feature(const_param_types)]`", ); } err.emit() diff --git a/compiler/rustc_typeck/src/collect.rs b/compiler/rustc_typeck/src/collect.rs index ff0b47abca9..b8e8854847f 100644 --- a/compiler/rustc_typeck/src/collect.rs +++ b/compiler/rustc_typeck/src/collect.rs @@ -1489,7 +1489,7 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics { } // HACK(eddyb) this provides the correct generics when - // `feature(const_generics)` is enabled, so that const expressions + // `feature(generic_const_expressions)` is enabled, so that const expressions // used with const generics, e.g. `Foo<{N+1}>`, can work at all. // // Note that we do not supply the parent generics when using |
