Skip to content

Commit f5a5d7c

Browse files
committed
auto merge of #13559 : FlaPer87/rust/remove-special-root, r=nikomatsakis
This patch removes the special auto-rooting for `@` from the borrow checker. With `@` moving into a library, it doesn't make sense to keep this code around anymore. It also simplifies `trans` by removing root checking from there @nikomatsakis Closes: #11586
2 parents e01e78f + 6fa1f48 commit f5a5d7c

28 files changed

+137
-351
lines changed

src/libfourcc/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ pub fn expand_syntax_ext(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) ->
9191

9292
let s = match expr.node {
9393
// expression is a literal
94-
ast::ExprLit(lit) => match lit.node {
94+
ast::ExprLit(ref lit) => match lit.node {
9595
// string literal
9696
ast::LitStr(ref s, _) => {
9797
if s.get().char_len() != 4 {

src/librustc/driver/driver.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -346,8 +346,7 @@ pub fn phase_3_run_analysis_passes(sess: Session,
346346
time(time_passes, "effect checking", (), |_|
347347
middle::effect::check_crate(&ty_cx, krate));
348348

349-
let middle::moves::MoveMaps {moves_map, moved_variables_set,
350-
capture_map} =
349+
let middle::moves::MoveMaps {moves_map, capture_map} =
351350
time(time_passes, "compute moves", (), |_|
352351
middle::moves::compute_moves(&ty_cx, krate));
353352

@@ -357,14 +356,11 @@ pub fn phase_3_run_analysis_passes(sess: Session,
357356
time(time_passes, "liveness checking", (), |_|
358357
middle::liveness::check_crate(&ty_cx, &capture_map, krate));
359358

360-
let root_map =
361-
time(time_passes, "borrow checking", (), |_|
362-
middle::borrowck::check_crate(&ty_cx, &moves_map,
363-
&moved_variables_set,
364-
&capture_map, krate));
359+
time(time_passes, "borrow checking", (), |_|
360+
middle::borrowck::check_crate(&ty_cx, &moves_map,
361+
&capture_map, krate));
365362

366363
drop(moves_map);
367-
drop(moved_variables_set);
368364

369365
time(time_passes, "kind checking", (), |_|
370366
kind::check_crate(&ty_cx, krate));
@@ -389,7 +385,6 @@ pub fn phase_3_run_analysis_passes(sess: Session,
389385
exported_items: exported_items,
390386
public_items: public_items,
391387
maps: astencode::Maps {
392-
root_map: root_map,
393388
capture_map: RefCell::new(capture_map)
394389
},
395390
reachable: reachable_map

src/librustc/middle/astencode.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ use writer = serialize::ebml::writer;
5454

5555
// Auxiliary maps of things to be encoded
5656
pub struct Maps {
57-
pub root_map: middle::borrowck::root_map,
5857
pub capture_map: RefCell<middle::moves::CaptureMap>,
5958
}
6059

src/librustc/middle/borrowck/gather_loans/lifetime.rs

Lines changed: 2 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,6 @@ struct GuaranteeLifetimeContext<'a> {
6565
}
6666

6767
impl<'a> GuaranteeLifetimeContext<'a> {
68-
fn tcx(&self) -> &'a ty::ctxt {
69-
self.bccx.tcx
70-
}
7168

7269
fn check(&self, cmt: &mc::cmt, discr_scope: Option<ast::NodeId>) -> R {
7370
//! Main routine. Walks down `cmt` until we find the "guarantor".
@@ -90,29 +87,10 @@ impl<'a> GuaranteeLifetimeContext<'a> {
9087
Ok(())
9188
}
9289

93-
mc::cat_deref(ref base, derefs, mc::GcPtr) => {
94-
let base_scope = self.scope(base);
95-
96-
// L-Deref-Managed-Imm-User-Root
97-
let omit_root =
98-
self.bccx.is_subregion_of(self.loan_region, base_scope) &&
99-
self.is_rvalue_or_immutable(base) &&
100-
!self.is_moved(base);
101-
102-
if !omit_root {
103-
// L-Deref-Managed-Imm-Compiler-Root
104-
// L-Deref-Managed-Mut-Compiler-Root
105-
self.check_root(cmt, base, derefs, discr_scope)
106-
} else {
107-
debug!("omitting root, base={}, base_scope={:?}",
108-
base.repr(self.tcx()), base_scope);
109-
Ok(())
110-
}
111-
}
112-
11390
mc::cat_downcast(ref base) |
11491
mc::cat_deref(ref base, _, mc::OwnedPtr) | // L-Deref-Send
115-
mc::cat_interior(ref base, _) => { // L-Field
92+
mc::cat_interior(ref base, _) | // L-Field
93+
mc::cat_deref(ref base, _, mc::GcPtr) => {
11694
self.check(base, discr_scope)
11795
}
11896

@@ -174,74 +152,6 @@ impl<'a> GuaranteeLifetimeContext<'a> {
174152
}
175153
}
176154

177-
fn is_rvalue_or_immutable(&self,
178-
cmt: &mc::cmt) -> bool {
179-
//! We can omit the root on an `@T` value if the location
180-
//! that holds the box is either (1) an rvalue, in which case
181-
//! it is in a non-user-accessible temporary, or (2) an immutable
182-
//! lvalue.
183-
184-
cmt.mutbl.is_immutable() || match cmt.guarantor().cat {
185-
mc::cat_rvalue(..) => true,
186-
_ => false
187-
}
188-
}
189-
190-
fn check_root(&self,
191-
cmt_deref: &mc::cmt,
192-
cmt_base: &mc::cmt,
193-
derefs: uint,
194-
discr_scope: Option<ast::NodeId>) -> R {
195-
debug!("check_root(cmt_deref={}, cmt_base={}, derefs={:?}, \
196-
discr_scope={:?})",
197-
cmt_deref.repr(self.tcx()),
198-
cmt_base.repr(self.tcx()),
199-
derefs,
200-
discr_scope);
201-
202-
// Make sure that the loan does not exceed the maximum time
203-
// that we can root the value, dynamically.
204-
let root_region = ty::ReScope(self.root_scope_id);
205-
if !self.bccx.is_subregion_of(self.loan_region, root_region) {
206-
return Err(self.report_error(
207-
err_out_of_root_scope(root_region, self.loan_region)));
208-
}
209-
210-
// Extract the scope id that indicates how long the rooting is required
211-
let root_scope = match self.loan_region {
212-
ty::ReScope(id) => id,
213-
_ => {
214-
// the check above should fail for anything is not ReScope
215-
self.bccx.tcx.sess.span_bug(
216-
cmt_base.span,
217-
format!("cannot issue root for scope region: {:?}",
218-
self.loan_region));
219-
}
220-
};
221-
222-
// If inside of a match arm, expand the rooting to the entire
223-
// match. See the detailed discussion in `check()` above.
224-
let root_scope = match discr_scope {
225-
None => root_scope,
226-
Some(id) => {
227-
if self.bccx.is_subscope_of(root_scope, id) {
228-
id
229-
} else {
230-
root_scope
231-
}
232-
}
233-
};
234-
235-
// Add a record of what is required
236-
let rm_key = root_map_key {id: cmt_deref.id, derefs: derefs};
237-
let root_info = RootInfo {scope: root_scope};
238-
239-
self.bccx.root_map.borrow_mut().insert(rm_key, root_info);
240-
241-
debug!("root_key: {:?} root_info: {:?}", rm_key, root_info);
242-
Ok(())
243-
}
244-
245155
fn check_scope(&self, max_scope: ty::Region) -> R {
246156
//! Reports an error if `loan_region` is larger than `valid_scope`
247157
@@ -252,32 +162,6 @@ impl<'a> GuaranteeLifetimeContext<'a> {
252162
}
253163
}
254164

255-
fn is_moved(&self, cmt: &mc::cmt) -> bool {
256-
//! True if `cmt` is something that is potentially moved
257-
//! out of the current stack frame.
258-
259-
match cmt.guarantor().cat {
260-
mc::cat_local(id) |
261-
mc::cat_arg(id) => {
262-
self.bccx.moved_variables_set.contains(&id)
263-
}
264-
mc::cat_rvalue(..) |
265-
mc::cat_static_item |
266-
mc::cat_copied_upvar(..) |
267-
mc::cat_deref(..) |
268-
mc::cat_upvar(..) => {
269-
false
270-
}
271-
ref r @ mc::cat_downcast(..) |
272-
ref r @ mc::cat_interior(..) |
273-
ref r @ mc::cat_discr(..) => {
274-
self.tcx().sess.span_bug(
275-
cmt.span,
276-
format!("illegal guarantor category: {:?}", r));
277-
}
278-
}
279-
}
280-
281165
fn scope(&self, cmt: &mc::cmt) -> ty::Region {
282166
//! Returns the maximal region scope for the which the
283167
//! lvalue `cmt` is guaranteed to be valid without any

src/librustc/middle/borrowck/gather_loans/restrictions.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,18 @@ impl<'a> RestrictionsContext<'a> {
101101
self.extend(result, cmt.mutbl, LpInterior(i), restrictions)
102102
}
103103

104-
mc::cat_deref(cmt_base, _, pk @ mc::OwnedPtr) => {
104+
mc::cat_deref(cmt_base, _, pk @ mc::OwnedPtr) |
105+
mc::cat_deref(cmt_base, _, pk @ mc::GcPtr) => {
105106
// R-Deref-Send-Pointer
106107
//
107108
// When we borrow the interior of an owned pointer, we
108109
// cannot permit the base to be mutated, because that
109110
// would cause the unique pointer to be freed.
111+
//
112+
// For a managed pointer, the rules are basically the
113+
// same, because this could be the last ref.
114+
// Eventually we should make these non-special and
115+
// just rely on Deref<T> implementation.
110116
let result = self.restrict(
111117
cmt_base,
112118
restrictions | RESTR_MUTATE);
@@ -134,11 +140,6 @@ impl<'a> RestrictionsContext<'a> {
134140
Safe
135141
}
136142

137-
mc::cat_deref(_, _, mc::GcPtr) => {
138-
// R-Deref-Imm-Managed
139-
Safe
140-
}
141-
142143
mc::cat_deref(cmt_base, _, pk @ mc::BorrowedPtr(ty::MutBorrow, lt)) => {
143144
// R-Deref-Mut-Borrowed
144145
if !self.bccx.is_subregion_of(self.loan_region, lt) {

0 commit comments

Comments
 (0)