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:
commit
98958bcaf4
5 changed files with 94 additions and 37 deletions
26
src/test/auxiliary/unboxed-closures-cross-crate.rs
Normal file
26
src/test/auxiliary/unboxed-closures-cross-crate.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.
|
||||
|
||||
#![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()
|
||||
}
|
||||
20
src/test/run-pass/unboxed-closures-cross-crate.rs
Normal file
20
src/test/run-pass/unboxed-closures-cross-crate.rs
Normal 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);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue