Skip to content

Commit 5eb0193

Browse files
committed
Audit AllowConstBlockItems
1 parent 61ac562 commit 5eb0193

17 files changed

Lines changed: 103 additions & 44 deletions

File tree

compiler/rustc_ast/src/ast.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3898,6 +3898,7 @@ impl ConstItemRhs {
38983898

38993899
#[derive(Clone, Encodable, Decodable, Debug, Walkable)]
39003900
pub struct ConstBlockItem {
3901+
// FIXME(const_block_items): current invariant is body.kind == InlineConst
39013902
pub body: Box<Expr>,
39023903
}
39033904

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;
@@ -111,7 +111,7 @@ impl CfgEval<'_> {
111111
match annotatable {
112112
Annotatable::Item(_) => {
113113
let item =
114-
parser.parse_item(ForceCollect::Yes, ConstBlockItemsAllowed::No)?.unwrap();
114+
parser.parse_item(ForceCollect::Yes, AllowConstBlockItems::Yes)?.unwrap();
115115
Annotatable::Item(self.flat_map_item(item).pop().unwrap())
116116
}
117117
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;
@@ -168,7 +168,7 @@ pub(crate) fn expand_include<'cx>(
168168
));
169169
let mut ret = SmallVec::new();
170170
loop {
171-
match p.parse_item(ForceCollect::No, ConstBlockItemsAllowed::No) {
171+
match p.parse_item(ForceCollect::No, AllowConstBlockItems::Yes) {
172172
Err(err) => {
173173
err.emit();
174174
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::parse::ParseSess;
2828
use rustc_span::def_id::{CrateNum, DefId, LocalDefId};
@@ -1472,7 +1472,7 @@ pub(crate) fn stream_pretty_printing_compatibility_hack(
14721472
let mut parser = Parser::new(psess, stream.clone(), None);
14731473
// No need to collect tokens for this simple check.
14741474
parser
1475-
.parse_item(ForceCollect::No, ConstBlockItemsAllowed::No)
1475+
.parse_item(ForceCollect::No, AllowConstBlockItems::No)
14761476
.expect("failed to reparse item")
14771477
.expect("an actual item")
14781478
}

compiler/rustc_expand/src/expand.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use rustc_hir::Target;
2525
use rustc_hir::def::MacroKinds;
2626
use rustc_hir::limit::Limit;
2727
use rustc_parse::parser::{
28-
AttemptLocalParseRecovery, CommaRecoveryMode, ConstBlockItemsAllowed, ForceCollect, Parser,
28+
AllowConstBlockItems, AttemptLocalParseRecovery, CommaRecoveryMode, ForceCollect, Parser,
2929
RecoverColon, RecoverComma, token_descr,
3030
};
3131
use rustc_session::Session;
@@ -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, ConstBlockItemsAllowed::No)? {
1102+
while let Some(item) = this.parse_item(ForceCollect::No, AllowConstBlockItems::Yes)? {
11031103
items.push(item);
11041104
}
11051105
AstFragment::Items(items)

compiler/rustc_expand/src/proc_macro.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use rustc_ast::tokenstream::TokenStream;
22
use rustc_errors::ErrorGuaranteed;
33
use rustc_middle::ty::{self, TyCtxt};
4-
use rustc_parse::parser::{ConstBlockItemsAllowed, ForceCollect, Parser};
4+
use rustc_parse::parser::{AllowConstBlockItems, ForceCollect, Parser};
55
use rustc_session::Session;
66
use rustc_session::config::ProcMacroExecutionStrategy;
77
use rustc_span::profiling::SpannedEventArgRecorder;
@@ -160,7 +160,10 @@ impl MultiItemModifier for DeriveProcMacro {
160160
let mut items = vec![];
161161

162162
loop {
163-
match parser.parse_item(ForceCollect::No, ConstBlockItemsAllowed::No) {
163+
match parser.parse_item(
164+
ForceCollect::No,
165+
if is_stmt { AllowConstBlockItems::No } else { AllowConstBlockItems::Yes },
166+
) {
164167
Ok(None) => break,
165168
Ok(Some(item)) => {
166169
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::Yes,
208208
) {
209209
Ok(Some(item)) => {
210210
// FIXME(#100717)

compiler/rustc_parse/src/parser/item.rs

Lines changed: 36 additions & 21 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);
@@ -126,19 +126,19 @@ impl<'a> Parser<'a> {
126126
pub fn parse_item(
127127
&mut self,
128128
force_collect: ForceCollect,
129-
const_block_items_allowed: ConstBlockItemsAllowed,
129+
allow_const_block_items: AllowConstBlockItems,
130130
) -> PResult<'a, Option<Box<Item>>> {
131131
let fn_parse_mode =
132132
FnParseMode { req_name: |_, _| true, context: FnContext::Free, req_body: true };
133-
self.parse_item_(fn_parse_mode, force_collect, const_block_items_allowed)
133+
self.parse_item_(fn_parse_mode, force_collect, allow_const_block_items)
134134
.map(|i| i.map(Box::new))
135135
}
136136

137137
fn parse_item_(
138138
&mut self,
139139
fn_parse_mode: FnParseMode,
140140
force_collect: ForceCollect,
141-
const_block_items_allowed: ConstBlockItemsAllowed,
141+
const_block_items_allowed: AllowConstBlockItems,
142142
) -> PResult<'a, Option<Item>> {
143143
self.recover_vcs_conflict_marker();
144144
let attrs = self.parse_outer_attributes()?;
@@ -160,10 +160,10 @@ impl<'a> Parser<'a> {
160160
attrs_allowed: bool,
161161
fn_parse_mode: FnParseMode,
162162
force_collect: ForceCollect,
163-
const_block_items_allowed: ConstBlockItemsAllowed,
163+
allow_const_block_items: AllowConstBlockItems,
164164
) -> PResult<'a, Option<Item>> {
165165
if let Some(item) = self.eat_metavar_seq(MetaVarKind::Item, |this| {
166-
this.parse_item(ForceCollect::Yes, const_block_items_allowed)
166+
this.parse_item(ForceCollect::Yes, allow_const_block_items)
167167
}) {
168168
let mut item = item.expect("an actual item");
169169
attrs.prepend_to_nt_inner(&mut item.attrs);
@@ -177,7 +177,7 @@ impl<'a> Parser<'a> {
177177
let kind = this.parse_item_kind(
178178
&mut attrs,
179179
mac_allowed,
180-
const_block_items_allowed,
180+
allow_const_block_items,
181181
lo,
182182
&vis,
183183
&mut def,
@@ -224,7 +224,7 @@ impl<'a> Parser<'a> {
224224
&mut self,
225225
attrs: &mut AttrVec,
226226
macros_allowed: bool,
227-
const_block_items_allowed: ConstBlockItemsAllowed,
227+
allow_const_block_items: AllowConstBlockItems,
228228
lo: Span,
229229
vis: &Visibility,
230230
def: &mut Defaultness,
@@ -273,12 +273,16 @@ impl<'a> Parser<'a> {
273273
} else if self.check_impl_frontmatter(0) {
274274
// IMPL ITEM
275275
self.parse_item_impl(attrs, def_(), false)?
276-
} else if let ConstBlockItemsAllowed::Yes = const_block_items_allowed
276+
} else if let AllowConstBlockItems::Yes | AllowConstBlockItems::DoesNotMatter =
277+
allow_const_block_items
277278
&& self.token.is_keyword(kw::Const)
278279
&& self.look_ahead(1, |t| *t == token::OpenBrace || t.is_metavar_block())
279280
{
280281
// CONST BLOCK ITEM
281282
self.psess.gated_spans.gate(sym::const_block_items, self.token.span);
283+
if let AllowConstBlockItems::DoesNotMatter = allow_const_block_items {
284+
debug!("Parsing a const block item that does not matter: {:?}", self.token.span);
285+
};
282286
ItemKind::ConstBlock(ConstBlockItem { body: self.parse_expr()? })
283287
} else if let Const::Yes(const_span) = self.parse_constness(case) {
284288
// CONST ITEM
@@ -339,7 +343,7 @@ impl<'a> Parser<'a> {
339343
return self.parse_item_kind(
340344
attrs,
341345
macros_allowed,
342-
const_block_items_allowed,
346+
allow_const_block_items,
343347
lo,
344348
vis,
345349
def,
@@ -1092,8 +1096,13 @@ impl<'a> Parser<'a> {
10921096
fn_parse_mode: FnParseMode,
10931097
force_collect: ForceCollect,
10941098
) -> PResult<'a, Option<Option<Box<AssocItem>>>> {
1095-
Ok(self.parse_item_(fn_parse_mode, force_collect, ConstBlockItemsAllowed::No)?.map(
1096-
|Item { attrs, id, span, vis, kind, tokens }| {
1099+
Ok(self
1100+
.parse_item_(
1101+
fn_parse_mode,
1102+
force_collect,
1103+
AllowConstBlockItems::DoesNotMatter, // due to `AssocItemKind::try_from` below
1104+
)?
1105+
.map(|Item { attrs, id, span, vis, kind, tokens }| {
10971106
let kind = match AssocItemKind::try_from(kind) {
10981107
Ok(kind) => kind,
10991108
Err(kind) => match kind {
@@ -1120,8 +1129,7 @@ impl<'a> Parser<'a> {
11201129
},
11211130
};
11221131
Some(Box::new(Item { attrs, id, span, vis, kind, tokens }))
1123-
},
1124-
))
1132+
}))
11251133
}
11261134

11271135
/// Parses a `type` alias with the following grammar:
@@ -1344,8 +1352,13 @@ impl<'a> Parser<'a> {
13441352
context: FnContext::Free,
13451353
req_body: false,
13461354
};
1347-
Ok(self.parse_item_(fn_parse_mode, force_collect, ConstBlockItemsAllowed::No)?.map(
1348-
|Item { attrs, id, span, vis, kind, tokens }| {
1355+
Ok(self
1356+
.parse_item_(
1357+
fn_parse_mode,
1358+
force_collect,
1359+
AllowConstBlockItems::DoesNotMatter, // due to `ForeignItemKind::try_from` below
1360+
)?
1361+
.map(|Item { attrs, id, span, vis, kind, tokens }| {
13491362
let kind = match ForeignItemKind::try_from(kind) {
13501363
Ok(kind) => kind,
13511364
Err(kind) => match kind {
@@ -1372,8 +1385,7 @@ impl<'a> Parser<'a> {
13721385
},
13731386
};
13741387
Some(Box::new(Item { attrs, id, span, vis, kind, tokens }))
1375-
},
1376-
))
1388+
}))
13771389
}
13781390

13791391
fn error_bad_item_kind<T>(&self, span: Span, kind: &ItemKind, ctx: &'static str) -> Option<T> {
@@ -2418,7 +2430,10 @@ impl<'a> Parser<'a> {
24182430
{
24192431
let kw_token = self.token;
24202432
let kw_str = pprust::token_to_string(&kw_token);
2421-
let item = self.parse_item(ForceCollect::No, ConstBlockItemsAllowed::No)?;
2433+
let item = self.parse_item(
2434+
ForceCollect::No,
2435+
AllowConstBlockItems::DoesNotMatter, // self.token != kw::Const
2436+
)?;
24222437
let mut item = item.unwrap().span;
24232438
if self.token == token::Comma {
24242439
item = item.to(self.token.span);

compiler/rustc_parse/src/parser/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,11 @@ 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,
153154
}
154155

155156
/// 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))),

0 commit comments

Comments
 (0)