about summary refs log tree commit diff
diff options
context:
space:
mode:
authorpetrochenkov <vadim.petrochenkov@gmail.com>2017-09-30 16:42:22 +0300
committerpetrochenkov <vadim.petrochenkov@gmail.com>2017-09-30 17:41:00 +0300
commit8037c28a4a6f238ba63fcbf306f61d4c30ce6a8a (patch)
tree38cb3a6699863b3c981ef1abe78ba6ac7e0d6f01
parent4491ea5a3f21b63e7d0f39d9294308673a6e9715 (diff)
downloadrust-8037c28a4a6f238ba63fcbf306f61d4c30ce6a8a.tar.gz
rust-8037c28a4a6f238ba63fcbf306f61d4c30ce6a8a.zip
Do not require semantic types for all syntactic types when there are type errors
-rw-r--r--src/librustc_typeck/astconv.rs10
-rw-r--r--src/librustc_typeck/check/mod.rs2
-rw-r--r--src/test/compile-fail/type-path-err-node-types.rs25
3 files changed, 23 insertions, 14 deletions
diff --git a/src/librustc_typeck/astconv.rs b/src/librustc_typeck/astconv.rs
index 54fd070e93c..22001d00896 100644
--- a/src/librustc_typeck/astconv.rs
+++ b/src/librustc_typeck/astconv.rs
@@ -988,16 +988,6 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
                 }
             }
             Def::Err => {
-                for segment in &path.segments {
-                    segment.with_parameters(|parameters| {
-                        for ty in &parameters.types {
-                            self.ast_ty_to_ty(ty);
-                        }
-                        for binding in &parameters.bindings {
-                            self.ast_ty_to_ty(&binding.ty);
-                        }
-                    });
-                }
                 self.set_tainted_by_errors();
                 return self.tcx().types.err;
             }
diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs
index a0099a48c89..09294332a4f 100644
--- a/src/librustc_typeck/check/mod.rs
+++ b/src/librustc_typeck/check/mod.rs
@@ -2009,7 +2009,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
     pub fn node_ty(&self, id: hir::HirId) -> Ty<'tcx> {
         match self.tables.borrow().node_types().get(id) {
             Some(&t) => t,
-            None if self.err_count_since_creation() != 0 => self.tcx.types.err,
+            None if self.is_tainted_by_errors() => self.tcx.types.err,
             None => {
                 let node_id = self.tcx.hir.definitions().find_node_for_hir_id(id);
                 bug!("no type for node {}: {} in fcx {}",
diff --git a/src/test/compile-fail/type-path-err-node-types.rs b/src/test/compile-fail/type-path-err-node-types.rs
index 8f26777b441..7ef099d0410 100644
--- a/src/test/compile-fail/type-path-err-node-types.rs
+++ b/src/test/compile-fail/type-path-err-node-types.rs
@@ -8,10 +8,29 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-// Type arguments of unresolved types should have their types recorded
+// Type arguments in unresolved entities (reporting errors before type checking)
+// should have their types recorded.
 
-fn main() {
+trait Tr<T> {}
+
+fn local_type() {
     let _: Nonexistent<u8, Assoc = u16>; //~ ERROR cannot find type `Nonexistent` in this scope
+}
 
-    let _ = |a, b: _| -> _ { 0 };
+fn ufcs_trait() {
+    <u8 as Tr<u8>>::nonexistent(); //~ ERROR cannot find method or associated constant `nonexistent`
 }
+
+fn ufcs_item() {
+    NonExistent::Assoc::<u8>; //~ ERROR undeclared type or module `NonExistent`
+}
+
+fn method() {
+    nonexistent.nonexistent::<u8>(); //~ ERROR cannot find value `nonexistent`
+}
+
+fn closure() {
+    let _ = |a, b: _| -> _ { 0 }; // OK
+}
+
+fn main() {}