Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion libcc2rs/src/fn_ptr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ pub trait FnAddr {

macro_rules! impl_fn_addr {
() => {
impl_fn_addr!(@gen A B C D E F G H I J);
impl_fn_addr!(@gen A B C D E F G H I J K L M N O P);
};
(@gen $($a:ident)*) => {
impl<R $(, $a)*> FnAddr for fn($($a,)*) -> R {
Expand Down
12 changes: 12 additions & 0 deletions tests/unit/fn_ptr_arity.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#include <assert.h>

int foo(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9,
int a10, int a11, int a12, int a13, int a14) {
return 22;
}

int main() {
auto f = &foo;
assert(f(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) == 22);
return 0;
}
55 changes: 55 additions & 0 deletions tests/unit/out/refcount/fn_ptr_arity.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
extern crate libcc2rs;
use libcc2rs::*;
use std::cell::RefCell;
use std::collections::BTreeMap;
use std::io::prelude::*;
use std::io::{Read, Seek, Write};
use std::os::fd::AsFd;
use std::rc::{Rc, Weak};
pub fn foo_0(
a1: i32,
a2: i32,
a3: i32,
a4: i32,
a5: i32,
a6: i32,
a7: i32,
a8: i32,
a9: i32,
a10: i32,
a11: i32,
a12: i32,
a13: i32,
a14: i32,
) -> i32 {
let a1: Value<i32> = Rc::new(RefCell::new(a1));
let a2: Value<i32> = Rc::new(RefCell::new(a2));
let a3: Value<i32> = Rc::new(RefCell::new(a3));
let a4: Value<i32> = Rc::new(RefCell::new(a4));
let a5: Value<i32> = Rc::new(RefCell::new(a5));
let a6: Value<i32> = Rc::new(RefCell::new(a6));
let a7: Value<i32> = Rc::new(RefCell::new(a7));
let a8: Value<i32> = Rc::new(RefCell::new(a8));
let a9: Value<i32> = Rc::new(RefCell::new(a9));
let a10: Value<i32> = Rc::new(RefCell::new(a10));
let a11: Value<i32> = Rc::new(RefCell::new(a11));
let a12: Value<i32> = Rc::new(RefCell::new(a12));
let a13: Value<i32> = Rc::new(RefCell::new(a13));
let a14: Value<i32> = Rc::new(RefCell::new(a14));
return 22;
}
pub fn main() {
std::process::exit(main_0());
}
fn main_0() -> i32 {
let f: Value<
FnPtr<fn(i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> i32>,
> =
Rc::new(RefCell::new(
(FnPtr::<
fn(i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> i32,
>::new(foo_0)),
));
assert!((({ (*(*f.borrow()))(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,) }) == 22));
return 0;
}
38 changes: 38 additions & 0 deletions tests/unit/out/unsafe/fn_ptr_arity.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
extern crate libc;
use libc::*;
extern crate libcc2rs;
use libcc2rs::*;
use std::collections::BTreeMap;
use std::io::{Read, Seek, Write};
use std::os::fd::{AsFd, FromRawFd, IntoRawFd};
use std::rc::Rc;
pub unsafe fn foo_0(
mut a1: i32,
mut a2: i32,
mut a3: i32,
mut a4: i32,
mut a5: i32,
mut a6: i32,
mut a7: i32,
mut a8: i32,
mut a9: i32,
mut a10: i32,
mut a11: i32,
mut a12: i32,
mut a13: i32,
mut a14: i32,
) -> i32 {
return 22;
}
pub fn main() {
unsafe {
std::process::exit(main_0() as i32);
}
}
unsafe fn main_0() -> i32 {
let mut f: Option<
unsafe fn(i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> i32,
> = (Some(foo_0));
assert!(((unsafe { (f).unwrap()(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,) }) == (22)));
return 0;
}
Loading