auto merge of #18546 : bkoropoff/rust/unboxed-closures-cross-crate, r=nick29581

This fixes some metadata/AST encoding problems that lead to ICEs.  The way this is currently handled will need revisiting if abstract return types are added, as unboxed closure types from extern crates could show up without being inlined into the local crate.

Closes #16790 (I think this was fixed earlier by accident and just needed a test case)
Closes #18378
Closes #18543

r? @pcwalton
This commit is contained in:
bors 2014-11-05 10:21:38 +00:00
commit 98958bcaf4
5 changed files with 94 additions and 37 deletions

View 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.
#![feature(unboxed_closures, overloaded_calls)]
#[inline]
pub fn has_closures() -> uint {
let x = 1u;
let mut f = move |&mut:| x;
let y = 1u;
let g = |:| y;
f() + g()
}
pub fn has_generic_closures<T: Add<T,T> + Copy>(x: T, y: T) -> T {
let mut f = move |&mut:| x;
let g = |:| y;
f() + g()
}

View file

@ -0,0 +1,20 @@
// 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.
// Test that unboxed closures work with cross-crate inlining
// Acts as a regression test for #16790, #18378 and #18543
// aux-build:unboxed-closures-cross-crate.rs
extern crate "unboxed-closures-cross-crate" as ubcc;
fn main() {
assert_eq!(ubcc::has_closures(), 2u);
assert_eq!(ubcc::has_generic_closures(2u, 3u), 5u);
}