Skip to content

Commit 4bd057d

Browse files
committed
---
yaml --- r: 274332 b: refs/heads/stable c: 10de882 h: refs/heads/master
1 parent c63a9ee commit 4bd057d

File tree

23 files changed

+502
-53
lines changed

23 files changed

+502
-53
lines changed

[refs]

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

branches/stable/CONTRIBUTING.md

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ links to the major sections:
66

77
* [Feature Requests](#feature-requests)
88
* [Bug Reports](#bug-reports)
9+
* [The Build System](#the-build-system)
910
* [Pull Requests](#pull-requests)
1011
* [Writing Documentation](#writing-documentation)
1112
* [Issue Triage](#issue-triage)
@@ -77,6 +78,66 @@ to do this is to invoke `rustc` like this:
7778
$ RUST_BACKTRACE=1 rustc ...
7879
```
7980

81+
## The Build System
82+
83+
Rust's build system allows you to bootstrap the compiler, run tests &
84+
benchmarks, generate documentation, install a fresh build of Rust, and more.
85+
It's your best friend when working on Rust, allowing you to compile & test
86+
your contributions before submission.
87+
88+
All the configuration for the build system lives in [the `mk` directory][mkdir]
89+
in the project root. It can be hard to follow in places, as it uses some
90+
advanced Make features which make for some challenging reading. If you have
91+
questions on the build system internals, try asking in
92+
[`#rust-internals`][pound-rust-internals].
93+
94+
[mkdir]: https://github.com/rust-lang/rust/tree/master/mk/
95+
96+
### Configuration
97+
98+
Before you can start building the compiler you need to configure the build for
99+
your system. In most cases, that will just mean using the defaults provided
100+
for Rust. Configuring involves invoking the `configure` script in the project
101+
root.
102+
103+
```
104+
./configure
105+
```
106+
107+
There are large number of options accepted by this script to alter the
108+
configuration used later in the build process. Some options to note:
109+
110+
- `--enable-debug` - Build a debug version of the compiler (disables optimizations)
111+
- `--enable-optimize` - Enable optimizations (can be used with `--enable-debug`
112+
to make a debug build with optimizations)
113+
- `--disable-valgrind-rpass` - Don't run tests with valgrind
114+
- `--enable-clang` - Prefer clang to gcc for building dependencies (e.g., LLVM)
115+
- `--enable-ccache` - Invoke clang/gcc with ccache to re-use object files between builds
116+
- `--enable-compiler-docs` - Build compiler documentation
117+
118+
To see a full list of options, run `./configure --help`.
119+
120+
### Useful Targets
121+
122+
Some common make targets are:
123+
124+
- `make rustc-stage1` - build up to (and including) the first stage. For most
125+
cases we don't need to build the stage2 compiler, so we can save time by not
126+
building it. The stage1 compiler is a fully functioning compiler and
127+
(probably) will be enough to determine if your change works as expected.
128+
- `make check` - build the full compiler & run all tests (takes a while). This
129+
is what gets run by the continuous integration system against your pull
130+
request. You should run this before submitting to make sure your tests pass
131+
& everything builds in the correct manner.
132+
- `make check-stage1-std NO_REBUILD=1` - test the standard library without
133+
rebuilding the entire compiler
134+
- `make check TESTNAME=<path-to-test-file>.rs` - Run a single test file
135+
- `make check-stage1-rpass TESTNAME=<path-to-test-file>.rs` - Run a single
136+
rpass test with the stage1 compiler (this will be quicker than running the
137+
command above as we only build the stage1 compiler, not the entire thing).
138+
You can also leave off the `-rpass` to run all stage1 test types.
139+
- `make check-stage1-coretest` - Run stage1 tests in `libcore`.
140+
80141
## Pull Requests
81142

82143
Pull requests are the primary mechanism we use to change Rust. GitHub itself

branches/stable/src/doc/book/crates-and-modules.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -567,10 +567,11 @@ to it as "sayings". Similarly, the first `use` statement pulls in the
567567
`ja_greetings` as opposed to simply `greetings`. This can help to avoid
568568
ambiguity when importing similarly-named items from different places.
569569
570-
The second `use` statement uses a star glob to bring in _all_ symbols from the
571-
`sayings::japanese::farewells` module. As you can see we can later refer to
570+
The second `use` statement uses a star glob to bring in all public symbols from
571+
the `sayings::japanese::farewells` module. As you can see we can later refer to
572572
the Japanese `goodbye` function with no module qualifiers. This kind of glob
573-
should be used sparingly.
573+
should be used sparingly. It’s worth noting that it only imports the public
574+
symbols, even if the code doing the globbing is in the same module.
574575
575576
The third `use` statement bears more explanation. It's using "brace expansion"
576577
globbing to compress three `use` statements into one (this sort of syntax

branches/stable/src/doc/book/macros.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -478,9 +478,9 @@ which syntactic form it matches.
478478

479479
There are additional rules regarding the next token after a metavariable:
480480

481-
* `expr` variables may only be followed by one of: `=> , ;`
482-
* `ty` and `path` variables may only be followed by one of: `=> , : = > as`
483-
* `pat` variables may only be followed by one of: `=> , = if in`
481+
* `expr` and `stmt` variables may only be followed by one of: `=> , ;`
482+
* `ty` and `path` variables may only be followed by one of: `=> , = | ; : > [ { as where`
483+
* `pat` variables may only be followed by one of: `=> , = | if in`
484484
* Other variables may be followed by any token.
485485

486486
These rules provide some flexibility for Rust’s syntax to evolve without

branches/stable/src/doc/book/syntax-index.md

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## Keywords
44

5-
* `as`: primitive casting. See [Casting Between Types (`as`)].
5+
* `as`: primitive casting, or disambiguating the specific trait containing an item. See [Casting Between Types (`as`)], [Universal Function Call Syntax (Angle-bracket Form)], [Associated Types].
66
* `break`: break out of loop. See [Loops (Ending Iteration Early)].
77
* `const`: constant items and constant raw pointers. See [`const` and `static`], [Raw Pointers].
88
* `continue`: continue to next loop iteration. See [Loops (Ending Iteration Early)].
@@ -115,8 +115,11 @@
115115
* `::path`: path relative to the crate root (*i.e.* an explicitly absolute path). See [Crates and Modules (Re-exporting with `pub use`)].
116116
* `self::path`: path relative to the current module (*i.e.* an explicitly relative path). See [Crates and Modules (Re-exporting with `pub use`)].
117117
* `super::path`: path relative to the parent of the current module. See [Crates and Modules (Re-exporting with `pub use`)].
118-
* `type::ident`: associated constants, functions, and types. See [Associated Types].
118+
* `type::ident`, `<type as trait>::ident`: associated constants, functions, and types. See [Associated Types].
119119
* `<type>::…`: associated item for a type which cannot be directly named (*e.g.* `<&T>::…`, `<[T]>::…`, *etc.*). See [Associated Types].
120+
* `trait::method(…)`: disambiguating a method call by naming the trait which defines it. See [Universal Function Call Syntax].
121+
* `type::method(…)`: disambiguating a method call by naming the type for which it's defined. See [Universal Function Call Syntax].
122+
* `<type as trait>::method(…)`: disambiguating a method call by naming the trait _and_ type. See [Universal Function Call Syntax (Angle-bracket Form)].
120123

121124
<!-- Generics -->
122125

@@ -132,7 +135,8 @@
132135
<!-- Constraints -->
133136

134137
* `T: U`: generic parameter `T` constrained to types that implement `U`. See [Traits].
135-
* `T: 'a`: generic type `T` must outlive lifetime `'a`.
138+
* `T: 'a`: generic type `T` must outlive lifetime `'a`. When we say that a type 'outlives' the lifetime, we mean that it cannot transitively contain any references with lifetimes shorter than `'a`.
139+
* `T : 'static`: The generic type `T` contains no borrowed references other than `'static` ones.
136140
* `'b: 'a`: generic lifetime `'b` must outlive lifetime `'a`.
137141
* `T: ?Sized`: allow generic type parameter to be a dynamically-sized type. See [Unsized Types (`?Sized`)].
138142
* `'a + trait`, `trait + trait`: compound type constraint. See [Traits (Multiple Trait Bounds)].
@@ -234,6 +238,8 @@
234238
[Traits (`where` clause)]: traits.html#where-clause
235239
[Traits (Multiple Trait Bounds)]: traits.html#multiple-trait-bounds
236240
[Traits]: traits.html
241+
[Universal Function Call Syntax]: ufcs.html
242+
[Universal Function Call Syntax (Angle-bracket Form)]: ufcs.html#angle-bracket-form
237243
[Unsafe]: unsafe.html
238244
[Unsized Types (`?Sized`)]: unsized-types.html#sized
239245
[Variable Bindings]: variable-bindings.html

branches/stable/src/doc/reference.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2095,7 +2095,7 @@ along with their default settings. [Compiler
20952095
plugins](book/compiler-plugins.html#lint-plugins) can provide additional lint checks.
20962096

20972097
```{.ignore}
2098-
mod m1 {
2098+
pub mod m1 {
20992099
// Missing documentation is ignored here
21002100
#[allow(missing_docs)]
21012101
pub fn undocumented_one() -> i32 { 1 }
@@ -2115,9 +2115,9 @@ check on and off:
21152115

21162116
```{.ignore}
21172117
#[warn(missing_docs)]
2118-
mod m2{
2118+
pub mod m2{
21192119
#[allow(missing_docs)]
2120-
mod nested {
2120+
pub mod nested {
21212121
// Missing documentation is ignored here
21222122
pub fn undocumented_one() -> i32 { 1 }
21232123
@@ -2137,7 +2137,7 @@ that lint check:
21372137

21382138
```{.ignore}
21392139
#[forbid(missing_docs)]
2140-
mod m3 {
2140+
pub mod m3 {
21412141
// Attempting to toggle warning signals an error here
21422142
#[allow(missing_docs)]
21432143
/// Returns 2.

branches/stable/src/libcollections/btree/set.rs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
// to TreeMap
1313

1414
use core::cmp::Ordering::{self, Less, Greater, Equal};
15+
use core::cmp::{min, max};
1516
use core::fmt::Debug;
1617
use core::fmt;
1718
use core::iter::{Peekable, FromIterator};
@@ -703,7 +704,9 @@ impl<'a, T> DoubleEndedIterator for Iter<'a, T> {
703704
}
704705
}
705706
#[stable(feature = "rust1", since = "1.0.0")]
706-
impl<'a, T> ExactSizeIterator for Iter<'a, T> {}
707+
impl<'a, T> ExactSizeIterator for Iter<'a, T> {
708+
fn len(&self) -> usize { self.iter.len() }
709+
}
707710

708711

709712
#[stable(feature = "rust1", since = "1.0.0")]
@@ -724,7 +727,9 @@ impl<T> DoubleEndedIterator for IntoIter<T> {
724727
}
725728
}
726729
#[stable(feature = "rust1", since = "1.0.0")]
727-
impl<T> ExactSizeIterator for IntoIter<T> {}
730+
impl<T> ExactSizeIterator for IntoIter<T> {
731+
fn len(&self) -> usize { self.iter.len() }
732+
}
728733

729734

730735
impl<'a, T> Clone for Range<'a, T> {
@@ -780,6 +785,12 @@ impl<'a, T: Ord> Iterator for Difference<'a, T> {
780785
}
781786
}
782787
}
788+
789+
fn size_hint(&self) -> (usize, Option<usize>) {
790+
let a_len = self.a.len();
791+
let b_len = self.b.len();
792+
(a_len.saturating_sub(b_len), Some(a_len))
793+
}
783794
}
784795

785796
impl<'a, T> Clone for SymmetricDifference<'a, T> {
@@ -806,6 +817,10 @@ impl<'a, T: Ord> Iterator for SymmetricDifference<'a, T> {
806817
}
807818
}
808819
}
820+
821+
fn size_hint(&self) -> (usize, Option<usize>) {
822+
(0, Some(self.a.len() + self.b.len()))
823+
}
809824
}
810825

811826
impl<'a, T> Clone for Intersection<'a, T> {
@@ -842,6 +857,10 @@ impl<'a, T: Ord> Iterator for Intersection<'a, T> {
842857
}
843858
}
844859
}
860+
861+
fn size_hint(&self) -> (usize, Option<usize>) {
862+
(0, Some(min(self.a.len(), self.b.len())))
863+
}
845864
}
846865

847866
impl<'a, T> Clone for Union<'a, T> {
@@ -868,4 +887,10 @@ impl<'a, T: Ord> Iterator for Union<'a, T> {
868887
}
869888
}
870889
}
890+
891+
fn size_hint(&self) -> (usize, Option<usize>) {
892+
let a_len = self.a.len();
893+
let b_len = self.b.len();
894+
(max(a_len, b_len), Some(a_len + b_len))
895+
}
871896
}

branches/stable/src/libcollections/vec_deque.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1994,9 +1994,9 @@ impl<A: Ord> Ord for VecDeque<A> {
19941994
impl<A: Hash> Hash for VecDeque<A> {
19951995
fn hash<H: Hasher>(&self, state: &mut H) {
19961996
self.len().hash(state);
1997-
for elt in self {
1998-
elt.hash(state);
1999-
}
1997+
let (a, b) = self.as_slices();
1998+
Hash::hash_slice(a, state);
1999+
Hash::hash_slice(b, state);
20002000
}
20012001
}
20022002

branches/stable/src/libcollectionstest/vec_deque.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,25 @@ fn test_hash() {
605605
assert!(::hash(&x) == ::hash(&y));
606606
}
607607

608+
#[test]
609+
fn test_hash_after_rotation() {
610+
// test that two deques hash equal even if elements are laid out differently
611+
let len = 28;
612+
let mut ring: VecDeque<i32> = (0..len as i32).collect();
613+
let orig = ring.clone();
614+
for _ in 0..ring.capacity() {
615+
// shift values 1 step to the right by pop, sub one, push
616+
ring.pop_front();
617+
for elt in &mut ring {
618+
*elt -= 1;
619+
}
620+
ring.push_back(len - 1);
621+
assert_eq!(::hash(&orig), ::hash(&ring));
622+
assert_eq!(orig, ring);
623+
assert_eq!(ring, orig);
624+
}
625+
}
626+
608627
#[test]
609628
fn test_ord() {
610629
let x = VecDeque::new();

branches/stable/src/libstd/ffi/c_str.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,18 @@ use vec::Vec;
6060
/// }
6161
/// # }
6262
/// ```
63+
///
64+
/// # Safety
65+
///
66+
/// `CString` is intended for working with traditional C-style strings
67+
/// (a sequence of non-null bytes terminated by a single null byte); the
68+
/// primary use case for these kinds of strings is interoperating with C-like
69+
/// code. Often you will need to transfer ownership to/from that external
70+
/// code. It is strongly recommended that you thoroughly read through the
71+
/// documentation of `CString` before use, as improper ownership management
72+
/// of `CString` instances can lead to invalid memory accesses, memory leaks,
73+
/// and other memory errors.
74+
6375
#[derive(PartialEq, PartialOrd, Eq, Ord, Hash, Clone)]
6476
#[stable(feature = "rust1", since = "1.0.0")]
6577
pub struct CString {
@@ -207,11 +219,11 @@ impl CString {
207219
CString { inner: v.into_boxed_slice() }
208220
}
209221

210-
/// Retakes ownership of a CString that was transferred to C.
222+
/// Retakes ownership of a `CString` that was transferred to C.
211223
///
212-
/// The only appropriate argument is a pointer obtained by calling
213-
/// `into_raw`. The length of the string will be recalculated
214-
/// using the pointer.
224+
/// This should only ever be called with a pointer that was earlier
225+
/// obtained by calling `into_raw` on a `CString`. Additionally, the length
226+
/// of the string will be recalculated from the pointer.
215227
#[stable(feature = "cstr_memory", since = "1.4.0")]
216228
pub unsafe fn from_raw(ptr: *mut c_char) -> CString {
217229
let len = libc::strlen(ptr) + 1; // Including the NUL byte

branches/stable/src/libsyntax/ext/tt/macro_rules.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -972,6 +972,7 @@ fn can_be_followed_by_any(frag: &str) -> bool {
972972
/// we expanded `expr` to include a new binary operator, we might
973973
/// break macros that were relying on that binary operator as a
974974
/// separator.
975+
// when changing this do not forget to update doc/book/macros.md!
975976
fn is_in_follow(_: &ExtCtxt, tok: &Token, frag: &str) -> Result<bool, String> {
976977
if let &CloseDelim(_) = tok {
977978
// closing a token tree can never be matched by any fragment;

0 commit comments

Comments
 (0)