diff options
| author | John Kåre Alsaker <john.kare.alsaker@gmail.com> | 2017-07-15 03:51:44 +0200 |
|---|---|---|
| committer | John Kåre Alsaker <john.kare.alsaker@gmail.com> | 2017-07-28 15:46:25 +0200 |
| commit | 93172045c817ffa998d5e28a0899f33edf889f62 (patch) | |
| tree | 2d9f667b7b86acfb14ac1154503e6670162d23fb /src | |
| parent | dcddd807297765b85f11c05f68f0845cc8d372aa (diff) | |
Fix a bug with yielding subtypes of the yield type.
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_mir/transform/type_check.rs | 16 | ||||
| -rw-r--r-- | src/test/run-pass/generator/yield-subtype.rs | 23 |
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 |
