Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fix the test to use explicit argument types
Hopefully this pacifies the 32bit windows. Apparently there’s an ABI out there that not only allows
non-64 bit variadic arguments, but also has differing ABI for them!

Good thing all variadic functions are unsafe.
  • Loading branch information
nagisa committed Jun 2, 2016
1 parent f181187 commit ed4688c
Showing 1 changed file with 6 additions and 6 deletions.
12 changes: 6 additions & 6 deletions src/test/run-pass/variadic-ffi.rs
Expand Up @@ -10,7 +10,7 @@

#[link(name = "rust_test_helpers")]
extern {
fn rust_interesting_average(_: i64, ...) -> f64;
fn rust_interesting_average(_: u64, ...) -> f64;
}

pub fn main() {
Expand All @@ -21,26 +21,26 @@ pub fn main() {

// Call with direct arguments
unsafe {
assert_eq!(rust_interesting_average(1, 10, 10.0) as i64, 20);
assert_eq!(rust_interesting_average(1, 10i64, 10.0f64) as i64, 20);
}

// Call with named arguments, variable number of them
let (x1, x2, x3, x4) = (10, 10.0, 20, 20.0);
let (x1, x2, x3, x4) = (10i64, 10.0f64, 20i64, 20.0f64);
unsafe {
assert_eq!(rust_interesting_average(2, x1, x2, x3, x4) as i64, 30);
}

// A function that takes a function pointer
unsafe fn call(fp: unsafe extern fn(i64, ...) -> f64) {
let (x1, x2, x3, x4) = (10, 10.0, 20, 20.0);
unsafe fn call(fp: unsafe extern fn(u64, ...) -> f64) {
let (x1, x2, x3, x4) = (10i64, 10.0f64, 20i64, 20.0f64);
assert_eq!(fp(2, x1, x2, x3, x4) as i64, 30);
}

unsafe {
call(rust_interesting_average);

// Make a function pointer, pass indirectly
let x: unsafe extern fn(i64, ...) -> f64 = rust_interesting_average;
let x: unsafe extern fn(u64, ...) -> f64 = rust_interesting_average;
call(x);
}
}

0 comments on commit ed4688c

Please sign in to comment.