about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2016-12-15 02:39:34 +0000
committerbors <bors@rust-lang.org>2016-12-15 02:39:34 +0000
commit7ad7232422f7e5bbfa0e52dabe36c12677df19e2 (patch)
treeba556fcc1298e002076083769b00bf6e4d68e6b1
parent52e024f2d1bc003ae0d9aaf281f48bb02d23167d (diff)
parent0157e6c0588902967c9606e31fefebfd0cf5d7fd (diff)
downloadrust-7ad7232422f7e5bbfa0e52dabe36c12677df19e2.tar.gz
rust-7ad7232422f7e5bbfa0e52dabe36c12677df19e2.zip
Auto merge of #38375 - petrochenkov:prim, r=eddyb
Fix regression in resolution of primitive types

Fix often encountered ICE.
Extracted from https://github.com/rust-lang/rust/pull/38154
Fixes https://github.com/rust-lang/rust/issues/38155, fixes https://github.com/rust-lang/rust/issues/38188, fixes https://github.com/rust-lang/rust/issues/38277, fixes https://github.com/rust-lang/rust/issues/38280, fixes https://github.com/rust-lang/rust/issues/38292, fixes https://github.com/rust-lang/rust/issues/38311, fixes https://github.com/rust-lang/rust/issues/38344, fixes https://github.com/rust-lang/rust/issues/38363, fixes https://github.com/rust-lang/rust/issues/38372 (duplicates)

r? @jseyfried or @eddyb or @nrc
-rw-r--r--src/librustc_resolve/lib.rs6
-rw-r--r--src/test/compile-fail/resolve-primitive-fallback.rs20
2 files changed, 24 insertions, 2 deletions
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 <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.
+
+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
+}