diff --git a/src/libsyntax/ext/deriving/bounds.rs b/src/libsyntax/ext/deriving/bounds.rs index 71b6184390a0..87a6d0805b56 100644 --- a/src/libsyntax/ext/deriving/bounds.rs +++ b/src/libsyntax/ext/deriving/bounds.rs @@ -40,6 +40,7 @@ pub fn expand_deriving_copy(cx: &mut ExtCtxt, path: path, additional_bounds: Vec::new(), generics: LifetimeBounds::empty(), + is_unsafe: false, methods: Vec::new(), associated_types: Vec::new(), }; diff --git a/src/libsyntax/ext/deriving/clone.rs b/src/libsyntax/ext/deriving/clone.rs index 9261c0162c7a..f1a2983479c4 100644 --- a/src/libsyntax/ext/deriving/clone.rs +++ b/src/libsyntax/ext/deriving/clone.rs @@ -31,6 +31,7 @@ pub fn expand_deriving_clone(cx: &mut ExtCtxt, path: path_std!(cx, core::clone::Clone), additional_bounds: Vec::new(), generics: LifetimeBounds::empty(), + is_unsafe: false, methods: vec!( MethodDef { name: "clone", diff --git a/src/libsyntax/ext/deriving/cmp/eq.rs b/src/libsyntax/ext/deriving/cmp/eq.rs index b370757e8fb4..bd6b27fb44e4 100644 --- a/src/libsyntax/ext/deriving/cmp/eq.rs +++ b/src/libsyntax/ext/deriving/cmp/eq.rs @@ -51,6 +51,7 @@ pub fn expand_deriving_eq(cx: &mut ExtCtxt, path: path_std!(cx, core::cmp::Eq), additional_bounds: Vec::new(), generics: LifetimeBounds::empty(), + is_unsafe: false, methods: vec!( MethodDef { name: "assert_receiver_is_total_eq", diff --git a/src/libsyntax/ext/deriving/cmp/ord.rs b/src/libsyntax/ext/deriving/cmp/ord.rs index 815448ac6104..ff36e01d6cc8 100644 --- a/src/libsyntax/ext/deriving/cmp/ord.rs +++ b/src/libsyntax/ext/deriving/cmp/ord.rs @@ -32,6 +32,7 @@ pub fn expand_deriving_ord(cx: &mut ExtCtxt, path: path_std!(cx, core::cmp::Ord), additional_bounds: Vec::new(), generics: LifetimeBounds::empty(), + is_unsafe: false, methods: vec!( MethodDef { name: "cmp", diff --git a/src/libsyntax/ext/deriving/cmp/partial_eq.rs b/src/libsyntax/ext/deriving/cmp/partial_eq.rs index e5d6408ca1b6..495761c499b9 100644 --- a/src/libsyntax/ext/deriving/cmp/partial_eq.rs +++ b/src/libsyntax/ext/deriving/cmp/partial_eq.rs @@ -85,6 +85,7 @@ pub fn expand_deriving_partial_eq(cx: &mut ExtCtxt, path: path_std!(cx, core::cmp::PartialEq), additional_bounds: Vec::new(), generics: LifetimeBounds::empty(), + is_unsafe: false, methods: vec!( md!("eq", cs_eq), md!("ne", cs_ne) diff --git a/src/libsyntax/ext/deriving/cmp/partial_ord.rs b/src/libsyntax/ext/deriving/cmp/partial_ord.rs index a11e9f473a4a..084e3ef3f910 100644 --- a/src/libsyntax/ext/deriving/cmp/partial_ord.rs +++ b/src/libsyntax/ext/deriving/cmp/partial_ord.rs @@ -73,6 +73,7 @@ pub fn expand_deriving_partial_ord(cx: &mut ExtCtxt, path: path_std!(cx, core::cmp::PartialOrd), additional_bounds: vec![], generics: LifetimeBounds::empty(), + is_unsafe: false, methods: vec![ partial_cmp_def, md!("lt", true, false), diff --git a/src/libsyntax/ext/deriving/decodable.rs b/src/libsyntax/ext/deriving/decodable.rs index 99fac991e7f7..0fdcbec84477 100644 --- a/src/libsyntax/ext/deriving/decodable.rs +++ b/src/libsyntax/ext/deriving/decodable.rs @@ -59,6 +59,7 @@ fn expand_deriving_decodable_imp(cx: &mut ExtCtxt, path: Path::new_(vec!(krate, "Decodable"), None, vec!(), true), additional_bounds: Vec::new(), generics: LifetimeBounds::empty(), + is_unsafe: false, methods: vec!( MethodDef { name: "decode", diff --git a/src/libsyntax/ext/deriving/default.rs b/src/libsyntax/ext/deriving/default.rs index 3f4e9da0ed54..6a25088782a0 100644 --- a/src/libsyntax/ext/deriving/default.rs +++ b/src/libsyntax/ext/deriving/default.rs @@ -31,6 +31,7 @@ pub fn expand_deriving_default(cx: &mut ExtCtxt, path: path_std!(cx, core::default::Default), additional_bounds: Vec::new(), generics: LifetimeBounds::empty(), + is_unsafe: false, methods: vec!( MethodDef { name: "default", diff --git a/src/libsyntax/ext/deriving/encodable.rs b/src/libsyntax/ext/deriving/encodable.rs index 3c77effe5f53..786739938e58 100644 --- a/src/libsyntax/ext/deriving/encodable.rs +++ b/src/libsyntax/ext/deriving/encodable.rs @@ -135,6 +135,7 @@ fn expand_deriving_encodable_imp(cx: &mut ExtCtxt, path: Path::new_(vec!(krate, "Encodable"), None, vec!(), true), additional_bounds: Vec::new(), generics: LifetimeBounds::empty(), + is_unsafe: false, methods: vec!( MethodDef { name: "encode", diff --git a/src/libsyntax/ext/deriving/generic/mod.rs b/src/libsyntax/ext/deriving/generic/mod.rs index 3196380ec6c3..9fc2745cf929 100644 --- a/src/libsyntax/ext/deriving/generic/mod.rs +++ b/src/libsyntax/ext/deriving/generic/mod.rs @@ -229,6 +229,9 @@ pub struct TraitDef<'a> { /// Any extra lifetimes and/or bounds, e.g. `D: serialize::Decoder` pub generics: LifetimeBounds<'a>, + /// Is it an `unsafe` trait? + pub is_unsafe: bool, + pub methods: Vec>, pub associated_types: Vec<(ast::Ident, Ty<'a>)>, @@ -625,11 +628,18 @@ impl<'a> TraitDef<'a> { InternedString::new("unused_qualifications"))])); let mut a = vec![attr, unused_qual]; a.extend(self.attributes.iter().cloned()); + + let unsafety = if self.is_unsafe { + ast::Unsafety::Unsafe + } else { + ast::Unsafety::Normal + }; + cx.item( self.span, ident, a, - ast::ItemImpl(ast::Unsafety::Normal, + ast::ItemImpl(unsafety, ast::ImplPolarity::Positive, trait_generics, opt_trait_ref, diff --git a/src/libsyntax/ext/deriving/hash.rs b/src/libsyntax/ext/deriving/hash.rs index 97c50ed1eeaf..96be774ebdcf 100644 --- a/src/libsyntax/ext/deriving/hash.rs +++ b/src/libsyntax/ext/deriving/hash.rs @@ -32,6 +32,7 @@ pub fn expand_deriving_hash(cx: &mut ExtCtxt, path: path, additional_bounds: Vec::new(), generics: LifetimeBounds::empty(), + is_unsafe: false, methods: vec!( MethodDef { name: "hash", diff --git a/src/libsyntax/ext/deriving/primitive.rs b/src/libsyntax/ext/deriving/primitive.rs index 5eb98d3aa159..5d3cc50557cd 100644 --- a/src/libsyntax/ext/deriving/primitive.rs +++ b/src/libsyntax/ext/deriving/primitive.rs @@ -32,6 +32,7 @@ pub fn expand_deriving_from_primitive(cx: &mut ExtCtxt, path: path_std!(cx, core::num::FromPrimitive), additional_bounds: Vec::new(), generics: LifetimeBounds::empty(), + is_unsafe: false, methods: vec!( MethodDef { name: "from_i64", diff --git a/src/libsyntax/ext/deriving/show.rs b/src/libsyntax/ext/deriving/show.rs index 3a478884c6ab..4d70ca1ebf15 100644 --- a/src/libsyntax/ext/deriving/show.rs +++ b/src/libsyntax/ext/deriving/show.rs @@ -34,6 +34,7 @@ pub fn expand_deriving_show(cx: &mut ExtCtxt, path: path_std!(cx, core::fmt::Debug), additional_bounds: Vec::new(), generics: LifetimeBounds::empty(), + is_unsafe: false, methods: vec![ MethodDef { name: "fmt", diff --git a/src/test/auxiliary/custom_derive_plugin.rs b/src/test/auxiliary/custom_derive_plugin.rs index 8c1445a172d8..44ab4cc89a04 100644 --- a/src/test/auxiliary/custom_derive_plugin.rs +++ b/src/test/auxiliary/custom_derive_plugin.rs @@ -46,6 +46,7 @@ fn expand(cx: &mut ExtCtxt, additional_bounds: vec![], generics: LifetimeBounds::empty(), associated_types: vec![], + is_unsafe: false, methods: vec![ MethodDef { name: "total_sum", diff --git a/src/test/auxiliary/custom_derive_plugin_attr.rs b/src/test/auxiliary/custom_derive_plugin_attr.rs index 01fde91fef57..82d0edfb1632 100644 --- a/src/test/auxiliary/custom_derive_plugin_attr.rs +++ b/src/test/auxiliary/custom_derive_plugin_attr.rs @@ -48,6 +48,7 @@ fn expand(cx: &mut ExtCtxt, additional_bounds: vec![], generics: LifetimeBounds::empty(), associated_types: vec![], + is_unsafe: false, methods: vec![ MethodDef { name: "total_sum",