pre-expansion gate const_generics

This commit is contained in:
Mazdak Farrokhzad 2019-09-21 18:58:17 +02:00
parent 04c661ba02
commit 49cbfa1a6f
9 changed files with 37 additions and 26 deletions

View file

@ -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);
}

View file

@ -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,

View file

@ -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.

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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() {}

View file

@ -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`.