diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2018-08-20 03:35:52 +0300 |
|---|---|---|
| committer | Pietro Albini <pietro@pietroalbini.org> | 2018-08-25 15:35:58 +0200 |
| commit | ef2b1f16865319ce8b6affbf34fee4d3039c8540 (patch) | |
| tree | a8abbd9e3a7b19417fae92b558f297b2bdc81f26 /src | |
| parent | 21ef15223fb45cf19013eb5cddee0049e225cf43 (diff) | |
| download | rust-ef2b1f16865319ce8b6affbf34fee4d3039c8540.tar.gz rust-ef2b1f16865319ce8b6affbf34fee4d3039c8540.zip | |
resolve: Continue search in outer scopes after applying derive resolution fallback
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_resolve/lib.rs | 28 | ||||
| -rw-r--r-- | src/test/ui-fulldeps/proc-macro/generate-mod.rs | 8 | ||||
| -rw-r--r-- | src/test/ui-fulldeps/proc-macro/generate-mod.stderr | 18 |
3 files changed, 41 insertions, 13 deletions
diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 9714679949f..d41f3ec1d9b 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -1889,12 +1889,13 @@ impl<'a> Resolver<'a> { } 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; @@ -1917,9 +1918,9 @@ impl<'a> Resolver<'a> { } return Some(LexicalScopeBinding::Item(binding)) } - _ if poisoned.is_some() => break, - Err(Undetermined) => return None, - Err(Determined) => {} + Err(Determined) => continue, + Err(Undetermined) => + span_bug!(ident.span, "undetermined resolution during main resolution pass"), } } @@ -1965,12 +1966,12 @@ impl<'a> Resolver<'a> { None } - fn hygienic_lexical_parent_with_compatibility_fallback( - &mut self, module: Module<'a>, span: &mut Span, node_id: NodeId - ) -> (Option<Module<'a>>, /* poisoned */ Option<NodeId>) - { + fn hygienic_lexical_parent_with_compatibility_fallback(&mut self, module: Module<'a>, + span: &mut Span, node_id: NodeId, + poisoned: &mut Option<NodeId>) + -> Option<Module<'a>> { 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 @@ -1991,13 +1992,14 @@ impl<'a> Resolver<'a> { // 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 ee0077c3ed3..ac59984658d 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 c024aeffbb0..87e5fe25542 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 <https://github.com/rust-lang/rust/issues/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 <https://github.com/rust-lang/rust/issues/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 <https://github.com/rust-lang/rust/issues/50504> + error: aborting due to 4 previous errors For more information about this error, try `rustc --explain E0412`. |
