about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorJohn Kåre Alsaker <john.kare.alsaker@gmail.com>2017-07-15 03:51:44 +0200
committerJohn Kåre Alsaker <john.kare.alsaker@gmail.com>2017-07-28 15:46:25 +0200
commit93172045c817ffa998d5e28a0899f33edf889f62 (patch)
tree2d9f667b7b86acfb14ac1154503e6670162d23fb /src
parentdcddd807297765b85f11c05f68f0845cc8d372aa (diff)
Fix a bug with yielding subtypes of the yield type.
Diffstat (limited to 'src')
-rw-r--r--src/librustc_mir/transform/type_check.rs16
-rw-r--r--src/test/run-pass/generator/yield-subtype.rs23
2 files changed, 32 insertions, 7 deletions
diff --git a/src/librustc_mir/transform/type_check.rs b/src/librustc_mir/transform/type_check.rs
index 38b9454f896..69f3d68df57 100644
--- a/src/librustc_mir/transform/type_check.rs
+++ b/src/librustc_mir/transform/type_check.rs
@@ -516,14 +516,16 @@ impl<'a, 'gcx, 'tcx> TypeChecker<'a, 'gcx, 'tcx> {
                 let value_ty = value.ty(mir, tcx);
                 match mir.yield_ty {
                     None => span_mirbug!(self, term, "yield in non-generator"),
-                    Some(ty) if ty != value_ty => {
-                        span_mirbug!(self,
-                            term,
-                            "type of yield value is ({:?}, but the yield type is ({:?}",
-                            value_ty,
-                            ty);
+                    Some(ty) => {
+                        if let Err(terr) = self.sub_types(value_ty, ty) {
+                            span_mirbug!(self,
+                                term,
+                                "22 - type of yield value is {:?}, but the yield type is {:?}: {:?}",
+                                value_ty,
+                                ty,
+                                terr);
+                        }
                     }
-                    _ => (),
                 }
             }
         }
diff --git a/src/test/run-pass/generator/yield-subtype.rs b/src/test/run-pass/generator/yield-subtype.rs
new file mode 100644
index 00000000000..268add4974b
--- /dev/null
+++ b/src/test/run-pass/generator/yield-subtype.rs
@@ -0,0 +1,23 @@
+// Copyright 2017 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.
+
+#![feature(generators)]
+
+fn bar<'a>() {
+    let a: &'static str = "hi";
+    let b: &'a str = a;
+
+	|| {
+		yield a;
+		yield b;
+	};
+}
+
+fn main() {}
\ No newline at end of file