]> git.lizzy.rs Git - rust.git/commitdiff
auto merge of #15809 : pcwalton/rust/dedesugar-for, r=pnkfelix
authorbors <bors@rust-lang.org>
Fri, 25 Jul 2014 02:21:14 +0000 (02:21 +0000)
committerbors <bors@rust-lang.org>
Fri, 25 Jul 2014 02:21:14 +0000 (02:21 +0000)
librustc: Stop desugaring `for` expressions and translate them directly.

This makes edge cases in which the `Iterator` trait was not in scope
and/or `Option` or its variants were not in scope work properly.

This breaks code that looks like:

    struct MyStruct { ... }

    impl MyStruct {
        fn next(&mut self) -> Option<int> { ... }
    }

    for x in MyStruct { ... } { ... }

Change ad-hoc `next` methods like the above to implementations of the
`Iterator` trait. For example:

    impl Iterator<int> for MyStruct {
        fn next(&mut self) -> Option<int> { ... }
    }

Closes #15392.

[breaking-change]

src/librustc/middle/typeck/check/_match.rs
src/test/compile-fail/issue-15896.rs [new file with mode: 0644]

index 3f54677c08b2456c38ad95c5a588038bed88bdf8..a238c207696a1873013eecc836289dbd8e06cd89 100644 (file)
@@ -391,7 +391,9 @@ pub fn check_struct_like_enum_variant_pat(pcx: &pat_ctxt,
             check_struct_pat_fields(pcx, span, fields, class_fields,
                                     variant_id, substitutions, etc);
         }
-        Some(&def::DefStruct(..)) | Some(&def::DefVariant(..)) => {
+        Some(&def::DefStruct(..)) |
+        Some(&def::DefVariant(..)) |
+        Some(&def::DefTy(..)) => {
             let name = pprust::path_to_string(path);
             span_err!(tcx.sess, span, E0028,
                 "mismatched types: expected `{}` but found `{}`",
diff --git a/src/test/compile-fail/issue-15896.rs b/src/test/compile-fail/issue-15896.rs
new file mode 100644 (file)
index 0000000..a873c1e
--- /dev/null
@@ -0,0 +1,24 @@
+// Copyright 2012-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.
+
+// Regression test for #15896. It used to ICE rustc.
+
+fn main() {
+    enum R { REB(()) }
+    struct Tau { t: uint }
+    enum E { B(R, Tau) }
+
+    let e = B(REB(()), Tau { t: 3 });
+    let u = match e {
+        B(
+          Tau{t: x},    //~ ERROR mismatched types
+          _) => x,
+    };
+}