]> git.lizzy.rs Git - rust.git/commitdiff
Implement traits for variadic function pointers
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Sat, 16 Jul 2016 21:15:15 +0000 (00:15 +0300)
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Sun, 17 Jul 2016 07:21:07 +0000 (10:21 +0300)
src/libcore/ptr.rs
src/libcoretest/ptr.rs

index 8b3a14b24df29d595c459fec70f43ccc409d1c35..925cdfec900dbd6da769a2f4a24eeee6be972ee0 100644 (file)
@@ -571,12 +571,21 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
 }
 
 macro_rules! fnptr_impls_args {
-    ($($Arg: ident),*) => {
+    ($($Arg: ident),+) => {
         fnptr_impls_safety_abi! { extern "Rust" fn($($Arg),*) -> Ret, $($Arg),* }
         fnptr_impls_safety_abi! { extern "C" fn($($Arg),*) -> Ret, $($Arg),* }
+        fnptr_impls_safety_abi! { extern "C" fn($($Arg),* , ...) -> Ret, $($Arg),* }
         fnptr_impls_safety_abi! { unsafe extern "Rust" fn($($Arg),*) -> Ret, $($Arg),* }
         fnptr_impls_safety_abi! { unsafe extern "C" fn($($Arg),*) -> Ret, $($Arg),* }
-    }
+        fnptr_impls_safety_abi! { unsafe extern "C" fn($($Arg),* , ...) -> Ret, $($Arg),* }
+    };
+    () => {
+        // No variadic functions with 0 parameters
+        fnptr_impls_safety_abi! { extern "Rust" fn() -> Ret, }
+        fnptr_impls_safety_abi! { extern "C" fn() -> Ret, }
+        fnptr_impls_safety_abi! { unsafe extern "Rust" fn() -> Ret, }
+        fnptr_impls_safety_abi! { unsafe extern "C" fn() -> Ret, }
+    };
 }
 
 fnptr_impls_args! { }
index 343db93d4a970f2f05b28579ae413904b8187221..e0a9f4e5d422c19f2c617b65132f645e5301c97f 100644 (file)
@@ -171,3 +171,17 @@ fn test_unsized_unique() {
     let zs: &mut [i32] = &mut [1, 2, 3];
     assert!(ys == zs);
 }
+
+#[test]
+fn test_variadic_fnptr() {
+    use core::hash::{Hash, SipHasher};
+    extern "C" {
+        fn printf(_: *const u8, ...);
+    }
+    let p: unsafe extern "C" fn(*const u8, ...) = printf;
+    let q = p.clone();
+    assert_eq!(p, q);
+    assert!(!(p < q));
+    let mut s = SipHasher::new();
+    assert_eq!(p.hash(&mut s), q.hash(&mut s));
+}