Skip to content

Commit 1e0e6cf

Browse files
committed
Sugar for const _: () =
1 parent c8f22ca commit 1e0e6cf

File tree

18 files changed

+122
-29
lines changed

18 files changed

+122
-29
lines changed

compiler/rustc_ast/src/ast.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3794,6 +3794,12 @@ impl ConstItemRhs {
37943794
}
37953795
}
37963796

3797+
#[derive(Clone, Encodable, Decodable, Debug, Walkable)]
3798+
pub struct ConstBlockItem {
3799+
pub attrs: ThinVec<Attribute>,
3800+
pub body: AnonConst,
3801+
}
3802+
37973803
// Adding a new variant? Please update `test_item` in `tests/ui/macros/stringify.rs`.
37983804
#[derive(Clone, Encodable, Decodable, Debug)]
37993805
pub enum ItemKind {

compiler/rustc_ast/src/visit.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,7 @@ macro_rules! common_visitor_and_walkers {
422422
ByRef,
423423
Closure,
424424
Const,
425+
ConstBlockItem,
425426
ConstItem,
426427
ConstItemRhs,
427428
Defaultness,

compiler/rustc_ast_passes/src/feature_gate.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,7 @@ pub fn check_crate(krate: &ast::Crate, sess: &Session, features: &Features) {
526526
gate_all!(super_let, "`super let` is experimental");
527527
gate_all!(frontmatter, "frontmatters are experimental");
528528
gate_all!(coroutines, "coroutine syntax is experimental");
529+
gate_all!(const_block_items, "const block items are experimental");
529530

530531
if !visitor.features.never_patterns() {
531532
if let Some(spans) = spans.get(&sym::never_patterns) {

compiler/rustc_builtin_macros/src/cfg_eval.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use rustc_expand::base::{Annotatable, ExtCtxt};
99
use rustc_expand::config::StripUnconfigured;
1010
use rustc_expand::configure;
1111
use rustc_feature::Features;
12-
use rustc_parse::parser::{ForceCollect, Parser};
12+
use rustc_parse::parser::{ConstBlockItemsAllowed, ForceCollect, Parser};
1313
use rustc_session::Session;
1414
use rustc_span::{Span, sym};
1515
use smallvec::SmallVec;
@@ -113,7 +113,8 @@ impl CfgEval<'_> {
113113
let res: PResult<'_, Annotatable> = try {
114114
match annotatable {
115115
Annotatable::Item(_) => {
116-
let item = parser.parse_item(ForceCollect::Yes)?.unwrap();
116+
let item =
117+
parser.parse_item(ForceCollect::Yes, ConstBlockItemsAllowed::No)?.unwrap();
117118
Annotatable::Item(self.flat_map_item(item).pop().unwrap())
118119
}
119120
Annotatable::AssocItem(_, ctxt) => {

compiler/rustc_builtin_macros/src/source_util.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use rustc_expand::base::{
1313
};
1414
use rustc_expand::module::DirOwnership;
1515
use rustc_parse::lexer::StripTokens;
16-
use rustc_parse::parser::ForceCollect;
16+
use rustc_parse::parser::{ConstBlockItemsAllowed, ForceCollect};
1717
use rustc_parse::{new_parser_from_file, unwrap_or_emit_fatal, utf8_error};
1818
use rustc_session::lint::builtin::INCOMPLETE_INCLUDE;
1919
use rustc_session::parse::ParseSess;
@@ -173,7 +173,7 @@ pub(crate) fn expand_include<'cx>(
173173
));
174174
let mut ret = SmallVec::new();
175175
loop {
176-
match p.parse_item(ForceCollect::No) {
176+
match p.parse_item(ForceCollect::No, ConstBlockItemsAllowed::No) {
177177
Err(err) => {
178178
err.emit();
179179
break;

compiler/rustc_expand/src/base.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use rustc_hir::limit::Limit;
2222
use rustc_hir::{Stability, find_attr};
2323
use rustc_lint_defs::RegisteredTools;
2424
use rustc_parse::MACRO_ARGUMENTS;
25-
use rustc_parse::parser::{ForceCollect, Parser};
25+
use rustc_parse::parser::{ConstBlockItemsAllowed, ForceCollect, Parser};
2626
use rustc_session::Session;
2727
use rustc_session::config::CollapseMacroDebuginfo;
2828
use rustc_session::parse::ParseSess;
@@ -1494,7 +1494,7 @@ pub(crate) fn stream_pretty_printing_compatibility_hack(
14941494
let mut parser = Parser::new(psess, stream.clone(), None);
14951495
// No need to collect tokens for this simple check.
14961496
parser
1497-
.parse_item(ForceCollect::No)
1497+
.parse_item(ForceCollect::No, ConstBlockItemsAllowed::No)
14981498
.expect("failed to reparse item")
14991499
.expect("an actual item")
15001500
}

compiler/rustc_expand/src/expand.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ use rustc_hir::Target;
2121
use rustc_hir::def::MacroKinds;
2222
use rustc_hir::limit::Limit;
2323
use rustc_parse::parser::{
24-
AttemptLocalParseRecovery, CommaRecoveryMode, ForceCollect, Parser, RecoverColon, RecoverComma,
25-
token_descr,
24+
AttemptLocalParseRecovery, CommaRecoveryMode, ConstBlockItemsAllowed, ForceCollect, Parser,
25+
RecoverColon, RecoverComma, token_descr,
2626
};
2727
use rustc_session::Session;
2828
use rustc_session::lint::builtin::{UNUSED_ATTRIBUTES, UNUSED_DOC_COMMENTS};
@@ -1099,7 +1099,7 @@ pub fn parse_ast_fragment<'a>(
10991099
Ok(match kind {
11001100
AstFragmentKind::Items => {
11011101
let mut items = SmallVec::new();
1102-
while let Some(item) = this.parse_item(ForceCollect::No)? {
1102+
while let Some(item) = this.parse_item(ForceCollect::No, ConstBlockItemsAllowed::No)? {
11031103
items.push(item);
11041104
}
11051105
AstFragment::Items(items)

compiler/rustc_expand/src/proc_macro.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use rustc_ast::tokenstream::TokenStream;
22
use rustc_errors::ErrorGuaranteed;
3-
use rustc_parse::parser::{ForceCollect, Parser};
3+
use rustc_parse::parser::{ConstBlockItemsAllowed, ForceCollect, Parser};
44
use rustc_session::config::ProcMacroExecutionStrategy;
55
use rustc_span::Span;
66
use rustc_span::profiling::SpannedEventArgRecorder;
@@ -156,7 +156,7 @@ impl MultiItemModifier for DeriveProcMacro {
156156
let mut items = vec![];
157157

158158
loop {
159-
match parser.parse_item(ForceCollect::No) {
159+
match parser.parse_item(ForceCollect::No, ConstBlockItemsAllowed::No) {
160160
Ok(None) => break,
161161
Ok(Some(item)) => {
162162
if is_stmt {

compiler/rustc_feature/src/unstable.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,8 @@ declare_features! (
442442
(unstable, cmse_nonsecure_entry, "1.48.0", Some(75835)),
443443
/// Allows `async {}` expressions in const contexts.
444444
(unstable, const_async_blocks, "1.53.0", Some(85368)),
445+
/// Allows `const { ... }` as a shorthand for `const _: () = const { ... };` for module items.
446+
(unstable, const_block_items, "CURRENT_RUSTC_VERSION", None),
445447
/// Allows `const || {}` closures in const contexts.
446448
(incomplete, const_closures, "1.68.0", Some(106003)),
447449
/// Allows using `[const] Destruct` bounds and calling drop impls in const contexts.

compiler/rustc_parse/src/parser/attr.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ use thin_vec::ThinVec;
99
use tracing::debug;
1010

1111
use super::{
12-
AttrWrapper, Capturing, FnParseMode, ForceCollect, Parser, PathStyle, Trailing, UsePreAttrPos,
12+
AttrWrapper, Capturing, ConstBlockItemsAllowed, FnParseMode, ForceCollect, Parser, PathStyle,
13+
Trailing, UsePreAttrPos,
1314
};
1415
use crate::parser::FnContext;
1516
use crate::{errors, exp, fluent_generated as fluent};
@@ -203,6 +204,7 @@ impl<'a> Parser<'a> {
203204
false,
204205
FnParseMode { req_name: |_| true, context: FnContext::Free, req_body: true },
205206
ForceCollect::No,
207+
ConstBlockItemsAllowed::No,
206208
) {
207209
Ok(Some(item)) => {
208210
// FIXME(#100717)

0 commit comments

Comments
 (0)