Skip to content

Commit 28d49db

Browse files
committed
---
yaml --- r: 3007 b: refs/heads/master c: 5318248 h: refs/heads/master i: 3005: c4d9273 3003: 1a2651b 2999: 82bc1f6 2991: c690f9c 2975: 5dd05f1 2943: 3f3608b v: v3
1 parent d3ef81e commit 28d49db

File tree

16 files changed

+112
-46
lines changed

16 files changed

+112
-46
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 1c481028388b076c74bc68c001f173b8ec5a4b83
2+
refs/heads/master: 5318248f24afbcc61cf948bbcacd61d8b157c24a

trunk/src/comp/front/ast.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,9 +247,15 @@ tag spawn_dom {
247247
dom_thread;
248248
}
249249
250+
// FIXME: temporary
251+
tag seq_kind {
252+
sk_unique;
253+
sk_rc;
254+
}
255+
250256
type expr = spanned[expr_];
251257
tag expr_ {
252-
expr_vec(vec[@expr], mutability, ann);
258+
expr_vec(vec[@expr], mutability, seq_kind, ann);
253259
expr_tup(vec[elt], ann);
254260
expr_rec(vec[field], option::t[@expr], ann);
255261
expr_call(@expr, vec[@expr], ann);
@@ -294,7 +300,7 @@ tag expr_ {
294300
295301
type lit = spanned[lit_];
296302
tag lit_ {
297-
lit_str(str);
303+
lit_str(str, seq_kind);
298304
lit_char(char);
299305
lit_int(int);
300306
lit_uint(uint);

trunk/src/comp/front/eval.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ fn eval_lit(ctx cx, span sp, @ast::lit lit) -> val {
104104
alt (lit.node) {
105105
case (ast::lit_bool(?b)) { ret val_bool(b); }
106106
case (ast::lit_int(?i)) { ret val_int(i); }
107-
case (ast::lit_str(?s)) { ret val_str(s); }
107+
case (ast::lit_str(?s,_)) { ret val_str(s); }
108108
case (_) {
109109
cx.sess.span_err(sp, "evaluating unsupported literal");
110110
}

trunk/src/comp/front/extenv.rs

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,22 +40,15 @@ fn expand_syntax_ext(&ext_ctxt cx,
4040

4141
// FIXME: duplicate code copied from extfmt:
4242

43-
fn expr_to_str(&ext_ctxt cx,
44-
@ast::expr expr) -> str {
43+
fn expr_to_str(&ext_ctxt cx, @ast::expr expr) -> str {
4544
alt (expr.node) {
4645
case (ast::expr_lit(?l, _)) {
4746
alt (l.node) {
48-
case (ast::lit_str(?s)) {
49-
ret s;
50-
}
51-
case (_) {
52-
cx.span_err(l.span, "malformed #env call");
53-
}
47+
case (ast::lit_str(?s,_)) { ret s; }
48+
case (_) { cx.span_err(l.span, "malformed #env call"); }
5449
}
5550
}
56-
case (_) {
57-
cx.span_err(expr.span, "malformed #env call");
58-
}
51+
case (_) { cx.span_err(expr.span, "malformed #env call"); }
5952
}
6053
}
6154

@@ -67,8 +60,7 @@ fn make_new_lit(&ext_ctxt cx, common::span sp, ast::lit_ lit)
6760
}
6861

6962
fn make_new_str(&ext_ctxt cx, common::span sp, str s) -> @ast::expr {
70-
auto lit = ast::lit_str(s);
71-
ret make_new_lit(cx, sp, lit);
63+
ret make_new_lit(cx, sp, ast::lit_str(s, ast::sk_rc));
7264
}
7365

7466
//

trunk/src/comp/front/extfmt.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,8 @@ fn expr_to_str(&ext_ctxt cx, @ast::expr expr) -> str {
4949
alt (expr.node) {
5050
case (ast::expr_lit(?l, _)) {
5151
alt (l.node) {
52-
case (ast::lit_str(?s)) {
53-
ret s;
54-
}
55-
case (_) {
56-
cx.span_err(l.span, err_msg);
57-
}
52+
case (ast::lit_str(?s,_)) { ret s; }
53+
case (_) { cx.span_err(l.span, err_msg); }
5854
}
5955
}
6056
case (_) {
@@ -77,7 +73,7 @@ fn pieces_to_expr(&ext_ctxt cx, common::span sp,
7773
}
7874

7975
fn make_new_str(&ext_ctxt cx, common::span sp, str s) -> @ast::expr {
80-
auto lit = ast::lit_str(s);
76+
auto lit = ast::lit_str(s, ast::sk_rc);
8177
ret make_new_lit(cx, sp, lit);
8278
}
8379

@@ -109,7 +105,8 @@ fn pieces_to_expr(&ext_ctxt cx, common::span sp,
109105

110106
fn make_vec_expr(&ext_ctxt cx, common::span sp, vec[@ast::expr] exprs)
111107
-> @ast::expr {
112-
auto vecexpr = ast::expr_vec(exprs, ast::imm, cx.next_ann());
108+
auto vecexpr = ast::expr_vec(exprs, ast::imm, ast::sk_rc,
109+
cx.next_ann());
113110
auto sp_vecexpr = @rec(node=vecexpr, span=sp);
114111
ret sp_vecexpr;
115112
}

trunk/src/comp/front/parser.rs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -682,7 +682,7 @@ fn parse_lit(&parser p) -> ast::lit {
682682
}
683683
case (token::LIT_STR(?s)) {
684684
p.bump();
685-
lit = ast::lit_str(p.get_str(s));
685+
lit = ast::lit_str(p.get_str(s), ast::sk_rc);
686686
}
687687
case (?t) {
688688
unexpected(p, t);
@@ -826,7 +826,30 @@ fn parse_bottom_expr(&parser p) -> @ast::expr {
826826
auto es = parse_seq_to_end[@ast::expr](token::RBRACKET,
827827
some(token::COMMA),
828828
pf, p);
829-
ex = ast::expr_vec(es, mut, p.get_ann());
829+
ex = ast::expr_vec(es, mut, ast::sk_rc, p.get_ann());
830+
} else if (p.peek() == token::TILDE) {
831+
p.bump();
832+
alt (p.peek()) {
833+
case (token::LBRACKET) { // unique array (temporary)
834+
p.bump();
835+
auto mut = parse_mutability(p);
836+
auto es = parse_seq_to_end(token::RBRACKET,
837+
some(token::COMMA), parse_expr, p);
838+
ex = ast::expr_vec(es, mut, ast::sk_unique, p.get_ann());
839+
}
840+
case (token::LIT_STR(?s)) {
841+
p.bump();
842+
auto lit = @rec(
843+
node=ast::lit_str(p.get_str(s), ast::sk_unique),
844+
span=p.get_span()
845+
);
846+
ex = ast::expr_lit(lit, p.get_ann());
847+
}
848+
case (_) {
849+
p.get_session().span_unimpl(p.get_span(),
850+
"unique pointer creation");
851+
}
852+
}
830853
} else if (eat_word(p, "obj")) {
831854
// Anonymous object
832855

@@ -1632,7 +1655,7 @@ fn stmt_ends_with_semi(&ast::stmt stmt) -> bool {
16321655
}
16331656
case (ast::stmt_expr(?e,_)) {
16341657
alt (e.node) {
1635-
case (ast::expr_vec(_,_,_)) { ret true; }
1658+
case (ast::expr_vec(_,_,_,_)) { ret true; }
16361659
case (ast::expr_tup(_,_)) { ret true; }
16371660
case (ast::expr_rec(_,_,_)) { ret true; }
16381661
case (ast::expr_call(_,_,_)) { ret true; }

trunk/src/comp/middle/trans.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3365,7 +3365,7 @@ fn trans_lit(&@crate_ctxt cx, &ast::lit lit, &ast::ann ann) -> ValueRef {
33653365
case (ast::lit_nil) {
33663366
ret C_nil();
33673367
}
3368-
case (ast::lit_str(?s)) {
3368+
case (ast::lit_str(?s, _)) {
33693369
ret C_str(cx, s);
33703370
}
33713371
}
@@ -5619,7 +5619,7 @@ fn trans_expr_out(&@block_ctxt cx, &@ast::expr e, out_method output)
56195619
ret trans_cast(cx, e, ann);
56205620
}
56215621

5622-
case (ast::expr_vec(?args, _, ?ann)) {
5622+
case (ast::expr_vec(?args, _, _, ?ann)) {
56235623
ret trans_vec(cx, args, ann);
56245624
}
56255625

trunk/src/comp/middle/tstate/pre_post_conditions.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ fn find_pre_post_expr(&fn_ctxt fcx, @expr e) -> () {
265265
vec::push[@expr](args, operator);
266266
find_pre_post_exprs(fcx, args, a);
267267
}
268-
case (expr_vec(?args, _, ?a)) {
268+
case (expr_vec(?args, _, _, ?a)) {
269269
find_pre_post_exprs(fcx, args, a);
270270
}
271271
case (expr_tup(?elts, ?a)) {

trunk/src/comp/middle/tstate/states.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ fn find_pre_post_state_expr(&fn_ctxt fcx, &prestate pres, @expr e) -> bool {
143143

144144
/* FIXME could get rid of some of the copy/paste */
145145
alt (e.node) {
146-
case (expr_vec(?elts, _, ?a)) {
146+
case (expr_vec(?elts, _, _, ?a)) {
147147
ret find_pre_post_state_exprs(fcx, pres, a, elts);
148148
}
149149
case (expr_tup(?elts, ?a)) {

trunk/src/comp/middle/ty.rs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1580,7 +1580,7 @@ fn item_ann(&@ast::item it) -> ast::ann {
15801580

15811581
fn expr_ann(&@ast::expr e) -> ast::ann {
15821582
alt (e.node) {
1583-
case (ast::expr_vec(_,_,?a)) { ret a; }
1583+
case (ast::expr_vec(_,_,_,?a)) { ret a; }
15841584
case (ast::expr_tup(_,?a)) { ret a; }
15851585
case (ast::expr_rec(_,_,?a)) { ret a; }
15861586
case (ast::expr_call(_,_,?a)) { ret a; }
@@ -2139,6 +2139,7 @@ mod unify {
21392139
case (ty::ty_float) { ret struct_cmp(cx, expected, actual); }
21402140
case (ty::ty_char) { ret struct_cmp(cx, expected, actual); }
21412141
case (ty::ty_str) { ret struct_cmp(cx, expected, actual); }
2142+
case (ty::ty_istr) { ret struct_cmp(cx, expected, actual); }
21422143
case (ty::ty_type) { ret struct_cmp(cx, expected, actual); }
21432144
case (ty::ty_native) { ret struct_cmp(cx, expected, actual); }
21442145
case (ty::ty_param(_)) { ret struct_cmp(cx, expected, actual); }
@@ -2238,6 +2239,33 @@ mod unify {
22382239
}
22392240
}
22402241

2242+
case (ty::ty_ivec(?expected_mt)) {
2243+
alt (struct(cx.tcx, actual)) {
2244+
case (ty::ty_ivec(?actual_mt)) {
2245+
auto mut;
2246+
alt (unify_mut(expected_mt.mut, actual_mt.mut)) {
2247+
case (none) { ret ures_err(terr_vec_mutability); }
2248+
case (some(?m)) { mut = m; }
2249+
}
2250+
2251+
auto result = unify_step(cx,
2252+
expected_mt.ty,
2253+
actual_mt.ty);
2254+
alt (result) {
2255+
case (ures_ok(?result_sub)) {
2256+
auto mt = rec(ty=result_sub, mut=mut);
2257+
ret ures_ok(mk_ivec(cx.tcx, mt));
2258+
}
2259+
case (_) {
2260+
ret result;
2261+
}
2262+
}
2263+
}
2264+
2265+
case (_) { ret ures_err(terr_mismatch); }
2266+
}
2267+
}
2268+
22412269
case (ty::ty_port(?expected_sub)) {
22422270
alt (struct(cx.tcx, actual)) {
22432271
case (ty::ty_port(?actual_sub)) {

trunk/src/comp/middle/typeck.rs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1259,7 +1259,8 @@ fn replace_node_type_only(&ty::ctxt tcx, uint fixup, ty::t new_t) {
12591259

12601260
fn check_lit(@crate_ctxt ccx, &@ast::lit lit) -> ty::t {
12611261
alt (lit.node) {
1262-
case (ast::lit_str(_)) { ret ty::mk_str(ccx.tcx); }
1262+
case (ast::lit_str(_, ast::sk_rc)) { ret ty::mk_str(ccx.tcx); }
1263+
case (ast::lit_str(_, ast::sk_unique)) { ret ty::mk_istr(ccx.tcx); }
12631264
case (ast::lit_char(_)) { ret ty::mk_char(ccx.tcx); }
12641265
case (ast::lit_int(_)) { ret ty::mk_int(ccx.tcx); }
12651266
case (ast::lit_float(_)) { ret ty::mk_float(ccx.tcx); }
@@ -1334,9 +1335,9 @@ fn check_pat(&@fn_ctxt fcx, &@ast::pat pat, ty::t expected) {
13341335
fcx.ccx.tcx.sess.span_err(pat.span, #fmt(
13351336
"this pattern has %u field%s, but the corresponding variant has %u field%s",
13361337
subpats_len,
1337-
if (subpats_len == 0u) { "" } else { "s" },
1338+
if (subpats_len == 1u) { "" } else { "s" },
13381339
arg_len,
1339-
if (arg_len == 0u) { "" } else { "s" }));
1340+
if (arg_len == 1u) { "" } else { "s" }));
13401341
}
13411342

13421343
// TODO: vec::iter2
@@ -1352,7 +1353,7 @@ fn check_pat(&@fn_ctxt fcx, &@ast::pat pat, ty::t expected) {
13521353
fcx.ccx.tcx.sess.span_err(pat.span, #fmt(
13531354
"this pattern has %u field%s, but the corresponding variant has no fields",
13541355
subpats_len,
1355-
if (subpats_len == 0u) { "" } else { "s" }));
1356+
if (subpats_len == 1u) { "" } else { "s" }));
13561357
}
13571358

13581359
write::ty_fixup(fcx, ann.id, path_tpot);
@@ -2025,7 +2026,7 @@ fn check_expr(&@fn_ctxt fcx, &@ast::expr expr) {
20252026
write::ty_only_fixup(fcx, a.id, t_1);
20262027
}
20272028

2028-
case (ast::expr_vec(?args, ?mut, ?a)) {
2029+
case (ast::expr_vec(?args, ?mut, ?kind, ?a)) {
20292030
let ty::t t;
20302031
if (vec::len[@ast::expr](args) == 0u) {
20312032
t = next_ty_var(fcx);
@@ -2040,7 +2041,16 @@ fn check_expr(&@fn_ctxt fcx, &@ast::expr expr) {
20402041
demand::simple(fcx, expr.span, t, expr_t);
20412042
}
20422043

2043-
auto typ = ty::mk_vec(fcx.ccx.tcx, rec(ty=t, mut=mut));
2044+
auto typ;
2045+
alt (kind) {
2046+
case (ast::sk_rc) {
2047+
typ = ty::mk_vec(fcx.ccx.tcx, rec(ty=t, mut=mut));
2048+
}
2049+
case (ast::sk_unique) {
2050+
typ = ty::mk_ivec(fcx.ccx.tcx, rec(ty=t, mut=mut));
2051+
}
2052+
}
2053+
20442054
write::ty_only_fixup(fcx, a.id, typ);
20452055
}
20462056

trunk/src/comp/middle/visit.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ fn visit_exprs[E](vec[@expr] exprs, &E e, &vt[E] v) {
246246

247247
fn visit_expr[E](&@expr ex, &E e, &vt[E] v) {
248248
alt (ex.node) {
249-
case (expr_vec(?es, _, _)) {
249+
case (expr_vec(?es, _, _, _)) {
250250
visit_exprs(es, e, v);
251251
}
252252
case (expr_tup(?elts, _)) {

trunk/src/comp/middle/walk.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ fn walk_expr(&ast_visitor v, @ast::expr e) {
321321
if (!v.keep_going()) { ret; }
322322
v.visit_expr_pre(e);
323323
alt (e.node) {
324-
case (ast::expr_vec(?es, _, _)) {
324+
case (ast::expr_vec(?es, _, _, _)) {
325325
walk_exprs(v, es);
326326
}
327327
case (ast::expr_tup(?elts, _)) {

trunk/src/comp/pretty/ppaux.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,10 @@ fn print_literal(&ps s, &@ast::lit lit) {
225225
}
226226

227227
alt (lit.node) {
228-
case (ast::lit_str(?st)) {print_string(s, st);}
228+
case (ast::lit_str(?st,?kind)) {
229+
if (kind == ast::sk_unique) { word(s.s, "~"); }
230+
print_string(s, st);
231+
}
229232
case (ast::lit_char(?ch)) {
230233
word(s.s, "'" + escape_str(str::from_bytes([ch as u8]), '\'')
231234
+ "'");

trunk/src/comp/pretty/pprust.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -463,9 +463,14 @@ fn print_expr(&ps s, &@ast::expr expr) {
463463
}
464464

465465
alt (expr.node) {
466-
case (ast::expr_vec(?exprs,?mut,_)) {
466+
case (ast::expr_vec(?exprs,?mut,?kind,_)) {
467467
ibox(s, indent_unit);
468-
word(s.s, "[");
468+
469+
alt (kind) {
470+
case (ast::sk_rc) { word(s.s, "["); }
471+
case (ast::sk_unique) { word(s.s, "~["); }
472+
}
473+
469474
if (mut == ast::mut) {
470475
word_nbsp(s, "mutable");
471476
}

trunk/src/comp/util/common.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,9 +233,11 @@ fn local_rhs_span(&@ast::local l, &span def) -> span {
233233

234234
fn lit_eq(&@ast::lit l, &@ast::lit m) -> bool {
235235
alt (l.node) {
236-
case (ast::lit_str(?s)) {
236+
case (ast::lit_str(?s,?kind_s)) {
237237
alt (m.node) {
238-
case (ast::lit_str(?t)) { ret s == t; }
238+
case (ast::lit_str(?t,?kind_t)) {
239+
ret s == t && kind_s == kind_t;
240+
}
239241
case (_) { ret false; }
240242
}
241243
}

0 commit comments

Comments
 (0)