Skip to content

Commit 8b6f6a3

Browse files
committed
---
yaml --- r: 235247 b: refs/heads/stable c: 04dfdd7 h: refs/heads/master i: 235245: 3656023 235243: 3085434 235239: c5da101 235231: 169a667 v: v3
1 parent 6ec5586 commit 8b6f6a3

File tree

17 files changed

+72
-298
lines changed

17 files changed

+72
-298
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ refs/heads/tmp: afae2ff723393b3ab4ccffef6ac7c6d1809e2da0
2929
refs/tags/1.0.0-alpha.2: 4c705f6bc559886632d3871b04f58aab093bfa2f
3030
refs/tags/homu-tmp: f859507de8c410b648d934d8f5ec1c52daac971d
3131
refs/tags/1.0.0-beta: 8cbb92b53468ee2b0c2d3eeb8567005953d40828
32-
refs/heads/stable: fd8e175c4e39537b16beb40c704a17fcf9796852
32+
refs/heads/stable: 04dfdd7403b8dd3f93e26af9a32d34b786e33324
3333
refs/tags/1.0.0: 55bd4f8ff2b323f317ae89e254ce87162d52a375
3434
refs/tags/1.1.0: bc3c16f09287e5545c1d3f76b7abd54f2eca868b
3535
refs/tags/1.2.0: f557861f822c34f07270347b94b5280de20a597e

branches/stable/src/doc/trpl/concurrency.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,11 @@ system is up to the task, and gives you powerful ways to reason about
1010
concurrent code at compile time.
1111

