diff options
| author | Tim Chevalier <chevalier@alum.wellesley.edu> | 2012-10-05 16:10:08 -0700 |
|---|---|---|
| committer | Tim Chevalier <chevalier@alum.wellesley.edu> | 2012-10-05 16:10:08 -0700 |
| commit | f8bc0d25455d7bfb299cd0e7693ee575f5dbce21 (patch) | |
| tree | 80c1bde3c3f3b0cf47993dfe769418cc2ac55323 /src/rustc | |
| parent | ca49fd402af8e7bf613c43e996274b5a017958d2 (diff) | |
| download | rust-f8bc0d25455d7bfb299cd0e7693ee575f5dbce21.tar.gz rust-f8bc0d25455d7bfb299cd0e7693ee575f5dbce21.zip | |
Revert "wip"
This reverts commit ca49fd402af8e7bf613c43e996274b5a017958d2.
Diffstat (limited to 'src/rustc')
| -rw-r--r-- | src/rustc/metadata/encoder.rs | 2 | ||||
| -rw-r--r-- | src/rustc/metadata/tydecode.rs | 1 | ||||
| -rw-r--r-- | src/rustc/metadata/tyencode.rs | 1 | ||||
| -rw-r--r-- | src/rustc/middle/borrowck.rs | 6 | ||||
| -rw-r--r-- | src/rustc/middle/borrowck/check_loans.rs | 11 | ||||
| -rw-r--r-- | src/rustc/middle/borrowck/gather_loans.rs | 4 | ||||
| -rw-r--r-- | src/rustc/middle/kind.rs | 18 | ||||
| -rw-r--r-- | src/rustc/middle/liveness.rs | 29 | ||||
| -rw-r--r-- | src/rustc/middle/mem_categorization.rs | 3 | ||||
| -rw-r--r-- | src/rustc/middle/trans/base.rs | 2 | ||||
| -rw-r--r-- | src/rustc/middle/trans/callee.rs | 2 | ||||
| -rw-r--r-- | src/rustc/middle/trans/reflect.rs | 1 | ||||
| -rw-r--r-- | src/rustc/middle/trans/shape.rs | 8 | ||||
| -rw-r--r-- | src/rustc/middle/trans/type_use.rs | 2 | ||||
| -rw-r--r-- | src/rustc/middle/trans/uniq.rs | 1 |
15 files changed, 62 insertions, 29 deletions
diff --git a/src/rustc/metadata/encoder.rs b/src/rustc/metadata/encoder.rs index 47d91c10818..87ef3b4749c 100644 --- a/src/rustc/metadata/encoder.rs +++ b/src/rustc/metadata/encoder.rs @@ -116,7 +116,7 @@ fn encode_mutability(ebml_w: ebml::Writer, mt: class_mutability) { type entry<T> = {val: T, pos: uint}; fn add_to_index(ecx: @encode_ctxt, ebml_w: ebml::Writer, path: &[ident], - index: &mut ~[entry<~str>], name: ident) { + &index: ~[entry<~str>], name: ident) { let mut full_path = ~[]; full_path.push_all(path); full_path.push(name); diff --git a/src/rustc/metadata/tydecode.rs b/src/rustc/metadata/tydecode.rs index 1375ff2d0be..f3fa0e3f350 100644 --- a/src/rustc/metadata/tydecode.rs +++ b/src/rustc/metadata/tydecode.rs @@ -394,6 +394,7 @@ fn parse_arg(st: @pstate, conv: conv_did) -> ty::arg { fn parse_mode(st: @pstate) -> ast::mode { let m = ast::expl(match next(st) { + '&' => ast::by_mutbl_ref, '-' => ast::by_move, '+' => ast::by_copy, '=' => ast::by_ref, diff --git a/src/rustc/metadata/tyencode.rs b/src/rustc/metadata/tyencode.rs index 83f92b44fe8..88d83ca23f4 100644 --- a/src/rustc/metadata/tyencode.rs +++ b/src/rustc/metadata/tyencode.rs @@ -332,6 +332,7 @@ fn enc_arg(w: io::Writer, cx: @ctxt, arg: ty::arg) { fn enc_mode(w: io::Writer, cx: @ctxt, m: mode) { match ty::resolved_mode(cx.tcx, m) { + by_mutbl_ref => w.write_char('&'), by_move => w.write_char('-'), by_copy => w.write_char('+'), by_ref => w.write_char('='), diff --git a/src/rustc/middle/borrowck.rs b/src/rustc/middle/borrowck.rs index e2f7ba20642..414890cbd7c 100644 --- a/src/rustc/middle/borrowck.rs +++ b/src/rustc/middle/borrowck.rs @@ -396,10 +396,10 @@ type req_maps = { pure_map: HashMap<ast::node_id, bckerr> }; -fn save_and_restore<T:Copy,U>(save_and_restore_t: &mut T, f: fn() -> U) -> U { - let old_save_and_restore_t = *save_and_restore_t; +fn save_and_restore<T:Copy,U>(&save_and_restore_t: T, f: fn() -> U) -> U { + let old_save_and_restore_t = save_and_restore_t; let u <- f(); - *save_and_restore_t = old_save_and_restore_t; + save_and_restore_t = old_save_and_restore_t; move u } diff --git a/src/rustc/middle/borrowck/check_loans.rs b/src/rustc/middle/borrowck/check_loans.rs index 51beff021fa..0c79c0fcd7f 100644 --- a/src/rustc/middle/borrowck/check_loans.rs +++ b/src/rustc/middle/borrowck/check_loans.rs @@ -529,7 +529,8 @@ impl check_loan_ctxt { ast::by_move => { self.check_move_out(*arg); } - ast::by_ref | ast::by_copy | ast::by_val => { + ast::by_mutbl_ref | ast::by_ref | + ast::by_copy | ast::by_val => { } } } @@ -541,9 +542,9 @@ fn check_loans_in_fn(fk: visit::fn_kind, decl: ast::fn_decl, body: ast::blk, visitor: visit::vt<check_loan_ctxt>) { debug!("purity on entry=%?", copy self.declared_purity); - do save_and_restore(&mut(self.in_ctor)) { - do save_and_restore(&mut(self.declared_purity)) { - do save_and_restore(&mut(self.fn_args)) { + do save_and_restore(self.in_ctor) { + do save_and_restore(self.declared_purity) { + do save_and_restore(self.fn_args) { let is_stack_closure = self.is_stack_closure(id); let fty = ty::node_id_to_type(self.tcx(), id); self.declared_purity = ty::determine_inherited_purity( @@ -666,7 +667,7 @@ fn check_loans_in_expr(expr: @ast::expr, fn check_loans_in_block(blk: ast::blk, &&self: check_loan_ctxt, vt: visit::vt<check_loan_ctxt>) { - do save_and_restore(&mut(self.declared_purity)) { + do save_and_restore(self.declared_purity) { self.check_for_conflicting_loans(blk.node.id); match blk.node.rules { diff --git a/src/rustc/middle/borrowck/gather_loans.rs b/src/rustc/middle/borrowck/gather_loans.rs index 5dfde8c9af6..327db51518b 100644 --- a/src/rustc/middle/borrowck/gather_loans.rs +++ b/src/rustc/middle/borrowck/gather_loans.rs @@ -115,6 +115,10 @@ fn req_loans_in_expr(ex: @ast::expr, let scope_r = ty::re_scope(ex.id); for vec::each2(args, arg_tys) |arg, arg_ty| { match ty::resolved_mode(self.tcx(), arg_ty.mode) { + ast::by_mutbl_ref => { + let arg_cmt = self.bccx.cat_expr(*arg); + self.guarantee_valid(arg_cmt, m_mutbl, scope_r); + } ast::by_ref => { let arg_cmt = self.bccx.cat_expr(*arg); self.guarantee_valid(arg_cmt, m_imm, scope_r); diff --git a/src/rustc/middle/kind.rs b/src/rustc/middle/kind.rs index 1da145cabc9..9aff382775c 100644 --- a/src/rustc/middle/kind.rs +++ b/src/rustc/middle/kind.rs @@ -319,13 +319,13 @@ fn check_expr(e: @expr, cx: ctx, v: visit::vt<ctx>) { for exprs.each |expr| { maybe_copy(cx, *expr, None); } } expr_call(f, args, _) => { - let mut i = 0; + let mut i = 0u; for ty::ty_fn_args(ty::expr_ty(cx.tcx, f)).each |arg_t| { match ty::arg_mode(cx.tcx, *arg_t) { by_copy => maybe_copy(cx, args[i], None), - by_ref | by_val | by_move => () + by_ref | by_val | by_mutbl_ref | by_move => () } - i += 1; + i += 1u; } } expr_field(lhs, _, _) => { @@ -335,7 +335,7 @@ fn check_expr(e: @expr, cx: ctx, v: visit::vt<ctx>) { Some(ref mme) => { match ty::arg_mode(cx.tcx, mme.self_arg) { by_copy => maybe_copy(cx, lhs, None), - by_ref | by_val | by_move => () + by_ref | by_val | by_mutbl_ref | by_move => () } } _ => () @@ -465,10 +465,18 @@ fn check_imm_free_var(cx: ctx, def: def, sp: span) { cx.tcx.sess.span_err(sp, msg); } } + def_arg(_, mode) => { + match ty::resolved_mode(cx.tcx, mode) { + by_ref | by_val | by_move | by_copy => { /* ok */ } + by_mutbl_ref => { + cx.tcx.sess.span_err(sp, msg); + } + } + } def_upvar(_, def1, _, _) => { check_imm_free_var(cx, *def1, sp); } - def_arg(*) | def_binding(*) | def_self(*) => { /*ok*/ } + def_binding(*) | def_self(*) => { /*ok*/ } _ => { cx.tcx.sess.span_bug( sp, diff --git a/src/rustc/middle/liveness.rs b/src/rustc/middle/liveness.rs index bdf808e8568..69b325b03a4 100644 --- a/src/rustc/middle/liveness.rs +++ b/src/rustc/middle/liveness.rs @@ -398,8 +398,8 @@ impl IrMaps { (*v).push(id); } - Arg(_, _, by_ref) | Arg(_, _, by_val) | Self | Field(_) | - ImplicitRet | + Arg(_, _, by_ref) | Arg(_, _, by_mutbl_ref) | + Arg(_, _, by_val) | Self | Field(_) | ImplicitRet | Local(LocalInfo {kind: FromMatch(bind_by_implicit_ref), _}) => { debug!("--but it is not owned"); } @@ -831,9 +831,9 @@ impl Liveness { let mut changed = false; do self.indices2(ln, succ_ln) |idx, succ_idx| { changed |= copy_if_invalid(copy self.users[succ_idx].reader, - &mut self.users[idx].reader); + self.users[idx].reader); changed |= copy_if_invalid(copy self.users[succ_idx].writer, - &mut self.users[idx].writer); + self.users[idx].writer); if self.users[succ_idx].used && !self.users[idx].used { self.users[idx].used = true; changed = true; @@ -844,10 +844,10 @@ impl Liveness { ln.to_str(), self.ln_str(succ_ln), first_merge, changed); return changed; - fn copy_if_invalid(src: LiveNode, dst: &mut LiveNode) -> bool { + fn copy_if_invalid(src: LiveNode, &dst: LiveNode) -> bool { if src.is_valid() { if !dst.is_valid() { - *dst = src; + dst = src; return true; } } @@ -919,7 +919,7 @@ impl Liveness { // inputs passed by & mode should be considered live on exit: for decl.inputs.each |arg| { match ty::resolved_mode(self.tcx, arg.mode) { - by_ref | by_val => { + by_mutbl_ref | by_ref | by_val => { // These are "non-owned" modes, so register a read at // the end. This will prevent us from moving out of // such variables but also prevent us from registering @@ -1573,7 +1573,7 @@ fn check_expr(expr: @expr, &&self: @Liveness, vt: vt<@Liveness>) { let targs = ty::ty_fn_args(ty::expr_ty(self.tcx, f)); for vec::each2(args, targs) |arg_expr, arg_ty| { match ty::resolved_mode(self.tcx, arg_ty.mode) { - by_val | by_copy | by_ref => {} + by_val | by_copy | by_ref | by_mutbl_ref => {} by_move => { self.check_move_from_expr(*arg_expr, vt); } @@ -1866,6 +1866,19 @@ impl @Liveness { for decl.inputs.each |arg| { let var = self.variable(arg.id, arg.ty.span); match ty::resolved_mode(self.tcx, arg.mode) { + by_mutbl_ref => { + // for mutable reference arguments, something like + // x = 1; + // is not worth warning about, as it has visible + // side effects outside the fn. + match self.assigned_on_entry(entry_ln, var) { + Some(_) => { /*ok*/ } + None => { + // but if it is not written, it ought to be used + self.warn_about_unused(sp, entry_ln, var); + } + } + } by_val | by_ref | by_move | by_copy => { self.warn_about_unused(sp, entry_ln, var); } diff --git a/src/rustc/middle/mem_categorization.rs b/src/rustc/middle/mem_categorization.rs index dc5874ea2cf..fe465db1312 100644 --- a/src/rustc/middle/mem_categorization.rs +++ b/src/rustc/middle/mem_categorization.rs @@ -523,6 +523,9 @@ impl &mem_categorization_ctxt { // m: mutability of the argument // lp: loan path, must be none for aliasable things let {m,lp} = match ty::resolved_mode(self.tcx, mode) { + ast::by_mutbl_ref => { + {m: m_mutbl, lp: None} + } ast::by_move | ast::by_copy => { {m: m_imm, lp: Some(@lp_arg(vid))} } diff --git a/src/rustc/middle/trans/base.rs b/src/rustc/middle/trans/base.rs index 368a523306e..ce596586ddc 100644 --- a/src/rustc/middle/trans/base.rs +++ b/src/rustc/middle/trans/base.rs @@ -1503,7 +1503,7 @@ fn copy_args_to_allocas(fcx: fn_ctxt, // the event it's not truly needed. let llarg; match ty::resolved_mode(tcx, arg_ty.mode) { - ast::by_ref => { + ast::by_ref | ast::by_mutbl_ref => { llarg = raw_llarg; } ast::by_move | ast::by_copy => { diff --git a/src/rustc/middle/trans/callee.rs b/src/rustc/middle/trans/callee.rs index c851c5bc725..e7b4dd171e3 100644 --- a/src/rustc/middle/trans/callee.rs +++ b/src/rustc/middle/trans/callee.rs @@ -592,7 +592,7 @@ fn trans_arg_expr(bcx: block, DoAutorefArg => { val = arg_datum.to_ref_llval(bcx); } DontAutorefArg => { match arg_mode { - ast::by_ref => { + ast::by_ref | ast::by_mutbl_ref => { val = arg_datum.to_ref_llval(bcx); } diff --git a/src/rustc/middle/trans/reflect.rs b/src/rustc/middle/trans/reflect.rs index ef1cc15f5c0..cdd11ee85c5 100644 --- a/src/rustc/middle/trans/reflect.rs +++ b/src/rustc/middle/trans/reflect.rs @@ -208,6 +208,7 @@ impl reflector { ast::expl(e) => match e { ast::by_ref => 1u, ast::by_val => 2u, + ast::by_mutbl_ref => 3u, ast::by_move => 4u, ast::by_copy => 5u } diff --git a/src/rustc/middle/trans/shape.rs b/src/rustc/middle/trans/shape.rs index e7dfac42bec..cf58b5b51c4 100644 --- a/src/rustc/middle/trans/shape.rs +++ b/src/rustc/middle/trans/shape.rs @@ -49,12 +49,12 @@ fn mk_ctxt(llmod: ModuleRef) -> ctxt { return {mut next_tag_id: 0u16, pad: 0u16, pad2: 0u32}; } -fn add_u16(dest: &mut ~[u8], val: u16) { - *dest += ~[(val & 0xffu16) as u8, (val >> 8u16) as u8]; +fn add_u16(&dest: ~[u8], val: u16) { + dest += ~[(val & 0xffu16) as u8, (val >> 8u16) as u8]; } -fn add_substr(dest: &mut ~[u8], src: ~[u8]) { +fn add_substr(&dest: ~[u8], src: ~[u8]) { add_u16(dest, vec::len(src) as u16); - *dest += src; + dest += src; } diff --git a/src/rustc/middle/trans/type_use.rs b/src/rustc/middle/trans/type_use.rs index 9140ea94e9c..6bd3c22f626 100644 --- a/src/rustc/middle/trans/type_use.rs +++ b/src/rustc/middle/trans/type_use.rs @@ -53,7 +53,7 @@ fn type_uses_for(ccx: @crate_ctxt, fn_id: def_id, n_tps: uint) by_val | by_move | by_copy => { type_needs(cx, use_repr, arg.ty); } - by_ref => {} + by_ref | by_mutbl_ref => {} } } } diff --git a/src/rustc/middle/trans/uniq.rs b/src/rustc/middle/trans/uniq.rs index 50ea363ace2..6ab91c4a1d7 100644 --- a/src/rustc/middle/trans/uniq.rs +++ b/src/rustc/middle/trans/uniq.rs @@ -3,6 +3,7 @@ use lib::llvm::ValueRef; use common::*; use build::*; use base::*; +use shape::llsize_of; use datum::immediate_rvalue; export make_free_glue, autoderef, duplicate; |
