Skip to content

Commit 06e9651

Browse files
committed
---
yaml --- r: 195546 b: refs/heads/master c: abd747c h: refs/heads/master v: v3
1 parent 2da3969 commit 06e9651

File tree

390 files changed

+6471
-7425
lines changed

Some content is hidden

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

390 files changed

+6471
-7425
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 240734c31e529557583a0dc8e97abf858b4a375d
2+
refs/heads/master: abd747cd153c1ef3648831916017fb692200387d
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: b3317d68910900f135f9f38e43a7a699bc736b4a
55
refs/heads/try: 961e0358e1a5c0faaef606e31e9965742c1643bf

trunk/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"

trunk/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

trunk/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))

trunk/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

trunk/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

trunk/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

trunk/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)]

trunk/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

trunk/src/doc/trpl/SUMMARY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,5 +42,6 @@
4242
* [Intrinsics](intrinsics.md)
4343
* [Lang items](lang-items.md)
4444
* [Link args](link-args.md)
45+
* [Benchmark Tests](benchmark-tests.md)
4546
* [Conclusion](conclusion.md)
4647
* [Glossary](glossary.md)

trunk/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.

trunk/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

trunk/src/doc/trpl/benchmark-tests.md

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.

trunk/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

trunk/src/doc/trpl/documentation.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,7 @@ This will create documentation for bar both inside the documentation for the
529529
crate `foo`, as well as the documentation for your crate. It will use the same
530530
documentation in both places.
531531

532-
This behavior can be supressed with `no_inline`:
532+
This behavior can be suppressed with `no_inline`:
533533

534534
```ignore
535535
extern crate foo;

0 commit comments

Comments
 (0)