]> git.lizzy.rs Git - rust.git/commitdiff
Avoid flow-on Iterator error for `for ... in [ty err] {}`.
authorHuon Wilson <dbau.pp+github@gmail.com>
Tue, 26 Aug 2014 12:45:00 +0000 (22:45 +1000)
committerHuon Wilson <dbau.pp+github@gmail.com>
Fri, 29 Aug 2014 07:43:46 +0000 (17:43 +1000)
This squashes the

> `for` loop expression has type `[type error]` which does not implement
> the `Iterator` trait

message that one received when writing `for ... in x` where was
previously found to have a type error.

Fixes #16042.

src/librustc/middle/typeck/check/mod.rs
src/test/compile-fail/for-loop-type-error.rs [new file with mode: 0644]

index d8044ba96ddff1119765f56d6f3f427c311ae94c..cfd2ee2b44190c74e82a9f40e7ef74a373fc1f3f 100644 (file)
@@ -2184,10 +2184,15 @@ fn lookup_method_for_for_loop(fcx: &FnCtxt,
     let method_type = match method {
         Some(ref method) => method.ty,
         None => {
-            fcx.tcx().sess.span_err(iterator_expr.span,
-                                    format!("`for` loop expression has type `{}` which does \
-                                             not implement the `Iterator` trait",
-                                            fcx.infcx().ty_to_string(expr_type)).as_slice());
+            let true_expr_type = fcx.infcx().resolve_type_vars_if_possible(expr_type);
+
+            if !ty::type_is_error(true_expr_type) {
+                let ty_string = fcx.infcx().ty_to_string(true_expr_type);
+                fcx.tcx().sess.span_err(iterator_expr.span,
+                                        format!("`for` loop expression has type `{}` which does \
+                                                 not implement the `Iterator` trait",
+                                                ty_string).as_slice());
+            }
             ty::mk_err()
         }
     };
diff --git a/src/test/compile-fail/for-loop-type-error.rs b/src/test/compile-fail/for-loop-type-error.rs
new file mode 100644 (file)
index 0000000..7f0e401
--- /dev/null
@@ -0,0 +1,16 @@
+// Copyright 2014 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.
+
+pub fn main() {
+    let x = () + (); //~ ERROR binary operation
+
+    // this shouldn't have a flow-on error:
+    for _ in x {}
+}