Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pre-expansion gate most of the things #65742

Merged
merged 13 commits into from
Oct 25, 2019
13 changes: 2 additions & 11 deletions src/libsyntax/feature_gate/check.rs
Original file line number Diff line number Diff line change
@@ -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);
}
4 changes: 4 additions & 0 deletions src/libsyntax/parse/parser/generics.rs
Original file line number Diff line number Diff line change
@@ -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,
2 changes: 2 additions & 0 deletions src/libsyntax/sess.rs
Original file line number Diff line number Diff line change
@@ -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.
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
4 changes: 2 additions & 2 deletions src/test/ui/const-generics/issues/issue-60263.stderr
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
5 changes: 5 additions & 0 deletions src/test/ui/feature-gates/feature-gate-const_generics.rs
Original file line number Diff line number Diff line change
@@ -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() {}
19 changes: 14 additions & 5 deletions src/test/ui/feature-gates/feature-gate-const_generics.stderr
Original file line number Diff line number Diff line change
@@ -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`.