diff options
| author | Dylan DPC <99973273+Dylan-DPC@users.noreply.github.com> | 2022-04-09 18:26:28 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-04-09 18:26:28 +0200 |
| commit | 17157c717e8121c18c38fd08f47ac2cecd9aa57c (patch) | |
| tree | e92a54ae727d10a077f896f2ab3fdbd79545333d /compiler/rustc_expand/src | |
| parent | 50929460419d5235c17e61773b18376f41a88a04 (diff) | |
| parent | 379ae12a1dfc26ba58607be7f83a3e7f24550a84 (diff) | |
| download | rust-17157c717e8121c18c38fd08f47ac2cecd9aa57c.tar.gz rust-17157c717e8121c18c38fd08f47ac2cecd9aa57c.zip | |
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``
Diffstat (limited to 'compiler/rustc_expand/src')
| -rw-r--r-- | compiler/rustc_expand/src/mbe/macro_check.rs | 15 | ||||
| -rw-r--r-- | compiler/rustc_expand/src/mbe/macro_parser.rs | 18 | ||||
| -rw-r--r-- | compiler/rustc_expand/src/mbe/quoted.rs | 8 |
3 files changed, 21 insertions, 20 deletions
diff --git a/compiler/rustc_expand/src/mbe/macro_check.rs b/compiler/rustc_expand/src/mbe/macro_check.rs index fbacebf99c0..4298475767e 100644 --- a/compiler/rustc_expand/src/mbe/macro_check.rs +++ b/compiler/rustc_expand/src/mbe/macro_check.rs @@ -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"); } diff --git a/compiler/rustc_expand/src/mbe/macro_parser.rs b/compiler/rustc_expand/src/mbe/macro_parser.rs index a137e0c92e8..ce243b4a672 100644 --- a/compiler/rustc_expand/src/mbe/macro_parser.rs +++ b/compiler/rustc_expand/src/mbe/macro_parser.rs @@ -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()); } } } diff --git a/compiler/rustc_expand/src/mbe/quoted.rs b/compiler/rustc_expand/src/mbe/quoted.rs index a99a18aae11..024299fbd9c 100644 --- a/compiler/rustc_expand/src/mbe/quoted.rs +++ b/compiler/rustc_expand/src/mbe/quoted.rs @@ -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)); } |
