rustc_typeck: unify expected return types with formal return types to propagate coercions through calls of generic functions.
This commit is contained in:
parent
21ec0c85d9
commit
e73fbc69cd
5 changed files with 180 additions and 23 deletions
|
|
@ -30,4 +30,7 @@ pub fn main() {
|
|||
let _: &Fn(int) -> _ = &{ |x| (x as u8) };
|
||||
let _: &Show = &if true { false } else { true };
|
||||
let _: &Show = &match true { true => 'a', false => 'b' };
|
||||
|
||||
let _: Box<[int]> = Box::new([1, 2, 3]);
|
||||
let _: Box<Fn(int) -> _> = Box::new(|x| (x as u8));
|
||||
}
|
||||
|
|
|
|||
26
src/test/run-pass/coerce-unify-return.rs
Normal file
26
src/test/run-pass/coerce-unify-return.rs
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
// 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.
|
||||
|
||||
// Check that coercions unify the expected return type of a polymorphic
|
||||
// function call, instead of leaving the type variables as they were.
|
||||
|
||||
struct Foo;
|
||||
impl Foo {
|
||||
fn foo<T>(self, x: T) -> Option<T> { Some(x) }
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
let _: Option<fn()> = Some(main);
|
||||
let _: Option<fn()> = Foo.foo(main);
|
||||
|
||||
// The same two cases, with implicit type variables made explicit.
|
||||
let _: Option<fn()> = Some::<_>(main);
|
||||
let _: Option<fn()> = Foo.foo::<_>(main);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue