Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions compiler/rustc_ast_passes/src/feature_gate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
2 changes: 2 additions & 0 deletions compiler/rustc_feature/src/unstable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
15 changes: 14 additions & 1 deletion compiler/rustc_parse/src/parser/stmt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)?;
Expand Down
4 changes: 4 additions & 0 deletions compiler/rustc_parse/src/parser/token_type.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ pub enum TokenType {
KwSelfUpper,
KwStatic,
KwStruct,
KwSuper,
KwTrait,
KwTry,
KwType,
Expand Down Expand Up @@ -250,6 +251,7 @@ impl TokenType {
KwSelfUpper,
KwStatic,
KwStruct,
KwSuper,
KwTrait,
KwTry,
KwType,
Expand Down Expand Up @@ -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),
Expand Down Expand Up @@ -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) };
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_span/src/symbol.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2036,6 +2036,7 @@ symbols! {
sub_assign,
sub_with_overflow,
suggestion,
super_let,
supertrait_item_shadowing,
surface_async_drop_in_place,
sym,
Expand Down
4 changes: 4 additions & 0 deletions tests/ui/feature-gates/feature-gate-super-let.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
fn main() {
super let a = 1;
//~^ ERROR `super let` is experimental
}
Comment on lines +1 to +4
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't want to run this back through CI, but in follow-up work, let's please remember to add a test that confirms we get this error when the code is cfged out. That's correctly done here (it's apparent in the code and I tested locally), but we should always want a test for this.

13 changes: 13 additions & 0 deletions tests/ui/feature-gates/feature-gate-super-let.stderr
Original file line number Diff line number Diff line change
@@ -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`.
Loading