Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit a6d91db

Browse files
committed
XXX: NtExpr/NtLiteral
Notes about tests: - tests/ui/macros/stringify.rs: the `c2` macro is no longer needed, because the TokenStream pretty printer is now used for all cases. - tests/ui/rfcs/rfc-2294-if-let-guard/feature-gate.rs: some messages are now duplicated due to repeated parsing. - tests/ui/rfcs/rfc-2497-if-let-chains/disallowed-positions*.rs: ditto. XXX: Getting a test failure here: ``` Building tool error_index_generator (stage1 -> stage2, x86_64-unknown-linux-gnu) Compiling cfg-if v1.0.0 ... Compiling mdbook v0.4.37 error: internal compiler error: the following error was constructed but not emitted error: unexpected token: keyword `self` --> /home/njn/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mdbook-0.4.37/src/book/summary.rs:280:31 | 280 | ... bail!(self.parse_error("Suffix chapters cannot be followed by a list")); | ^^^^ thread 'rustc' panicked at /home/njn/dev/rust3/compiler/rustc_errors/src/diagnostic.rs:1375:17: error was constructed but not emitted ``` I get a similar compile error (not ICE) in a vanilla compiler if I change `can_begin_maybe_minus` to accept `NtExpr` without checking that `e` is a `Lit` or `Unary` error: format argument must be a string literal --> /home/njn/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mdbook-0.4.37/src/book/summary.rs:280:31 | 280 | ... bail!(self.parse_error("Suffix chapters cannot be followed by a list")); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | help: you might be missing a string literal to format with | 280 | bail!("{}", self.parse_error("Suffix chapters cannot be followed by a list")); | +++++
1 parent dbcc0a7 commit a6d91db

33 files changed

+660
-530
lines changed

