From d6c3f6009da53a5e79a45b5afb5c2eaa20643b29 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 7 Jul 2026 11:01:03 +0100 Subject: [PATCH] Increase max arity of FnPtr --- libcc2rs/src/fn_ptr.rs | 2 +- tests/unit/fn_ptr_arity.cpp | 12 ++++++ tests/unit/out/refcount/fn_ptr_arity.rs | 55 +++++++++++++++++++++++++ tests/unit/out/unsafe/fn_ptr_arity.rs | 38 +++++++++++++++++ 4 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 tests/unit/fn_ptr_arity.cpp create mode 100644 tests/unit/out/refcount/fn_ptr_arity.rs create mode 100644 tests/unit/out/unsafe/fn_ptr_arity.rs diff --git a/libcc2rs/src/fn_ptr.rs b/libcc2rs/src/fn_ptr.rs index e7152279..12bfced8 100644 --- a/libcc2rs/src/fn_ptr.rs +++ b/libcc2rs/src/fn_ptr.rs @@ -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 FnAddr for fn($($a,)*) -> R { diff --git a/tests/unit/fn_ptr_arity.cpp b/tests/unit/fn_ptr_arity.cpp new file mode 100644 index 00000000..a3f3e734 --- /dev/null +++ b/tests/unit/fn_ptr_arity.cpp @@ -0,0 +1,12 @@ +#include + +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; +} diff --git a/tests/unit/out/refcount/fn_ptr_arity.rs b/tests/unit/out/refcount/fn_ptr_arity.rs new file mode 100644 index 00000000..4e3dfd71 --- /dev/null +++ b/tests/unit/out/refcount/fn_ptr_arity.rs @@ -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 = Rc::new(RefCell::new(a1)); + let a2: Value = Rc::new(RefCell::new(a2)); + let a3: Value = Rc::new(RefCell::new(a3)); + let a4: Value = Rc::new(RefCell::new(a4)); + let a5: Value = Rc::new(RefCell::new(a5)); + let a6: Value = Rc::new(RefCell::new(a6)); + let a7: Value = Rc::new(RefCell::new(a7)); + let a8: Value = Rc::new(RefCell::new(a8)); + let a9: Value = Rc::new(RefCell::new(a9)); + let a10: Value = Rc::new(RefCell::new(a10)); + let a11: Value = Rc::new(RefCell::new(a11)); + let a12: Value = Rc::new(RefCell::new(a12)); + let a13: Value = Rc::new(RefCell::new(a13)); + let a14: Value = Rc::new(RefCell::new(a14)); + return 22; +} +pub fn main() { + std::process::exit(main_0()); +} +fn main_0() -> i32 { + let f: Value< + FnPtr 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; +} diff --git a/tests/unit/out/unsafe/fn_ptr_arity.rs b/tests/unit/out/unsafe/fn_ptr_arity.rs new file mode 100644 index 00000000..912c17c4 --- /dev/null +++ b/tests/unit/out/unsafe/fn_ptr_arity.rs @@ -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; +}