From 7e8825b4ecdc0540dd3008eb9ff6c520bc88799d Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Mon, 20 Aug 2018 03:35:52 +0300 Subject: [PATCH] resolve: Continue search in outer scopes after applying derive resolution fallback --- src/librustc_resolve/lib.rs | 23 ++++++++++--------- .../ui-fulldeps/proc-macro/generate-mod.rs | 8 +++++++ .../proc-macro/generate-mod.stderr | 18 +++++++++++++++ 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 2e163cb4c6a37..3ebf5793e550b 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -1900,12 +1900,13 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> { } ident.span = ident.span.modern(); + let mut poisoned = None; loop { - let (opt_module, poisoned) = if let Some(node_id) = record_used_id { + let opt_module = if let Some(node_id) = record_used_id { self.hygienic_lexical_parent_with_compatibility_fallback(module, &mut ident.span, - node_id) + node_id, &mut poisoned) } else { - (self.hygienic_lexical_parent(module, &mut ident.span), None) + self.hygienic_lexical_parent(module, &mut ident.span) }; module = unwrap_or!(opt_module, break); let orig_current_module = self.current_module; @@ -1933,7 +1934,6 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> { } return Some(LexicalScopeBinding::Item(binding)) } - _ if poisoned.is_some() => break, Err(Determined) => continue, Err(Undetermined) => span_bug!(ident.span, "undetermined resolution during main resolution pass"), @@ -1993,12 +1993,12 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> { None } - fn hygienic_lexical_parent_with_compatibility_fallback( - &mut self, module: Module<'a>, span: &mut Span, node_id: NodeId - ) -> (Option>, /* poisoned */ Option) - { + fn hygienic_lexical_parent_with_compatibility_fallback(&mut self, module: Module<'a>, + span: &mut Span, node_id: NodeId, + poisoned: &mut Option) + -> Option> { if let module @ Some(..) = self.hygienic_lexical_parent(module, span) { - return (module, None); + return module; } // We need to support the next case under a deprecation warning @@ -2019,13 +2019,14 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> { // The macro is a proc macro derive if module.expansion.looks_like_proc_macro_derive() { if parent.expansion.is_descendant_of(span.ctxt().outer()) { - return (module.parent, Some(node_id)); + *poisoned = Some(node_id); + return module.parent; } } } } - (None, None) + None } fn resolve_ident_in_module(&mut self, diff --git a/src/test/ui-fulldeps/proc-macro/generate-mod.rs b/src/test/ui-fulldeps/proc-macro/generate-mod.rs index b0cccd8728bd1..6ac6e4f6def5c 100644 --- a/src/test/ui-fulldeps/proc-macro/generate-mod.rs +++ b/src/test/ui-fulldeps/proc-macro/generate-mod.rs @@ -31,6 +31,14 @@ struct S; //~| WARN this was previously accepted struct Z; +fn inner_block() { + #[derive(generate_mod::CheckDerive)] //~ WARN cannot find type `FromOutside` in this scope + //~| WARN 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 struct W; diff --git a/src/test/ui-fulldeps/proc-macro/generate-mod.stderr b/src/test/ui-fulldeps/proc-macro/generate-mod.stderr index c024aeffbb086..87e5fe2554264 100644 --- a/src/test/ui-fulldeps/proc-macro/generate-mod.stderr +++ b/src/test/ui-fulldeps/proc-macro/generate-mod.stderr @@ -41,6 +41,24 @@ LL | #[derive(generate_mod::CheckDerive)] //~ WARN cannot find type `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 #50504 +warning: cannot find type `FromOutside` in this scope + --> $DIR/generate-mod.rs:35:14 + | +LL | #[derive(generate_mod::CheckDerive)] //~ WARN cannot find type `FromOutside` in this scope + | ^^^^^^^^^^^^^^^^^^^^^^^^^ 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 #50504 + +warning: cannot find type `OuterDerive` in this scope + --> $DIR/generate-mod.rs:35:14 + | +LL | #[derive(generate_mod::CheckDerive)] //~ WARN cannot find type `FromOutside` in this scope + | ^^^^^^^^^^^^^^^^^^^^^^^^^ 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 #50504 + error: aborting due to 4 previous errors For more information about this error, try `rustc --explain E0412`.