about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorKevin Ballard <kevin@sb.org>2015-04-07 12:36:39 -0700
committerKevin Ballard <kevin@sb.org>2015-04-07 12:39:25 -0700
commitdf95719391b2ee94c09162060052755e75f431dc (patch)
tree5b6803cbd54a83942c3a2b901299567cbf858dd3 /src
parentb41f2df4ca92e9ab816d9b6649c0fc5df9e9d213 (diff)
downloadrust-df95719391b2ee94c09162060052755e75f431dc.tar.gz
rust-df95719391b2ee94c09162060052755e75f431dc.zip
Add Clone impls for extern "C" and unsafe fns
We only implemented Clone on `extern "Rust" fn`s (for up to 8
parameters). This didn't cover `extern "C"` or `unsafe` (or `unsafe
extern "C"`) `fn`s, but there's no reason why they shouldn't be
cloneable as well.

The new impls are marked unstable because the existing impl for `extern
"Rust" fn`s is.

Fixes #24161.
Diffstat (limited to 'src')
-rw-r--r--src/libcore/clone.rs21
-rw-r--r--src/test/run-pass/issue-24161.rs19
2 files changed, 40 insertions, 0 deletions
diff --git a/src/libcore/clone.rs b/src/libcore/clone.rs
index 85e5bde4859..91747d7405f 100644
--- a/src/libcore/clone.rs
+++ b/src/libcore/clone.rs
@@ -97,6 +97,27 @@ macro_rules! extern_fn_clone {
             #[inline]
             fn clone(&self) -> extern "Rust" fn($($A),*) -> ReturnType { *self }
         }
+
+        #[unstable(feature = "core", reason = "brand new")]
+        impl<$($A,)* ReturnType> Clone for extern "C" fn($($A),*) -> ReturnType {
+            /// Return a copy of a function pointer
+            #[inline]
+            fn clone(&self) -> extern "C" fn($($A),*) -> ReturnType { *self }
+        }
+
+        #[unstable(feature = "core", reason = "brand new")]
+        impl<$($A,)* ReturnType> Clone for unsafe extern "Rust" fn($($A),*) -> ReturnType {
+            /// Return a copy of a function pointer
+            #[inline]
+            fn clone(&self) -> unsafe extern "Rust" fn($($A),*) -> ReturnType { *self }
+        }
+
+        #[unstable(feature = "core", reason = "brand new")]
+        impl<$($A,)* ReturnType> Clone for unsafe extern "C" fn($($A),*) -> ReturnType {
+            /// Return a copy of a function pointer
+            #[inline]
+            fn clone(&self) -> unsafe extern "C" fn($($A),*) -> ReturnType { *self }
+        }
     )
 }
 
diff --git a/src/test/run-pass/issue-24161.rs b/src/test/run-pass/issue-24161.rs
new file mode 100644
index 00000000000..2445ef17ecf
--- /dev/null
+++ b/src/test/run-pass/issue-24161.rs
@@ -0,0 +1,19 @@
+// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#[derive(Copy,Clone)]
+struct Functions {
+    a: fn(u32) -> u32,
+    b: extern "C" fn(u32) -> u32,
+    c: unsafe fn(u32) -> u32,
+    d: unsafe extern "C" fn(u32) -> u32
+}
+
+pub fn main() {}