Skip to content

Commit 39f242a

Browse files
committed
---
yaml --- r: 166458 b: refs/heads/snap-stage3 c: 8a357e1 h: refs/heads/master v: v3
1 parent 90b4a9e commit 39f242a

File tree

14 files changed

+84
-9
lines changed

14 files changed

+84
-9
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
refs/heads/master: 18842f89f084c52588fe7cffe07f87bf6e90796a
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
4-
refs/heads/snap-stage3: 53c5fcb99fc8c62b8723032280fab3dc06fef973
4+
refs/heads/snap-stage3: 8a357e1d87971574817a033e5467785402d5fcfb
55
refs/heads/try: f5d619caf9f32458680fae55526b99582ca682dd
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d

branches/snap-stage3/src/librustc/middle/cfg/construct.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,10 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
439439
start.iter().chain(end.iter()).map(|x| &**x))
440440
}
441441

442+
ast::ExprRange(..) => {
443+
self.tcx.sess.span_bug(expr.span, "non-desugared range");
444+
}
445+
442446
ast::ExprUnary(_, ref e) if self.is_method_call(expr) => {
443447
self.call(expr, pred, &**e, None::<ast::Expr>.iter())
444448
}

branches/snap-stage3/src/librustc/middle/expr_use_visitor.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,10 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
465465
assert!(overloaded);
466466
}
467467

