about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2016-04-05 18:56:24 -0400
committerNiko Matsakis <niko@alum.mit.edu>2016-04-12 13:29:47 -0400
commita4e0e6bbf5835afc69ab5df383097a1d7b8293c5 (patch)
treef0938b71e60c7ff85234bec3e5640c4d5ba097ea
parentccaa2f855e34028ff9be745ecc9803e720d34b5e (diff)
downloadrust-a4e0e6bbf5835afc69ab5df383097a1d7b8293c5.tar.gz
rust-a4e0e6bbf5835afc69ab5df383097a1d7b8293c5.zip
avoid "type must be known here" errors if tainted
-rw-r--r--src/librustc_typeck/check/mod.rs8
-rw-r--r--src/test/compile-fail/issue-31997.rs67
2 files changed, 72 insertions, 3 deletions
diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs
index 5bc6184263c..31458eac9ef 100644
--- a/src/librustc_typeck/check/mod.rs
+++ b/src/librustc_typeck/check/mod.rs
@@ -4800,9 +4800,11 @@ fn structurally_resolve_type_or_else<'a, 'tcx, F>(fcx: &FnCtxt<'a, 'tcx>,
 
         // If not, error.
         if alternative.is_ty_var() || alternative.references_error() {
-            fcx.type_error_message(sp, |_actual| {
-                "the type of this value must be known in this context".to_string()
-            }, ty, None);
+            if !fcx.infcx().is_tainted_by_errors() {
+                fcx.type_error_message(sp, |_actual| {
+                    "the type of this value must be known in this context".to_string()
+                }, ty, None);
+            }
             demand::suptype(fcx, sp, fcx.tcx().types.err, ty);
             ty = fcx.tcx().types.err;
         } else {
diff --git a/src/test/compile-fail/issue-31997.rs b/src/test/compile-fail/issue-31997.rs
new file mode 100644
index 00000000000..2d78382fea3
--- /dev/null
+++ b/src/test/compile-fail/issue-31997.rs
@@ -0,0 +1,67 @@
+// Copyright 2012 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.
+
+// Regression test for this example from #31997 -- main goal is to
+// emit as minimal and precise an error set as possible. Ideally, we'd
+// only emit the E0433 error below, but right now we emit two.
+
+use std::io::prelude::*;
+// use std::collections::HashMap;
+use std::io;
+
+#[derive(Debug)]
+struct Instance {
+    name: String,
+    start: Option<String>,
+    end: Option<String>,
+}
+
+fn main() {
+    let input = io::stdin();
+    let mut input = input.lock();
+
+    let mut map = HashMap::new();
+    //~^ ERROR E0433
+    //~| ERROR E0425
+
+    for line in input.lines() {
+        let line = line.unwrap();
+        println!("process: {}", line);
+        let mut parts = line.splitn(2, ":");
+        let _logfile = parts.next().unwrap();
+        let rest = parts.next().unwrap();
+        let mut parts = line.split(" [-] ");
+
+        let stamp = parts.next().unwrap();
+
+        let rest = parts.next().unwrap();
+        let words = rest.split_whitespace().collect::<Vec<_>>();
+
+        let instance = words.iter().find(|a| a.starts_with("i-")).unwrap();
+        let name = words[1].to_owned();
+        let mut entry = map.entry(instance.to_owned()).or_insert(Instance {
+            name: name,
+            start: None,
+            end: None,
+        });
+
+        if rest.contains("terminating") {
+            assert!(entry.end.is_none());
+            entry.end = Some(stamp.to_string());
+        }
+        if rest.contains("waiting for") {
+            assert!(entry.start.is_none());
+            entry.start = Some(stamp.to_string());
+        }
+
+    }
+
+    println!("{:?}", map);
+}