Skip to content

Commit aad7563

Browse files
committed
Audit AllowConstBlockItems
1 parent 5ceb381 commit aad7563

File tree

14 files changed

+102
-37
lines changed

14 files changed

+102
-37
lines changed

compiler/rustc_builtin_macros/src/cfg_eval.rs

Lines changed: 2 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::{ConstBlockItemsAllowed, ForceCollect, Parser};
12+
use rustc_parse::parser::{AllowConstBlockItems, ForceCollect, Parser};
1313
use rustc_session::Session;
1414
use rustc_span::{Span, sym};
1515
use smallvec::SmallVec;
@@ -114,7 +114,7 @@ impl CfgEval<'_> {
114114
match annotatable {
115115
Annotatable::Item(_) => {
116116
let item =
117-
parser.parse_item(ForceCollect::Yes, ConstBlockItemsAllowed::No)?.unwrap();
117+
parser.parse_item(ForceCollect::Yes, AllowConstBlockItems::Yes)?.unwrap();
118118
Annotatable::Item(self.flat_map_item(item).pop().unwrap())
119119
}
120120
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::{ConstBlockItemsAllowed, ForceCollect};
16+
use rustc_parse::parser::{AllowConstBlockItems, 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, ConstBlockItemsAllowed::No) {
176+
match p.parse_item(ForceCollect::No, AllowConstBlockItems::Yes) {
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::{ConstBlockItemsAllowed, ForceCollect, Parser};
25+
use rustc_parse::parser::{AllowConstBlockItems, ForceCollect, Parser};
2626
use rustc_session::Session;
2727
use rustc_session::config::CollapseMacroDebuginfo;
2828
use rustc_session::parse::ParseSess;
@@ -1497,7 +1497,7 @@ pub(crate) fn stream_pretty_printing_compatibility_hack(
14971497
let mut parser = Parser::new(psess, stream.clone(), None);
14981498
// No need to collect tokens for this simple check.
14991499
parser
1500-
.parse_item(ForceCollect::No, ConstBlockItemsAllowed::No)
1500+
.parse_item(ForceCollect::No, AllowConstBlockItems::FIXME)
15011501
.expect("failed to reparse item")
15021502
.expect("an actual item")
15031503
}

compiler/rustc_expand/src/expand.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use rustc_hir::Target;
2121
use rustc_hir::def::MacroKinds;
2222
use rustc_hir::limit::Limit;
2323
use rustc_parse::parser::{
24-
AttemptLocalParseRecovery, CommaRecoveryMode, ConstBlockItemsAllowed, ForceCollect, Parser,
24+
AllowConstBlockItems, AttemptLocalParseRecovery, CommaRecoveryMode, ForceCollect, Parser,
2525
RecoverColon, RecoverComma, token_descr,
2626
};
2727
use rustc_session::Session;
@@ -1096,7 +1096,7 @@ pub fn parse_ast_fragment<'a>(
10961096
Ok(match kind {
10971097
AstFragmentKind::Items => {
10981098
let mut items = SmallVec::new();
1099-
while let Some(item) = this.parse_item(ForceCollect::No, ConstBlockItemsAllowed::No)? {
1099+
while let Some(item) = this.parse_item(ForceCollect::No, AllowConstBlockItems::Yes)? {
11001100
items.push(item);
11011101
}
11021102
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::{ConstBlockItemsAllowed, ForceCollect, Parser};
3+
use rustc_parse::parser::{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, ConstBlockItemsAllowed::No) {
159+
match parser.parse_item(ForceCollect::No, (!is_stmt).into()) {
160160
Ok(None) => break,
161161
Ok(Some(item)) => {
162162
if is_stmt {

compiler/rustc_parse/src/parser/attr.rs

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

1111
use super::{
12-
AttrWrapper, Capturing, ConstBlockItemsAllowed, FnParseMode, ForceCollect, Parser, PathStyle,
12+
AllowConstBlockItems, AttrWrapper, Capturing, FnParseMode, ForceCollect, Parser, PathStyle,
1313
Trailing, UsePreAttrPos,
1414
};
1515
use crate::parser::FnContext;
@@ -204,7 +204,7 @@ impl<'a> Parser<'a> {
204204
false,
205205
FnParseMode { req_name: |_, _| true, context: FnContext::Free, req_body: true },
206206
ForceCollect::No,
207-
ConstBlockItemsAllowed::No,
207+
AllowConstBlockItems::FIXME,
208208
) {
209209
Ok(Some(item)) => {
210210
// FIXME(#100717)

compiler/rustc_parse/src/parser/item.rs

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ use tracing::debug;
2222
use super::diagnostics::{ConsumeClosingDelim, dummy_arg};
2323
use super::ty::{AllowPlus, RecoverQPath, RecoverReturnSign};
2424
use super::{
25-
AttrWrapper, ConstBlockItemsAllowed, ExpKeywordPair, ExpTokenPair, FollowedByType,
26-
ForceCollect, Parser, PathStyle, Recovered, Trailing, UsePreAttrPos,
25+
AllowConstBlockItems, AttrWrapper, ExpKeywordPair, ExpTokenPair, FollowedByType, ForceCollect,
26+
Parser, PathStyle, Recovered, Trailing, UsePreAttrPos,
2727
};
2828
use crate::errors::{self, FnPointerCannotBeAsync, FnPointerCannotBeConst, MacroExpandsToAdtField};
2929
use crate::{exp, fluent_generated as fluent};
@@ -69,7 +69,7 @@ impl<'a> Parser<'a> {
6969
// `parse_item` consumes the appropriate semicolons so any leftover is an error.
7070
loop {
7171
while self.maybe_consume_incorrect_semicolon(items.last().map(|x| &**x)) {} // Eat all bad semicolons
72-
let Some(item) = self.parse_item(ForceCollect::No, ConstBlockItemsAllowed::Yes)? else {
72+
let Some(item) = self.parse_item(ForceCollect::No, AllowConstBlockItems::Yes)? else {
7373
break;
7474
};
7575
items.push(item);
@@ -121,19 +121,19 @@ impl<'a> Parser<'a> {
121121
pub fn parse_item(
122122
&mut self,
123123
force_collect: ForceCollect,
124-
const_block_items_allowed: ConstBlockItemsAllowed,
124+
allow_const_block_items: AllowConstBlockItems,
125125
) -> PResult<'a, Option<Box<Item>>> {
126126
let fn_parse_mode =
127127
FnParseMode { req_name: |_, _| true, context: FnContext::Free, req_body: true };
128-
self.parse_item_(fn_parse_mode, force_collect, const_block_items_allowed)
128+
self.parse_item_(fn_parse_mode, force_collect, allow_const_block_items)
129129
.map(|i| i.map(Box::new))
130130
}
131131

132132
fn parse_item_(
133133
&mut self,
134134
fn_parse_mode: FnParseMode,
135135
force_collect: ForceCollect,
136-
const_block_items_allowed: ConstBlockItemsAllowed,
136+
const_block_items_allowed: AllowConstBlockItems,
137137
) -> PResult<'a, Option<Item>> {
138138
self.recover_vcs_conflict_marker();
139139
let attrs = self.parse_outer_attributes()?;
@@ -155,7 +155,7 @@ impl<'a> Parser<'a> {
155155
attrs_allowed: bool,
156156
fn_parse_mode: FnParseMode,
157157
force_collect: ForceCollect,
158-
const_block_items_allowed: ConstBlockItemsAllowed,
158+
const_block_items_allowed: AllowConstBlockItems,
159159
) -> PResult<'a, Option<Item>> {
160160
if let Some(item) = self.eat_metavar_seq(MetaVarKind::Item, |this| {
161161
this.parse_item(ForceCollect::Yes, const_block_items_allowed)
@@ -219,7 +219,7 @@ impl<'a> Parser<'a> {
219219
&mut self,
220220
attrs: &mut AttrVec,
221221
macros_allowed: bool,
222-
const_block_items_allowed: ConstBlockItemsAllowed,
222+
const_block_items_allowed: AllowConstBlockItems,
223223
lo: Span,
224224
vis: &Visibility,
225225
def: &mut Defaultness,
@@ -269,12 +269,16 @@ impl<'a> Parser<'a> {
269269
} else if self.check_impl_frontmatter() {
270270
// IMPL ITEM
271271
self.parse_item_impl(attrs, def_())?
272-
} else if let ConstBlockItemsAllowed::Yes = const_block_items_allowed
272+
} else if let AllowConstBlockItems::Yes | AllowConstBlockItems::DoesNotMatter =
273+
const_block_items_allowed
273274
&& self.token.is_keyword(kw::Const)
274275
&& self.look_ahead(1, |t| *t == token::OpenBrace || t.is_metavar_block())
275276
{
276277
// CONST BLOCK ITEM
277278
self.psess.gated_spans.gate(sym::const_block_items, self.token.span);
279+
if let AllowConstBlockItems::DoesNotMatter = const_block_items_allowed {
280+
debug!("Parsing a const block item that does not matter: {:?}", self.token.span);
281+
};
278282
ItemKind::ConstBlock(ConstBlockItem { body: self.parse_expr()? })
279283
} else if let Const::Yes(const_span) = self.parse_constness(Case::Sensitive) {
280284
// CONST ITEM
@@ -1016,8 +1020,13 @@ impl<'a> Parser<'a> {
10161020
fn_parse_mode: FnParseMode,
10171021
force_collect: ForceCollect,
10181022
) -> PResult<'a, Option<Option<Box<AssocItem>>>> {
1019-
Ok(self.parse_item_(fn_parse_mode, force_collect, ConstBlockItemsAllowed::No)?.map(
1020-
|Item { attrs, id, span, vis, kind, tokens }| {
1023+
Ok(self
1024+
.parse_item_(
1025+
fn_parse_mode,
1026+
force_collect,
1027+
AllowConstBlockItems::DoesNotMatter, // due to `AssocItemKind::try_from` below
1028+
)?
1029+
.map(|Item { attrs, id, span, vis, kind, tokens }| {
10211030
let kind = match AssocItemKind::try_from(kind) {
10221031
Ok(kind) => kind,
10231032
Err(kind) => match kind {
@@ -1044,8 +1053,7 @@ impl<'a> Parser<'a> {
10441053
},
10451054
};
10461055
Some(Box::new(Item { attrs, id, span, vis, kind, tokens }))
1047-
},
1048-
))
1056+
}))
10491057
}
10501058

10511059
/// Parses a `type` alias with the following grammar:
@@ -1268,8 +1276,13 @@ impl<'a> Parser<'a> {
12681276
context: FnContext::Free,
12691277
req_body: false,
12701278
};
1271-
Ok(self.parse_item_(fn_parse_mode, force_collect, ConstBlockItemsAllowed::No)?.map(
1272-
|Item { attrs, id, span, vis, kind, tokens }| {
1279+
Ok(self
1280+
.parse_item_(
1281+
fn_parse_mode,
1282+
force_collect,
1283+
AllowConstBlockItems::DoesNotMatter, // due to `ForeignItemKind::try_from` below
1284+
)?
1285+
.map(|Item { attrs, id, span, vis, kind, tokens }| {
12731286
let kind = match ForeignItemKind::try_from(kind) {
12741287
Ok(kind) => kind,
12751288
Err(kind) => match kind {
@@ -1296,8 +1309,7 @@ impl<'a> Parser<'a> {
12961309
},
12971310
};
12981311
Some(Box::new(Item { attrs, id, span, vis, kind, tokens }))
1299-
},
1300-
))
1312+
}))
13011313
}
13021314

13031315
fn error_bad_item_kind<T>(&self, span: Span, kind: &ItemKind, ctx: &'static str) -> Option<T> {
@@ -2324,7 +2336,10 @@ impl<'a> Parser<'a> {
23242336
{
23252337
let kw_token = self.token;
23262338
let kw_str = pprust::token_to_string(&kw_token);
2327-
let item = self.parse_item(ForceCollect::No, ConstBlockItemsAllowed::No)?;
2339+
let item = self.parse_item(
2340+
ForceCollect::No,
2341+
AllowConstBlockItems::DoesNotMatter, // self.token != kw::Const
2342+
)?;
23282343
let mut item = item.unwrap().span;
23292344
if self.token == token::Comma {
23302345
item = item.to(self.token.span);

compiler/rustc_parse/src/parser/mod.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,21 @@ pub enum ForceCollect {
146146
}
147147

148148
/// Whether to accept `const { ... }` as a shorthand for `const _: () = const { ... }`.
149-
#[derive(Clone, Copy, Debug, PartialEq)]
150-
pub enum ConstBlockItemsAllowed {
149+
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
150+
pub enum AllowConstBlockItems {
151151
Yes,
152152
No,
153+
DoesNotMatter,
154+
FIXME, // FIXME(const_block_items): get rid of this variant
155+
}
156+
157+
impl From<bool> for AllowConstBlockItems {
158+
fn from(value: bool) -> Self {
159+
match value {
160+
true => Self::Yes,
161+
false => Self::No,
162+
}
163+
}
153164
}
154165

155166
/// If the next tokens are ill-formed `$ty::` recover them as `<$ty>::`.

compiler/rustc_parse/src/parser/nonterminal.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use rustc_span::{Ident, kw};
77
use crate::errors::UnexpectedNonterminal;
88
use crate::parser::pat::{CommaRecoveryMode, RecoverColon, RecoverComma};
99
use crate::parser::{
10-
ConstBlockItemsAllowed, FollowedByType, ForceCollect, ParseNtResult, Parser, PathStyle,
10+
AllowConstBlockItems, FollowedByType, ForceCollect, ParseNtResult, Parser, PathStyle,
1111
};
1212

1313
impl<'a> Parser<'a> {
@@ -121,7 +121,7 @@ impl<'a> Parser<'a> {
121121
// Note that TT is treated differently to all the others.
122122
NonterminalKind::TT => Ok(ParseNtResult::Tt(self.parse_token_tree())),
123123
NonterminalKind::Item => match self
124-
.parse_item(ForceCollect::Yes, ConstBlockItemsAllowed::Yes)?
124+
.parse_item(ForceCollect::Yes, AllowConstBlockItems::Yes)?
125125
{
126126
Some(item) => Ok(ParseNtResult::Item(item)),
127127
None => Err(self.dcx().create_err(UnexpectedNonterminal::Item(self.token.span))),

compiler/rustc_parse/src/parser/stmt.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use super::diagnostics::AttemptLocalParseRecovery;
2020
use super::pat::{PatternLocation, RecoverComma};
2121
use super::path::PathStyle;
2222
use super::{
23-
AttrWrapper, BlockMode, ConstBlockItemsAllowed, FnContext, FnParseMode, ForceCollect, Parser,
23+
AllowConstBlockItems, AttrWrapper, BlockMode, FnContext, FnParseMode, ForceCollect, Parser,
2424
Restrictions, SemiColonMode, Trailing, UsePreAttrPos,
2525
};
2626
use crate::errors::{self, MalformedLoopLabel};
@@ -156,7 +156,7 @@ impl<'a> Parser<'a> {
156156
true,
157157
FnParseMode { req_name: |_, _| true, context: FnContext::Free, req_body: true },
158158
force_collect,
159-
ConstBlockItemsAllowed::No,
159+
AllowConstBlockItems::No,
160160
)? {
161161
self.mk_stmt(lo.to(item.span), StmtKind::Item(Box::new(item)))
162162
} else if self.eat(exp!(Semi)) {

0 commit comments

Comments
 (0)