compiler/rustc_ast/src/ast_traits.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,13 +231,11 @@ impl HasTokens for Attribute {
231231
impl HasTokens for Nonterminal {
232232
fn tokens(&self) -> Option<&LazyAttrTokenStream> {
233233
match self {
234-
Nonterminal::NtExpr(expr) | Nonterminal::NtLiteral(expr) => expr.tokens(),
235234
Nonterminal::NtBlock(block) => block.tokens(),
236235
}
237236
}
238237
fn tokens_mut(&mut self) -> Option<&mut Option<LazyAttrTokenStream>> {
239238
match self {
240-
Nonterminal::NtExpr(expr) | Nonterminal::NtLiteral(expr) => expr.tokens_mut(),
241239
Nonterminal::NtBlock(block) => block.tokens_mut(),
242240
}
243241
}

compiler/rustc_ast/src/mut_visit.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -820,8 +820,6 @@ pub fn visit_token<T: MutVisitor>(t: &mut Token, vis: &mut T) {
820820
fn visit_nonterminal<T: MutVisitor>(nt: &mut token::Nonterminal, vis: &mut T) {
821821
match nt {
822822
token::NtBlock(block) => vis.visit_block(block),
823-
token::NtExpr(expr) => vis.visit_expr(expr),
824-
token::NtLiteral(expr) => vis.visit_expr(expr),
825823
}
826824
}
827825

compiler/rustc_ast/src/token.rs

Lines changed: 58 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -134,16 +134,27 @@ impl Lit {
134134
}
135135
}
136136

137-
/// Keep this in sync with `Token::can_begin_literal_maybe_minus` excluding unary negation.
137+
/// Keep this in sync with `Token::can_begin_literal_maybe_minus` and
138+
/// `Parser::maybe_parse_token_lit` (excluding unary negation).
138139
pub fn from_token(token: &Token) -> Option<Lit> {
139140
match token.uninterpolate().kind {
140141
Ident(name, IdentIsRaw::No) if name.is_bool_lit() => Some(Lit::new(Bool, name, None)),
141142
Literal(token_lit) => Some(token_lit),
142-
Interpolated(ref nt)
143-
if let NtExpr(expr) | NtLiteral(expr) = &**nt
144-
&& let ast::ExprKind::Lit(token_lit) = expr.kind =>
145-
{
146-
Some(token_lit)
143+
OpenDelim(Delimiter::Invisible(InvisibleOrigin::MetaVar(NonterminalKind::Literal))) => {
144+
panic!("njn: FROM_TOKEN (1)");
145+
// if let NtExpr(expr) | NtLiteral(expr) = &**nt
146+
// && let ast::ExprKind::Lit(token_lit) = expr.kind =>
147+
// {
148+
// Some(token_lit)
149+
// }
150+
}
151+
OpenDelim(Delimiter::Invisible(InvisibleOrigin::MetaVar(NonterminalKind::Expr))) => {
152+
panic!("njn: FROM_TOKEN (2)");
153+
// if let NtExpr(expr) | NtLiteral(expr) = &**nt
154+
// && let ast::ExprKind::Lit(token_lit) = expr.kind =>
155+
// {
156+
// Some(token_lit)
157+
// }
147158
}
148159
_ => None,
149160
}
@@ -476,6 +487,7 @@ impl Token {
476487
Token::new(Ident(ident.name, ident.is_raw_guess().into()), ident.span)
477488
}
478489

490+
/// njn: phase this out in favour of Parser::uninterpolated_token_span?
479491
/// For interpolated tokens, returns a span of the fragment to which the interpolated
480492
/// token refers. For all other tokens this is just a regular span.
481493
/// It is particularly important to use this for identifiers and lifetimes
@@ -531,9 +543,7 @@ impl Token {
531543
PathSep | // global path
532544
Lifetime(..) | // labeled loop
533545
Pound => true, // expression attributes
534-
Interpolated(ref nt) => matches!(&**nt, NtLiteral(..) |
535-
NtExpr(..) |
536-
NtBlock(..)),
546+
Interpolated(ref nt) => matches!(&**nt, NtBlock(..)),
537547
OpenDelim(Delimiter::Invisible(InvisibleOrigin::MetaVar(
538548
NonterminalKind::Block |
539549
NonterminalKind::Expr |
@@ -561,7 +571,7 @@ impl Token {
561571
| DotDot | DotDotDot | DotDotEq // ranges
562572
| Lt | BinOp(Shl) // associated path
563573
| PathSep => true, // global path
564-
Interpolated(ref nt) => matches!(&**nt, NtLiteral(..) | NtBlock(..)),
574+
Interpolated(ref nt) => matches!(&**nt, NtBlock(..)),
565575
OpenDelim(Delimiter::Invisible(InvisibleOrigin::MetaVar(
566576
NonterminalKind::Block |
567577
NonterminalKind::PatParam { .. } |
@@ -603,6 +613,7 @@ impl Token {
603613
match self.kind {
604614
OpenDelim(Delimiter::Brace) | Literal(..) | BinOp(Minus) => true,
605615
Ident(name, IdentIsRaw::No) if name.is_bool_lit() => true,
616+
Interpolated(ref nt) => matches!(&**nt, NtBlock(..)),
606617
OpenDelim(Delimiter::Invisible(InvisibleOrigin::MetaVar(
607618
NonterminalKind::Expr
608619
| NonterminalKind::Expr2021 { .. }
@@ -649,22 +660,24 @@ impl Token {
649660
///
650661
/// In other words, would this token be a valid start of `parse_literal_maybe_minus`?
651662
///
652-
/// Keep this in sync with and `Lit::from_token`, excluding unary negation.
663+
/// Keep this in sync with `Lit::from_token` and
664+
/// `Parser::maybe_parse_token_lit` (excluding unary negation).
653665
pub fn can_begin_literal_maybe_minus(&self) -> bool {
654666
match self.uninterpolate().kind {
655667
Literal(..) | BinOp(Minus) => true,
656668
Ident(name, IdentIsRaw::No) if name.is_bool_lit() => true,
657-
Interpolated(ref nt) => match &**nt {
658-
NtLiteral(_) => true,
659-
NtExpr(e) => match &e.kind {
660-
ast::ExprKind::Lit(_) => true,
661-
ast::ExprKind::Unary(ast::UnOp::Neg, e) => {
662-
matches!(&e.kind, ast::ExprKind::Lit(_))
663-
}
664-
_ => false,
665-
},
666-
_ => false,
667-
},
669+
// njn: fix up
670+
// Interpolated(ref nt) => match &**nt {
671+
// NtLiteral(_) => true,
672+
// NtExpr(e) => match &e.kind {
673+
// ast::ExprKind::Lit(_) => true,
674+
// ast::ExprKind::Unary(ast::UnOp::Neg, e) => {
675+
// matches!(&e.kind, ast::ExprKind::Lit(_))
676+
// }
677+
// _ => false,
678+
// },
679+
// _ => false,
680+
// },
668681
// njn: too simple compared to what's above?
669682
OpenDelim(Delimiter::Invisible(InvisibleOrigin::MetaVar(
670683
NonterminalKind::Literal | NonterminalKind::Expr | NonterminalKind::Expr2021 { .. },
@@ -676,14 +689,19 @@ impl Token {
676689
pub fn can_begin_string_literal(&self) -> bool {
677690
match self.uninterpolate().kind {
678691
Literal(..) => true,
679-
Interpolated(ref nt) => match &**nt {
680-
NtLiteral(_) => true,
681-
NtExpr(e) => match &e.kind {
682-
ast::ExprKind::Lit(_) => true,
683-
_ => false,
684-
},
685-
_ => false,
686-
},
692+
// njn: fix up
693+
// Interpolated(ref nt) => match &**nt {
694+
// NtLiteral(_) => true,
695+
// NtExpr(e) => match &e.kind {
696+
// ast::ExprKind::Lit(_) => true,
697+
// _ => false,
698+
// },
699+
// _ => false,
700+
// },
701+
// njn: too simple compared to what's above?
702+
OpenDelim(Delimiter::Invisible(InvisibleOrigin::MetaVar(
703+
NonterminalKind::Literal | NonterminalKind::Expr | NonterminalKind::Expr2021,
704+
))) => true,
687705
_ => false,
688706
}
689707
}
@@ -738,16 +756,19 @@ impl Token {
738756
self.ident().is_some_and(|(ident, _)| ident.name == name)
739757
}
740758

741-
/// Would `maybe_whole_expr` in `parser.rs` return `Ok(..)`?
759+
/// Would `maybe_reparse_metavar_expr` in `parser.rs` return `Ok(..)`?
742760
/// That is, is this a pre-parsed expression dropped into the token stream
743761
/// (which happens while parsing the result of macro expansion)?
744-
pub fn is_whole_expr(&self) -> bool {
745-
#[allow(irrefutable_let_patterns)] // njn: temp
762+
pub fn is_metavar_expr(&self) -> bool {
763+
#[allow(irrefutable_let_patterns)] // FIXME: temporary
746764
if let Interpolated(nt) = &self.kind
747-
&& let NtExpr(_) | NtLiteral(_) = &**nt
765+
&& let NtBlock(_) = &**nt
748766
{
749767
true
750-
} else if matches!(self.is_metavar_seq(), Some(NonterminalKind::Path)) {
768+
} else if matches!(
769+
self.is_metavar_seq(),
770+
Some(NonterminalKind::Expr | NonterminalKind::Literal | NonterminalKind::Path)
771+
) {
751772
true
752773
} else {
753774
false
@@ -756,6 +777,7 @@ impl Token {
756777

757778
/// Is the token an interpolated block (`$b:block`)?
758779
pub fn is_whole_block(&self) -> bool {
780+
#[allow(irrefutable_let_patterns)] // FIXME: temporary
759781
if let Interpolated(nt) = &self.kind
760782
&& let NtBlock(..) = &**nt
761783
{
@@ -928,8 +950,6 @@ impl PartialEq<TokenKind> for Token {
928950
/// For interpolation during macro expansion.
929951
pub enum Nonterminal {
930952
NtBlock(P<ast::Block>),
931-
NtExpr(P<ast::Expr>),
932-
NtLiteral(P<ast::Expr>),
933953
}
934954

935955
#[derive(Debug, Copy, Clone, PartialEq, Eq, Encodable, Decodable, Hash, HashStable_Generic)]
@@ -1027,15 +1047,12 @@ impl Nonterminal {
10271047
pub fn use_span(&self) -> Span {
10281048
match self {
10291049
NtBlock(block) => block.span,
1030-
NtExpr(expr) | NtLiteral(expr) => expr.span,
10311050
}
10321051
}
10331052

10341053
pub fn descr(&self) -> &'static str {
10351054
match self {
10361055
NtBlock(..) => "block",
1037-
NtExpr(..) => "expression",
1038-
NtLiteral(..) => "literal",
10391056
}
10401057
}
10411058
}
@@ -1054,8 +1071,6 @@ impl fmt::Debug for Nonterminal {
10541071
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
10551072
match *self {
10561073
NtBlock(..) => f.pad("NtBlock(..)"),
1057-
NtExpr(..) => f.pad("NtExpr(..)"),
1058-
NtLiteral(..) => f.pad("NtLiteral(..)"),
10591074
}
10601075
}
10611076
}
@@ -1077,7 +1092,7 @@ mod size_asserts {
10771092
// tidy-alphabetical-start
10781093
static_assert_size!(Lit, 12);
10791094
static_assert_size!(LitKind, 2);
1080-
static_assert_size!(Nonterminal, 16);
1095+
static_assert_size!(Nonterminal, 8);
10811096
static_assert_size!(Token, 24);
10821097
static_assert_size!(TokenKind, 16);
10831098
// tidy-alphabetical-end

compiler/rustc_ast/src/tokenstream.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,6 @@ impl TokenStream {
467467
pub fn from_nonterminal_ast(nt: &Nonterminal) -> TokenStream {
468468
match nt {
469469
Nonterminal::NtBlock(block) => TokenStream::from_ast(block),
470-
Nonterminal::NtExpr(expr) | Nonterminal::NtLiteral(expr) => TokenStream::from_ast(expr),
471470
}
472471
}
473472

compiler/rustc_expand/src/mbe/transcribe.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,12 @@ pub(super) fn transcribe<'a>(
316316
MatchedSingle(ParseNtResult::PatWithOr(ref pat)) => {
317317
mk_delimited(NonterminalKind::PatWithOr, TokenStream::from_ast(pat))
318318
}
319+
MatchedSingle(ParseNtResult::Expr(ref expr)) => {
320+
mk_delimited(NonterminalKind::Expr, TokenStream::from_ast(expr))
321+
}
322+
MatchedSingle(ParseNtResult::Literal(ref expr)) => {
323+
mk_delimited(NonterminalKind::Literal, TokenStream::from_ast(expr))
324+
}
319325
MatchedSingle(ParseNtResult::Ty(ref ty)) => {
320326
mk_delimited(NonterminalKind::Ty, TokenStream::from_ast(ty))
321327
}

compiler/rustc_index/src/bit_set/tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ fn chunked_bitset() {
302302
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
303303
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x8000_0000_0000_0000
304304
])),
305-
],
305+
], // njn: trailing comma here causes a crash in reparse_metavar_seq?
306306
);
307307
assert_eq!(b4096.count(), 2);
308308
b4096.assert_valid();
@@ -336,7 +336,7 @@ fn chunked_bitset() {
336336
])),
337337
Zeros(2048),
338338
Zeros(1808),
339-
],
339+
], // njn: trailing comma here causes a crash in reparse_metavar_seq?
340340
);
341341
let mut b10000b = ChunkedBitSet::<usize>::new_empty(10000);
342342
b10000b.clone_from(&b10000);

compiler/rustc_parse/messages.ftl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -807,7 +807,7 @@ parse_unexpected_parentheses_in_match_arm_pattern = unexpected parentheses surro
807807
parse_unexpected_self_in_generic_parameters = unexpected keyword `Self` in generic parameters
808808
.note = you cannot use `Self` as a generic parameter because it is reserved for associated items
809809
810-
parse_unexpected_token_after_dot = unexpected token: `{$actual}`
810+
parse_unexpected_token_after_dot = unexpected token: {$actual}
811811
812812
parse_unexpected_token_after_label = expected `while`, `for`, `loop` or `{"{"}` after a label
813813
.suggestion_remove_label = consider removing the label

compiler/rustc_parse/src/errors.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1602,10 +1602,10 @@ pub(crate) struct SelfArgumentPointer {
16021602

16031603
#[derive(Diagnostic)]
16041604
#[diag(parse_unexpected_token_after_dot)]
1605-
pub struct UnexpectedTokenAfterDot<'a> {
1605+
pub struct UnexpectedTokenAfterDot {
16061606
#[primary_span]
16071607
pub span: Span,
1608-
pub actual: Cow<'a, str>,
1608+
pub actual: String,
16091609
}
16101610

16111611
#[derive(Diagnostic)]

0 commit comments

Comments
 (0)