Rollup merge of #95808 - petrochenkov:fragspec, r=nnethercote
expand: Remove `ParseSess::missing_fragment_specifiers` It was used for deduplicating some errors for legacy code which are mostly deduplicated even without that, but at cost of global mutable state, which is not a good tradeoff. cc https://github.com/rust-lang/rust/pull/95747#issuecomment-1091619403 r? ``@nnethercote``
This commit is contained in:
commit
17157c717e
13 changed files with 138 additions and 48 deletions
|
@ -110,7 +110,7 @@ use rustc_ast::token::{DelimToken, Token, TokenKind};
|
|||
use rustc_ast::{NodeId, DUMMY_NODE_ID};
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_errors::MultiSpan;
|
||||
use rustc_session::lint::builtin::META_VARIABLE_MISUSE;
|
||||
use rustc_session::lint::builtin::{META_VARIABLE_MISUSE, MISSING_FRAGMENT_SPECIFIER};
|
||||
use rustc_session::parse::ParseSess;
|
||||
use rustc_span::symbol::kw;
|
||||
use rustc_span::{symbol::MacroRulesNormalizedIdent, Span};
|
||||
|
@ -261,7 +261,18 @@ fn check_binders(
|
|||
}
|
||||
}
|
||||
// Similarly, this can only happen when checking a toplevel macro.
|
||||
TokenTree::MetaVarDecl(span, name, _kind) => {
|
||||
TokenTree::MetaVarDecl(span, name, kind) => {
|
||||
if kind.is_none() && node_id != DUMMY_NODE_ID {
|
||||
// FIXME: Report this as a hard error eventually and remove equivalent errors from
|
||||
// `parse_tt_inner` and `nameize`. Until then the error may be reported twice, once
|
||||
// as a hard error and then once as a buffered lint.
|
||||
sess.buffer_lint(
|
||||
MISSING_FRAGMENT_SPECIFIER,
|
||||
span,
|
||||
node_id,
|
||||
&format!("missing fragment specifier"),
|
||||
);
|
||||
}
|
||||
if !macros.is_empty() {
|
||||
sess.span_diagnostic.span_bug(span, "unexpected MetaVarDecl in nested lhs");
|
||||
}
|
||||
|
|
|
@ -411,7 +411,6 @@ impl TtParser {
|
|||
/// track of through the mps generated.
|
||||
fn parse_tt_inner(
|
||||
&mut self,
|
||||
sess: &ParseSess,
|
||||
matcher: &[MatcherLoc],
|
||||
token: &Token,
|
||||
) -> Option<NamedParseResult> {
|
||||
|
@ -519,11 +518,9 @@ impl TtParser {
|
|||
self.bb_mps.push(mp);
|
||||
}
|
||||
} else {
|
||||
// E.g. `$e` instead of `$e:expr`, reported as a hard error if actually used.
|
||||
// Both this check and the one in `nameize` are necessary, surprisingly.
|
||||
if sess.missing_fragment_specifiers.borrow_mut().remove(&span).is_some() {
|
||||
// E.g. `$e` instead of `$e:expr`.
|
||||
return Some(Error(span, "missing fragment specifier".to_string()));
|
||||
}
|
||||
return Some(Error(span, "missing fragment specifier".to_string()));
|
||||
}
|
||||
}
|
||||
MatcherLoc::Eof => {
|
||||
|
@ -549,7 +546,7 @@ impl TtParser {
|
|||
// Need to take ownership of the matches from within the `Lrc`.
|
||||
Lrc::make_mut(&mut eof_mp.matches);
|
||||
let matches = Lrc::try_unwrap(eof_mp.matches).unwrap().into_iter();
|
||||
self.nameize(sess, matcher, matches)
|
||||
self.nameize(matcher, matches)
|
||||
}
|
||||
EofMatcherPositions::Multiple => {
|
||||
Error(token.span, "ambiguity: multiple successful parses".to_string())
|
||||
|
@ -587,7 +584,7 @@ impl TtParser {
|
|||
|
||||
// Process `cur_mps` until either we have finished the input or we need to get some
|
||||
// parsing from the black-box parser done.
|
||||
if let Some(res) = self.parse_tt_inner(&parser.sess, matcher, &parser.token) {
|
||||
if let Some(res) = self.parse_tt_inner(matcher, &parser.token) {
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -694,7 +691,6 @@ impl TtParser {
|
|||
|
||||
fn nameize<I: Iterator<Item = NamedMatch>>(
|
||||
&self,
|
||||
sess: &ParseSess,
|
||||
matcher: &[MatcherLoc],
|
||||
mut res: I,
|
||||
) -> NamedParseResult {
|
||||
|
@ -711,11 +707,9 @@ impl TtParser {
|
|||
}
|
||||
};
|
||||
} else {
|
||||
// E.g. `$e` instead of `$e:expr`, reported as a hard error if actually used.
|
||||
// Both this check and the one in `parse_tt_inner` are necessary, surprisingly.
|
||||
if sess.missing_fragment_specifiers.borrow_mut().remove(&span).is_some() {
|
||||
// E.g. `$e` instead of `$e:expr`.
|
||||
return Error(span, "missing fragment specifier".to_string());
|
||||
}
|
||||
return Error(span, "missing fragment specifier".to_string());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,8 +2,7 @@ use crate::mbe::macro_parser::count_metavar_decls;
|
|||
use crate::mbe::{Delimited, KleeneOp, KleeneToken, MetaVarExpr, SequenceRepetition, TokenTree};
|
||||
|
||||
use rustc_ast::token::{self, Token};
|
||||
use rustc_ast::tokenstream;
|
||||
use rustc_ast::{NodeId, DUMMY_NODE_ID};
|
||||
use rustc_ast::{tokenstream, NodeId};
|
||||
use rustc_ast_pretty::pprust;
|
||||
use rustc_feature::Features;
|
||||
use rustc_session::parse::{feature_err, ParseSess};
|
||||
|
@ -104,10 +103,7 @@ pub(super) fn parse(
|
|||
}
|
||||
tree => tree.as_ref().map_or(start_sp, tokenstream::TokenTree::span),
|
||||
};
|
||||
if node_id != DUMMY_NODE_ID {
|
||||
// Macros loaded from other crates have dummy node ids.
|
||||
sess.missing_fragment_specifiers.borrow_mut().insert(span, node_id);
|
||||
}
|
||||
|
||||
result.push(TokenTree::MetaVarDecl(span, ident, None));
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue