Extend proc_macro_back_compat
lint to procedural-masquerade
We now lint on *any* use of `procedural-masquerade` crate. While this crate still exists, its main reverse dependency (`cssparser`) no longer depends on it. Any crates still depending off should stop doing so, as it only exists to support very old Rust versions. If a crate actually needs to support old versions of rustc via `procedural-masquerade`, then they'll just need to accept the warning until we remove it entirely (at the same time as the back-compat hack). The latest version of `procedural-masquerade` does not work with the latest rustc, but trying to check for the version seems like more trouble than it's worth. While working on this, I realized that the `proc-macro-hack` check was never actually doing anything. The corresponding enum variant in `proc-macro-hack` is named `Value` or `Nested` - it has never been called `Input`. Due to a strange Crater issue, the Crater run that tested adding this did *not* end up testing it - some of the crates that would have failed did not actually have their tests checked, making it seem as though the `proc-macro-hack` check was working. The Crater issue is being discussed at https://rust-lang.zulipchat.com/#narrow/stream/242791-t-infra/topic/Nearly.20identical.20Crater.20runs.20processed.20a.20crate.20differently/near/230406661 Despite the `proc-macro-hack` check not actually doing anything, we haven't gotten any reports from users about their build being broken. I went ahead and removed it entirely, since it's clear that no one is being affected by the `proc-macro-hack` regression in practice.
This commit is contained in:
parent
2ccf06302c
commit
d6a7c1d47f
@ -784,33 +784,6 @@ pub fn span(&self) -> Span {
|
|||||||
NtTT(tt) => tt.span(),
|
NtTT(tt) => tt.span(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This nonterminal looks like some specific enums from
|
|
||||||
/// `proc-macro-hack` and `procedural-masquerade` crates.
|
|
||||||
/// We need to maintain some special pretty-printing behavior for them due to incorrect
|
|
||||||
/// asserts in old versions of those crates and their wide use in the ecosystem.
|
|
||||||
/// See issue #73345 for more details.
|
|
||||||
/// FIXME(#73933): Remove this eventually.
|
|
||||||
pub fn pretty_printing_compatibility_hack(&self) -> bool {
|
|
||||||
let item = match self {
|
|
||||||
NtItem(item) => item,
|
|
||||||
NtStmt(stmt) => match &stmt.kind {
|
|
||||||
ast::StmtKind::Item(item) => item,
|
|
||||||
_ => return false,
|
|
||||||
},
|
|
||||||
_ => return false,
|
|
||||||
};
|
|
||||||
|
|
||||||
let name = item.ident.name;
|
|
||||||
if name == sym::ProceduralMasqueradeDummyType || name == sym::ProcMacroHack {
|
|
||||||
if let ast::ItemKind::Enum(enum_def, _) = &item.kind {
|
|
||||||
if let [variant] = &*enum_def.variants {
|
|
||||||
return variant.ident.name == sym::Input;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PartialEq for Nonterminal {
|
impl PartialEq for Nonterminal {
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_data_structures::sync::{self, Lrc};
|
use rustc_data_structures::sync::{self, Lrc};
|
||||||
use rustc_errors::{DiagnosticBuilder, ErrorReported};
|
use rustc_errors::{DiagnosticBuilder, ErrorReported};
|
||||||
|
use rustc_lint_defs::builtin::PROC_MACRO_BACK_COMPAT;
|
||||||
|
use rustc_lint_defs::BuiltinLintDiagnostics;
|
||||||
use rustc_parse::{self, nt_to_tokenstream, parser, MACRO_ARGUMENTS};
|
use rustc_parse::{self, nt_to_tokenstream, parser, MACRO_ARGUMENTS};
|
||||||
use rustc_session::{parse::ParseSess, Limit, Session};
|
use rustc_session::{parse::ParseSess, Limit, Session};
|
||||||
use rustc_span::def_id::DefId;
|
use rustc_span::def_id::DefId;
|
||||||
@ -1241,3 +1243,41 @@ pub fn get_exprs_from_tts(
|
|||||||
}
|
}
|
||||||
Some(es)
|
Some(es)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// This nonterminal looks like some specific enums from
|
||||||
|
/// `proc-macro-hack` and `procedural-masquerade` crates.
|
||||||
|
/// We need to maintain some special pretty-printing behavior for them due to incorrect
|
||||||
|
/// asserts in old versions of those crates and their wide use in the ecosystem.
|
||||||
|
/// See issue #73345 for more details.
|
||||||
|
/// FIXME(#73933): Remove this eventually.
|
||||||
|
pub(crate) fn pretty_printing_compatibility_hack(nt: &Nonterminal, sess: &ParseSess) -> bool {
|
||||||
|
let item = match nt {
|
||||||
|
Nonterminal::NtItem(item) => item,
|
||||||
|
Nonterminal::NtStmt(stmt) => match &stmt.kind {
|
||||||
|
ast::StmtKind::Item(item) => item,
|
||||||
|
_ => return false,
|
||||||
|
},
|
||||||
|
_ => return false,
|
||||||
|
};
|
||||||
|
|
||||||
|
let name = item.ident.name;
|
||||||
|
if name == sym::ProceduralMasqueradeDummyType {
|
||||||
|
if let ast::ItemKind::Enum(enum_def, _) = &item.kind {
|
||||||
|
if let [variant] = &*enum_def.variants {
|
||||||
|
if variant.ident.name == sym::Input {
|
||||||
|
sess.buffer_lint_with_diagnostic(
|
||||||
|
&PROC_MACRO_BACK_COMPAT,
|
||||||
|
item.ident.span,
|
||||||
|
ast::CRATE_NODE_ID,
|
||||||
|
"using `procedural-masquerade` crate",
|
||||||
|
BuiltinLintDiagnostics::ProcMacroBackCompat(
|
||||||
|
"The `procedural-masquerade` crate has been unnecessary since Rust 1.30.0. \
|
||||||
|
Versions of this crate below 0.1.7 will eventually stop compiling.".to_string())
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
|
@ -90,7 +90,8 @@ fn expand(
|
|||||||
}
|
}
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
};
|
};
|
||||||
let input = if item.pretty_printing_compatibility_hack() {
|
let input = if crate::base::pretty_printing_compatibility_hack(&item, &ecx.sess.parse_sess)
|
||||||
|
{
|
||||||
TokenTree::token(token::Interpolated(Lrc::new(item)), DUMMY_SP).into()
|
TokenTree::token(token::Interpolated(Lrc::new(item)), DUMMY_SP).into()
|
||||||
} else {
|
} else {
|
||||||
nt_to_tokenstream(&item, &ecx.sess.parse_sess, CanSynthesizeMissingTokens::Yes)
|
nt_to_tokenstream(&item, &ecx.sess.parse_sess, CanSynthesizeMissingTokens::Yes)
|
||||||
|
@ -187,7 +187,7 @@ macro_rules! op {
|
|||||||
delimiter: Delimiter::None,
|
delimiter: Delimiter::None,
|
||||||
stream,
|
stream,
|
||||||
span: DelimSpan::from_single(span),
|
span: DelimSpan::from_single(span),
|
||||||
flatten: nt.pretty_printing_compatibility_hack(),
|
flatten: crate::base::pretty_printing_compatibility_hack(&nt, sess),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
13
src/test/ui/proc-macro/issue-73933-procedural-masquerade.rs
Normal file
13
src/test/ui/proc-macro/issue-73933-procedural-masquerade.rs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// check-pass
|
||||||
|
// aux-build:test-macros.rs
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
extern crate test_macros;
|
||||||
|
|
||||||
|
#[derive(Print)]
|
||||||
|
enum ProceduralMasqueradeDummyType { //~ WARN using
|
||||||
|
//~| WARN this was previously
|
||||||
|
Input
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,25 @@
|
|||||||
|
warning: using `procedural-masquerade` crate
|
||||||
|
--> $DIR/issue-73933-procedural-masquerade.rs:8:6
|
||||||
|
|
|
||||||
|
LL | enum ProceduralMasqueradeDummyType {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: `#[warn(proc_macro_back_compat)]` on by default
|
||||||
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||||
|
= note: for more information, see issue #83125 <https://github.com/rust-lang/rust/issues/83125>
|
||||||
|
= note: The `procedural-masquerade` crate has been unnecessary since Rust 1.30.0. Versions of this crate below 0.1.7 will eventually stop compiling.
|
||||||
|
|
||||||
|
warning: 1 warning emitted
|
||||||
|
|
||||||
|
Future incompatibility report: Future breakage date: None, diagnostic:
|
||||||
|
warning: using `procedural-masquerade` crate
|
||||||
|
--> $DIR/issue-73933-procedural-masquerade.rs:8:6
|
||||||
|
|
|
||||||
|
LL | enum ProceduralMasqueradeDummyType {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: `#[warn(proc_macro_back_compat)]` on by default
|
||||||
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||||
|
= note: for more information, see issue #83125 <https://github.com/rust-lang/rust/issues/83125>
|
||||||
|
= note: The `procedural-masquerade` crate has been unnecessary since Rust 1.30.0. Versions of this crate below 0.1.7 will eventually stop compiling.
|
||||||
|
|
@ -0,0 +1,22 @@
|
|||||||
|
PRINT-DERIVE INPUT (DISPLAY): enum ProceduralMasqueradeDummyType { Input, }
|
||||||
|
PRINT-DERIVE RE-COLLECTED (DISPLAY): enum ProceduralMasqueradeDummyType { Input }
|
||||||
|
PRINT-DERIVE INPUT (DEBUG): TokenStream [
|
||||||
|
Ident {
|
||||||
|
ident: "enum",
|
||||||
|
span: #0 bytes(100..104),
|
||||||
|
},
|
||||||
|
Ident {
|
||||||
|
ident: "ProceduralMasqueradeDummyType",
|
||||||
|
span: #0 bytes(105..134),
|
||||||
|
},
|
||||||
|
Group {
|
||||||
|
delimiter: Brace,
|
||||||
|
stream: TokenStream [
|
||||||
|
Ident {
|
||||||
|
ident: "Input",
|
||||||
|
span: #0 bytes(186..191),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
span: #0 bytes(135..193),
|
||||||
|
},
|
||||||
|
]
|
Loading…
Reference in New Issue
Block a user