};
}
-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].
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,
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 => {
-use rustc_ast::{self as ast, NodeId};
+use rustc_ast as ast;
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};
};
let mut scope = match ns {
_ if is_absolute_path => Scope::CrateRoot,
- TypeNS | ValueNS => Scope::Module(module, None),
+ TypeNS | ValueNS => Scope::Module(module),
MacroNS => Scope::DeriveHelpers(parent_scope.expansion),
};
let mut ctxt = ctxt.normalize_to_macros_2_0();
MacroRulesScope::Invocation(invoc_id) => {
Scope::MacroRules(self.invocation_parent_scopes[&invoc_id].macro_rules)
}
- MacroRulesScope::Empty => Scope::Module(module, None),
+ MacroRulesScope::Empty => Scope::Module(module),
},
Scope::CrateRoot => match ns {
TypeNS => {
}
ValueNS | MacroNS => break,
},
- Scope::Module(module, prev_lint_id) => {
+ Scope::Module(module) => {
use_prelude = !module.no_implicit_prelude;
- 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))
- }
+ match self.hygienic_lexical_parent(module, &mut ctxt) {
+ Some(parent_module) => Scope::Module(parent_module),
None => {
ctxt.adjust(ExpnId::root());
match ns {
&mut self,
module: Module<'a>,
ctxt: &mut SyntaxContext,
- derive_fallback_lint_id: Option<NodeId>,
- ) -> Option<(Module<'a>, Option<NodeId>)> {
+ ) -> Option<Module<'a>> {
if !module.expansion.outer_expn_is_descendant_of(*ctxt) {
- return Some((self.expn_def_scope(ctxt.remove_mark()), None));
+ return Some(self.expn_def_scope(ctxt.remove_mark()));
}
if let ModuleKind::Block = module.kind {
- 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));
- }
- }
- }
- }
+ return Some(module.parent.unwrap().nearest_item_scope());
}
None
Err((Determinacy::Determined, _)) => Err(Determinacy::Determined),
}
}
- Scope::Module(module, derive_fallback_lint_id) => {
+ Scope::Module(module) => {
let adjusted_parent_scope = &ParentScope { module, ..*parent_scope };
let binding = this.resolve_ident_in_module_unadjusted_ext(
ModuleOrUniformRoot::Module(module),
);
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() {
DeriveHelpersCompat,
MacroRules(MacroRulesScopeRef<'a>),
CrateRoot,
- // The node ID is for reporting the `PROC_MACRO_DERIVE_RESOLUTION_FALLBACK`
- // lint if it should be reported.
- Module(Module<'a>, Option<NodeId>),
+ Module(Module<'a>),
MacroUsePrelude,
BuiltinAttrs,
ExternPrelude,
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 => {
#[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)] // OK, lint is suppressed
+#[derive(generate_mod::CheckDeriveLint)] //~ ERROR cannot find type `OuterDeriveLint` in this scope
+ //~| ERROR cannot find type `FromOutside` in this scope
struct W;
fn main() {}
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: cannot find type `FromOutside` in this scope
+error[E0412]: 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
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope
|
- = 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: consider importing this struct:
+ FromOutside
= note: this error originates in the derive macro `generate_mod::CheckDerive` (in Nightly builds, run with -Z macro-backtrace for more info)
-error: cannot find type `OuterDerive` in this scope
+error[E0412]: 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: this error originates in the derive macro `generate_mod::CheckDerive` (in Nightly builds, run with -Z macro-backtrace for more info)
-
-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
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope
|
- = 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: consider importing this struct:
+ OuterDerive
= note: this error originates in the derive macro `generate_mod::CheckDerive` (in Nightly builds, run with -Z macro-backtrace for more info)
-error: cannot find type `OuterDerive` in this scope
- --> $DIR/generate-mod.rs:23:14
+error[E0412]: cannot find type `FromOutside` in this scope
+ --> $DIR/generate-mod.rs:21: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: this error originates in the derive macro `generate_mod::CheckDerive` (in Nightly builds, run with -Z macro-backtrace for more info)
-
-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
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope
|
- = 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: consider importing this struct:
+ FromOutside
= 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
+error[E0412]: cannot find type `OuterDerive` in this scope
+ --> $DIR/generate-mod.rs:21:14
|
LL | #[derive(generate_mod::CheckDerive)]
- | ^^^^^^^^^^^^^^^^^^^^^^^^^ names from parent modules are not accessible without an explicit import
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope
|
- = 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: consider importing this struct:
+ OuterDerive
= 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
+error[E0412]: cannot find type `FromOutside` in this scope
+ --> $DIR/generate-mod.rs:26:10
|
-LL | #[derive(generate_mod::CheckDerive)]
- | ^^^^^^^^^^^^^^^^^^^^^^^^^ names from parent modules are not accessible without an explicit import
+LL | #[derive(generate_mod::CheckDeriveLint)]
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope
|
- = 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)
+ = note: 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)
-Future breakage diagnostic:
-warning: cannot find type `FromOutside` in this scope
- --> $DIR/generate-mod.rs:30:10
+error[E0412]: cannot find type `OuterDeriveLint` in this scope
+ --> $DIR/generate-mod.rs:26:10
|
-LL | #[derive(generate_mod::CheckDeriveLint)] // OK, lint is suppressed
- | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ names from parent modules are not accessible without an explicit import
+LL | #[derive(generate_mod::CheckDeriveLint)]
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope
|
- = 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)
+ = note: 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)
-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)
+error: aborting due to 10 previous errors
+For more information about this error, try `rustc --explain E0412`.