Skip to content

Commit f57b6db

Browse files
committed
fallout from removing hir::ExprRange
A whole bunch of stuff gets folded into struct handling! Plus, removes an ugly hack from trans and accidentally fixes a bug with constructing ranges from references (see later commits with tests).
1 parent 5032bc2 commit f57b6db

File tree

14 files changed

+3
-217
lines changed

14 files changed

+3
-217
lines changed

src/librustc/middle/cfg/construct.rs

-6
Original file line numberDiff line numberDiff line change
@@ -316,12 +316,6 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
316316
self.call(expr, pred, &**l, Some(&**r).into_iter())
317317
}
318318

319-
hir::ExprRange(ref start, ref end) => {
320-
let fields = start.as_ref().map(|e| &**e).into_iter()
321-
.chain(end.as_ref().map(|e| &**e));
322-
self.straightline(expr, pred, fields)
323-
}
324-
325319
hir::ExprUnary(_, ref e) if self.tcx.is_method_call(expr.id) => {
326320
self.call(expr, pred, &**e, None::<hir::Expr>.iter())
327321
}

src/librustc/middle/expr_use_visitor.rs

-5
Original file line numberDiff line numberDiff line change
@@ -399,11 +399,6 @@ impl<'d,'t,'a,'tcx> ExprUseVisitor<'d,'t,'a,'tcx> {
399399
}
400400
}
401401

