Fix a bug with yielding subtypes of the yield type.

This commit is contained in:
John Kåre Alsaker 2017-07-15 03:51:44 +02:00
parent dcddd80729
commit 93172045c8
2 changed files with 32 additions and 7 deletions

View File

@ -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);
}
}
_ => (),
}
}
}

View File

@ -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() {}