From 375bccb8b3fa2a517e6e19e24da25cad0413987d Mon Sep 17 00:00:00 2001 From: Bastian Kauschke Date: Wed, 5 Aug 2020 18:27:54 +0200 Subject: [PATCH] add min_const_generics feature gate --- src/librustc_ast_passes/ast_validation.rs | 8 +++++++- src/librustc_ast_passes/feature_gate.rs | 7 ++++--- src/librustc_feature/active.rs | 3 +++ src/librustc_middle/ty/context.rs | 4 +++- src/librustc_span/symbol.rs | 1 + src/librustc_typeck/collect.rs | 3 +++ 6 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/librustc_ast_passes/ast_validation.rs b/src/librustc_ast_passes/ast_validation.rs index daf3e23d6a1..0e98c047c2f 100644 --- a/src/librustc_ast_passes/ast_validation.rs +++ b/src/librustc_ast_passes/ast_validation.rs @@ -776,7 +776,13 @@ fn validate_generic_param_order<'a>( span, &format!( "reorder the parameters: lifetimes, then types{}", - if sess.features_untracked().const_generics { ", then consts" } else { "" }, + if sess.features_untracked().const_generics + || sess.features_untracked().min_const_generics + { + ", then consts" + } else { + "" + }, ), ordered_params.clone(), Applicability::MachineApplicable, diff --git a/src/librustc_ast_passes/feature_gate.rs b/src/librustc_ast_passes/feature_gate.rs index 22eaca4f071..0c8edc565bd 100644 --- a/src/librustc_ast_passes/feature_gate.rs +++ b/src/librustc_ast_passes/feature_gate.rs @@ -526,12 +526,13 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> { fn visit_generic_param(&mut self, param: &'a GenericParam) { if let GenericParamKind::Const { .. } = param.kind { - gate_feature_post!( + gate_feature_fn!( &self, - const_generics, + |x: &Features| x.const_generics || x.min_const_generics, param.ident.span, + sym::const_generics, "const generics are unstable" - ) + ); } visit::walk_generic_param(self, param) } diff --git a/src/librustc_feature/active.rs b/src/librustc_feature/active.rs index d7c310a8b4c..d726fd8d5f7 100644 --- a/src/librustc_feature/active.rs +++ b/src/librustc_feature/active.rs @@ -579,6 +579,9 @@ declare_features! ( /// Alloc calling `transmute` in const fn (active, const_fn_transmute, "1.46.0", Some(53605), None), + /// The smallest useful subset of `const_generics`. + (active, min_const_generics, "1.46.0", None, None), + // ------------------------------------------------------------------------- // feature-group-end: actual feature gates // ------------------------------------------------------------------------- diff --git a/src/librustc_middle/ty/context.rs b/src/librustc_middle/ty/context.rs index 6cbf5db8373..16f5e9a42d3 100644 --- a/src/librustc_middle/ty/context.rs +++ b/src/librustc_middle/ty/context.rs @@ -1380,7 +1380,9 @@ impl<'tcx> TyCtxt<'tcx> { /// we still evaluate them eagerly. #[inline] pub fn lazy_normalization(self) -> bool { - self.features().const_generics || self.features().lazy_normalization_consts + let features = self.features(); + // Note: We do not enable lazy normalization for `features.min_const_generics`. + features.const_generics || features.lazy_normalization_consts } #[inline] diff --git a/src/librustc_span/symbol.rs b/src/librustc_span/symbol.rs index 98776a04782..5203bfdb3b7 100644 --- a/src/librustc_span/symbol.rs +++ b/src/librustc_span/symbol.rs @@ -672,6 +672,7 @@ symbols! { min_align_of, min_align_of_val, min_const_fn, + min_const_generics, min_const_unsafe_fn, min_specialization, minnumf32, diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs index 97df065500a..bab8db46a9d 100644 --- a/src/librustc_typeck/collect.rs +++ b/src/librustc_typeck/collect.rs @@ -1238,6 +1238,9 @@ 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 // used with const generics, e.g. `Foo<{N+1}>`, can work at all. + // + // Note that we do not supply the parent generics when using + // `feature(min_const_generics)`. Some(parent_def_id.to_def_id()) } else { let parent_node = tcx.hir().get(tcx.hir().get_parent_node(hir_id));