diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 39a9194cf5e60..74df14e881d7e 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -2410,13 +2410,15 @@ impl<'a> Resolver<'a> { match binding { Ok(binding) => { + let def = binding.def(); + let maybe_assoc = opt_ns != Some(MacroNS) && PathSource::Type.is_expected(def); if let Some(next_module) = binding.module() { module = Some(next_module); - } else if binding.def() == Def::Err { + } else if def == Def::Err { return PathResult::NonModule(err_path_resolution()); - } else if opt_ns.is_some() && !(opt_ns == Some(MacroNS) && !is_last) { + } else if opt_ns.is_some() && (is_last || maybe_assoc) { return PathResult::NonModule(PathResolution { - base_def: binding.def(), + base_def: def, depth: path.len() - i - 1, }); } else { diff --git a/src/test/compile-fail/resolve-variant-assoc-item.rs b/src/test/compile-fail/resolve-variant-assoc-item.rs new file mode 100644 index 0000000000000..869eed5a8d774 --- /dev/null +++ b/src/test/compile-fail/resolve-variant-assoc-item.rs @@ -0,0 +1,17 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +enum E { V } +use E::V; + +fn main() { + E::V::associated_item; //~ ERROR failed to resolve. Not a module `V` + V::associated_item; //~ ERROR failed to resolve. Not a module `V` +} diff --git a/src/test/compile-fail/ufcs-partially-resolved.rs b/src/test/compile-fail/ufcs-partially-resolved.rs index 5337272343b7d..7e2c97711801d 100644 --- a/src/test/compile-fail/ufcs-partially-resolved.rs +++ b/src/test/compile-fail/ufcs-partially-resolved.rs @@ -55,9 +55,9 @@ fn main() { ::NN; //~ ERROR unresolved method or associated constant `E::N::NN` ::NN; //~ ERROR unresolved method or associated constant `A::N::NN` let _: ::NN; //~ ERROR unresolved associated type `Tr::Y::NN` - let _: ::NN; //~ ERROR unresolved associated type `E::Y::NN` + let _: ::NN; //~ ERROR failed to resolve. Not a module `Y` ::NN; //~ ERROR unresolved method or associated constant `Tr::Y::NN` - ::NN; //~ ERROR unresolved method or associated constant `E::Y::NN` + ::NN; //~ ERROR failed to resolve. Not a module `Y` let _: ::Z; //~ ERROR expected associated type, found method `Dr::Z` ::X; //~ ERROR expected method or associated constant, found associated type `Dr::X`