pre-expansion gate const_generics
This commit is contained in:
parent
04c661ba02
commit
49cbfa1a6f
9 changed files with 37 additions and 26 deletions
|
|
@ -3,7 +3,7 @@ use super::accepted::ACCEPTED_FEATURES;
|
|||
use super::removed::{REMOVED_FEATURES, STABLE_REMOVED_FEATURES};
|
||||
use super::builtin_attrs::{AttributeGate, BUILTIN_ATTRIBUTE_MAP};
|
||||
|
||||
use crate::ast::{self, NodeId, GenericParam, GenericParamKind, PatKind, RangeEnd, VariantData};
|
||||
use crate::ast::{self, NodeId, PatKind, RangeEnd, VariantData};
|
||||
use crate::attr::{self, check_builtin_attribute};
|
||||
use crate::source_map::Spanned;
|
||||
use crate::edition::{ALL_EDITIONS, Edition};
|
||||
|
|
@ -571,16 +571,6 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
|
|||
visit::walk_fn(self, fn_kind, fn_decl, span)
|
||||
}
|
||||
|
||||
fn visit_generic_param(&mut self, param: &'a GenericParam) {
|
||||
match param.kind {
|
||||
GenericParamKind::Const { .. } =>
|
||||
gate_feature_post!(&self, const_generics, param.ident.span,
|
||||
"const generics are unstable"),
|
||||
_ => {}
|
||||
}
|
||||
visit::walk_generic_param(self, param)
|
||||
}
|
||||
|
||||
fn visit_trait_item(&mut self, ti: &'a ast::TraitItem) {
|
||||
match ti.kind {
|
||||
ast::TraitItemKind::Method(ref sig, ref block) => {
|
||||
|
|
@ -840,6 +830,7 @@ pub fn check_crate(krate: &ast::Crate,
|
|||
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");
|
||||
|
||||
visit::walk_crate(&mut visitor, krate);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -55,11 +55,15 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
|
||||
fn parse_const_param(&mut self, preceding_attrs: Vec<Attribute>) -> PResult<'a, GenericParam> {
|
||||
let lo = self.token.span;
|
||||
|
||||
self.expect_keyword(kw::Const)?;
|
||||
let ident = self.parse_ident()?;
|
||||
self.expect(&token::Colon)?;
|
||||
let ty = self.parse_ty()?;
|
||||
|
||||
self.sess.gated_spans.const_generics.borrow_mut().push(lo.to(self.prev_span));
|
||||
|
||||
Ok(GenericParam {
|
||||
ident,
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
|
|
|
|||
|
|
@ -36,6 +36,8 @@ crate struct GatedSpans {
|
|||
pub associated_type_bounds: Lock<Vec<Span>>,
|
||||
/// Spans collected for gating `crate_visibility_modifier`, e.g. `crate fn`.
|
||||
pub crate_visibility_modifier: Lock<Vec<Span>>,
|
||||
/// Spans collected for gating `const_generics`, e.g. `const N: usize`.
|
||||
pub const_generics: Lock<Vec<Span>>,
|
||||
}
|
||||
|
||||
/// Info about a parsing session.
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
error[E0658]: const generics are unstable
|
||||
--> $DIR/const-param-in-trait-ungated.rs:1:19
|
||||
--> $DIR/const-param-in-trait-ungated.rs:1:13
|
||||
|
|
||||
LL | trait Trait<const T: ()> {}
|
||||
| ^
|
||||
| ^^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see https://github.com/rust-lang/rust/issues/44580
|
||||
= help: add `#![feature(const_generics)]` to the crate attributes to enable
|
||||
|
|
|
|||
|
|
@ -5,10 +5,10 @@ LL | struct B<T, const N: T>(PhantomData<[T; N]>);
|
|||
| ^ const parameter depends on type parameter
|
||||
|
||||
error[E0658]: const generics are unstable
|
||||
--> $DIR/const-param-type-depends-on-type-param-ungated.rs:3:19
|
||||
--> $DIR/const-param-type-depends-on-type-param-ungated.rs:3:13
|
||||
|
|
||||
LL | struct B<T, const N: T>(PhantomData<[T; N]>);
|
||||
| ^
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see https://github.com/rust-lang/rust/issues/44580
|
||||
= help: add `#![feature(const_generics)]` to the crate attributes to enable
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
error[E0658]: const generics are unstable
|
||||
--> $DIR/issue-60263.rs:1:16
|
||||
--> $DIR/issue-60263.rs:1:10
|
||||
|
|
||||
LL | struct B<const I: u8>;
|
||||
| ^
|
||||
| ^^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see https://github.com/rust-lang/rust/issues/44580
|
||||
= help: add `#![feature(const_generics)]` to the crate attributes to enable
|
||||
|
|
|
|||
|
|
@ -1,17 +1,17 @@
|
|||
error[E0658]: const generics are unstable
|
||||
--> $DIR/feature-gate-const_generics-ptr.rs:1:22
|
||||
--> $DIR/feature-gate-const_generics-ptr.rs:1:16
|
||||
|
|
||||
LL | struct ConstFn<const F: fn()>;
|
||||
| ^
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see https://github.com/rust-lang/rust/issues/44580
|
||||
= help: add `#![feature(const_generics)]` to the crate attributes to enable
|
||||
|
||||
error[E0658]: const generics are unstable
|
||||
--> $DIR/feature-gate-const_generics-ptr.rs:5:23
|
||||
--> $DIR/feature-gate-const_generics-ptr.rs:5:17
|
||||
|
|
||||
LL | struct ConstPtr<const P: *const u32>;
|
||||
| ^
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see https://github.com/rust-lang/rust/issues/44580
|
||||
= help: add `#![feature(const_generics)]` to the crate attributes to enable
|
||||
|
|
|
|||
|
|
@ -2,4 +2,9 @@ fn foo<const X: ()>() {} //~ ERROR const generics are unstable
|
|||
|
||||
struct Foo<const X: usize>([(); X]); //~ ERROR const generics are unstable
|
||||
|
||||
macro_rules! accept_item { ($i:item) => {} }
|
||||
accept_item! {
|
||||
impl<const X: ()> A {} //~ ERROR const generics are unstable
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -1,21 +1,30 @@
|
|||
error[E0658]: const generics are unstable
|
||||
--> $DIR/feature-gate-const_generics.rs:1:14
|
||||
--> $DIR/feature-gate-const_generics.rs:1:8
|
||||
|
|
||||
LL | fn foo<const X: ()>() {}
|
||||
| ^
|
||||
| ^^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see https://github.com/rust-lang/rust/issues/44580
|
||||
= help: add `#![feature(const_generics)]` to the crate attributes to enable
|
||||
|
||||
error[E0658]: const generics are unstable
|
||||
--> $DIR/feature-gate-const_generics.rs:3:18
|
||||
--> $DIR/feature-gate-const_generics.rs:3:12
|
||||
|
|
||||
LL | struct Foo<const X: usize>([(); X]);
|
||||
| ^
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see https://github.com/rust-lang/rust/issues/44580
|
||||
= help: add `#![feature(const_generics)]` to the crate attributes to enable
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
error[E0658]: const generics are unstable
|
||||
--> $DIR/feature-gate-const_generics.rs:7:10
|
||||
|
|
||||
LL | impl<const X: ()> A {}
|
||||
| ^^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see https://github.com/rust-lang/rust/issues/44580
|
||||
= help: add `#![feature(const_generics)]` to the crate attributes to enable
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue