From af61daf294ce6264d547f373b76fb27aa649a099 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Mon, 15 Aug 2011 14:36:52 -0700 Subject: [PATCH] rustc: Parse and typecheck unique pointers --- src/comp/middle/tstate/states.rs | 1 + src/comp/middle/typeck.rs | 5 +++++ src/comp/syntax/ast.rs | 1 + src/comp/syntax/fold.rs | 1 + src/comp/syntax/parse/parser.rs | 2 +- src/comp/syntax/print/pprust.rs | 4 ++++ src/comp/syntax/visit.rs | 1 + 7 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/comp/middle/tstate/states.rs b/src/comp/middle/tstate/states.rs index de367a256af..56dca058c5e 100644 --- a/src/comp/middle/tstate/states.rs +++ b/src/comp/middle/tstate/states.rs @@ -620,6 +620,7 @@ fn find_pre_post_state_expr(fcx: &fn_ctxt, pres: &prestate, e: @expr) -> none. { ret pure_exp(fcx.ccx, e.id, pres); } } } + expr_uniq(_) { ret pure_exp(fcx.ccx, e.id, pres); } } } diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index fbb69c226ed..161ad281158 100644 --- a/src/comp/middle/typeck.rs +++ b/src/comp/middle/typeck.rs @@ -2467,6 +2467,11 @@ fn check_expr_with_unifier(fcx: &@fn_ctxt, expr: &@ast::expr, // Now remove the info from the stack. ivec::pop[obj_info](fcx.ccx.obj_infos); } + ast::expr_uniq(x) { + let t = next_ty_var(fcx); + check_expr_with(fcx, x, ty::mk_uniq(tcx, t)); + write::ty_only_fixup(fcx, id, ty::mk_uniq(tcx, t)); + } _ { tcx.sess.unimpl("expr type in typeck::check_expr"); } } if bot { diff --git a/src/comp/syntax/ast.rs b/src/comp/syntax/ast.rs index d2ad2cd0f08..152fb38157c 100644 --- a/src/comp/syntax/ast.rs +++ b/src/comp/syntax/ast.rs @@ -336,6 +336,7 @@ tag expr_ { expr_chan(@expr); expr_anon_obj(anon_obj); expr_mac(mac); + expr_uniq(@expr); } type mac = spanned[mac_]; diff --git a/src/comp/syntax/fold.rs b/src/comp/syntax/fold.rs index 77ec93c809b..956373da964 100644 --- a/src/comp/syntax/fold.rs +++ b/src/comp/syntax/fold.rs @@ -433,6 +433,7 @@ fn noop_fold_expr(e: &expr_, fld: ast_fold) -> expr_ { expr_chan(e) { expr_chan(fld.fold_expr(e)) } expr_anon_obj(ao) { expr_anon_obj(fold_anon_obj(ao)) } expr_mac(mac) { expr_mac(fold_mac(mac)) } + expr_uniq(e) { expr_uniq(fld.fold_expr(e)) } } } diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs index 27ded6cdc25..7f8a3aae0bf 100644 --- a/src/comp/syntax/parse/parser.rs +++ b/src/comp/syntax/parse/parser.rs @@ -870,7 +870,7 @@ fn parse_bottom_expr(p: &parser) -> @ast::expr { span: p.get_span()}; ex = ast::expr_lit(lit); } - _ { p.fatal("unimplemented: unique pointer creation"); } + _ { ex = ast::expr_uniq(parse_expr(p)); } } } else if (eat_word(p, "obj")) { // Anonymous object diff --git a/src/comp/syntax/print/pprust.rs b/src/comp/syntax/print/pprust.rs index de0e459c650..98e91a7f41f 100644 --- a/src/comp/syntax/print/pprust.rs +++ b/src/comp/syntax/print/pprust.rs @@ -1037,6 +1037,10 @@ fn print_expr(s: &ps, expr: &@ast::expr) { } bclose(s, expr.span); } + ast::expr_uniq(expr) { + word(s.s, "~"); + print_expr(s, expr); + } } s.ann.post(ann_node); end(s); diff --git a/src/comp/syntax/visit.rs b/src/comp/syntax/visit.rs index 5f160d88e6f..735daf0b1b4 100644 --- a/src/comp/syntax/visit.rs +++ b/src/comp/syntax/visit.rs @@ -341,6 +341,7 @@ fn visit_expr[E](ex: &@expr, e: &E, v: &vt[E]) { } } expr_mac(mac) { visit_mac(mac, e, v); } + expr_uniq(x) { v.visit_expr(x, e, v); } } }