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 {
--- /dev/null
+// 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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`
+}
<u8 as E::N>::NN; //~ ERROR unresolved method or associated constant `E::N::NN`
<u8 as A::N>::NN; //~ ERROR unresolved method or associated constant `A::N::NN`
let _: <u8 as Tr::Y>::NN; //~ ERROR unresolved associated type `Tr::Y::NN`
- let _: <u8 as E::Y>::NN; //~ ERROR unresolved associated type `E::Y::NN`
+ let _: <u8 as E::Y>::NN; //~ ERROR failed to resolve. Not a module `Y`
<u8 as Tr::Y>::NN; //~ ERROR unresolved method or associated constant `Tr::Y::NN`
- <u8 as E::Y>::NN; //~ ERROR unresolved method or associated constant `E::Y::NN`
+ <u8 as E::Y>::NN; //~ ERROR failed to resolve. Not a module `Y`
let _: <u8 as Dr>::Z; //~ ERROR expected associated type, found method `Dr::Z`
<u8 as Dr>::X; //~ ERROR expected method or associated constant, found associated type `Dr::X`