diff options
| author | petrochenkov <vadim.petrochenkov@gmail.com> | 2017-09-30 16:42:22 +0300 |
|---|---|---|
| committer | petrochenkov <vadim.petrochenkov@gmail.com> | 2017-09-30 17:41:00 +0300 |
| commit | 8037c28a4a6f238ba63fcbf306f61d4c30ce6a8a (patch) | |
| tree | 38cb3a6699863b3c981ef1abe78ba6ac7e0d6f01 | |
| parent | 4491ea5a3f21b63e7d0f39d9294308673a6e9715 (diff) | |
| download | rust-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.rs | 10 | ||||
| -rw-r--r-- | src/librustc_typeck/check/mod.rs | 2 | ||||
| -rw-r--r-- | src/test/compile-fail/type-path-err-node-types.rs | 25 |
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 ¶meters.types { - self.ast_ty_to_ty(ty); - } - for binding in ¶meters.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() {} |
