mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
Auto merge of #107133 - pnkfelix:revert-pr-84022-for-issue-106337, r=Mark-Simulacrum
Revert "Make PROC_MACRO_DERIVE_RESOLUTION_FALLBACK a hard error"
This reverts commit 7d82cadd97
aka PR #84022
I am doing this to buy us some time with respect to issue #106337 w.r.t. the 1.67 release.
This commit is contained in:
commit
85da15c016
@ -2023,6 +2023,73 @@ declare_lint! {
|
||||
};
|
||||
}
|
||||
|
||||
declare_lint! {
|
||||
/// The `proc_macro_derive_resolution_fallback` lint detects proc macro
|
||||
/// derives using inaccessible names from parent modules.
|
||||
///
|
||||
/// ### Example
|
||||
///
|
||||
/// ```rust,ignore (proc-macro)
|
||||
/// // foo.rs
|
||||
/// #![crate_type = "proc-macro"]
|
||||
///
|
||||
/// extern crate proc_macro;
|
||||
///
|
||||
/// use proc_macro::*;
|
||||
///
|
||||
/// #[proc_macro_derive(Foo)]
|
||||
/// pub fn foo1(a: TokenStream) -> TokenStream {
|
||||
/// drop(a);
|
||||
/// "mod __bar { static mut BAR: Option<Something> = None; }".parse().unwrap()
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// ```rust,ignore (needs-dependency)
|
||||
/// // bar.rs
|
||||
/// #[macro_use]
|
||||
/// extern crate foo;
|
||||
///
|
||||
/// struct Something;
|
||||
///
|
||||
/// #[derive(Foo)]
|
||||
/// struct Another;
|
||||
///
|
||||
/// fn main() {}
|
||||
/// ```
|
||||
///
|
||||
/// This will produce:
|
||||
///
|
||||
/// ```text
|
||||
/// warning: cannot find type `Something` in this scope
|
||||
/// --> src/main.rs:8:10
|
||||
/// |
|
||||
/// 8 | #[derive(Foo)]
|
||||
/// | ^^^ names from parent modules are not accessible without an explicit import
|
||||
/// |
|
||||
/// = note: `#[warn(proc_macro_derive_resolution_fallback)]` 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 #50504 <https://github.com/rust-lang/rust/issues/50504>
|
||||
/// ```
|
||||
///
|
||||
/// ### Explanation
|
||||
///
|
||||
/// If a proc-macro generates a module, the compiler unintentionally
|
||||
/// allowed items in that module to refer to items in the crate root
|
||||
/// without importing them. This is a [future-incompatible] lint to
|
||||
/// transition this to a hard error in the future. See [issue #50504] for
|
||||
/// more details.
|
||||
///
|
||||
/// [issue #50504]: https://github.com/rust-lang/rust/issues/50504
|
||||
/// [future-incompatible]: ../index.md#future-incompatible-lints
|
||||
pub PROC_MACRO_DERIVE_RESOLUTION_FALLBACK,
|
||||
Deny,
|
||||
"detects proc macro derives using inaccessible names from parent modules",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reference: "issue #83583 <https://github.com/rust-lang/rust/issues/83583>",
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorReportNow,
|
||||
};
|
||||
}
|
||||
|
||||
declare_lint! {
|
||||
/// The `macro_use_extern_crate` lint detects the use of the
|
||||
/// [`macro_use` attribute].
|
||||
@ -3261,6 +3328,7 @@ declare_lint_pass! {
|
||||
UNSTABLE_NAME_COLLISIONS,
|
||||
IRREFUTABLE_LET_PATTERNS,
|
||||
WHERE_CLAUSES_OBJECT_SAFETY,
|
||||
PROC_MACRO_DERIVE_RESOLUTION_FALLBACK,
|
||||
MACRO_USE_EXTERN_CRATE,
|
||||
MACRO_EXPANDED_MACRO_EXPORTS_ACCESSED_BY_ABSOLUTE_PATHS,
|
||||
ILL_FORMED_ATTRIBUTE_INPUT,
|
||||
|
@ -1033,7 +1033,7 @@ impl<'a> Resolver<'a> {
|
||||
let root_module = this.resolve_crate_root(root_ident);
|
||||
this.add_module_candidates(root_module, &mut suggestions, filter_fn, None);
|
||||
}
|
||||
Scope::Module(module) => {
|
||||
Scope::Module(module, _) => {
|
||||
this.add_module_candidates(module, &mut suggestions, filter_fn, None);
|
||||
}
|
||||
Scope::MacroUsePrelude => {
|
||||
|
@ -1,9 +1,11 @@
|
||||
use rustc_ast as ast;
|
||||
use rustc_ast::{self as ast, NodeId};
|
||||
use rustc_feature::is_builtin_attr_name;
|
||||
use rustc_hir::def::{DefKind, Namespace, NonMacroAttrKind, PartialRes, PerNS};
|
||||
use rustc_hir::PrimTy;
|
||||
use rustc_middle::bug;
|
||||
use rustc_middle::ty;
|
||||
use rustc_session::lint::builtin::PROC_MACRO_DERIVE_RESOLUTION_FALLBACK;
|
||||
use rustc_session::lint::BuiltinLintDiagnostics;
|
||||
use rustc_span::def_id::LocalDefId;
|
||||
use rustc_span::edition::Edition;
|
||||
use rustc_span::hygiene::{ExpnId, ExpnKind, LocalExpnId, MacroKind, SyntaxContext};
|
||||
@ -99,7 +101,7 @@ impl<'a> Resolver<'a> {
|
||||
};
|
||||
let mut scope = match ns {
|
||||
_ if is_absolute_path => Scope::CrateRoot,
|
||||
TypeNS | ValueNS => Scope::Module(module),
|
||||
TypeNS | ValueNS => Scope::Module(module, None),
|
||||
MacroNS => Scope::DeriveHelpers(parent_scope.expansion),
|
||||
};
|
||||
let mut ctxt = ctxt.normalize_to_macros_2_0();
|
||||
@ -163,7 +165,7 @@ impl<'a> Resolver<'a> {
|
||||
MacroRulesScope::Invocation(invoc_id) => {
|
||||
Scope::MacroRules(self.invocation_parent_scopes[&invoc_id].macro_rules)
|
||||
}
|
||||
MacroRulesScope::Empty => Scope::Module(module),
|
||||
MacroRulesScope::Empty => Scope::Module(module, None),
|
||||
},
|
||||
Scope::CrateRoot => match ns {
|
||||
TypeNS => {
|
||||
@ -172,10 +174,16 @@ impl<'a> Resolver<'a> {
|
||||
}
|
||||
ValueNS | MacroNS => break,
|
||||
},
|
||||
Scope::Module(module) => {
|
||||
Scope::Module(module, prev_lint_id) => {
|
||||
use_prelude = !module.no_implicit_prelude;
|
||||
match self.hygienic_lexical_parent(module, &mut ctxt) {
|
||||
Some(parent_module) => Scope::Module(parent_module),
|
||||
let derive_fallback_lint_id = match scope_set {
|
||||
ScopeSet::Late(.., lint_id) => lint_id,
|
||||
_ => None,
|
||||
};
|
||||
match self.hygienic_lexical_parent(module, &mut ctxt, derive_fallback_lint_id) {
|
||||
Some((parent_module, lint_id)) => {
|
||||
Scope::Module(parent_module, lint_id.or(prev_lint_id))
|
||||
}
|
||||
None => {
|
||||
ctxt.adjust(ExpnId::root());
|
||||
match ns {
|
||||
@ -207,13 +215,45 @@ impl<'a> Resolver<'a> {
|
||||
&mut self,
|
||||
module: Module<'a>,
|
||||
ctxt: &mut SyntaxContext,
|
||||
) -> Option<Module<'a>> {
|
||||
derive_fallback_lint_id: Option<NodeId>,
|
||||
) -> Option<(Module<'a>, Option<NodeId>)> {
|
||||
if !module.expansion.outer_expn_is_descendant_of(*ctxt) {
|
||||
return Some(self.expn_def_scope(ctxt.remove_mark()));
|
||||
return Some((self.expn_def_scope(ctxt.remove_mark()), None));
|
||||
}
|
||||
|
||||
if let ModuleKind::Block = module.kind {
|
||||
return Some(module.parent.unwrap().nearest_item_scope());
|
||||
return Some((module.parent.unwrap().nearest_item_scope(), None));
|
||||
}
|
||||
|
||||
// We need to support the next case under a deprecation warning
|
||||
// ```
|
||||
// struct MyStruct;
|
||||
// ---- begin: this comes from a proc macro derive
|
||||
// mod implementation_details {
|
||||
// // Note that `MyStruct` is not in scope here.
|
||||
// impl SomeTrait for MyStruct { ... }
|
||||
// }
|
||||
// ---- end
|
||||
// ```
|
||||
// So we have to fall back to the module's parent during lexical resolution in this case.
|
||||
if derive_fallback_lint_id.is_some() {
|
||||
if let Some(parent) = module.parent {
|
||||
// Inner module is inside the macro, parent module is outside of the macro.
|
||||
if module.expansion != parent.expansion
|
||||
&& module.expansion.is_descendant_of(parent.expansion)
|
||||
{
|
||||
// The macro is a proc macro derive
|
||||
if let Some(def_id) = module.expansion.expn_data().macro_def_id {
|
||||
let ext = self.get_macro_by_def_id(def_id).ext;
|
||||
if ext.builtin_name.is_none()
|
||||
&& ext.macro_kind() == MacroKind::Derive
|
||||
&& parent.expansion.outer_expn_is_descendant_of(*ctxt)
|
||||
{
|
||||
return Some((parent, derive_fallback_lint_id));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
None
|
||||
@ -470,7 +510,7 @@ impl<'a> Resolver<'a> {
|
||||
Err((Determinacy::Determined, _)) => Err(Determinacy::Determined),
|
||||
}
|
||||
}
|
||||
Scope::Module(module) => {
|
||||
Scope::Module(module, derive_fallback_lint_id) => {
|
||||
let adjusted_parent_scope = &ParentScope { module, ..*parent_scope };
|
||||
let binding = this.resolve_ident_in_module_unadjusted_ext(
|
||||
ModuleOrUniformRoot::Module(module),
|
||||
@ -483,6 +523,21 @@ impl<'a> Resolver<'a> {
|
||||
);
|
||||
match binding {
|
||||
Ok(binding) => {
|
||||
if let Some(lint_id) = derive_fallback_lint_id {
|
||||
this.lint_buffer.buffer_lint_with_diagnostic(
|
||||
PROC_MACRO_DERIVE_RESOLUTION_FALLBACK,
|
||||
lint_id,
|
||||
orig_ident.span,
|
||||
&format!(
|
||||
"cannot find {} `{}` in this scope",
|
||||
ns.descr(),
|
||||
ident
|
||||
),
|
||||
BuiltinLintDiagnostics::ProcMacroDeriveResolutionFallback(
|
||||
orig_ident.span,
|
||||
),
|
||||
);
|
||||
}
|
||||
let misc_flags = if ptr::eq(module, this.graph_root) {
|
||||
Flags::MISC_SUGGEST_CRATE
|
||||
} else if module.is_normal() {
|
||||
|
@ -105,7 +105,9 @@ enum Scope<'a> {
|
||||
DeriveHelpersCompat,
|
||||
MacroRules(MacroRulesScopeRef<'a>),
|
||||
CrateRoot,
|
||||
Module(Module<'a>),
|
||||
// The node ID is for reporting the `PROC_MACRO_DERIVE_RESOLUTION_FALLBACK`
|
||||
// lint if it should be reported.
|
||||
Module(Module<'a>, Option<NodeId>),
|
||||
MacroUsePrelude,
|
||||
BuiltinAttrs,
|
||||
ExternPrelude,
|
||||
@ -1591,7 +1593,7 @@ impl<'a> Resolver<'a> {
|
||||
|
||||
self.visit_scopes(ScopeSet::All(TypeNS, false), parent_scope, ctxt, |this, scope, _, _| {
|
||||
match scope {
|
||||
Scope::Module(module) => {
|
||||
Scope::Module(module, _) => {
|
||||
this.traits_in_module(module, assoc_item, &mut found_traits);
|
||||
}
|
||||
Scope::StdLibPrelude => {
|
||||
|
@ -15,16 +15,19 @@ struct S;
|
||||
|
||||
#[derive(generate_mod::CheckDerive)] //~ ERROR cannot find type `FromOutside` in this scope
|
||||
//~| ERROR cannot find type `OuterDerive` in this scope
|
||||
//~| WARN this was previously accepted
|
||||
//~| WARN this was previously accepted
|
||||
struct Z;
|
||||
|
||||
fn inner_block() {
|
||||
#[derive(generate_mod::CheckDerive)] //~ ERROR cannot find type `FromOutside` in this scope
|
||||
//~| ERROR cannot find type `OuterDerive` in this scope
|
||||
//~| WARN this was previously accepted
|
||||
//~| WARN this was previously accepted
|
||||
struct InnerZ;
|
||||
}
|
||||
|
||||
#[derive(generate_mod::CheckDeriveLint)] //~ ERROR cannot find type `OuterDeriveLint` in this scope
|
||||
//~| ERROR cannot find type `FromOutside` in this scope
|
||||
#[derive(generate_mod::CheckDeriveLint)] // OK, lint is suppressed
|
||||
struct W;
|
||||
|
||||
fn main() {}
|
||||
|
@ -38,66 +38,127 @@ LL | #[generate_mod::check_attr]
|
||||
OuterAttr
|
||||
= note: this error originates in the attribute macro `generate_mod::check_attr` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0412]: cannot find type `FromOutside` in this scope
|
||||
error: cannot find type `FromOutside` in this scope
|
||||
--> $DIR/generate-mod.rs:16:10
|
||||
|
|
||||
LL | #[derive(generate_mod::CheckDerive)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ names from parent modules are not accessible without an explicit import
|
||||
|
|
||||
= help: consider importing this struct:
|
||||
FromOutside
|
||||
= 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 #83583 <https://github.com/rust-lang/rust/issues/83583>
|
||||
= note: `#[deny(proc_macro_derive_resolution_fallback)]` on by default
|
||||
= note: this error originates in the derive macro `generate_mod::CheckDerive` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0412]: cannot find type `OuterDerive` in this scope
|
||||
error: cannot find type `OuterDerive` in this scope
|
||||
--> $DIR/generate-mod.rs:16:10
|
||||
|
|
||||
LL | #[derive(generate_mod::CheckDerive)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ names from parent modules are not accessible without an explicit import
|
||||
|
|
||||
= help: consider importing this struct:
|
||||
OuterDerive
|
||||
= 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 #83583 <https://github.com/rust-lang/rust/issues/83583>
|
||||
= note: this error originates in the derive macro `generate_mod::CheckDerive` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0412]: cannot find type `FromOutside` in this scope
|
||||
--> $DIR/generate-mod.rs:21:14
|
||||
error: cannot find type `FromOutside` in this scope
|
||||
--> $DIR/generate-mod.rs:23:14
|
||||
|
|
||||
LL | #[derive(generate_mod::CheckDerive)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ names from parent modules are not accessible without an explicit import
|
||||
|
|
||||
= help: consider importing this struct:
|
||||
FromOutside
|
||||
= 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 #83583 <https://github.com/rust-lang/rust/issues/83583>
|
||||
= note: this error originates in the derive macro `generate_mod::CheckDerive` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0412]: cannot find type `OuterDerive` in this scope
|
||||
--> $DIR/generate-mod.rs:21:14
|
||||
error: cannot find type `OuterDerive` in this scope
|
||||
--> $DIR/generate-mod.rs:23:14
|
||||
|
|
||||
LL | #[derive(generate_mod::CheckDerive)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ names from parent modules are not accessible without an explicit import
|
||||
|
|
||||
= help: consider importing this struct:
|
||||
OuterDerive
|
||||
= 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 #83583 <https://github.com/rust-lang/rust/issues/83583>
|
||||
= note: this error originates in the derive macro `generate_mod::CheckDerive` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0412]: cannot find type `FromOutside` in this scope
|
||||
--> $DIR/generate-mod.rs:26:10
|
||||
|
|
||||
LL | #[derive(generate_mod::CheckDeriveLint)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope
|
||||
|
|
||||
= help: consider importing this struct:
|
||||
FromOutside
|
||||
= note: this error originates in the derive macro `generate_mod::CheckDeriveLint` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0412]: cannot find type `OuterDeriveLint` in this scope
|
||||
--> $DIR/generate-mod.rs:26:10
|
||||
|
|
||||
LL | #[derive(generate_mod::CheckDeriveLint)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope
|
||||
|
|
||||
= help: consider importing this struct:
|
||||
OuterDeriveLint
|
||||
= note: this error originates in the derive macro `generate_mod::CheckDeriveLint` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: aborting due to 10 previous errors
|
||||
error: aborting due to 8 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0412`.
|
||||
Future incompatibility report: Future breakage diagnostic:
|
||||
error: cannot find type `FromOutside` in this scope
|
||||
--> $DIR/generate-mod.rs:16:10
|
||||
|
|
||||
LL | #[derive(generate_mod::CheckDerive)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ names from parent modules are not accessible without an explicit import
|
||||
|
|
||||
= 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 #83583 <https://github.com/rust-lang/rust/issues/83583>
|
||||
= note: `#[deny(proc_macro_derive_resolution_fallback)]` on by default
|
||||
= note: this error originates in the derive macro `generate_mod::CheckDerive` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
Future breakage diagnostic:
|
||||
error: cannot find type `OuterDerive` in this scope
|
||||
--> $DIR/generate-mod.rs:16:10
|
||||
|
|
||||
LL | #[derive(generate_mod::CheckDerive)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ names from parent modules are not accessible without an explicit import
|
||||
|
|
||||
= 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 #83583 <https://github.com/rust-lang/rust/issues/83583>
|
||||
= note: `#[deny(proc_macro_derive_resolution_fallback)]` on by default
|
||||
= note: this error originates in the derive macro `generate_mod::CheckDerive` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
Future breakage diagnostic:
|
||||
error: cannot find type `FromOutside` in this scope
|
||||
--> $DIR/generate-mod.rs:23:14
|
||||
|
|
||||
LL | #[derive(generate_mod::CheckDerive)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ names from parent modules are not accessible without an explicit import
|
||||
|
|
||||
= 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 #83583 <https://github.com/rust-lang/rust/issues/83583>
|
||||
= note: `#[deny(proc_macro_derive_resolution_fallback)]` on by default
|
||||
= note: this error originates in the derive macro `generate_mod::CheckDerive` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
Future breakage diagnostic:
|
||||
error: cannot find type `OuterDerive` in this scope
|
||||
--> $DIR/generate-mod.rs:23:14
|
||||
|
|
||||
LL | #[derive(generate_mod::CheckDerive)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ names from parent modules are not accessible without an explicit import
|
||||
|
|
||||
= 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 #83583 <https://github.com/rust-lang/rust/issues/83583>
|
||||
= note: `#[deny(proc_macro_derive_resolution_fallback)]` on by default
|
||||
= note: this error originates in the derive macro `generate_mod::CheckDerive` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
Future breakage diagnostic:
|
||||
warning: cannot find type `FromOutside` in this scope
|
||||
--> $DIR/generate-mod.rs:30:10
|
||||
|
|
||||
LL | #[derive(generate_mod::CheckDeriveLint)] // OK, lint is suppressed
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ names from parent modules are not accessible without an explicit import
|
||||
|
|
||||
= 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 #83583 <https://github.com/rust-lang/rust/issues/83583>
|
||||
note: the lint level is defined here
|
||||
--> $DIR/generate-mod.rs:30:10
|
||||
|
|
||||
LL | #[derive(generate_mod::CheckDeriveLint)] // OK, lint is suppressed
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: this warning originates in the derive macro `generate_mod::CheckDeriveLint` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
Future breakage diagnostic:
|
||||
warning: cannot find type `OuterDeriveLint` in this scope
|
||||
--> $DIR/generate-mod.rs:30:10
|
||||
|
|
||||
LL | #[derive(generate_mod::CheckDeriveLint)] // OK, lint is suppressed
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ names from parent modules are not accessible without an explicit import
|
||||
|
|
||||
= 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 #83583 <https://github.com/rust-lang/rust/issues/83583>
|
||||
note: the lint level is defined here
|
||||
--> $DIR/generate-mod.rs:30:10
|
||||
|
|
||||
LL | #[derive(generate_mod::CheckDeriveLint)] // OK, lint is suppressed
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: this warning originates in the derive macro `generate_mod::CheckDeriveLint` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user