about summary refs log tree commit diff
path: root/src/libsyntax/ext/deriving/generic
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2015-05-17 11:28:19 +0530
committerManish Goregaokar <manishsmail@gmail.com>2015-05-17 14:56:13 +0530
commit5b63841d91c3de96aac8bc79df1fc22b47ed993e (patch)
tree9c62cf7a351d7fc03f0689867409fd510f28fcb7 /src/libsyntax/ext/deriving/generic
parent4f83c4b8513fe77ab27e1f8d07cf5c7d577a1fe2 (diff)
downloadrust-5b63841d91c3de96aac8bc79df1fc22b47ed993e.tar.gz
rust-5b63841d91c3de96aac8bc79df1fc22b47ed993e.zip
Allow #[derive()] to generate unsafe methods
Diffstat (limited to 'src/libsyntax/ext/deriving/generic')
-rw-r--r--src/libsyntax/ext/deriving/generic/mod.rs11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/libsyntax/ext/deriving/generic/mod.rs b/src/libsyntax/ext/deriving/generic/mod.rs
index 1525f1a822b..b9968ca9608 100644
--- a/src/libsyntax/ext/deriving/generic/mod.rs
+++ b/src/libsyntax/ext/deriving/generic/mod.rs
@@ -253,6 +253,9 @@ pub struct MethodDef<'a> {
 
     pub attributes: Vec<ast::Attribute>,
 
+    // Is it an `unsafe fn`?
+    pub is_unsafe: bool,
+
     pub combine_substructure: RefCell<CombineSubstructureFunc<'a>>,
 }
 
@@ -859,6 +862,12 @@ impl<'a> MethodDef<'a> {
         let fn_decl = cx.fn_decl(args, ret_type);
         let body_block = cx.block_expr(body);
 
+        let unsafety = if self.is_unsafe {
+            ast::Unsafety::Unsafe
+        } else {
+            ast::Unsafety::Normal
+        };
+
         // Create the method.
         P(ast::ImplItem {
             id: ast::DUMMY_NODE_ID,
@@ -870,7 +879,7 @@ impl<'a> MethodDef<'a> {
                 generics: fn_generics,
                 abi: abi,
                 explicit_self: explicit_self,
-                unsafety: ast::Unsafety::Normal,
+                unsafety: unsafety,
                 decl: fn_decl
             }, body_block)
         })