1212
Before we talk about the concurrency features that come with Rust, it's important
13-
to understand something: Rust is low-level enough that the vast majority of
14-
this is provided by the standard library, not by the language. This means that
15-
if you don't like some aspect of the way Rust handles concurrency, you can
16-
implement an alternative way of doing things.
17-
[mio](https://github.com/carllerche/mio) is a real-world example of this
18-
principle in action.
13+
to understand something: Rust is low-level enough that all of this is provided
14+
by the standard library, not by the language. This means that if you don't like
15+
some aspect of the way Rust handles concurrency, you can implement an alternative
16+
way of doing things. [mio](https://github.com/carllerche/mio) is a real-world
17+
example of this principle in action.
1918

2019
## Background: `Send` and `Sync`
2120

branches/stable/src/doc/trpl/lifetimes.md

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,6 @@ the lifetime `'a` has snuck in between the `&` and the `mut i32`. We read `&mut
101101
i32` as ‘a mutable reference to an i32’ and `&'a mut i32` as ‘a mutable
102102
reference to an `i32` with the lifetime `'a`’.
103103

104-
# In `struct`s
105-
106104
You’ll also need explicit lifetimes when working with [`struct`][structs]s:
107105

108106
```rust
@@ -139,33 +137,6 @@ x: &'a i32,
139137
uses it. So why do we need a lifetime here? We need to ensure that any reference
140138
to a `Foo` cannot outlive the reference to an `i32` it contains.
141139

142-
## `impl` blocks
143-
144-
Let’s implement a method on `Foo`:
145-
146-
```rust
147-
struct Foo<'a> {
148-
x: &'a i32,
149-
}
150-
151-
impl<'a> Foo<'a> {
152-
fn x(&self) -> &'a i32 { self.x }
153-
}
154-
155-
fn main() {
156-
let y = &5; // this is the same as `let _y = 5; let y = &_y;`
157-
let f = Foo { x: y };
158-
159-
println!("x is: {}", f.x());
160-
}
161-
```
162-
163-
As you can see, we need to declare a lifetime for `Foo` in the `impl` line. We repeat
164-
`'a` twice, just like on functions: `impl<'a>` defines a lifetime `'a`, and `Foo<'a>`
165-
uses it.
166-
167-
## Multiple lifetimes
168-
169140
If you have multiple references, you can use the same lifetime multiple times:
170141

171142
```rust

branches/stable/src/doc/trpl/unsafe.md

Lines changed: 15 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ this, Rust has a keyword, `unsafe`. Code using `unsafe` has less restrictions
88
than normal code does.
99

1010
Let’s go over the syntax, and then we’ll talk semantics. `unsafe` is used in
11-
four contexts. The first one is to mark a function as unsafe:
11+
two contexts. The first one is to mark a function as unsafe:
1212

1313
```rust
1414
unsafe fn danger_will_robinson() {
@@ -27,40 +27,15 @@ unsafe {
2727
}
2828
```
2929

30-
The third is for unsafe traits:
31-
32-
```rust
33-
unsafe trait Scary { }
34-
```
35-
36-
And the fourth is for `impl`ementing one of those traits:
37-
38-
```rust
39-
# unsafe trait Scary { }
40-
unsafe impl Scary for i32 {}
41-
```
42-
4330
It’s important to be able to explicitly delineate code that may have bugs that
4431
cause big problems. If a Rust program segfaults, you can be sure it’s somewhere
4532
in the sections marked `unsafe`.
4633

4734
# What does ‘safe’ mean?
4835

49-
Safe, in the context of Rust, means ‘doesn’t do anything unsafe’. It’s also
50-
important to know that there are certain behaviors that are probably not
51-
desirable in your code, but are expressly _not_ unsafe:
36+
Safe, in the context of Rust, means “doesn’t do anything unsafe.” Easy!
5237

53-
* Deadlocks
54-
* Leaks of memory or other resources
55-
* Exiting without calling destructors
56-
* Integer overflow
57-
58-
Rust cannot prevent all kinds of software problems. Buggy code can and will be
59-
written in Rust. These things aren’t great, but they don’t qualify as `unsafe`
60-
specifically.
61-
62-
In addition, the following are all undefined behaviors in Rust, and must be
63-
avoided, even when writing `unsafe` code:
38+
Okay, let’s try again: what is not safe to do? Here’s a list:
6439

6540
* Data races
6641
* Dereferencing a null/dangling raw pointer
@@ -89,6 +64,18 @@ avoided, even when writing `unsafe` code:
8964
[undef]: http://llvm.org/docs/LangRef.html#undefined-values
9065
[aliasing]: http://llvm.org/docs/LangRef.html#pointer-aliasing-rules
9166

67+
Whew! That’s a bunch of stuff. It’s also important to notice all kinds of
68+
behaviors that are certainly bad, but are expressly _not_ unsafe:
69+
70+
* Deadlocks
71+
* Leaks of memory or other resources
72+
* Exiting without calling destructors
73+
* Integer overflow
74+
75+
Rust cannot prevent all kinds of software problems. Buggy code can and will be
76+
written in Rust. These things aren’t great, but they don’t qualify as `unsafe`
77+
specifically.
78+
9279
# Unsafe Superpowers
9380

9481
In both unsafe functions and unsafe blocks, Rust will let you do three things

branches/stable/src/librustc/diagnostics.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1237,6 +1237,5 @@ register_diagnostics! {
12371237
E0314, // closure outlives stack frame
12381238
E0315, // cannot invoke closure outside of its lifetime
12391239
E0316, // nested quantification of lifetimes
1240-
E0370, // discriminant overflow
1241-
E0400 // overloaded derefs are not allowed in constants
1240+
E0370 // discriminant overflow
12421241
}

branches/stable/src/librustc/middle/cfg/construct.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
332332
}
333333

334334
ast::ExprIndex(ref l, ref r) |
335-
ast::ExprBinary(_, ref l, ref r) if self.tcx.is_method_call(expr.id) => {
335+
ast::ExprBinary(_, ref l, ref r) if self.is_method_call(expr) => {
336336
self.call(expr, pred, &**l, Some(&**r).into_iter())
337337
}
338338

@@ -342,7 +342,7 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
342342
self.straightline(expr, pred, fields)
343343
}
344344

345-
ast::ExprUnary(_, ref e) if self.tcx.is_method_call(expr.id) => {
345+
ast::ExprUnary(_, ref e) if self.is_method_call(expr) => {
346346
self.call(expr, pred, &**e, None::<ast::Expr>.iter())
347347
}
348348

@@ -631,4 +631,9 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
631631
}
632632
}
633633
}
634+
635+
fn is_method_call(&self, expr: &ast::Expr) -> bool {
636+
let method_call = ty::MethodCall::expr(expr.id);
637+
self.tcx.tables.borrow().method_map.contains_key(&method_call)
638+
}
634639
}

