diff --git a/src/libsyntax/ext/build.rs b/src/libsyntax/ext/build.rs index 909f8f1e78ce4..64ab0e5cb191f 100644 --- a/src/libsyntax/ext/build.rs +++ b/src/libsyntax/ext/build.rs @@ -52,6 +52,9 @@ pub trait AstBuilder { ty: P, lifetime: Option, mutbl: ast::Mutability) -> P; + fn ty_ptr(&self, span: Span, + ty: P, + mutbl: ast::Mutability) -> P; fn ty_uniq(&self, span: Span, ty: P) -> P; fn ty_option(&self, ty: P) -> P; @@ -369,6 +372,14 @@ impl<'a> AstBuilder for ExtCtxt<'a> { ast::TyRptr(lifetime, self.ty_mt(ty, mutbl))) } + fn ty_ptr(&self, + span: Span, + ty: P, + mutbl: ast::Mutability) + -> P { + self.ty(span, + ast::TyPtr(self.ty_mt(ty, mutbl))) + } fn ty_uniq(&self, span: Span, ty: P) -> P { self.ty(span, ast::TyUniq(ty)) } diff --git a/src/libsyntax/ext/deriving/generic/ty.rs b/src/libsyntax/ext/deriving/generic/ty.rs index f4a9b85f75d23..8b4a9c51cf09d 100644 --- a/src/libsyntax/ext/deriving/generic/ty.rs +++ b/src/libsyntax/ext/deriving/generic/ty.rs @@ -28,6 +28,8 @@ use std::gc::Gc; pub enum PtrTy<'a> { /// &'lifetime mut Borrowed(Option<&'a str>, ast::Mutability), + /// *mut + Raw(ast::Mutability), } /// A path, e.g. `::std::option::Option::` (global). Has support @@ -82,7 +84,7 @@ impl<'a> Path<'a> { } } -/// A type. Supports pointers (except for *), Self, and literals +/// A type. Supports pointers, Self, and literals #[deriving(Clone)] pub enum Ty<'a> { Self, @@ -143,6 +145,7 @@ impl<'a> Ty<'a> { let lt = mk_lifetime(cx, span, lt); cx.ty_rptr(span, raw_ty, lt, mutbl) } + Raw(mutbl) => cx.ty_ptr(span, raw_ty, mutbl) } } Literal(ref p) => { p.to_ty(cx, span, self_ty, self_generics) } @@ -273,6 +276,7 @@ pub fn get_explicit_self(cx: &ExtCtxt, span: Span, self_ptr: &Option) let lt = lt.map(|s| cx.lifetime(span, cx.ident_of(s).name)); ast::SelfRegion(lt, mutbl, special_idents::self_) } + Raw(_) => cx.span_bug(span, "attempted to use *self in deriving definition") }); let self_expr = cx.expr_deref(span, self_path); (self_expr, self_ty)