402-
hir::ExprRange(ref start, ref end) => {
403-
start.as_ref().map(|e| self.consume_expr(&**e));
404-
end.as_ref().map(|e| self.consume_expr(&**e));
405-
}
406-
407402
hir::ExprCall(ref callee, ref args) => { // callee(args)
408403
self.walk_callee(expr, &**callee);
409404
self.consume_exprs(args);

src/librustc/middle/liveness.rs

+2-7
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ fn visit_expr(ir: &mut IrMaps, expr: &Expr) {
496496
hir::ExprBlock(..) | hir::ExprAssign(..) | hir::ExprAssignOp(..) |
497497
hir::ExprStruct(..) | hir::ExprRepeat(..) |
498498
hir::ExprInlineAsm(..) | hir::ExprBox(..) |
499-
hir::ExprRange(..) | hir::ExprType(..) => {
499+
hir::ExprType(..) => {
500500
intravisit::walk_expr(ir, expr);
501501
}
502502
}
@@ -1152,11 +1152,6 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
11521152
self.propagate_through_expr(&**l, r_succ)
11531153
}
11541154

1155-
hir::ExprRange(ref e1, ref e2) => {
1156-
let succ = e2.as_ref().map_or(succ, |e| self.propagate_through_expr(&**e, succ));
1157-
e1.as_ref().map_or(succ, |e| self.propagate_through_expr(&**e, succ))
1158-
}
1159-
11601155
hir::ExprBox(ref e) |
11611156
hir::ExprAddrOf(_, ref e) |
11621157
hir::ExprCast(ref e, _) |
@@ -1444,7 +1439,7 @@ fn check_expr(this: &mut Liveness, expr: &Expr) {
14441439
hir::ExprBlock(..) | hir::ExprAddrOf(..) |
14451440
hir::ExprStruct(..) | hir::ExprRepeat(..) |
14461441
hir::ExprClosure(..) | hir::ExprPath(..) | hir::ExprBox(..) |
1447-
hir::ExprRange(..) | hir::ExprType(..) => {
1442+
hir::ExprType(..) => {
14481443
intravisit::walk_expr(this, expr);
14491444
}
14501445
}

src/librustc/middle/mem_categorization.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ impl<'t, 'a,'tcx> MemCategorizationContext<'t, 'a, 'tcx> {
525525
hir::ExprAddrOf(..) | hir::ExprCall(..) |
526526
hir::ExprAssign(..) | hir::ExprAssignOp(..) |
527527
hir::ExprClosure(..) | hir::ExprRet(..) |
528-
hir::ExprUnary(..) | hir::ExprRange(..) |
528+
hir::ExprUnary(..) |
529529
hir::ExprMethodCall(..) | hir::ExprCast(..) |
530530
hir::ExprVec(..) | hir::ExprTup(..) | hir::ExprIf(..) |
531531
hir::ExprBinary(..) | hir::ExprWhile(..) |

src/librustc/middle/ty/mod.rs

-1
Original file line numberDiff line numberDiff line change
@@ -1981,7 +1981,6 @@ impl<'tcx> ctxt<'tcx> {
19811981
hir::ExprCall(..) |
19821982
hir::ExprMethodCall(..) |
19831983
hir::ExprStruct(..) |
1984-
hir::ExprRange(..) |
19851984
hir::ExprTup(..) |
19861985
hir::ExprIf(..) |
19871986
hir::ExprMatch(..) |

src/librustc_back/svh.rs

-2
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,6 @@ mod svh_visitor {
243243
SawExprAssign,
244244
SawExprAssignOp(hir::BinOp_),
245245
SawExprIndex,
246-
SawExprRange,
247246
SawExprPath(Option<usize>),
248247
SawExprAddrOf(hir::Mutability),
249248
SawExprRet,
@@ -275,7 +274,6 @@ mod svh_visitor {
275274
ExprField(_, name) => SawExprField(name.node.as_str()),
276275
ExprTupField(_, id) => SawExprTupField(id.node),
277276
ExprIndex(..) => SawExprIndex,
278-
ExprRange(..) => SawExprRange,
279277
ExprPath(ref qself, _) => SawExprPath(qself.as_ref().map(|q| q.position)),
280278
ExprAddrOf(m, _) => SawExprAddrOf(m),
281279
ExprBreak(id) => SawExprBreak(id.map(|id| id.node.name.as_str())),

src/librustc_front/fold.rs

-4
Original file line numberDiff line numberDiff line change
@@ -1089,10 +1089,6 @@ pub fn noop_fold_expr<T: Folder>(Expr { id, node, span, attrs }: Expr, folder: &
10891089
ExprIndex(el, er) => {
10901090
ExprIndex(folder.fold_expr(el), folder.fold_expr(er))
10911091
}
1092-
ExprRange(e1, e2) => {
1093-
ExprRange(e1.map(|x| folder.fold_expr(x)),
1094-
e2.map(|x| folder.fold_expr(x)))
1095-
}
10961092
ExprPath(qself, path) => {
10971093
let qself = qself.map(|QSelf { ty, position }| {
10981094
QSelf {

src/librustc_front/intravisit.rs

-4
Original file line numberDiff line numberDiff line change
@@ -781,10 +781,6 @@ pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr) {
781781
visitor.visit_expr(main_expression);
782782
visitor.visit_expr(index_expression)
783783
}
784-
ExprRange(ref start, ref end) => {
785-
walk_list!(visitor, visit_expr, start);
786-
walk_list!(visitor, visit_expr, end);
787-
}
788784
ExprPath(ref maybe_qself, ref path) => {
789785
if let Some(ref qself) = *maybe_qself {
790786
visitor.visit_ty(&qself.ty);

src/librustc_front/print/pprust.rs

-9
Original file line numberDiff line numberDiff line change
@@ -1460,15 +1460,6 @@ impl<'a> State<'a> {
14601460
try!(self.print_expr(&**index));
14611461
try!(word(&mut self.s, "]"));
14621462
}
1463-
hir::ExprRange(ref start, ref end) => {
1464-
if let &Some(ref e) = start {
1465-
try!(self.print_expr(&**e));
1466-
}
1467-
try!(word(&mut self.s, ".."));
1468-
if let &Some(ref e) = end {
1469-
try!(self.print_expr(&**e));
1470-
}
1471-
}
14721463
hir::ExprPath(None, ref path) => {
14731464
try!(self.print_path(path, true, 0))
14741465
}

src/librustc_mir/hair/cx/expr.rs

-33
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ use rustc::middle::ty::{self, VariantDef, Ty};
2121
use rustc::mir::repr::*;
2222
use rustc_front::hir;
2323
use rustc_front::util as hir_util;
24-
use syntax::parse::token;
2524
use syntax::ptr::P;
2625

2726
impl<'tcx> Mirror<'tcx> for &'tcx hir::Expr {
@@ -281,38 +280,6 @@ impl<'tcx> Mirror<'tcx> for &'tcx hir::Expr {
281280
}
282281
}
283282

284-
hir::ExprRange(ref start, ref end) => {
285-
let range_ty = cx.tcx.expr_ty(self);
286-
let (adt_def, substs) = match range_ty.sty {
287-
ty::TyStruct(adt_def, substs) => (adt_def, substs),
288-
_ => {
289-
cx.tcx.sess.span_bug(self.span, "unexpanded ast");
290-
}
291-
};
292-
293-
let field_expr_ref = |s: &'tcx P<hir::Expr>, name: &str| {
294-
let name = token::intern(name);
295-
let index = adt_def.variants[0].index_of_field_named(name).unwrap();
296-
FieldExprRef { name: Field::new(index), expr: s.to_ref() }
297-
};
298-
299-
let start_field = start.as_ref()
300-
.into_iter()
301-
.map(|s| field_expr_ref(s, "start"));
302-
303-
let end_field = end.as_ref()
304-
.into_iter()
305-
.map(|e| field_expr_ref(e, "end"));
306-
307-
ExprKind::Adt {
308-
adt_def: adt_def,
309-
variant_index: 0,
310-
substs: substs,
311-
fields: start_field.chain(end_field).collect(),
312-
base: None,
313-
}
314-
}
315-
316283
hir::ExprPath(..) => {
317284
convert_path_expr(cx, self)
318285
}

src/librustc_passes/consts.rs

-3
Original file line numberDiff line numberDiff line change
@@ -747,9 +747,6 @@ fn check_expr<'a, 'tcx>(v: &mut CheckCrateVisitor<'a, 'tcx>,
747747
hir::ExprAgain(_) |
748748
hir::ExprRet(_) |
749749

750-
// Miscellaneous expressions that could be implemented.
751-
hir::ExprRange(..) |
752-
753750
// Expressions with side-effects.
754751
hir::ExprAssign(..) |
755752
hir::ExprAssignOp(..) |

src/librustc_trans/trans/debuginfo/create_scope_map.rs

-5
Original file line numberDiff line numberDiff line change
@@ -346,11 +346,6 @@ fn walk_expr(cx: &CrateContext,
346346
walk_expr(cx, &**rhs, scope_stack, scope_map);
347347
}
348348

349-
hir::ExprRange(ref start, ref end) => {
350-
start.as_ref().map(|e| walk_expr(cx, &**e, scope_stack, scope_map));
351-
end.as_ref().map(|e| walk_expr(cx, &**e, scope_stack, scope_map));
352-
}
353-
354349
hir::ExprVec(ref init_expressions) |
355350
hir::ExprTup(ref init_expressions) => {
356351
for ie in init_expressions {

src/librustc_trans/trans/expr.rs

-56
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,6 @@ use rustc_front::hir;
8787
use syntax::{ast, codemap};
8888
use syntax::parse::token::InternedString;
8989
use syntax::ptr::P;
90-
use syntax::parse::token;
9190
use std::mem;
9291

9392
// Destinations
@@ -1062,7 +1061,6 @@ fn trans_rvalue_dps_unadjusted<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
10621061
-> Block<'blk, 'tcx> {
10631062
let _icx = push_ctxt("trans_rvalue_dps_unadjusted");
10641063
let mut bcx = bcx;
1065-
let tcx = bcx.tcx();
10661064

10671065
debuginfo::set_source_location(bcx.fcx, expr.id, expr.span);
10681066

@@ -1091,59 +1089,6 @@ fn trans_rvalue_dps_unadjusted<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
10911089
node_id_type(bcx, expr.id),
10921090
dest)
10931091
}
1094-
hir::ExprRange(ref start, ref end) => {
1095-
// FIXME it is just not right that we are synthesising ast nodes in
1096-
// trans. Shudder.
1097-
fn make_field(field_name: &str, expr: P<hir::Expr>) -> hir::Field {
1098-
hir::Field {
1099-
name: codemap::dummy_spanned(token::intern(field_name)),
1100-
expr: expr,
1101-
span: codemap::DUMMY_SP,
1102-
}
1103-
}
1104-
1105-
// A range just desugars into a struct.
1106-
// Note that the type of the start and end may not be the same, but
1107-
// they should only differ in their lifetime, which should not matter
1108-
// in trans.
1109-
let (did, fields, ty_params) = match (start, end) {
1110-
(&Some(ref start), &Some(ref end)) => {
1111-
// Desugar to Range
1112-
let fields = vec![make_field("start", start.clone()),
1113-
make_field("end", end.clone())];
1114-
(tcx.lang_items.range_struct(), fields, vec![node_id_type(bcx, start.id)])
1115-
}
1116-
(&Some(ref start), &None) => {
1117-
// Desugar to RangeFrom
1118-
let fields = vec![make_field("start", start.clone())];
1119-
(tcx.lang_items.range_from_struct(), fields, vec![node_id_type(bcx, start.id)])
1120-
}
1121-
(&None, &Some(ref end)) => {
1122-
// Desugar to RangeTo
1123-
let fields = vec![make_field("end", end.clone())];
1124-
(tcx.lang_items.range_to_struct(), fields, vec![node_id_type(bcx, end.id)])
1125-
}
1126-
_ => {
1127-
// Desugar to RangeFull
1128-
(tcx.lang_items.range_full_struct(), vec![], vec![])
1129-
}
1130-
};
1131-
1132-
if let Some(did) = did {
1133-
let substs = Substs::new_type(ty_params, vec![]);
1134-
trans_struct(bcx,
1135-
&fields,
1136-
None,
1137-
expr.span,
1138-
expr.id,
1139-
tcx.mk_struct(tcx.lookup_adt_def(did),
1140-
tcx.mk_substs(substs)),
1141-
dest)
1142-
} else {
1143-
tcx.sess.span_bug(expr.span,
1144-
"No lang item for ranges (how did we get this far?)")
1145-
}
1146-
}
11471092
hir::ExprTup(ref args) => {
11481093
let numbered_fields: Vec<(usize, &hir::Expr)> =
11491094
args.iter().enumerate().map(|(i, arg)| (i, &**arg)).collect();
@@ -2627,7 +2572,6 @@ fn expr_kind(tcx: &ty::ctxt, expr: &hir::Expr) -> ExprKind {
26272572
hir::ExprCall(..) |
26282573
hir::ExprMethodCall(..) |
26292574
hir::ExprStruct(..) |
2630-
hir::ExprRange(..) |
26312575
hir::ExprTup(..) |
26322576
hir::ExprIf(..) |
26332577
hir::ExprMatch(..) |

src/librustc_typeck/check/mod.rs

-81
Original file line numberDiff line numberDiff line change
@@ -3658,87 +3658,6 @@ fn check_expr_with_unifier<'a, 'tcx, F>(fcx: &FnCtxt<'a, 'tcx>,
36583658
}
36593659
}
36603660
}
3661-
hir::ExprRange(ref start, ref end) => {
3662-
let t_start = start.as_ref().map(|e| {
3663-
check_expr(fcx, &**e);
3664-
fcx.expr_ty(&**e)
3665-
});
3666-
let t_end = end.as_ref().map(|e| {
3667-
check_expr(fcx, &**e);
3668-
fcx.expr_ty(&**e)
3669-
});
3670-
3671-
let idx_type = match (t_start, t_end) {
3672-
(Some(ty), None) | (None, Some(ty)) => {
3673-
Some(ty)
3674-
}
3675-
(Some(t_start), Some(t_end)) if (t_start.references_error() ||
3676-
t_end.references_error()) => {
3677-
Some(fcx.tcx().types.err)
3678-
}
3679-
(Some(t_start), Some(t_end)) => {
3680-
Some(infer::common_supertype(fcx.infcx(),
3681-
TypeOrigin::RangeExpression(expr.span),
3682-
true,
3683-
t_start,
3684-
t_end))
3685-
}
3686-
_ => None
3687-
};
3688-
3689-
// Note that we don't check the type of start/end satisfy any
3690-
// bounds because right now the range structs do not have any. If we add
3691-
// some bounds, then we'll need to check `t_start` against them here.
3692-
3693-
let range_type = match idx_type {
3694-
Some(idx_type) if idx_type.references_error() => {
3695-
fcx.tcx().types.err
3696-
}
3697-
Some(idx_type) => {
3698-
// Find the did from the appropriate lang item.
3699-
let did = match (start, end) {
3700-
(&Some(_), &Some(_)) => tcx.lang_items.range_struct(),
3701-
(&Some(_), &None) => tcx.lang_items.range_from_struct(),
3702-
(&None, &Some(_)) => tcx.lang_items.range_to_struct(),
3703-
(&None, &None) => {
3704-
tcx.sess.span_bug(expr.span, "full range should be dealt with above")
3705-
}
3706-
};
3707-
3708-
if let Some(did) = did {
3709-
let def = tcx.lookup_adt_def(did);
3710-
let predicates = tcx.lookup_predicates(did);
3711-
let substs = Substs::new_type(vec![idx_type], vec![]);
3712-
let bounds = fcx.instantiate_bounds(expr.span, &substs, &predicates);
3713-
fcx.add_obligations_for_parameters(
3714-
traits::ObligationCause::new(expr.span,
3715-
fcx.body_id,
3716-
traits::ItemObligation(did)),
3717-
&bounds);
3718-
3719-
tcx.mk_struct(def, tcx.mk_substs(substs))
3720-
} else {
3721-
span_err!(tcx.sess, expr.span, E0236, "no lang item for range syntax");
3722-
fcx.tcx().types.err
3723-
}
3724-
}
3725-
None => {
3726-
// Neither start nor end => RangeFull
3727-
if let Some(did) = tcx.lang_items.range_full_struct() {
3728-
tcx.mk_struct(
3729-
tcx.lookup_adt_def(did),
3730-
tcx.mk_substs(Substs::empty())
3731-
)
3732-
} else {
3733-
span_err!(tcx.sess, expr.span, E0237, "no lang item for range syntax");
3734-
fcx.tcx().types.err
3735-
}
3736-
}
3737-
};
3738-
3739-
fcx.write_ty(id, range_type);
3740-
}
3741-
37423661
}
37433662

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

0 commit comments

Comments
 (0)