468+
ast::ExprRange(..) => {
469+
self.tcx().sess.span_bug(expr.span, "non-desugared range");
470+
}
471+
468472
ast::ExprCall(ref callee, ref args) => { // callee(args)
469473
self.walk_callee(expr, &**callee);
470474
self.consume_exprs(args);

branches/snap-stage3/src/librustc/middle/liveness.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,9 @@ fn visit_expr(ir: &mut IrMaps, expr: &Expr) {
486486
ast::ExprWhileLet(..) => {
487487
ir.tcx.sess.span_bug(expr.span, "non-desugared ExprWhileLet");
488488
}
489+
ast::ExprRange(..) => {
490+
ir.tcx.sess.span_bug(expr.span, "non-desugared range");
491+
}
489492
ast::ExprForLoop(ref pat, _, _, _) => {
490493
pat_util::pat_bindings(&ir.tcx.def_map, &**pat, |bm, p_id, sp, path1| {
491494
debug!("adding local variable {} from for loop with bm {}",
@@ -1197,6 +1200,10 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
11971200
self.propagate_through_expr(&**e1, succ)
11981201
}
11991202

1203+
ast::ExprRange(..) => {
1204+
self.ir.tcx.sess.span_bug(expr.span, "non-desugared range");
1205+
}
1206+
12001207
ast::ExprBox(None, ref e) |
12011208
ast::ExprAddrOf(_, ref e) |
12021209
ast::ExprCast(ref e, _) |
@@ -1498,6 +1505,9 @@ fn check_expr(this: &mut Liveness, expr: &Expr) {
14981505
ast::ExprWhileLet(..) => {
14991506
this.ir.tcx.sess.span_bug(expr.span, "non-desugared ExprWhileLet");
15001507
}
1508+
ast::ExprRange(..) => {
1509+
this.ir.tcx.sess.span_bug(expr.span, "non-desugared range");
1510+
}
15011511
}
15021512
}
15031513

branches/snap-stage3/src/librustc/middle/mem_categorization.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,9 @@ impl<'t,'tcx,TYPER:Typer<'tcx>> MemCategorizationContext<'t,TYPER> {
559559
ast::ExprWhileLet(..) => {
560560
self.tcx().sess.span_bug(expr.span, "non-desugared ExprWhileLet");
561561
}
562+
ast::ExprRange(..) => {
563+
self.tcx().sess.span_bug(expr.span, "non-desugared range");
564+
}
562565
}
563566
}
564567

branches/snap-stage3/src/librustc/middle/ty.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4273,6 +4273,9 @@ pub fn expr_kind(tcx: &ctxt, expr: &ast::Expr) -> ExprKind {
42734273
ast::ExprWhileLet(..) => {
42744274
tcx.sess.span_bug(expr.span, "non-desugared ExprWhileLet");
42754275
}
4276+
ast::ExprRange(..) => {
4277+
tcx.sess.span_bug(expr.span, "non-desugared range");
4278+
}
42764279

42774280
ast::ExprLit(ref lit) if lit_is_str(&**lit) => {
42784281
RvalueDpsExpr

branches/snap-stage3/src/librustc_back/svh.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ mod svh_visitor {
247247
SawExprAssignOp(ast::BinOp),
248248
SawExprIndex,
249249
SawExprSlice,
250+
SawExprRange,
250251
SawExprPath,
251252
SawExprAddrOf(ast::Mutability),
252253
SawExprRet,
@@ -280,6 +281,7 @@ mod svh_visitor {
280281
ExprTupField(_, id) => SawExprTupField(id.node),
281282
ExprIndex(..) => SawExprIndex,
282283
ExprSlice(..) => SawExprSlice,
284+
ExprRange(..) => SawExprRange,
283285
ExprPath(..) => SawExprPath,
284286
ExprAddrOf(m, _) => SawExprAddrOf(m),
285287
ExprBreak(id) => SawExprBreak(id.map(content)),

branches/snap-stage3/src/librustc_trans/trans/debuginfo.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3494,6 +3494,11 @@ fn populate_scope_map(cx: &CrateContext,
34943494
end.as_ref().map(|x| walk_expr(cx, &**x, scope_stack, scope_map));
34953495
}
34963496

3497+
ast::ExprRange(..) => {
3498+
cx.sess().span_bug(exp.span, "debuginfo::populate_scope_map() - \
3499+
Found unexpanded range.");
3500+
}
3501+
34973502
ast::ExprVec(ref init_expressions) |
34983503
ast::ExprTup(ref init_expressions) => {
34993504
for ie in init_expressions.iter() {

branches/snap-stage3/src/librustc_typeck/check/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4278,6 +4278,10 @@ fn check_expr_with_unifier<'a, 'tcx, F>(fcx: &FnCtxt<'a, 'tcx>,
42784278
}
42794279
}
42804280
}
4281+
ast::ExprRange(..) => {
4282+
tcx.sess.span_bug(expr.span, "non-desugared range");
4283+
}
4284+
42814285
}
42824286

42834287
debug!("type of expr({}) {} is...", expr.id,

branches/snap-stage3/src/libsyntax/ast.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -724,6 +724,7 @@ pub enum Expr_ {
724724
ExprTupField(P<Expr>, Spanned<uint>),
725725
ExprIndex(P<Expr>, P<Expr>),
726726
ExprSlice(P<Expr>, Option<P<Expr>>, Option<P<Expr>>, Mutability),
727+
ExprRange(P<Expr>, Option<P<Expr>>),
727728

728729
/// Variable reference, possibly containing `::` and/or
729730
/// type parameters, e.g. foo::bar::<baz>

branches/snap-stage3/src/libsyntax/fold.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1390,6 +1390,10 @@ pub fn noop_fold_expr<T: Folder>(Expr {id, node, span}: Expr, folder: &mut T) ->
13901390
e2.map(|x| folder.fold_expr(x)),
13911391
m)
13921392
}
1393+
ExprRange(e1, e2) => {
1394+
ExprRange(folder.fold_expr(e1),
1395+
e2.map(|x| folder.fold_expr(x)))
1396+
}
13931397
ExprPath(pth) => ExprPath(folder.fold_path(pth)),
13941398
ExprBreak(opt_ident) => ExprBreak(opt_ident.map(|x| folder.fold_ident(x))),
13951399
ExprAgain(opt_ident) => ExprAgain(opt_ident.map(|x| folder.fold_ident(x))),

branches/snap-stage3/src/libsyntax/parse/parser.rs

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use ast::{Expr, Expr_, ExprAddrOf, ExprMatch, ExprAgain};
2626
use ast::{ExprAssign, ExprAssignOp, ExprBinary, ExprBlock, ExprBox};
2727
use ast::{ExprBreak, ExprCall, ExprCast};
2828
use ast::{ExprField, ExprTupField, ExprClosure, ExprIf, ExprIfLet, ExprIndex, ExprSlice};
29-
use ast::{ExprLit, ExprLoop, ExprMac};
29+
use ast::{ExprLit, ExprLoop, ExprMac, ExprRange};
3030
use ast::{ExprMethodCall, ExprParen, ExprPath};
3131
use ast::{ExprRepeat, ExprRet, ExprStruct, ExprTup, ExprUnary};
3232
use ast::{ExprVec, ExprWhile, ExprWhileLet, ExprForLoop, Field, FnDecl};
@@ -95,7 +95,8 @@ bitflags! {
9595
const UNRESTRICTED = 0b0000,
9696
const RESTRICTION_STMT_EXPR = 0b0001,
9797
const RESTRICTION_NO_BAR_OP = 0b0010,
98-
const RESTRICTION_NO_STRUCT_LITERAL = 0b0100
98+
const RESTRICTION_NO_STRUCT_LITERAL = 0b0100,
99+
const RESTRICTION_NO_DOTS = 0b1000,
99100
}
100101
}
101102

@@ -1547,7 +1548,7 @@ impl<'a> Parser<'a> {
15471548

15481549
// Parse the `; e` in `[ int; e ]`
15491550
// where `e` is a const expression
1550-
let t = match self.maybe_parse_fixed_vstore() {
1551+
let t = match self.maybe_parse_fixed_length_of_vec() {
15511552
None => TyVec(t),
15521553
Some(suffix) => TyFixedLengthVec(t, suffix)
15531554
};
@@ -1707,12 +1708,12 @@ impl<'a> Parser<'a> {
17071708
}
17081709
}
17091710

1710-
pub fn maybe_parse_fixed_vstore(&mut self) -> Option<P<ast::Expr>> {
1711+
pub fn maybe_parse_fixed_length_of_vec(&mut self) -> Option<P<ast::Expr>> {
17111712
if self.check(&token::Comma) &&
17121713
self.look_ahead(1, |t| *t == token::DotDot) {
17131714
self.bump();
17141715
self.bump();
1715-
Some(self.parse_expr())
1716+
Some(self.parse_expr_res(RESTRICTION_NO_DOTS))
17161717
} else if self.check(&token::Semi) {
17171718
self.bump();
17181719
Some(self.parse_expr())
@@ -2130,14 +2131,22 @@ impl<'a> Parser<'a> {
21302131
ExprIndex(expr, idx)
21312132
}
21322133

2133-
pub fn mk_slice(&mut self, expr: P<Expr>,
2134+
pub fn mk_slice(&mut self,
2135+
expr: P<Expr>,
21342136
start: Option<P<Expr>>,
21352137
end: Option<P<Expr>>,
21362138
mutbl: Mutability)
21372139
-> ast::Expr_ {
21382140
ExprSlice(expr, start, end, mutbl)
21392141
}
21402142

2143+
pub fn mk_range(&mut self,
2144+
start: P<Expr>,
2145+
end: Option<P<Expr>>)
2146+
-> ast::Expr_ {
2147+
ExprRange(start, end)
2148+
}
2149+
21412150
pub fn mk_field(&mut self, expr: P<Expr>, ident: ast::SpannedIdent) -> ast::Expr_ {
21422151
ExprField(expr, ident)
21432152
}
@@ -2615,7 +2624,7 @@ impl<'a> Parser<'a> {
26152624
}
26162625
// e[e] | e[e..] | e[e..e]
26172626
_ => {
2618-
let ix = self.parse_expr();
2627+
let ix = self.parse_expr_res(RESTRICTION_NO_DOTS);
26192628
match self.token {
26202629
// e[e..] | e[e..e]
26212630
token::DotDot => {
@@ -2628,7 +2637,7 @@ impl<'a> Parser<'a> {
26282637
}
26292638
// e[e..e]
26302639
_ => {
2631-
let e2 = self.parse_expr();
2640+
let e2 = self.parse_expr_res(RESTRICTION_NO_DOTS);
26322641
self.commit_expr_expecting(&*e2,
26332642
token::CloseDelim(token::Bracket));
26342643
Some(e2)
@@ -2654,6 +2663,21 @@ impl<'a> Parser<'a> {
26542663
}
26552664
}
26562665

2666+
// A range expression, either `expr..expr` or `expr..`.
2667+
token::DotDot if !self.restrictions.contains(RESTRICTION_NO_DOTS) => {
2668+
self.bump();
2669+
2670+
let opt_end = if self.token.can_begin_expr() {
2671+
let end = self.parse_expr_res(RESTRICTION_NO_DOTS);
2672+
Some(end)
2673+
} else {
2674+
None
2675+
};
2676+
2677+
let hi = self.span.hi;
2678+
let range = self.mk_range(e, opt_end);
2679+
return self.mk_expr(lo, hi, range);
2680+
}
26572681
_ => return e
26582682
}
26592683
}

branches/snap-stage3/src/libsyntax/print/pprust.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1759,6 +1759,13 @@ impl<'a> State<'a> {
17591759
}
17601760
try!(word(&mut self.s, "]"));
17611761
}
1762+
ast::ExprRange(ref start, ref end) => {
1763+
try!(self.print_expr(&**start));
1764+
try!(word(&mut self.s, ".."));
1765+
if let &Some(ref e) = end {
1766+
try!(self.print_expr(&**e));
1767+
}
1768+
}
17621769
ast::ExprPath(ref path) => try!(self.print_path(path, true)),
17631770
ast::ExprBreak(opt_ident) => {
17641771
try!(word(&mut self.s, "break"));

branches/snap-stage3/src/libsyntax/visit.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -871,6 +871,10 @@ pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr) {
871871
walk_expr_opt(visitor, start);
872872
walk_expr_opt(visitor, end)
873873
}
874+
ExprRange(ref start, ref end) => {
875+
visitor.visit_expr(&**start);
876+
walk_expr_opt(visitor, end)
877+
}
874878
ExprPath(ref path) => {
875879
visitor.visit_path(path, expression.id)
876880
}

0 commit comments

Comments
 (0)