1
Fork 0

Add the feature gate for the super let experiment.

This commit is contained in:
Mara Bos 2025-03-28 18:32:12 +01:00
parent 2a06022951
commit 40b1f4899a
7 changed files with 39 additions and 1 deletions

View file

@ -505,6 +505,7 @@ pub fn check_crate(krate: &ast::Crate, sess: &Session, features: &Features) {
gate_all!(contracts, "contracts are incomplete");
gate_all!(contracts_internals, "contract internal machinery is for internal use only");
gate_all!(where_clause_attrs, "attributes in `where` clause are unstable");
gate_all!(super_let, "`super let` is experimental");
if !visitor.features.never_patterns() {
if let Some(spans) = spans.get(&sym::never_patterns) {

View file

@ -630,6 +630,8 @@ declare_features! (
(unstable, strict_provenance_lints, "1.61.0", Some(130351)),
/// Allows string patterns to dereference values to match them.
(unstable, string_deref_patterns, "1.67.0", Some(87121)),
/// Allows `super let` statements.
(unstable, super_let, "CURRENT_RUSTC_VERSION", Some(139076)),
/// Allows subtrait items to shadow supertrait items.
(unstable, supertrait_item_shadowing, "1.86.0", Some(89151)),
/// Allows using `#[thread_local]` on `static` items.

View file

@ -73,7 +73,20 @@ impl<'a> Parser<'a> {
});
}
let stmt = if self.token.is_keyword(kw::Let) {
let stmt = if self.token.is_keyword(kw::Super) && self.is_keyword_ahead(1, &[kw::Let]) {
self.collect_tokens(None, attrs, force_collect, |this, attrs| {
this.expect_keyword(exp!(Super))?;
this.psess.gated_spans.gate(sym::super_let, this.prev_token.span);
this.expect_keyword(exp!(Let))?;
let local = this.parse_local(attrs)?; // FIXME(mara): implement super let
let trailing = Trailing::from(capture_semi && this.token == token::Semi);
Ok((
this.mk_stmt(lo.to(this.prev_token.span), StmtKind::Let(local)),
trailing,
UsePreAttrPos::No,
))
})?
} else if self.token.is_keyword(kw::Let) {
self.collect_tokens(None, attrs, force_collect, |this, attrs| {
this.expect_keyword(exp!(Let))?;
let local = this.parse_local(attrs)?;

View file

@ -114,6 +114,7 @@ pub enum TokenType {
KwSelfUpper,
KwStatic,
KwStruct,
KwSuper,
KwTrait,
KwTry,
KwType,
@ -250,6 +251,7 @@ impl TokenType {
KwSelfUpper,
KwStatic,
KwStruct,
KwSuper,
KwTrait,
KwTry,
KwType,
@ -324,6 +326,7 @@ impl TokenType {
TokenType::KwSelfUpper => Some(kw::SelfUpper),
TokenType::KwStatic => Some(kw::Static),
TokenType::KwStruct => Some(kw::Struct),
TokenType::KwSuper => Some(kw::Super),
TokenType::KwTrait => Some(kw::Trait),
TokenType::KwTry => Some(kw::Try),
TokenType::KwType => Some(kw::Type),
@ -549,6 +552,7 @@ macro_rules! exp {
(SelfUpper) => { exp!(@kw, SelfUpper, KwSelfUpper) };
(Static) => { exp!(@kw, Static, KwStatic) };
(Struct) => { exp!(@kw, Struct, KwStruct) };
(Super) => { exp!(@kw, Super, KwSuper) };
(Trait) => { exp!(@kw, Trait, KwTrait) };
(Try) => { exp!(@kw, Try, KwTry) };
(Type) => { exp!(@kw, Type, KwType) };

View file

@ -2036,6 +2036,7 @@ symbols! {
sub_assign,
sub_with_overflow,
suggestion,
super_let,
supertrait_item_shadowing,
surface_async_drop_in_place,
sym,

View file

@ -0,0 +1,4 @@
fn main() {
super let a = 1;
//~^ ERROR `super let` is experimental
}

View file

@ -0,0 +1,13 @@
error[E0658]: `super let` is experimental
--> $DIR/feature-gate-super-let.rs:2:5
|
LL | super let a = 1;
| ^^^^^
|
= note: see issue #139076 <https://github.com/rust-lang/rust/issues/139076> for more information
= help: add `#![feature(super_let)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0658`.