Skip to content

Commit f1a2ea3

Browse files
committed
Remove NtTy.
Notes about tests: - tests/ui/parser/macro/trait-object-macro-matcher.rs: the syntax error is duplicated, because it occurs now when parsing the decl macro input, and also when parsing the expanded decl macro. But this won't show up for normal users due to error de-duplication. - tests/ui/associated-consts/issue-93835.rs: ditto.
1 parent d9d405b commit f1a2ea3

21 files changed

+95
-47
lines changed

compiler/rustc_ast/src/ast_traits.rs

-2
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,6 @@ impl HasTokens for Nonterminal {
235235
Nonterminal::NtStmt(stmt) => stmt.tokens(),
236236
Nonterminal::NtExpr(expr) | Nonterminal::NtLiteral(expr) => expr.tokens(),
237237
Nonterminal::NtPat(pat) => pat.tokens(),
238-
Nonterminal::NtTy(ty) => ty.tokens(),
239238
Nonterminal::NtMeta(attr_item) => attr_item.tokens(),
240239
Nonterminal::NtPath(path) => path.tokens(),
241240
Nonterminal::NtBlock(block) => block.tokens(),
@@ -247,7 +246,6 @@ impl HasTokens for Nonterminal {
247246
Nonterminal::NtStmt(stmt) => stmt.tokens_mut(),
248247
Nonterminal::NtExpr(expr) | Nonterminal::NtLiteral(expr) => expr.tokens_mut(),
249248
Nonterminal::NtPat(pat) => pat.tokens_mut(),
250-
Nonterminal::NtTy(ty) => ty.tokens_mut(),
251249
Nonterminal::NtMeta(attr_item) => attr_item.tokens_mut(),
252250
Nonterminal::NtPath(path) => path.tokens_mut(),
253251
Nonterminal::NtBlock(block) => block.tokens_mut(),

compiler/rustc_ast/src/mut_visit.rs

-1
Original file line numberDiff line numberDiff line change
@@ -837,7 +837,6 @@ fn visit_nonterminal<T: MutVisitor>(nt: &mut token::Nonterminal, vis: &mut T) {
837837
}),
838838
token::NtPat(pat) => vis.visit_pat(pat),
839839
token::NtExpr(expr) => vis.visit_expr(expr),
840-
token::NtTy(ty) => vis.visit_ty(ty),
841840
token::NtLiteral(expr) => vis.visit_expr(expr),
842841
token::NtMeta(item) => {
843842
let AttrItem { path, args, tokens } = item.deref_mut();

compiler/rustc_ast/src/token.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,7 @@ impl Token {
590590
Lifetime(..) | // lifetime bound in trait object
591591
Lt | BinOp(Shl) | // associated path
592592
PathSep => true, // global path
593-
Interpolated(ref nt) => matches!(&**nt, NtTy(..) | NtPath(..)),
593+
Interpolated(ref nt) => matches!(&**nt, NtPath(..)),
594594
OpenDelim(Delimiter::Invisible(InvisibleOrigin::MetaVar(
595595
NonterminalKind::Ty |
596596
NonterminalKind::Path
@@ -924,7 +924,6 @@ pub enum Nonterminal {
924924
NtStmt(P<ast::Stmt>),
925925
NtPat(P<ast::Pat>),
926926
NtExpr(P<ast::Expr>),
927-
NtTy(P<ast::Ty>),
928927
NtLiteral(P<ast::Expr>),
929928
/// Stuff inside brackets for attributes
930929
NtMeta(P<ast::AttrItem>),
@@ -1017,7 +1016,6 @@ impl Nonterminal {
10171016
NtStmt(stmt) => stmt.span,
10181017
NtPat(pat) => pat.span,
10191018
NtExpr(expr) | NtLiteral(expr) => expr.span,
1020-
NtTy(ty) => ty.span,
10211019
NtMeta(attr_item) => attr_item.span(),
10221020
NtPath(path) => path.span,
10231021
}
@@ -1031,7 +1029,6 @@ impl Nonterminal {
10311029
NtPat(..) => "pattern",
10321030
NtExpr(..) => "expression",
10331031
NtLiteral(..) => "literal",
1034-
NtTy(..) => "type",
10351032
NtMeta(..) => "attribute",
10361033
NtPath(..) => "path",
10371034
}
@@ -1056,7 +1053,6 @@ impl fmt::Debug for Nonterminal {
10561053
NtStmt(..) => f.pad("NtStmt(..)"),
10571054
NtPat(..) => f.pad("NtPat(..)"),
10581055
NtExpr(..) => f.pad("NtExpr(..)"),
1059-
NtTy(..) => f.pad("NtTy(..)"),
10601056
NtLiteral(..) => f.pad("NtLiteral(..)"),
10611057
NtMeta(..) => f.pad("NtMeta(..)"),
10621058
NtPath(..) => f.pad("NtPath(..)"),

compiler/rustc_ast/src/tokenstream.rs

-1
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,6 @@ impl TokenStream {
474474
}
475475
Nonterminal::NtStmt(stmt) => TokenStream::from_ast(stmt),
476476
Nonterminal::NtPat(pat) => TokenStream::from_ast(pat),
477-
Nonterminal::NtTy(ty) => TokenStream::from_ast(ty),
478477
Nonterminal::NtMeta(attr) => TokenStream::from_ast(attr),
479478
Nonterminal::NtPath(path) => TokenStream::from_ast(path),
480479
Nonterminal::NtExpr(expr) | Nonterminal::NtLiteral(expr) => TokenStream::from_ast(expr),

compiler/rustc_ast_pretty/src/pprust/state.rs

-1
Original file line numberDiff line numberDiff line change
@@ -855,7 +855,6 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
855855
match nt {
856856
token::NtExpr(e) => self.expr_to_string(e),
857857
token::NtMeta(e) => self.attr_item_to_string(e),
858-
token::NtTy(e) => self.ty_to_string(e),
859858
token::NtPath(e) => self.path_to_string(e),
860859
token::NtItem(e) => self.item_to_string(e),
861860
token::NtBlock(e) => self.block_to_string(e),

compiler/rustc_expand/src/mbe/transcribe.rs

+3
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,9 @@ pub(super) fn transcribe<'a>(
283283
let kind = token::NtLifetime(*ident);
284284
TokenTree::token_alone(kind, sp)
285285
}
286+
MatchedSingle(ParseNtResult::Ty(ref ty)) => {
287+
mk_delimited(NonterminalKind::Ty, TokenStream::from_ast(ty))
288+
}
286289
MatchedSingle(ParseNtResult::Vis(ref vis)) => {
287290
mk_delimited(NonterminalKind::Vis, TokenStream::from_ast(vis))
288291
}

compiler/rustc_parse/src/parser/mod.rs

+28-5
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,16 @@ macro_rules! maybe_recover_from_interpolated_ty_qpath {
158158
($self: expr, $allow_qpath_recovery: expr) => {
159159
if $allow_qpath_recovery
160160
&& $self.may_recover()
161-
&& $self.look_ahead(1, |t| t == &token::PathSep)
162-
&& let token::Interpolated(nt) = &$self.token.kind
163-
&& let token::NtTy(ty) = &**nt
161+
&& let Some(token::NonterminalKind::Ty) = $self.token.is_metavar_seq()
162+
&& $self.check_noexpect_past_close_delim(&token::PathSep)
164163
{
165-
let ty = ty.clone();
166-
$self.bump();
164+
// Reparse the type, then move to recovery.
165+
let ty = crate::reparse_metavar_seq!(
166+
$self,
167+
token::NonterminalKind::Ty,
168+
super::ParseNtResult::Ty(ty),
169+
ty
170+
);
167171
return $self.maybe_recover_from_bad_qpath_stage_2($self.prev_token.span, ty);
168172
}
169173
};
@@ -613,6 +617,24 @@ impl<'a> Parser<'a> {
613617
self.token == *tok
614618
}
615619

620+
// Check the first token after the delimiter that closes the current
621+
// delimited sequence. (Panics if used in the outermost token stream, which
622+
// has no delimiters.) It uses a clone of the relevant tree cursor to skip
623+
// past the entire `TokenTree::Delimited` in a single step, avoiding the
624+
// need for unbounded token lookahead.
625+
//
626+
// Primarily used when `self.token` matches
627+
// `OpenDelim(Delimiter::Invisible(_))`, to look ahead through the current
628+
// metavar expansion.
629+
fn check_noexpect_past_close_delim(&self, tok: &TokenKind) -> bool {
630+
let mut tree_cursor = self.token_cursor.stack.last().unwrap().0.clone();
631+
let tt = tree_cursor.next_ref();
632+
matches!(
633+
tt,
634+
Some(ast::tokenstream::TokenTree::Token(token::Token { kind, .. }, _)) if kind == tok
635+
)
636+
}
637+
616638
/// Consumes a token 'tok' if it exists. Returns whether the given token was present.
617639
///
618640
/// the main purpose of this function is to reduce the cluttering of the suggestions list
@@ -1691,6 +1713,7 @@ pub enum ParseNtResult {
16911713
Tt(TokenTree),
16921714
Ident(Ident, IdentIsRaw),
16931715
Lifetime(Ident),
1716+
Ty(P<ast::Ty>),
16941717
Vis(P<ast::Visibility>),
16951718

16961719
/// This variant will eventually be removed, along with `Token::Interpolate`.

compiler/rustc_parse/src/parser/nonterminal.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ impl<'a> Parser<'a> {
4949
NtStmt(_)
5050
| NtPat(_)
5151
| NtExpr(_)
52-
| NtTy(_)
5352
| NtLiteral(_) // `true`, `false`
5453
| NtMeta(_)
5554
| NtPath(_) => true,
@@ -84,7 +83,7 @@ impl<'a> Parser<'a> {
8483
token::NtLifetime(..) => true,
8584
token::Interpolated(nt) => match &**nt {
8685
NtBlock(_) | NtStmt(_) | NtExpr(_) | NtLiteral(_) => true,
87-
NtItem(_) | NtPat(_) | NtTy(_) | NtMeta(_) | NtPath(_) => false,
86+
NtItem(_) | NtPat(_) | NtMeta(_) | NtPath(_) => false,
8887
},
8988
token::OpenDelim(Delimiter::Invisible(InvisibleOrigin::MetaVar(k))) => match k {
9089
NonterminalKind::Block
@@ -196,7 +195,9 @@ impl<'a> Parser<'a> {
196195
}
197196

198197
NonterminalKind::Ty => {
199-
NtTy(self.collect_tokens_no_attrs(|this| this.parse_ty_no_question_mark_recover())?)
198+
return Ok(ParseNtResult::Ty(
199+
self.collect_tokens_no_attrs(|this| this.parse_ty_no_question_mark_recover())?,
200+
));
200201
}
201202

202203
// this could be handled like a token, since it is one

compiler/rustc_parse/src/parser/path.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use super::ty::{AllowPlus, RecoverQPath, RecoverReturnSign};
2-
use super::{Parser, Restrictions, TokenType};
2+
use super::{ParseNtResult, Parser, Restrictions, TokenType};
33
use crate::errors::PathSingleColon;
44
use crate::parser::{CommaRecoveryMode, RecoverColon, RecoverComma};
55
use crate::{errors, maybe_whole};
66
use ast::token::IdentIsRaw;
77
use rustc_ast::ptr::P;
8-
use rustc_ast::token::{self, Delimiter, Token, TokenKind};
8+
use rustc_ast::token::{self, Delimiter, NonterminalKind, Token, TokenKind};
99
use rustc_ast::{
1010
self as ast, AngleBracketedArg, AngleBracketedArgs, AnonConst, AssocConstraint,
1111
AssocConstraintKind, BlockCheckMode, GenericArg, GenericArgs, Generics, ParenthesizedArgs,
@@ -195,13 +195,13 @@ impl<'a> Parser<'a> {
195195

196196
maybe_whole!(self, NtPath, |path| reject_generics_if_mod_style(self, path.into_inner()));
197197

198-
if let token::Interpolated(nt) = &self.token.kind {
199-
if let token::NtTy(ty) = &**nt {
200-
if let ast::TyKind::Path(None, path) = &ty.kind {
201-
let path = path.clone();
202-
self.bump();
203-
return Ok(reject_generics_if_mod_style(self, path));
204-
}
198+
if let Some(NonterminalKind::Ty) = self.token.is_metavar_seq() {
199+
let mut self2 = self.clone();
200+
let ty =
201+
crate::reparse_metavar_seq!(self2, NonterminalKind::Ty, ParseNtResult::Ty(ty), ty);
202+
if let ast::TyKind::Path(None, path) = ty.into_inner().kind {
203+
*self = self2;
204+
return Ok(reject_generics_if_mod_style(self, path));
205205
}
206206
}
207207

compiler/rustc_parse/src/parser/ty.rs

+14-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
use super::{Parser, PathStyle, SeqSep, TokenType, Trailing};
1+
use super::{ParseNtResult, Parser, PathStyle, SeqSep, TokenType, Trailing};
22

33
use crate::errors::{
44
self, DynAfterMut, ExpectedFnPathFoundFnKeyword, ExpectedMutOrConstInRawPointerType,
55
FnPointerCannotBeAsync, FnPointerCannotBeConst, FnPtrWithGenerics, FnPtrWithGenericsSugg,
66
HelpUseLatestEdition, InvalidDynKeyword, LifetimeAfterMut, NeedPlusAfterTraitObjectLifetime,
77
NestedCVariadicType, ReturnTypesUseThinArrow,
88
};
9-
use crate::{maybe_recover_from_interpolated_ty_qpath, maybe_whole};
9+
use crate::{maybe_recover_from_interpolated_ty_qpath, maybe_reparse_metavar_seq};
1010

1111
use rustc_ast::ptr::P;
12-
use rustc_ast::token::{self, Delimiter, Token, TokenKind};
12+
use rustc_ast::token::{self, Delimiter, NonterminalKind, Token, TokenKind};
1313
use rustc_ast::util::case::Case;
1414
use rustc_ast::{
1515
self as ast, BareFnTy, BoundAsyncness, BoundConstness, BoundPolarity, FnRetTy, GenericBound,
@@ -190,7 +190,8 @@ impl<'a> Parser<'a> {
190190
)
191191
}
192192

193-
/// Parse a type without recovering `:` as `->` to avoid breaking code such as `where fn() : for<'a>`
193+
/// Parse a type without recovering `:` as `->` to avoid breaking code such
194+
/// as `where fn() : for<'a>`.
194195
pub(super) fn parse_ty_for_where_clause(&mut self) -> PResult<'a, P<Ty>> {
195196
self.parse_ty_common(
196197
AllowPlus::Yes,
@@ -250,7 +251,15 @@ impl<'a> Parser<'a> {
250251
) -> PResult<'a, P<Ty>> {
251252
let allow_qpath_recovery = recover_qpath == RecoverQPath::Yes;
252253
maybe_recover_from_interpolated_ty_qpath!(self, allow_qpath_recovery);
253-
maybe_whole!(self, NtTy, |ty| ty);
254+
if let Some(ty) = maybe_reparse_metavar_seq!(
255+
self,
256+
NonterminalKind::Ty,
257+
NonterminalKind::Ty,
258+
ParseNtResult::Ty(ty),
259+
ty
260+
) {
261+
return Ok(ty);
262+
}
254263

255264
let lo = self.token.span;
256265
let mut impl_dyn_multi = false;

tests/ui/associated-consts/issue-93835.rs

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ fn e() {
55
//~^ ERROR cannot find type `a` in this scope
66
//~| ERROR cannot find value
77
//~| ERROR associated const equality
8+
//~| ERROR associated const equality
89
//~| ERROR cannot find trait `p` in this scope
910
}
1011

tests/ui/associated-consts/issue-93835.stderr

+12-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,18 @@ LL | type_ascribe!(p, a<p:p<e=6>>);
2626
= help: add `#![feature(associated_const_equality)]` to the crate attributes to enable
2727
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
2828

29-
error: aborting due to 4 previous errors
29+
error[E0658]: associated const equality is incomplete
30+
--> $DIR/issue-93835.rs:4:28
31+
|
32+
LL | type_ascribe!(p, a<p:p<e=6>>);
33+
| ^^^
34+
|
35+
= note: see issue #92827 <https://github.com/rust-lang/rust/issues/92827> for more information
36+
= help: add `#![feature(associated_const_equality)]` to the crate attributes to enable
37+
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
38+
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
39+
40+
error: aborting due to 5 previous errors
3041

3142
Some errors have detailed explanations: E0405, E0412, E0425, E0658.
3243
For more information about an error, try `rustc --explain E0405`.

tests/ui/macros/macro-interpolation.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ macro_rules! qpath {
1919

2020
(ty, <$type:ty as $trait:ty>::$name:ident) => {
2121
<$type as $trait>::$name
22-
//~^ ERROR expected identifier, found `!`
22+
//~^ ERROR expected identifier, found metavariable
2323
};
2424
}
2525

tests/ui/macros/macro-interpolation.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
error: expected identifier, found `!`
1+
error: expected identifier, found metavariable
22
--> $DIR/macro-interpolation.rs:21:19
33
|
44
LL | <$type as $trait>::$name
5-
| ^^^^^^ expected identifier
5+
| ^^^^^^ expected identifier, found metavariable
66
...
77
LL | let _: qpath!(ty, <str as !>::Owned);
88
| -----------------------------

tests/ui/macros/stringify.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -793,14 +793,14 @@ fn test_ty() {
793793
c1!(ty, [ &'a T ], "&'a T");
794794
c1!(ty, [ &'a mut [T] ], "&'a mut [T]");
795795
c1!(ty, [ &A<B<C<D<E>>>> ], "&A<B<C<D<E>>>>");
796-
c2!(ty, [ &A<B<C<D<E> > > > ], "&A<B<C<D<E>>>>", "&A<B<C<D<E> > > >");
796+
c1!(ty, [ &A<B<C<D<E> > > > ], "&A<B<C<D<E> > > >");
797797

798798
// TyKind::BareFn
799799
c1!(ty, [ fn() ], "fn()");
800800
c1!(ty, [ fn() -> () ], "fn() -> ()");
801801
c1!(ty, [ fn(u8) ], "fn(u8)");
802802
c1!(ty, [ fn(x: u8) ], "fn(x: u8)");
803-
c2!(ty, [ for<> fn() ], "fn()", "for<> fn()");
803+
c1!(ty, [ for<> fn() ], "for<> fn()");
804804
c1!(ty, [ for<'a> fn() ], "for<'a> fn()");
805805

806806
// TyKind::Never
@@ -819,7 +819,7 @@ fn test_ty() {
819819
c1!(ty, [ T ], "T");
820820
c1!(ty, [ Ref<'a> ], "Ref<'a>");
821821
c1!(ty, [ PhantomData<T> ], "PhantomData<T>");
822-
c2!(ty, [ PhantomData::<T> ], "PhantomData<T>", "PhantomData::<T>");
822+
c1!(ty, [ PhantomData::<T> ], "PhantomData::<T>");
823823
c1!(ty, [ Fn() -> ! ], "Fn() -> !");
824824
c1!(ty, [ Fn(u8) -> ! ], "Fn(u8) -> !");
825825
c1!(ty, [ <Struct as Trait>::Type ], "<Struct as Trait>::Type");

tests/ui/macros/syntax-error-recovery.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ macro_rules! values {
99
}
1010
};
1111
}
12-
//~^^^^^ ERROR expected one of `(`, `,`, `=`, `{`, or `}`, found type `(String)`
13-
//~| ERROR macro expansion ignores type `(String)` and any tokens following
12+
//~^^^^^ ERROR expected one of `(`, `,`, `=`, `{`, or `}`, found `ty` metavariable
13+
//~| ERROR macro expansion ignores `ty` metavariable and any tokens following
1414

1515
values!(STRING(1) as (String) => cfg(test),);
1616
//~^ ERROR expected one of `!` or `::`, found `<eof>`

tests/ui/macros/syntax-error-recovery.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
error: expected one of `(`, `,`, `=`, `{`, or `}`, found type `(String)`
1+
error: expected one of `(`, `,`, `=`, `{`, or `}`, found `ty` metavariable
22
--> $DIR/syntax-error-recovery.rs:7:26
33
|
44
LL | $token $($inner)? = $value,
@@ -10,7 +10,7 @@ LL | values!(STRING(1) as (String) => cfg(test),);
1010
= help: enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }`
1111
= note: this error originates in the macro `values` (in Nightly builds, run with -Z macro-backtrace for more info)
1212

13-
error: macro expansion ignores type `(String)` and any tokens following
13+
error: macro expansion ignores `ty` metavariable and any tokens following
1414
--> $DIR/syntax-error-recovery.rs:7:26
1515
|
1616
LL | $token $($inner)? = $value,

tests/ui/parser/macro/issue-37113.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
macro_rules! test_macro {
22
( $( $t:ty ),* $(),*) => {
33
enum SomeEnum {
4-
$( $t, )* //~ ERROR expected identifier, found `String`
4+
$( $t, )* //~ ERROR expected identifier, found metavariable
55
};
66
};
77
}

tests/ui/parser/macro/issue-37113.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
error: expected identifier, found `String`
1+
error: expected identifier, found metavariable
22
--> $DIR/issue-37113.rs:4:16
33
|
44
LL | enum SomeEnum {
55
| -------- while parsing this enum
66
LL | $( $t, )*
7-
| ^^ expected identifier
7+
| ^^ expected identifier, found metavariable
88
...
99
LL | test_macro!(String,);
1010
| -------------------- in this macro invocation

tests/ui/parser/macro/trait-object-macro-matcher.rs

+1
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ macro_rules! m {
1010
fn main() {
1111
m!('static);
1212
//~^ ERROR lifetime in trait object type must be followed by `+`
13+
//~| ERROR lifetime in trait object type must be followed by `+`
1314
//~| ERROR at least one trait is required for an object type
1415
}

0 commit comments

Comments
 (0)