Skip to content

Commit a972633

Browse files
committed
parse regions on unsafe pointers (#7694)
1 parent 4f206cf commit a972633

File tree

8 files changed

+23
-12
lines changed

8 files changed

+23
-12
lines changed

src/librustc/middle/lint.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -725,7 +725,9 @@ fn check_item_ctypes(cx: &Context, it: &ast::item) {
725725
_ => ()
726726
}
727727
}
728-
ast::ty_ptr(ref mt) => { check_ty(cx, mt.ty) }
728+
ast::ty_ptr(_, ref mt) => {
729+
check_ty(cx, mt.ty)
730+
}
729731
_ => ()
730732
}
731733
}

src/librustc/middle/region.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -817,7 +817,7 @@ fn determine_rp_in_ty(ty: &ast::Ty,
817817

818818
match ty.node {
819819
ast::ty_box(ref mt) | ast::ty_uniq(ref mt) | ast::ty_vec(ref mt) |
820-
ast::ty_rptr(_, ref mt) | ast::ty_ptr(ref mt) => {
820+
ast::ty_rptr(_, ref mt) | ast::ty_ptr(_, ref mt) => {
821821
visit_mt(mt, (cx, visitor));
822822
}
823823

src/librustc/middle/typeck/astconv.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ pub fn ast_ty_to_ty<AC:AstConv, RS:region_scope + Clone + 'static>(
369369
// return /something/ so they can at least get more errors
370370
ty::mk_evec(tcx, ast_mt_to_mt(this, rscope, mt), ty::vstore_uniq)
371371
}
372-
ast::ty_ptr(ref mt) => {
372+
ast::ty_ptr(_, ref mt) => {
373373
ty::mk_ptr(tcx, ast_mt_to_mt(this, rscope, mt))
374374
}
375375
ast::ty_rptr(ref region, ref mt) => {

src/libsyntax/ast.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -773,7 +773,7 @@ pub enum ty_ {
773773
ty_uniq(mt),
774774
ty_vec(mt),
775775
ty_fixed_length_vec(mt, @expr),
776-
ty_ptr(mt),
776+
ty_ptr(Option<Lifetime>, mt),
777777
ty_rptr(Option<Lifetime>, mt),
778778
ty_closure(@TyClosure),
779779
ty_bare_fn(@TyBareFn),

src/libsyntax/fold.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -666,7 +666,7 @@ pub fn noop_fold_ty(t: &ty_, fld: @ast_fold) -> ty_ {
666666
ty_box(ref mt) => ty_box(fold_mt(mt, fld)),
667667
ty_uniq(ref mt) => ty_uniq(fold_mt(mt, fld)),
668668
ty_vec(ref mt) => ty_vec(fold_mt(mt, fld)),
669-
ty_ptr(ref mt) => ty_ptr(fold_mt(mt, fld)),
669+
ty_ptr(region, ref mt) => ty_ptr(region, fold_mt(mt, fld)),
670670
ty_rptr(region, ref mt) => ty_rptr(region, fold_mt(mt, fld)),
671671
ty_closure(ref f) => {
672672
ty_closure(@TyClosure {

src/libsyntax/parse/parser.rs

+10-5
Original file line numberDiff line numberDiff line change
@@ -986,7 +986,7 @@ impl Parser {
986986
} else if *self.token == token::BINOP(token::STAR) {
987987
// STAR POINTER (bare pointer?)
988988
self.bump();
989-
ty_ptr(self.parse_mt())
989+
self.parse_star_pointee()
990990
} else if *self.token == token::LBRACE {
991991
// STRUCTURAL RECORD (remove?)
992992
let elems = self.parse_unspanned_seq(
@@ -1084,16 +1084,21 @@ impl Parser {
10841084
ctor(mt)
10851085
}
10861086

1087+
pub fn parse_star_pointee(&self) -> ty_ {
1088+
// look for `*'lt` or `*'foo ` and interpret `foo` as the region name:
1089+
let opt_lifetime = self.parse_opt_lifetime();
1090+
ty_ptr(opt_lifetime, self.parse_mt())
1091+
}
1092+
10871093
pub fn parse_borrowed_pointee(&self) -> ty_ {
10881094
// look for `&'lt` or `&'foo ` and interpret `foo` as the region name:
10891095
let opt_lifetime = self.parse_opt_lifetime();
10901096

10911097
if self.token_is_closure_keyword(self.token) {
1092-
return self.parse_ty_closure(BorrowedSigil, opt_lifetime);
1098+
self.parse_ty_closure(BorrowedSigil, opt_lifetime)
1099+
} else {
1100+
ty_rptr(opt_lifetime, self.parse_mt())
10931101
}
1094-
1095-
let mt = self.parse_mt();
1096-
return ty_rptr(opt_lifetime, mt);
10971102
}
10981103

10991104
// parse an optional, obsolete argument mode.

src/libsyntax/print/pprust.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,11 @@ pub fn print_type(s: @ps, ty: &ast::Ty) {
394394
print_type(s, mt.ty);
395395
word(s.s, "]");
396396
}
397-
ast::ty_ptr(ref mt) => { word(s.s, "*"); print_mt(s, mt); }
397+
ast::ty_ptr(ref lifetime, ref mt) => {
398+
word(s.s, "*");
399+
print_opt_lifetime(s, lifetime);
400+
print_mt(s, mt);
401+
}
398402
ast::ty_rptr(ref lifetime, ref mt) => {
399403
word(s.s, "&");
400404
print_opt_lifetime(s, lifetime);

src/libsyntax/visit.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ pub fn skip_ty<E>(_t: &Ty, (_e,_v): (E, vt<E>)) {}
246246
pub fn visit_ty<E:Clone>(t: &Ty, (e, v): (E, vt<E>)) {
247247
match t.node {
248248
ty_box(ref mt) | ty_uniq(ref mt) |
249-
ty_vec(ref mt) | ty_ptr(ref mt) | ty_rptr(_, ref mt) => {
249+
ty_vec(ref mt) | ty_ptr(_, ref mt) | ty_rptr(_, ref mt) => {
250250
(v.visit_ty)(mt.ty, (e, v));
251251
},
252252
ty_tup(ref ts) => {

0 commit comments

Comments
 (0)