branches/stable/src/librustc/middle/check_const.rs

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,6 @@ impl<'a, 'tcx, 'v> Visitor<'v> for CheckCrateVisitor<'a, 'tcx> {
405405

406406
let node_ty = self.tcx.node_id_to_type(ex.id);
407407
check_expr(self, ex, node_ty);
408-
check_adjustments(self, ex);
409408

410409
// Special-case some expressions to avoid certain flags bubbling up.
411410
match ex.node {
@@ -778,25 +777,6 @@ fn check_expr<'a, 'tcx>(v: &mut CheckCrateVisitor<'a, 'tcx>,
778777
}
779778
}
780779

781-
/// Check the adjustments of an expression
782-
fn check_adjustments<'a, 'tcx>(v: &mut CheckCrateVisitor<'a, 'tcx>, e: &ast::Expr) {
783-
match v.tcx.tables.borrow().adjustments.get(&e.id) {
784-
None | Some(&ty::AdjustReifyFnPointer) | Some(&ty::AdjustUnsafeFnPointer) => {}
785-
Some(&ty::AdjustDerefRef(ty::AutoDerefRef { autoderefs, .. })) => {
786-
if (0..autoderefs as u32).any(|autoderef| {
787-
v.tcx.is_overloaded_autoderef(e.id, autoderef)
788-
}) {
789-
v.add_qualif(ConstQualif::NOT_CONST);
790-
if v.mode != Mode::Var {
791-
span_err!(v.tcx.sess, e.span, E0400,
792-
"user-defined dereference operators are not allowed in {}s",
793-
v.msg());
794-
}
795-
}
796-
}
797-
}
798-
}
799-
800780
pub fn check_crate(tcx: &ty::ctxt) {
801781
visit::walk_crate(&mut CheckCrateVisitor {
802782
tcx: tcx,

branches/stable/src/librustc/middle/stability.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -289,19 +289,15 @@ impl<'a, 'tcx> Checker<'a, 'tcx> {
289289
if !cross_crate { return }
290290

291291
match *stab {
292-
Some(&Stability { level: attr::Unstable, ref feature, ref reason, issue, .. }) => {
292+
Some(&Stability { level: attr::Unstable, ref feature, ref reason, .. }) => {
293293
self.used_features.insert(feature.clone(), attr::Unstable);
294294

295295
if !self.active_features.contains(feature) {
296-
let mut msg = match *reason {
296+
let msg = match *reason {
297297
Some(ref r) => format!("use of unstable library feature '{}': {}",
298298
&feature, &r),
299299
None => format!("use of unstable library feature '{}'", &feature)
300300
};
301-
if let Some(n) = issue {
302-
use std::fmt::Write;
303-
write!(&mut msg, " (see issue #{})", n).unwrap();
304-
}
305301

306302
emit_feature_err(&self.tcx.sess.parse_sess.span_diagnostic,
307303
&feature, span, &msg);

branches/stable/src/librustc/middle/ty.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6631,11 +6631,6 @@ impl<'tcx> ctxt<'tcx> {
66316631
self.tables.borrow().method_map.contains_key(&MethodCall::expr(expr_id))
66326632
}
66336633

6634-
pub fn is_overloaded_autoderef(&self, expr_id: ast::NodeId, autoderefs: u32) -> bool {
6635-
self.tables.borrow().method_map.contains_key(&MethodCall::autoderef(expr_id,
6636-
autoderefs))
6637-
}
6638-
66396634
pub fn upvar_capture(&self, upvar_id: ty::UpvarId) -> Option<ty::UpvarCapture> {
66406635
Some(self.tables.borrow().upvar_capture_map.get(&upvar_id).unwrap().clone())
66416636
}

branches/stable/src/librustc_driver/lib.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,10 @@ pub fn stage_str() -> Option<&'static str> {
487487
Some("stage0")
488488
} else if cfg!(stage1) {
489489
Some("stage1")
490+
} else if cfg!(stage2) {
491+
Some("stage2")
492+
} else if cfg!(stage3) {
493+
Some("stage3")
490494
} else {
491495
None
492496
}
@@ -504,9 +508,7 @@ pub fn version(binary: &str, matches: &getopts::Matches) {
504508
println!("commit-date: {}", unw(commit_date_str()));
505509
println!("host: {}", config::host_triple());
506510
println!("release: {}", unw(release_str()));
507-
if let Some(stage) = stage_str() {
508-
println!("stage: {}", stage);
509-
}
511+
println!("stage: {}", unw(stage_str()));
510512
}
511513
}
512514

branches/stable/src/librustc_trans/trans/expr.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,8 @@ fn apply_adjustments<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
367367
match datum.ty.sty {
368368
// Don't skip a conversion from Box<T> to &T, etc.
369369
ty::TyRef(..) => {
370-
if bcx.tcx().is_overloaded_autoderef(expr.id, 0) {
370+
let method_call = MethodCall::autoderef(expr.id, 0);
371+
if bcx.tcx().tables.borrow().method_map.contains_key(&method_call) {
371372
// Don't skip an overloaded deref.
372373
0
373374
} else {
@@ -1611,7 +1612,9 @@ fn trans_unary<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
16111612
// The only overloaded operator that is translated to a datum
16121613
// is an overloaded deref, since it is always yields a `&T`.
16131614
// Otherwise, we should be in the RvalueDpsExpr path.
1614-
assert!(op == ast::UnDeref || !ccx.tcx().is_method_call(expr.id));
1615+
assert!(
1616+
op == ast::UnDeref ||
1617+
!ccx.tcx().tables.borrow().method_map.contains_key(&method_call));
16151618

16161619
let un_ty = expr_ty(bcx, expr);
16171620

@@ -1904,7 +1907,7 @@ fn trans_binary<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
19041907
let ccx = bcx.ccx();
19051908

19061909
// if overloaded, would be RvalueDpsExpr
1907-
assert!(!ccx.tcx().is_method_call(expr.id));
1910+
assert!(!ccx.tcx().tables.borrow().method_map.contains_key(&MethodCall::expr(expr.id)));
19081911

19091912
match op.node {
19101913
ast::BiAnd => {
@@ -2138,7 +2141,7 @@ fn trans_assign_op<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
21382141
debug!("trans_assign_op(expr={:?})", expr);
21392142

21402143
// User-defined operator methods cannot be used with `+=` etc right now
2141-
assert!(!bcx.tcx().is_method_call(expr.id));
2144+
assert!(!bcx.tcx().tables.borrow().method_map.contains_key(&MethodCall::expr(expr.id)));
21422145

21432146
// Evaluate LHS (destination), which should be an lvalue
21442147
let dst_datum = unpack_datum!(bcx, trans_to_lvalue(bcx, dst, "assign_op"));
@@ -2603,7 +2606,7 @@ enum ExprKind {
26032606
}
26042607

26052608
fn expr_kind(tcx: &ty::ctxt, expr: &ast::Expr) -> ExprKind {
2606-
if tcx.is_method_call(expr.id) {
2609+
if tcx.tables.borrow().method_map.contains_key(&MethodCall::expr(expr.id)) {
26072610
// Overloaded operations are generally calls, and hence they are
26082611
// generated via DPS, but there are a few exceptions:
26092612
return match expr.node {

branches/stable/src/librustc_typeck/check/regionck.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,8 @@ fn visit_expr(rcx: &mut Rcx, expr: &ast::Expr) {
516516
type_must_outlive(rcx, infer::ExprTypeIsNotInScope(expr_ty, expr.span),
517517
expr_ty, ty::ReScope(CodeExtent::from_node_id(expr.id)));
518518

519-
let has_method_map = rcx.fcx.infcx().is_method_call(expr.id);
519+
let method_call = MethodCall::expr(expr.id);
520+
let has_method_map = rcx.fcx.inh.tables.borrow().method_map.contains_key(&method_call);
520521

521522
// Check any autoderefs or autorefs that appear.
522523
let adjustment = rcx.fcx.inh.tables.borrow().adjustments.get(&expr.id).map(|a| a.clone());

0 commit comments

Comments
 (0)