Skip to content

Commit d6c3f60

Browse files
committed
Increase max arity of FnPtr
1 parent 6b0264a commit d6c3f60

4 files changed

Lines changed: 106 additions & 1 deletion

File tree

libcc2rs/src/fn_ptr.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ pub trait FnAddr {
1515

1616
macro_rules! impl_fn_addr {
1717
() => {
18-
impl_fn_addr!(@gen A B C D E F G H I J);
18+
impl_fn_addr!(@gen A B C D E F G H I J K L M N O P);
1919
};
2020
(@gen $($a:ident)*) => {
2121
impl<R $(, $a)*> FnAddr for fn($($a,)*) -> R {

tests/unit/fn_ptr_arity.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#include <assert.h>
2+
3+
int foo(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9,
4+
int a10, int a11, int a12, int a13, int a14) {
5+
return 22;
6+
}
7+
8+
int main() {
9+
auto f = &foo;
10+
assert(f(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) == 22);
11+
return 0;
12+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
extern crate libcc2rs;
2+
use libcc2rs::*;
3+
use std::cell::RefCell;
4+
use std::collections::BTreeMap;
5+
use std::io::prelude::*;
6+
use std::io::{Read, Seek, Write};
7+
use std::os::fd::AsFd;
8+
use std::rc::{Rc, Weak};
9+
pub fn foo_0(
10+
a1: i32,
11+
a2: i32,
12+
a3: i32,
13+
a4: i32,
14+
a5: i32,
15+
a6: i32,
16+
a7: i32,
17+
a8: i32,
18+
a9: i32,
19+
a10: i32,
20+
a11: i32,
21+
a12: i32,
22+
a13: i32,
23+
a14: i32,
24+
) -> i32 {
25+
let a1: Value<i32> = Rc::new(RefCell::new(a1));
26+
let a2: Value<i32> = Rc::new(RefCell::new(a2));
27+
let a3: Value<i32> = Rc::new(RefCell::new(a3));
28+
let a4: Value<i32> = Rc::new(RefCell::new(a4));
29+
let a5: Value<i32> = Rc::new(RefCell::new(a5));
30+
let a6: Value<i32> = Rc::new(RefCell::new(a6));
31+
let a7: Value<i32> = Rc::new(RefCell::new(a7));
32+
let a8: Value<i32> = Rc::new(RefCell::new(a8));
33+
let a9: Value<i32> = Rc::new(RefCell::new(a9));
34+
let a10: Value<i32> = Rc::new(RefCell::new(a10));
35+
let a11: Value<i32> = Rc::new(RefCell::new(a11));
36+
let a12: Value<i32> = Rc::new(RefCell::new(a12));
37+
let a13: Value<i32> = Rc::new(RefCell::new(a13));
38+
let a14: Value<i32> = Rc::new(RefCell::new(a14));
39+
return 22;
40+
}
41+
pub fn main() {
42+
std::process::exit(main_0());
43+
}
44+
fn main_0() -> i32 {
45+
let f: Value<
46+
FnPtr<fn(i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> i32>,
47+
> =
48+
Rc::new(RefCell::new(
49+
(FnPtr::<
50+
fn(i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> i32,
51+
>::new(foo_0)),
52+
));
53+
assert!((({ (*(*f.borrow()))(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,) }) == 22));
54+
return 0;
55+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
extern crate libc;
2+
use libc::*;
3+
extern crate libcc2rs;
4+
use libcc2rs::*;
5+
use std::collections::BTreeMap;
6+
use std::io::{Read, Seek, Write};
7+
use std::os::fd::{AsFd, FromRawFd, IntoRawFd};
8+
use std::rc::Rc;
9+
pub unsafe fn foo_0(
10+
mut a1: i32,
11+
mut a2: i32,
12+
mut a3: i32,
13+
mut a4: i32,
14+
mut a5: i32,
15+
mut a6: i32,
16+
mut a7: i32,
17+
mut a8: i32,
18+
mut a9: i32,
19+
mut a10: i32,
20+
mut a11: i32,
21+
mut a12: i32,
22+
mut a13: i32,
23+
mut a14: i32,
24+
) -> i32 {
25+
return 22;
26+
}
27+
pub fn main() {
28+
unsafe {
29+
std::process::exit(main_0() as i32);
30+
}
31+
}
32+
unsafe fn main_0() -> i32 {
33+
let mut f: Option<
34+
unsafe fn(i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> i32,
35+
> = (Some(foo_0));
36+
assert!(((unsafe { (f).unwrap()(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,) }) == (22)));
37+
return 0;
38+
}

0 commit comments

Comments
 (0)