From 0157e6c0588902967c9606e31fefebfd0cf5d7fd Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Thu, 15 Dec 2016 02:12:08 +0300 Subject: [PATCH] Fix regression in resolution of primitive types --- src/librustc_resolve/lib.rs | 6 ++++-- .../resolve-primitive-fallback.rs | 20 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 src/test/compile-fail/resolve-primitive-fallback.rs diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index f7aaf2475f6..ea5aa5be013 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -754,7 +754,7 @@ impl<'a> LexicalScopeBinding<'a> { } } -#[derive(Copy, Clone)] +#[derive(Copy, Clone, PartialEq)] enum PathScope { Global, Lexical, @@ -2292,7 +2292,9 @@ impl<'a> Resolver<'a> { // // Such behavior is required for backward compatibility. // The same fallback is used when `a` resolves to nothing. - _ if self.primitive_type_table.primitive_types.contains_key(&path[0].name) => { + PathResult::Module(..) | PathResult::Failed(..) + if scope == PathScope::Lexical && (ns == TypeNS || path.len() > 1) && + self.primitive_type_table.primitive_types.contains_key(&path[0].name) => { PathResolution { base_def: Def::PrimTy(self.primitive_type_table.primitive_types[&path[0].name]), depth: segments.len() - 1, diff --git a/src/test/compile-fail/resolve-primitive-fallback.rs b/src/test/compile-fail/resolve-primitive-fallback.rs new file mode 100644 index 00000000000..1e43933ad0a --- /dev/null +++ b/src/test/compile-fail/resolve-primitive-fallback.rs @@ -0,0 +1,20 @@ +// 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. + +fn main() { + // Make sure primitive type fallback doesn't work in value namespace + std::mem::size_of(u16); + //~^ ERROR unresolved name `u16` + //~| ERROR this function takes 0 parameters but 1 parameter was supplied + + // Make sure primitive type fallback doesn't work with global paths + let _: ::u8; + //~^ ERROR type name `u8` is undefined or not in scope +}