Allow *-pointers in PtrTy (fixes #16781)
This commit is contained in:
parent
80b45ddbd3
commit
2b312eca89
2 changed files with 16 additions and 1 deletions
|
@ -52,6 +52,9 @@ pub trait AstBuilder {
|
||||||
ty: P<ast::Ty>,
|
ty: P<ast::Ty>,
|
||||||
lifetime: Option<ast::Lifetime>,
|
lifetime: Option<ast::Lifetime>,
|
||||||
mutbl: ast::Mutability) -> P<ast::Ty>;
|
mutbl: ast::Mutability) -> P<ast::Ty>;
|
||||||
|
fn ty_ptr(&self, span: Span,
|
||||||
|
ty: P<ast::Ty>,
|
||||||
|
mutbl: ast::Mutability) -> P<ast::Ty>;
|
||||||
fn ty_uniq(&self, span: Span, ty: P<ast::Ty>) -> P<ast::Ty>;
|
fn ty_uniq(&self, span: Span, ty: P<ast::Ty>) -> P<ast::Ty>;
|
||||||
|
|
||||||
fn ty_option(&self, ty: P<ast::Ty>) -> P<ast::Ty>;
|
fn ty_option(&self, ty: P<ast::Ty>) -> P<ast::Ty>;
|
||||||
|
@ -369,6 +372,14 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
|
||||||
ast::TyRptr(lifetime, self.ty_mt(ty, mutbl)))
|
ast::TyRptr(lifetime, self.ty_mt(ty, mutbl)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn ty_ptr(&self,
|
||||||
|
span: Span,
|
||||||
|
ty: P<ast::Ty>,
|
||||||
|
mutbl: ast::Mutability)
|
||||||
|
-> P<ast::Ty> {
|
||||||
|
self.ty(span,
|
||||||
|
ast::TyPtr(self.ty_mt(ty, mutbl)))
|
||||||
|
}
|
||||||
fn ty_uniq(&self, span: Span, ty: P<ast::Ty>) -> P<ast::Ty> {
|
fn ty_uniq(&self, span: Span, ty: P<ast::Ty>) -> P<ast::Ty> {
|
||||||
self.ty(span, ast::TyUniq(ty))
|
self.ty(span, ast::TyUniq(ty))
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,8 @@ use std::gc::Gc;
|
||||||
pub enum PtrTy<'a> {
|
pub enum PtrTy<'a> {
|
||||||
/// &'lifetime mut
|
/// &'lifetime mut
|
||||||
Borrowed(Option<&'a str>, ast::Mutability),
|
Borrowed(Option<&'a str>, ast::Mutability),
|
||||||
|
/// *mut
|
||||||
|
Raw(ast::Mutability),
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A path, e.g. `::std::option::Option::<int>` (global). Has support
|
/// A path, e.g. `::std::option::Option::<int>` (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)]
|
#[deriving(Clone)]
|
||||||
pub enum Ty<'a> {
|
pub enum Ty<'a> {
|
||||||
Self,
|
Self,
|
||||||
|
@ -143,6 +145,7 @@ impl<'a> Ty<'a> {
|
||||||
let lt = mk_lifetime(cx, span, lt);
|
let lt = mk_lifetime(cx, span, lt);
|
||||||
cx.ty_rptr(span, raw_ty, lt, mutbl)
|
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) }
|
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<PtrTy>)
|
||||||
let lt = lt.map(|s| cx.lifetime(span, cx.ident_of(s).name));
|
let lt = lt.map(|s| cx.lifetime(span, cx.ident_of(s).name));
|
||||||
ast::SelfRegion(lt, mutbl, special_idents::self_)
|
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);
|
let self_expr = cx.expr_deref(span, self_path);
|
||||||
(self_expr, self_ty)
|
(self_expr, self_ty)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue