Skip to content

Commit dfbef0d

Browse files
committed
---
yaml --- r: 195815 b: refs/heads/auto c: c054ae2 h: refs/heads/master i: 195813: 109926b 195811: bb6079e 195807: 43298a9 v: v3
1 parent f50856e commit dfbef0d

File tree

402 files changed

+6582
-7896
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

402 files changed

+6582
-7896
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503
1010
refs/tags/release-0.3.1: 495bae036dfe5ec6ceafd3312b4dca48741e845b
1111
refs/tags/release-0.4: e828ea2080499553b97dfe33b3f4d472b4562ad7
1212
refs/tags/release-0.5: 7e3bcfbf21278251ee936ad53e92e9b719702d73
13-
refs/heads/auto: ee3dffac4939c24d8c6412dc12dc1bd388494f40
13+
refs/heads/auto: c054ae2fa498ee32f5f26cba4cd3e442df4c59e9
1414
refs/heads/servo: af82457af293e2a842ba6b7759b70288da276167
1515
refs/tags/release-0.6: b4ebcfa1812664df5e142f0134a5faea3918544c
1616
refs/tags/0.1: b19db808c2793fe2976759b85a355c3ad8c8b336

branches/auto/AUTHORS.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,7 @@ Peter Schuller <[email protected]>
606606
Peter Williams <[email protected]>
607607
Peter Zotov <[email protected]>
608608
Petter Remen <[email protected]>
609-
Phil Dawes <[email protected]>
609+
Phil Dawes <[email protected]>
610610
Phil Ruffwind <[email protected]>
611611
Philip Munksgaard <[email protected]>
612612
Philipp Brüschweiler <[email protected]>

branches/auto/configure

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ case $CFG_OSTYPE in
404404
CFG_OSTYPE=pc-windows-gnu
405405
;;
406406

407-
# Thad's Cygwin identifers below
407+
# Thad's Cygwin identifiers below
408408

409409
# Vista 32 bit
410410
CYGWIN_NT-6.0)
@@ -526,7 +526,8 @@ VAL_OPTIONS=""
526526
opt valgrind 0 "run tests with valgrind (memcheck by default)"
527527
opt helgrind 0 "run tests with helgrind instead of memcheck"
528528
opt valgrind-rpass 1 "run rpass-valgrind tests with valgrind"
529-
opt docs 1 "build documentation"
529+
opt docs 1 "build standard library documentation"
530+
opt compiler-docs 0 "build compiler documentation"
530531
opt optimize 1 "build optimized rust code"
531532
opt optimize-cxx 1 "build optimized C++ code"
532533
opt optimize-llvm 1 "build optimized LLVM"

branches/auto/mk/crates.mk

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -122,17 +122,34 @@ ONLY_RLIB_rustc_bitflags := 1
122122
# You should not need to edit below this line
123123
################################################################################
124124

125+
# On channels where the only usable crate is std, only build documentation for
126+
# std. This keeps distributions small and doesn't clutter up the API docs with
127+
# confusing internal details from the crates behind the facade.
128+
#
129+
# (Disabled while cmr figures out how to change rustdoc to make reexports work
130+
# slightly nicer. Otherwise, all cross-crate links to Vec will go to
131+
# libcollections, breaking them, and [src] links for anything reexported will
132+
# not work.)
133+
134+
#ifeq ($(CFG_RELEASE_CHANNEL),stable)
135+
#DOC_CRATES := std
136+
#else
137+
#ifeq ($(CFG_RELEASE_CHANNEL),beta)
138+
#DOC_CRATES := std
139+
#else
125140
DOC_CRATES := $(filter-out rustc, \
126-
$(filter-out rustc_trans, \
127-
$(filter-out rustc_typeck, \
128-
$(filter-out rustc_borrowck, \
129-
$(filter-out rustc_resolve, \
130-
$(filter-out rustc_driver, \
131-
$(filter-out rustc_privacy, \
132-
$(filter-out rustc_lint, \
133-
$(filter-out log, \
134-
$(filter-out getopts, \
135-
$(filter-out syntax, $(CRATES))))))))))))
141+
$(filter-out rustc_trans, \
142+
$(filter-out rustc_typeck, \
143+
$(filter-out rustc_borrowck, \
144+
$(filter-out rustc_resolve, \
145+
$(filter-out rustc_driver, \
146+
$(filter-out rustc_privacy, \
147+
$(filter-out rustc_lint, \
148+
$(filter-out log, \
149+
$(filter-out getopts, \
150+
$(filter-out syntax, $(CRATES))))))))))))
151+
#endif
152+
#endif
136153
COMPILER_DOC_CRATES := rustc rustc_trans rustc_borrowck rustc_resolve \
137154
rustc_typeck rustc_driver syntax rustc_privacy \
138155
rustc_lint

branches/auto/mk/docs.mk

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,10 @@ doc/$(1)/index.html: $$(LIB_DOC_DEP_$(1)) doc/$(1)/
259259
endef
260260

261261
$(foreach crate,$(DOC_CRATES),$(eval $(call DEF_LIB_DOC,$(crate),DOC_TARGETS)))
262-
$(foreach crate,$(COMPILER_DOC_CRATES),$(eval $(call DEF_LIB_DOC,$(crate),COMPILER_DOC_TARGETS)))
262+
263+
ifdef CFG_COMPILER_DOCS
264+
$(foreach crate,$(COMPILER_DOC_CRATES),$(eval $(call DEF_LIB_DOC,$(crate),COMPILER_DOC_TARGETS)))
265+
endif
263266

264267
ifdef CFG_DISABLE_DOCS
265268
$(info cfg: disabling doc build (CFG_DISABLE_DOCS))

branches/auto/mk/platform.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ define CFG_MAKE_TOOLCHAIN
179179

180180
ifeq ($$(findstring $(HOST_$(1)),arm aarch64 mips mipsel powerpc),)
181181

182-
# On Bitrig, we need the relocation model to be PIC for everthing
182+
# On Bitrig, we need the relocation model to be PIC for everything
183183
ifeq (,$(filter $(OSTYPE_$(1)),bitrig))
184184
LLVM_MC_RELOCATION_MODEL="pic"
185185
else

branches/auto/mk/target.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ endef
132132
# on $$(TSREQ$(1)_T_$(2)_H_$(3)), to ensure that no products will be
133133
# put into the target area until after the get-snapshot.py script has
134134
# had its chance to clean it out; otherwise the other products will be
135-
# inadvertantly included in the clean out.
135+
# inadvertently included in the clean out.
136136
SNAPSHOT_RUSTC_POST_CLEANUP=$(HBIN0_H_$(CFG_BUILD))/rustc$(X_$(CFG_BUILD))
137137

138138
define TARGET_HOST_RULES

branches/auto/mk/tests.mk

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ $(foreach file,$(wildcard $(S)src/doc/trpl/*.md), \
166166
######################################################################
167167

168168
# The main testing target. Tests lots of stuff.
169-
check: cleantmptestlogs cleantestlibs all check-stage2 tidy
169+
check: check-sanitycheck cleantmptestlogs cleantestlibs all check-stage2 tidy
170170
$(Q)$(CFG_PYTHON) $(S)src/etc/check-summary.py tmp/*.log
171171

172172
# As above but don't bother running tidy.
@@ -193,6 +193,11 @@ check-docs: cleantestlibs cleantmptestlogs check-stage2-docs
193193
# Not run as part of the normal test suite, but tested by bors on checkin.
194194
check-secondary: check-build-compiletest check-build-lexer-verifier check-lexer check-pretty
195195

196+
.PHONY: check-sanitycheck
197+
198+
check-sanitycheck:
199+
$(Q)$(CFG_PYTHON) $(S)src/etc/check-sanitycheck.py
200+
196201
# check + check-secondary.
197202
#
198203
# Issue #17883: build check-secondary first so hidden dependencies in

branches/auto/src/compiletest/compiletest.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
#![feature(std_misc)]
1919
#![feature(test)]
2020
#![feature(path_ext)]
21-
#![feature(convert)]
2221
#![feature(str_char)]
2322

2423
#![deny(warnings)]

branches/auto/src/doc/reference.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -977,17 +977,13 @@ An example of `use` declarations:
977977

978978
```
979979
# #![feature(core)]
980-
use std::iter::range_step;
981980
use std::option::Option::{Some, None};
982981
use std::collections::hash_map::{self, HashMap};
983982
984983
fn foo<T>(_: T){}
985984
fn bar(map1: HashMap<String, usize>, map2: hash_map::HashMap<String, usize>){}
986985
987986
fn main() {
988-
// Equivalent to 'std::iter::range_step(0, 10, 2);'
989-
range_step(0, 10, 2);
990-
991987
// Equivalent to 'foo(vec![std::option::Option::Some(1.0f64),
992988
// std::option::Option::None]);'
993989
foo(vec![Some(1.0f64), None]);
@@ -1188,12 +1184,15 @@ the guarantee that these issues are never caused by safe code.
11881184

11891185
* Data races
11901186
* Dereferencing a null/dangling raw pointer
1191-
* Mutating an immutable value/reference without `UnsafeCell`
11921187
* Reads of [undef](http://llvm.org/docs/LangRef.html#undefined-values)
11931188
(uninitialized) memory
11941189
* Breaking the [pointer aliasing
11951190
rules](http://llvm.org/docs/LangRef.html#pointer-aliasing-rules)
11961191
with raw pointers (a subset of the rules used by C)
1192+
* `&mut` and `&` follow LLVM’s scoped [noalias] model, except if the `&T`
1193+
contains an `UnsafeCell<U>`. Unsafe code must not violate these aliasing
1194+
guarantees.
1195+
* Mutating an immutable value/reference without `UnsafeCell<U>`
11971196
* Invoking undefined behavior via compiler intrinsics:
11981197
* Indexing outside of the bounds of an object with `std::ptr::offset`
11991198
(`offset` intrinsic), with
@@ -1210,6 +1209,8 @@ the guarantee that these issues are never caused by safe code.
12101209
code. Rust's failure system is not compatible with exception handling in
12111210
other languages. Unwinding must be caught and handled at FFI boundaries.
12121211

1212+
[noalias]: http://llvm.org/docs/LangRef.html#noalias
1213+
12131214
##### Behaviour not considered unsafe
12141215

12151216
This is a list of behaviour not considered *unsafe* in Rust terms, but that may

branches/auto/src/doc/trpl/SUMMARY.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
* [Looping](looping.md)
1414
* [Strings](strings.md)
1515
* [Arrays, Vectors, and Slices](arrays-vectors-and-slices.md)
16-
* [Standard Input](standard-input.md)
1716
* [Intermediate Rust](intermediate.md)
1817
* [Crates and Modules](crates-and-modules.md)
1918
* [Testing](testing.md)
@@ -43,5 +42,6 @@
4342
* [Intrinsics](intrinsics.md)
4443
* [Lang items](lang-items.md)
4544
* [Link args](link-args.md)
45+
* [Benchmark Tests](benchmark-tests.md)
4646
* [Conclusion](conclusion.md)
4747
* [Glossary](glossary.md)

branches/auto/src/doc/trpl/arrays-vectors-and-slices.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,5 +99,4 @@ You can also take a slice of a vector, `String`, or `&str`, because they are
9999
backed by arrays. Slices have type `&[T]`, which we'll talk about when we cover
100100
generics.
101101

102-
We have now learned all of the most basic Rust concepts. Next, we learn how to
103-
get input from the keyboard.
102+
We have now learned all of the most basic Rust concepts.

branches/auto/src/doc/trpl/associated-types.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ let obj = Box::new(graph) as Box<Graph>;
170170
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
171171
```
172172

173-
We can’t create a trait object like this, becuase we don’t know the associated
173+
We can’t create a trait object like this, because we don’t know the associated
174174
types. Instead, we can write this:
175175

176176
```rust
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
% Benchmark tests
2+
3+
Rust supports benchmark tests, which can test the performance of your
4+
code. Let's make our `src/lib.rs` look like this (comments elided):
5+
6+
```{rust,ignore}
7+
#![feature(test)]
8+
9+
extern crate test;
10+
11+
pub fn add_two(a: i32) -> i32 {
12+
a + 2
13+
}
14+
15+
#[cfg(test)]
16+
mod tests {
17+
use super::*;
18+
use test::Bencher;
19+
20+
#[test]
21+
fn it_works() {
22+
assert_eq!(4, add_two(2));
23+
}
24+
25+
#[bench]
26+
fn bench_add_two(b: &mut Bencher) {
27+
b.iter(|| add_two(2));
28+
}
29+
}
30+
```
31+
32+
Note the `test` feature gate, which enables this unstable feature.
33+
34+
We've imported the `test` crate, which contains our benchmarking support.
35+
We have a new function as well, with the `bench` attribute. Unlike regular
36+
tests, which take no arguments, benchmark tests take a `&mut Bencher`. This
37+
`Bencher` provides an `iter` method, which takes a closure. This closure
38+
contains the code we'd like to benchmark.
39+
40+
We can run benchmark tests with `cargo bench`:
41+
42+
```bash
43+
$ cargo bench
44+
Compiling adder v0.0.1 (file:///home/steve/tmp/adder)
45+
Running target/release/adder-91b3e234d4ed382a
46+
47+
running 2 tests
48+
test tests::it_works ... ignored
49+
test tests::bench_add_two ... bench: 1 ns/iter (+/- 0)
50+
51+
test result: ok. 0 passed; 0 failed; 1 ignored; 1 measured
52+
```
53+
54+
Our non-benchmark test was ignored. You may have noticed that `cargo bench`
55+
takes a bit longer than `cargo test`. This is because Rust runs our benchmark
56+
a number of times, and then takes the average. Because we're doing so little
57+
work in this example, we have a `1 ns/iter (+/- 0)`, but this would show
58+
the variance if there was one.
59+
60+
Advice on writing benchmarks:
61+
62+
63+
* Move setup code outside the `iter` loop; only put the part you want to measure inside
64+
* Make the code do "the same thing" on each iteration; do not accumulate or change state
65+
* Make the outer function idempotent too; the benchmark runner is likely to run
66+
it many times
67+
* Make the inner `iter` loop short and fast so benchmark runs are fast and the
68+
calibrator can adjust the run-length at fine resolution
69+
* Make the code in the `iter` loop do something simple, to assist in pinpointing
70+
performance improvements (or regressions)
71+
72+
## Gotcha: optimizations
73+
74+
There's another tricky part to writing benchmarks: benchmarks compiled with
75+
optimizations activated can be dramatically changed by the optimizer so that
76+
the benchmark is no longer benchmarking what one expects. For example, the
77+
compiler might recognize that some calculation has no external effects and
78+
remove it entirely.
79+
80+
```{rust,ignore}
81+
#![feature(test)]
82+
83+
extern crate test;
84+
use test::Bencher;
85+
86+
#[bench]
87+
fn bench_xor_1000_ints(b: &mut Bencher) {
88+
b.iter(|| {
89+
(0..1000).fold(0, |old, new| old ^ new);
90+
});
91+
}
92+
```
93+
94+
gives the following results
95+
96+
```text
97+
running 1 test
98+
test bench_xor_1000_ints ... bench: 0 ns/iter (+/- 0)
99+
100+
test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured
101+
```
102+
103+
The benchmarking runner offers two ways to avoid this. Either, the closure that
104+
the `iter` method receives can return an arbitrary value which forces the
105+
optimizer to consider the result used and ensures it cannot remove the
106+
computation entirely. This could be done for the example above by adjusting the
107+
`b.iter` call to
108+
109+
```rust
110+
# struct X;
111+
# impl X { fn iter<T, F>(&self, _: F) where F: FnMut() -> T {} } let b = X;
112+
b.iter(|| {
113+
// note lack of `;` (could also use an explicit `return`).
114+
(0..1000).fold(0, |old, new| old ^ new)
115+
});
116+
```
117+
118+
Or, the other option is to call the generic `test::black_box` function, which
119+
is an opaque "black box" to the optimizer and so forces it to consider any
120+
argument as used.
121+
122+
```rust
123+
#![feature(test)]
124+
125+
extern crate test;
126+
127+
# fn main() {
128+
# struct X;
129+
# impl X { fn iter<T, F>(&self, _: F) where F: FnMut() -> T {} } let b = X;
130+
b.iter(|| {
131+
let n = test::black_box(1000);
132+
133+
(0..n).fold(0, |a, b| a ^ b)
134+
})
135+
# }
136+
```
137+
138+
Neither of these read or modify the value, and are very cheap for small values.
139+
Larger values can be passed indirectly to reduce overhead (e.g.
140+
`black_box(&huge_struct)`).
141+
142+
Performing either of the above changes gives the following benchmarking results
143+
144+
```text
145+
running 1 test
146+
test bench_xor_1000_ints ... bench: 131 ns/iter (+/- 3)
147+
148+
test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured
149+
```
150+
151+
However, the optimizer can still modify a testcase in an undesirable manner
152+
even when using either of the above.

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -280,13 +280,15 @@ it returns an `Result<T, E>`, and because this is just an example, we `unwrap()`
280280
it to get a reference to the data. Real code would have more robust error handling
281281
here. We're then free to mutate it, since we have the lock.
282282

283-
This timer bit is a bit awkward, however. We have picked a reasonable amount of
284-
time to wait, but it's entirely possible that we've picked too high, and that
285-
we could be taking less time. It's also possible that we've picked too low,
286-
and that we aren't actually finishing this computation.
287-
288-
Rust's standard library provides a few more mechanisms for two threads to
289-
synchronize with each other. Let's talk about one: channels.
283+
Lastly, while the threads are running, we wait on a short timer. But
284+
this is not ideal: we may have picked a reasonable amount of time to
285+
wait but it's more likely we'll either be waiting longer than
286+
necessary or not long enough, depending on just how much time the
287+
threads actually take to finish computing when the program runs.
288+
289+
A more precise alternative to the timer would be to use one of the
290+
mechanisms provided by the Rust standard library for synchronizing
291+
threads with each other. Let's talk about one of them: channels.
290292

291293
## Channels
292294

0 commit comments

Comments
 (0)