]> git.lizzy.rs Git - rust.git/blob - RELEASES.md
Document size_of for 128-bit integers
[rust.git] / RELEASES.md
1 Version 1.26.2 (2018-06-05)
2 ==========================
3
4 Compatibility Notes
5 -------------------
6
7 - [The borrow checker was fixed to avoid unsoundness when using match ergonomics][51117]
8
9 [51117]: https://github.com/rust-lang/rust/issues/51117
10
11 Version 1.26.1 (2018-05-29)
12 ==========================
13
14 Tools
15 -----
16
17 - [RLS now works on Windows][50646]
18 - [Rustfmt stopped badly formatting text in some cases][rustfmt/2695]
19
20 Compatibility Notes
21 --------
22
23 - [`fn main() -> impl Trait` no longer works for non-Termination
24   trait][50656]
25   This reverts an accidental stabilization.
26 - [`NaN > NaN` no longer returns true in const-fn contexts][50812]
27 - [Prohibit using turbofish for `impl Trait` in method arguments][50950]
28
29 [50646]: https://github.com/rust-lang/rust/issues/50646
30 [50656]: https://github.com/rust-lang/rust/pull/50656
31 [50812]: https://github.com/rust-lang/rust/pull/50812
32 [50950]: https://github.com/rust-lang/rust/issues/50950
33 [rustfmt/2695]: https://github.com/rust-lang-nursery/rustfmt/issues/2695
34
35 Version 1.26.0 (2018-05-10)
36 ==========================
37
38 Language
39 --------
40 - [Closures now implement `Copy` and/or `Clone` if all captured variables
41   implement either or both traits.][49299]
42 - [The inclusive range syntax e.g. `for x in 0..=10` is now stable.][47813]
43 - [Stablise `'_`. The underscore lifetime can be used anywhere where a
44   lifetime can be elided.][49458]
45 - [`impl Trait` is now stable allowing you to have abstract types in returns
46    or in function parameters.][49255] e.g. `fn foo() -> impl Iterator<Item=u8>` or
47   `fn open(path: impl AsRef<Path>)`.
48 - [Pattern matching will now automatically apply dereferences.][49394]
49 - [128-bit integers in the form of `u128` and `i128` are now stable.][49101]
50 - [`main` can now return `Result<(), E: Debug>`][49162] in addition to `()`.
51 - [A lot of operations are now available in a const context.][46882] E.g. You
52   can now index into constant arrays, reference and dereference into constants,
53   and use Tuple struct constructors.
54 - [Fixed entry slice patterns are now stable.][48516] e.g.
55   ```rust
56   let points = [1, 2, 3, 4];
57   match points {
58       [1, 2, 3, 4] => println!("All points were sequential."),
59       _ => println!("Not all points were sequential."),
60   }
61   ```
62
63
64 Compiler
65 --------
66 - [LLD is now used as the default linker for `wasm32-unknown-unknown`.][48125]
67 - [Fixed exponential projection complexity on nested types.][48296]
68   This can provide up to a ~12% reduction in compile times for certain crates.
69 - [Added the `--remap-path-prefix` option to rustc.][48359] Allowing you
70   to remap path prefixes outputted by the compiler.
71 - [Added `powerpc-unknown-netbsd` target.][48281]
72
73 Libraries
74 ---------
75 - [Implemented `From<u16> for usize` & `From<{u8, i16}> for isize`.][49305]
76 - [Added hexadecimal formatting for integers with fmt::Debug][48978]
77   e.g. `assert!(format!("{:02x?}", b"Foo\0") == "[46, 6f, 6f, 00]")`
78 - [Implemented `Default, Hash` for `cmp::Reverse`.][48628]
79 - [Optimized `str::repeat` being 8x faster in large cases.][48657]
80 - [`ascii::escape_default` is now available in libcore.][48735]
81 - [Trailing commas are now supported in std and core macros.][48056]
82 - [Implemented `Copy, Clone` for `cmp::Reverse`][47379]
83 - [Implemented `Clone` for `char::{ToLowercase, ToUppercase}`.][48629]
84
85 Stabilized APIs
86 ---------------
87 - [`*const T::add`]
88 - [`*const T::copy_to_nonoverlapping`]
89 - [`*const T::copy_to`]
90 - [`*const T::read_unaligned`]
91 - [`*const T::read_volatile`]
92 - [`*const T::read`]
93 - [`*const T::sub`]
94 - [`*const T::wrapping_add`]
95 - [`*const T::wrapping_sub`]
96 - [`*mut T::add`]
97 - [`*mut T::copy_to_nonoverlapping`]
98 - [`*mut T::copy_to`]
99 - [`*mut T::read_unaligned`]
100 - [`*mut T::read_volatile`]
101 - [`*mut T::read`]
102 - [`*mut T::replace`]
103 - [`*mut T::sub`]
104 - [`*mut T::swap`]
105 - [`*mut T::wrapping_add`]
106 - [`*mut T::wrapping_sub`]
107 - [`*mut T::write_bytes`]
108 - [`*mut T::write_unaligned`]
109 - [`*mut T::write_volatile`]
110 - [`*mut T::write`]
111 - [`Box::leak`]
112 - [`FromUtf8Error::as_bytes`]
113 - [`LocalKey::try_with`]
114 - [`Option::cloned`]
115 - [`btree_map::Entry::and_modify`]
116 - [`fs::read_to_string`]
117 - [`fs::read`]
118 - [`fs::write`]
119 - [`hash_map::Entry::and_modify`]
120 - [`iter::FusedIterator`]
121 - [`ops::RangeInclusive`]
122 - [`ops::RangeToInclusive`]
123 - [`process::id`]
124 - [`slice::rotate_left`]
125 - [`slice::rotate_right`]
126 - [`String::retain`]
127
128
129 Cargo
130 -----
131 - [Cargo will now output path to custom commands when `-v` is
132   passed with `--list`][cargo/5041]
133 - [The Cargo binary version is now the same as the Rust version][cargo/5083]
134 - [`Cargo.lock` files are now included in published crates.][cargo/5093]
135
136 Misc
137 ----
138 - [The second edition of "The Rust Programming Language" book is now recommended
139   over the first.][48404]
140
141 Compatibility Notes
142 -------------------
143
144 - [aliasing a `Fn` trait as `dyn` no longer works.][48481] E.g. the following
145   syntax is now invalid.
146   ```
147   use std::ops::Fn as dyn;
148   fn g(_: Box<dyn(std::fmt::Debug)>) {}
149   ```
150 - [The result of dereferences are no longer promoted to `'static`.][47408]
151   e.g.
152   ```rust
153   fn main() {
154       const PAIR: &(i32, i32) = &(0, 1);
155       let _reversed_pair: &'static _ = &(PAIR.1, PAIR.0); // Doesn't work
156   }
157   ```
158 - [Deprecate `AsciiExt` trait in favor of inherent methods.][49109]
159 - [`".e0"` will now no longer parse as `0.0` and will instead cause
160   an error.][48235]
161 - [Removed hoedown from rustdoc.][48274]
162 - [Bounds on higher-kinded lifetimes a hard error.][48326]
163
164 [46882]: https://github.com/rust-lang/rust/pull/46882
165 [47379]: https://github.com/rust-lang/rust/pull/47379
166 [47408]: https://github.com/rust-lang/rust/pull/47408
167 [47813]: https://github.com/rust-lang/rust/pull/47813
168 [48056]: https://github.com/rust-lang/rust/pull/48056
169 [48125]: https://github.com/rust-lang/rust/pull/48125
170 [48166]: https://github.com/rust-lang/rust/pull/48166
171 [48235]: https://github.com/rust-lang/rust/pull/48235
172 [48274]: https://github.com/rust-lang/rust/pull/48274
173 [48281]: https://github.com/rust-lang/rust/pull/48281
174 [48296]: https://github.com/rust-lang/rust/pull/48296
175 [48326]: https://github.com/rust-lang/rust/pull/48326
176 [48359]: https://github.com/rust-lang/rust/pull/48359
177 [48404]: https://github.com/rust-lang/rust/pull/48404
178 [48481]: https://github.com/rust-lang/rust/pull/48481
179 [48516]: https://github.com/rust-lang/rust/pull/48516
180 [48628]: https://github.com/rust-lang/rust/pull/48628
181 [48629]: https://github.com/rust-lang/rust/pull/48629
182 [48657]: https://github.com/rust-lang/rust/pull/48657
183 [48735]: https://github.com/rust-lang/rust/pull/48735
184 [48978]: https://github.com/rust-lang/rust/pull/48978
185 [49101]: https://github.com/rust-lang/rust/pull/49101
186 [49109]: https://github.com/rust-lang/rust/pull/49109
187 [49121]: https://github.com/rust-lang/rust/pull/49121
188 [49162]: https://github.com/rust-lang/rust/pull/49162
189 [49184]: https://github.com/rust-lang/rust/pull/49184
190 [49234]: https://github.com/rust-lang/rust/pull/49234
191 [49255]: https://github.com/rust-lang/rust/pull/49255
192 [49299]: https://github.com/rust-lang/rust/pull/49299
193 [49305]: https://github.com/rust-lang/rust/pull/49305
194 [49394]: https://github.com/rust-lang/rust/pull/49394
195 [49458]: https://github.com/rust-lang/rust/pull/49458
196 [`*const T::add`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.add
197 [`*const T::copy_to_nonoverlapping`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.copy_to_nonoverlapping
198 [`*const T::copy_to`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.copy_to
199 [`*const T::read_unaligned`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read_unaligned
200 [`*const T::read_volatile`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read_volatile
201 [`*const T::read`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read
202 [`*const T::sub`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.sub
203 [`*const T::wrapping_add`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_add
204 [`*const T::wrapping_sub`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_sub
205 [`*mut T::add`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.add-1
206 [`*mut T::copy_to_nonoverlapping`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.copy_to_nonoverlapping-1
207 [`*mut T::copy_to`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.copy_to-1
208 [`*mut T::read_unaligned`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read_unaligned-1
209 [`*mut T::read_volatile`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read_volatile-1
210 [`*mut T::read`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read-1
211 [`*mut T::replace`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.replace
212 [`*mut T::sub`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.sub-1
213 [`*mut T::swap`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.swap
214 [`*mut T::wrapping_add`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_add-1
215 [`*mut T::wrapping_sub`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_sub-1
216 [`*mut T::write_bytes`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write_bytes
217 [`*mut T::write_unaligned`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write_unaligned
218 [`*mut T::write_volatile`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write_volatile
219 [`*mut T::write`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write
220 [`Box::leak`]: https://doc.rust-lang.org/std/boxed/struct.Box.html#method.leak
221 [`FromUtf8Error::as_bytes`]: https://doc.rust-lang.org/std/string/struct.FromUtf8Error.html#method.as_bytes
222 [`LocalKey::try_with`]: https://doc.rust-lang.org/std/thread/struct.LocalKey.html#method.try_with
223 [`Option::cloned`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.cloned
224 [`btree_map::Entry::and_modify`]: https://doc.rust-lang.org/std/collections/btree_map/enum.Entry.html#method.and_modify
225 [`fs::read_to_string`]: https://doc.rust-lang.org/std/fs/fn.read_to_string.html
226 [`fs::read`]: https://doc.rust-lang.org/std/fs/fn.read.html
227 [`fs::write`]: https://doc.rust-lang.org/std/fs/fn.write.html
228 [`hash_map::Entry::and_modify`]: https://doc.rust-lang.org/std/collections/hash_map/enum.Entry.html#method.and_modify
229 [`iter::FusedIterator`]: https://doc.rust-lang.org/std/iter/trait.FusedIterator.html
230 [`ops::RangeInclusive`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html
231 [`ops::RangeToInclusive`]: https://doc.rust-lang.org/std/ops/struct.RangeToInclusive.html
232 [`process::id`]: https://doc.rust-lang.org/std/process/fn.id.html
233 [`slice::rotate_left`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rotate_left
234 [`slice::rotate_right`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rotate_right
235 [`String::retain`]: https://doc.rust-lang.org/std/string/struct.String.html#method.retain
236 [cargo/5041]: https://github.com/rust-lang/cargo/pull/5041
237 [cargo/5083]: https://github.com/rust-lang/cargo/pull/5083
238 [cargo/5093]: https://github.com/rust-lang/cargo/pull/5093
239
240
241 Version 1.25.0 (2018-03-29)
242 ==========================
243
244 Language
245 --------
246 - [Stabilised `#[repr(align(x))]`.][47006] [RFC 1358]
247 - [You can now use nested groups of imports.][47948]
248   e.g. `use std::{fs::File, io::Read, path::{Path, PathBuf}};`
249 - [You can now have `|` at the start of a match arm.][47947] e.g.
250 ```rust
251 enum Foo { A, B, C }
252
253 fn main() {
254     let x = Foo::A;
255     match x {
256         | Foo::A
257         | Foo::B => println!("AB"),
258         | Foo::C => println!("C"),
259     }
260 }
261 ```
262
263 Compiler
264 --------
265 - [Upgraded to LLVM 6.][47828]
266 - [Added `-C lto=val` option.][47521]
267 - [Added `i586-unknown-linux-musl` target][47282]
268
269 Libraries
270 ---------
271 - [Impl Send for `process::Command` on Unix.][47760]
272 - [Impl PartialEq and Eq for `ParseCharError`.][47790]
273 - [`UnsafeCell::into_inner` is now safe.][47204]
274 - [Implement libstd for CloudABI.][47268]
275 - [`Float::{from_bits, to_bits}` is now available in libcore.][46931]
276 - [Implement `AsRef<Path>` for Component][46985]
277 - [Implemented `Write` for `Cursor<&mut Vec<u8>>`][46830]
278 - [Moved `Duration` to libcore.][46666]
279
280 Stabilized APIs
281 ---------------
282 - [`Location::column`]
283 - [`ptr::NonNull`]
284
285 The following functions can now be used in a constant expression.
286 eg. `static MINUTE: Duration = Duration::from_secs(60);`
287 - [`Duration::new`][47300]
288 - [`Duration::from_secs`][47300]
289 - [`Duration::from_millis`][47300]
290
291 Cargo
292 -----
293 - [`cargo new` no longer removes `rust` or `rs` prefixs/suffixs.][cargo/5013]
294 - [`cargo new` now defaults to creating a binary crate, instead of a
295   library crate.][cargo/5029]
296
297 Misc
298 ----
299 - [Rust by example is now shipped with new releases][46196]
300
301 Compatibility Notes
302 -------------------
303 - [Deprecated `net::lookup_host`.][47510]
304 - [`rustdoc` has switched to pulldown as the default markdown renderer.][47398]
305 - The borrow checker was sometimes incorrectly permitting overlapping borrows
306   around indexing operations (see [#47349][47349]). This has been fixed (which also
307   enabled some correct code that used to cause errors (e.g. [#33903][33903] and [#46095][46095]).
308 - [Removed deprecated unstable attribute `#[simd]`.][47251]
309
310 [33903]: https://github.com/rust-lang/rust/pull/33903
311 [47947]: https://github.com/rust-lang/rust/pull/47947
312 [47948]: https://github.com/rust-lang/rust/pull/47948
313 [47760]: https://github.com/rust-lang/rust/pull/47760
314 [47790]: https://github.com/rust-lang/rust/pull/47790
315 [47828]: https://github.com/rust-lang/rust/pull/47828
316 [47398]: https://github.com/rust-lang/rust/pull/47398
317 [47510]: https://github.com/rust-lang/rust/pull/47510
318 [47521]: https://github.com/rust-lang/rust/pull/47521
319 [47204]: https://github.com/rust-lang/rust/pull/47204
320 [47251]: https://github.com/rust-lang/rust/pull/47251
321 [47268]: https://github.com/rust-lang/rust/pull/47268
322 [47282]: https://github.com/rust-lang/rust/pull/47282
323 [47300]: https://github.com/rust-lang/rust/pull/47300
324 [47349]: https://github.com/rust-lang/rust/pull/47349
325 [46931]: https://github.com/rust-lang/rust/pull/46931
326 [46985]: https://github.com/rust-lang/rust/pull/46985
327 [47006]: https://github.com/rust-lang/rust/pull/47006
328 [46830]: https://github.com/rust-lang/rust/pull/46830
329 [46095]: https://github.com/rust-lang/rust/pull/46095
330 [46666]: https://github.com/rust-lang/rust/pull/46666
331 [46196]: https://github.com/rust-lang/rust/pull/46196
332 [cargo/5013]: https://github.com/rust-lang/cargo/pull/5013
333 [cargo/5029]: https://github.com/rust-lang/cargo/pull/5029
334 [RFC 1358]: https://github.com/rust-lang/rfcs/pull/1358
335 [`Location::column`]: https://doc.rust-lang.org/std/panic/struct.Location.html#method.column
336 [`ptr::NonNull`]: https://doc.rust-lang.org/std/ptr/struct.NonNull.html
337
338
339 Version 1.24.1 (2018-03-01)
340 ==========================
341
342  - [Do not abort when unwinding through FFI][48251]
343  - [Emit UTF-16 files for linker arguments on Windows][48318]
344  - [Make the error index generator work again][48308]
345  - [Cargo will warn on Windows 7 if an update is needed][cargo/5069].
346
347 [48251]: https://github.com/rust-lang/rust/issues/48251
348 [48308]: https://github.com/rust-lang/rust/issues/48308
349 [48318]: https://github.com/rust-lang/rust/issues/48318
350 [cargo/5069]: https://github.com/rust-lang/cargo/pull/5069
351
352
353 Version 1.24.0 (2018-02-15)
354 ==========================
355
356 Language
357 --------
358 - [External `sysv64` ffi is now available.][46528]
359   eg. `extern "sysv64" fn foo () {}`
360
361 Compiler
362 --------
363 - [rustc now uses 16 codegen units by default for release builds.][46910]
364   For the fastest builds, utilize `codegen-units=1`.
365 - [Added `armv4t-unknown-linux-gnueabi` target.][47018]
366 - [Add `aarch64-unknown-openbsd` support][46760]
367
368 Libraries
369 ---------
370 - [`str::find::<char>` now uses memchr.][46735] This should lead to a 10x
371   improvement in performance in the majority of cases.
372 - [`OsStr`'s `Debug` implementation is now lossless and consistent
373   with Windows.][46798]
374 - [`time::{SystemTime, Instant}` now implement `Hash`.][46828]
375 - [impl `From<bool>` for `AtomicBool`][46293]
376 - [impl `From<{CString, &CStr}>` for `{Arc<CStr>, Rc<CStr>}`][45990]
377 - [impl `From<{OsString, &OsStr}>` for `{Arc<OsStr>, Rc<OsStr>}`][45990]
378 - [impl `From<{PathBuf, &Path}>` for `{Arc<Path>, Rc<Path>}`][45990]
379 - [float::from_bits now just uses transmute.][46012] This provides
380   some optimisations from LLVM.
381 - [Copied `AsciiExt` methods onto `char`][46077]
382 - [Remove `T: Sized` requirement on `ptr::is_null()`][46094]
383 - [impl `From<RecvError>` for `{TryRecvError, RecvTimeoutError}`][45506]
384 - [Optimised `f32::{min, max}` to generate more efficient x86 assembly][47080]
385 - [`[u8]::contains` now uses memchr which provides a 3x speed improvement][46713]
386
387 Stabilized APIs
388 ---------------
389 - [`RefCell::replace`]
390 - [`RefCell::swap`]
391 - [`atomic::spin_loop_hint`]
392
393 The following functions can now be used in a constant expression.
394 eg. `let buffer: [u8; size_of::<usize>()];`, `static COUNTER: AtomicUsize = AtomicUsize::new(1);`
395
396 - [`AtomicBool::new`][46287]
397 - [`AtomicUsize::new`][46287]
398 - [`AtomicIsize::new`][46287]
399 - [`AtomicPtr::new`][46287]
400 - [`Cell::new`][46287]
401 - [`{integer}::min_value`][46287]
402 - [`{integer}::max_value`][46287]
403 - [`mem::size_of`][46287]
404 - [`mem::align_of`][46287]
405 - [`ptr::null`][46287]
406 - [`ptr::null_mut`][46287]
407 - [`RefCell::new`][46287]
408 - [`UnsafeCell::new`][46287]
409
410 Cargo
411 -----
412 - [Added a `workspace.default-members` config that
413   overrides implied `--all` in virtual workspaces.][cargo/4743]
414 - [Enable incremental by default on development builds.][cargo/4817] Also added
415   configuration keys to `Cargo.toml` and `.cargo/config` to disable on a
416   per-project or global basis respectively.
417
418 Misc
419 ----
420
421 Compatibility Notes
422 -------------------
423 - [Floating point types `Debug` impl now always prints a decimal point.][46831]
424 - [`Ipv6Addr` now rejects superfluous `::`'s in IPv6 addresses][46671] This is
425   in accordance with IETF RFC 4291 Â§2.2.
426 - [Unwinding will no longer go past FFI boundaries, and will instead abort.][46833]
427 - [`Formatter::flags` method is now deprecated.][46284] The `sign_plus`,
428   `sign_minus`, `alternate`, and `sign_aware_zero_pad` should be used instead.
429 - [Leading zeros in tuple struct members is now an error][47084]
430 - [`column!()` macro is one-based instead of zero-based][46977]
431 - [`fmt::Arguments` can no longer be shared across threads][45198]
432 - [Access to `#[repr(packed)]` struct fields is now unsafe][44884]
433 - [Cargo sets a different working directory for the compiler][cargo/4788]
434
435 [44884]: https://github.com/rust-lang/rust/pull/44884
436 [45198]: https://github.com/rust-lang/rust/pull/45198
437 [45506]: https://github.com/rust-lang/rust/pull/45506
438 [45904]: https://github.com/rust-lang/rust/pull/45904
439 [45990]: https://github.com/rust-lang/rust/pull/45990
440 [46012]: https://github.com/rust-lang/rust/pull/46012
441 [46077]: https://github.com/rust-lang/rust/pull/46077
442 [46094]: https://github.com/rust-lang/rust/pull/46094
443 [46284]: https://github.com/rust-lang/rust/pull/46284
444 [46287]: https://github.com/rust-lang/rust/pull/46287
445 [46293]: https://github.com/rust-lang/rust/pull/46293
446 [46528]: https://github.com/rust-lang/rust/pull/46528
447 [46671]: https://github.com/rust-lang/rust/pull/46671
448 [46713]: https://github.com/rust-lang/rust/pull/46713
449 [46735]: https://github.com/rust-lang/rust/pull/46735
450 [46749]: https://github.com/rust-lang/rust/pull/46749
451 [46760]: https://github.com/rust-lang/rust/pull/46760
452 [46798]: https://github.com/rust-lang/rust/pull/46798
453 [46828]: https://github.com/rust-lang/rust/pull/46828
454 [46831]: https://github.com/rust-lang/rust/pull/46831
455 [46833]: https://github.com/rust-lang/rust/pull/46833
456 [46910]: https://github.com/rust-lang/rust/pull/46910
457 [46977]: https://github.com/rust-lang/rust/pull/46977
458 [47018]: https://github.com/rust-lang/rust/pull/47018
459 [47080]: https://github.com/rust-lang/rust/pull/47080
460 [47084]: https://github.com/rust-lang/rust/pull/47084
461 [cargo/4743]: https://github.com/rust-lang/cargo/pull/4743
462 [cargo/4788]: https://github.com/rust-lang/cargo/pull/4788
463 [cargo/4817]: https://github.com/rust-lang/cargo/pull/4817
464 [`RefCell::replace`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.replace
465 [`RefCell::swap`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.swap
466 [`atomic::spin_loop_hint`]: https://doc.rust-lang.org/std/sync/atomic/fn.spin_loop_hint.html
467
468
469 Version 1.23.0 (2018-01-04)
470 ==========================
471
472 Language
473 --------
474 - [Arbitrary `auto` traits are now permitted in trait objects.][45772]
475 - [rustc now uses subtyping on the left hand side of binary operations.][45435]
476   Which should fix some confusing errors in some operations.
477
478 Compiler
479 --------
480 - [Enabled `TrapUnreachable` in LLVM which should mitigate the impact of
481   undefined behaviour.][45920]
482 - [rustc now suggests renaming import if names clash.][45660]
483 - [Display errors/warnings correctly when there are zero-width or
484   wide characters.][45711]
485 - [rustc now avoids unnecessary copies of arguments that are
486   simple bindings][45380] This should improve memory usage on average by 5-10%.
487 - [Updated musl used to build musl rustc to 1.1.17][45393]
488
489 Libraries
490 ---------
491 - [Allow a trailing comma in `assert_eq/ne` macro][45887]
492 - [Implement Hash for raw pointers to unsized types][45483]
493 - [impl `From<*mut T>` for `AtomicPtr<T>`][45610]
494 - [impl `From<usize/isize>` for `AtomicUsize/AtomicIsize`.][45610]
495 - [Removed the `T: Sync` requirement for `RwLock<T>: Send`][45267]
496 - [Removed `T: Sized` requirement for `{<*const T>, <*mut T>}::as_ref`
497   and `<*mut T>::as_mut`][44932]
498 - [Optimized `Thread::{park, unpark}` implementation][45524]
499 - [Improved `SliceExt::binary_search` performance.][45333]
500 - [impl `FromIterator<()>` for `()`][45379]
501 - [Copied `AsciiExt` trait methods to primitive types.][44042] Use of `AsciiExt`
502   is now deprecated.
503
504 Stabilized APIs
505 ---------------
506
507 Cargo
508 -----
509 - [Cargo now supports uninstallation of multiple packages][cargo/4561]
510   eg. `cargo uninstall foo bar` uninstalls `foo` and `bar`.
511 - [Added unit test checking to `cargo check`][cargo/4592]
512 - [Cargo now lets you install a specific version
513   using `cargo install --version`][cargo/4637]
514
515 Misc
516 ----
517 - [Releases now ship with the Cargo book documentation.][45692]
518 - [rustdoc now prints rendering warnings on every run.][45324]
519
520 Compatibility Notes
521 -------------------
522 - [Changes have been made to type equality to make it more correct,
523   in rare cases this could break some code.][45853] [Tracking issue for
524   further information][45852]
525 - [`char::escape_debug` now uses Unicode 10 over 9.][45571]
526 - [Upgraded Android SDK to 27, and NDK to r15c.][45580] This drops support for
527   Android 9, the minimum supported version is Android 14.
528 - [Bumped the minimum LLVM to 3.9][45326]
529
530 [44042]: https://github.com/rust-lang/rust/pull/44042
531 [44932]: https://github.com/rust-lang/rust/pull/44932
532 [45267]: https://github.com/rust-lang/rust/pull/45267
533 [45324]: https://github.com/rust-lang/rust/pull/45324
534 [45326]: https://github.com/rust-lang/rust/pull/45326
535 [45333]: https://github.com/rust-lang/rust/pull/45333
536 [45379]: https://github.com/rust-lang/rust/pull/45379
537 [45380]: https://github.com/rust-lang/rust/pull/45380
538 [45393]: https://github.com/rust-lang/rust/pull/45393
539 [45435]: https://github.com/rust-lang/rust/pull/45435
540 [45483]: https://github.com/rust-lang/rust/pull/45483
541 [45524]: https://github.com/rust-lang/rust/pull/45524
542 [45571]: https://github.com/rust-lang/rust/pull/45571
543 [45580]: https://github.com/rust-lang/rust/pull/45580
544 [45610]: https://github.com/rust-lang/rust/pull/45610
545 [45660]: https://github.com/rust-lang/rust/pull/45660
546 [45692]: https://github.com/rust-lang/rust/pull/45692
547 [45711]: https://github.com/rust-lang/rust/pull/45711
548 [45772]: https://github.com/rust-lang/rust/pull/45772
549 [45852]: https://github.com/rust-lang/rust/issues/45852
550 [45853]: https://github.com/rust-lang/rust/pull/45853
551 [45887]: https://github.com/rust-lang/rust/pull/45887
552 [45920]: https://github.com/rust-lang/rust/pull/45920
553 [cargo/4561]: https://github.com/rust-lang/cargo/pull/4561
554 [cargo/4592]: https://github.com/rust-lang/cargo/pull/4592
555 [cargo/4637]: https://github.com/rust-lang/cargo/pull/4637
556
557
558 Version 1.22.1 (2017-11-22)
559 ==========================
560
561 - [Update Cargo to fix an issue with macOS 10.13 "High Sierra"][46183]
562
563 [46183]: https://github.com/rust-lang/rust/pull/46183
564
565 Version 1.22.0 (2017-11-22)
566 ==========================
567
568 Language
569 --------
570 - [`non_snake_case` lint now allows extern no-mangle functions][44966]
571 - [Now accepts underscores in unicode escapes][43716]
572 - [`T op= &T` now works for numeric types.][44287] eg. `let mut x = 2; x += &8;`
573 - [types that impl `Drop` are now allowed in `const` and `static` types][44456]
574
575 Compiler
576 --------
577 - [rustc now defaults to having 16 codegen units at debug on supported platforms.][45064]
578 - [rustc will no longer inline in codegen units when compiling for debug][45075]
579   This should decrease compile times for debug builds.
580 - [strict memory alignment now enabled on ARMv6][45094]
581 - [Remove support for the PNaCl target `le32-unknown-nacl`][45041]
582
583 Libraries
584 ---------
585 - [Allow atomic operations up to 32 bits
586   on `armv5te_unknown_linux_gnueabi`][44978]
587 - [`Box<Error>` now impls `From<Cow<str>>`][44466]
588 - [`std::mem::Discriminant` is now guaranteed to be `Send + Sync`][45095]
589 - [`fs::copy` now returns the length of the main stream on NTFS.][44895]
590 - [Properly detect overflow in `Instant += Duration`.][44220]
591 - [impl `Hasher` for `{&mut Hasher, Box<Hasher>}`][44015]
592 - [impl `fmt::Debug` for `SplitWhitespace`.][44303]
593 - [`Option<T>` now impls `Try`][42526] This allows for using `?` with `Option` types.
594
595 Stabilized APIs
596 ---------------
597
598 Cargo
599 -----
600 - [Cargo will now build multi file examples in subdirectories of the `examples`
601   folder that have a `main.rs` file.][cargo/4496]
602 - [Changed `[root]` to `[package]` in `Cargo.lock`][cargo/4571] Packages with
603   the old format will continue to work and can be updated with `cargo update`.
604 - [Now supports vendoring git repositories][cargo/3992]
605
606 Misc
607 ----
608 - [`libbacktrace` is now available on Apple platforms.][44251]
609 - [Stabilised the `compile_fail` attribute for code fences in doc-comments.][43949]
610   This now lets you specify that a given code example will fail to compile.
611
612 Compatibility Notes
613 -------------------
614 - [The minimum Android version that rustc can build for has been bumped
615   to `4.0` from `2.3`][45656]
616 - [Allowing `T op= &T` for numeric types has broken some type
617   inference cases][45480]
618
619
620 [42526]: https://github.com/rust-lang/rust/pull/42526
621 [43017]: https://github.com/rust-lang/rust/pull/43017
622 [43716]: https://github.com/rust-lang/rust/pull/43716
623 [43949]: https://github.com/rust-lang/rust/pull/43949
624 [44015]: https://github.com/rust-lang/rust/pull/44015
625 [44220]: https://github.com/rust-lang/rust/pull/44220
626 [44251]: https://github.com/rust-lang/rust/pull/44251
627 [44287]: https://github.com/rust-lang/rust/pull/44287
628 [44303]: https://github.com/rust-lang/rust/pull/44303
629 [44456]: https://github.com/rust-lang/rust/pull/44456
630 [44466]: https://github.com/rust-lang/rust/pull/44466
631 [44895]: https://github.com/rust-lang/rust/pull/44895
632 [44966]: https://github.com/rust-lang/rust/pull/44966
633 [44978]: https://github.com/rust-lang/rust/pull/44978
634 [45041]: https://github.com/rust-lang/rust/pull/45041
635 [45064]: https://github.com/rust-lang/rust/pull/45064
636 [45075]: https://github.com/rust-lang/rust/pull/45075
637 [45094]: https://github.com/rust-lang/rust/pull/45094
638 [45095]: https://github.com/rust-lang/rust/pull/45095
639 [45480]: https://github.com/rust-lang/rust/issues/45480
640 [45656]: https://github.com/rust-lang/rust/pull/45656
641 [cargo/3992]: https://github.com/rust-lang/cargo/pull/3992
642 [cargo/4496]: https://github.com/rust-lang/cargo/pull/4496
643 [cargo/4571]: https://github.com/rust-lang/cargo/pull/4571
644
645
646
647
648
649
650 Version 1.21.0 (2017-10-12)
651 ==========================
652
653 Language
654 --------
655 - [You can now use static references for literals.][43838]
656   Example:
657   ```rust
658   fn main() {
659       let x: &'static u32 = &0;
660   }
661   ```
662 - [Relaxed path syntax. Optional `::` before `<` is now allowed in all contexts.][43540]
663   Example:
664   ```rust
665   my_macro!(Vec<i32>::new); // Always worked
666   my_macro!(Vec::<i32>::new); // Now works
667   ```
668
669 Compiler
670 --------
671 - [Upgraded jemalloc to 4.5.0][43911]
672 - [Enabled unwinding panics on Redox][43917]
673 - [Now runs LLVM in parallel during translation phase.][43506]
674   This should reduce peak memory usage.
675
676 Libraries
677 ---------
678 - [Generate builtin impls for `Clone` for all arrays and tuples that
679   are `T: Clone`][43690]
680 - [`Stdin`, `Stdout`, and `Stderr` now implement `AsRawFd`.][43459]
681 - [`Rc` and `Arc` now implement `From<&[T]> where T: Clone`, `From<str>`,
682   `From<String>`, `From<Box<T>> where T: ?Sized`, and `From<Vec<T>>`.][42565]
683
684 Stabilized APIs
685 ---------------
686
687 [`std::mem::discriminant`]
688
689 Cargo
690 -----
691 - [You can now call `cargo install` with multiple package names][cargo/4216]
692 - [Cargo commands inside a virtual workspace will now implicitly
693   pass `--all`][cargo/4335]
694 - [Added a `[patch]` section to `Cargo.toml` to handle
695   prepublication dependencies][cargo/4123] [RFC 1969]
696 - [`include` & `exclude` fields in `Cargo.toml` now accept gitignore
697   like patterns][cargo/4270]
698 - [Added the `--all-targets` option][cargo/4400]
699 - [Using required dependencies as a feature is now deprecated and emits
700   a warning][cargo/4364]
701
702
703 Misc
704 ----
705 - [Cargo docs are moving][43916]
706   to [doc.rust-lang.org/cargo](https://doc.rust-lang.org/cargo)
707 - [The rustdoc book is now available][43863]
708   at [doc.rust-lang.org/rustdoc](https://doc.rust-lang.org/rustdoc)
709 - [Added a preview of RLS has been made available through rustup][44204]
710   Install with `rustup component add rls-preview`
711 - [`std::os` documentation for Unix, Linux, and Windows now appears on doc.rust-lang.org][43348]
712   Previously only showed `std::os::unix`.
713
714 Compatibility Notes
715 -------------------
716 - [Changes in method matching against higher-ranked types][43880] This may cause
717   breakage in subtyping corner cases. [A more in-depth explanation is available.][info/43880]
718 - [rustc's JSON error output's byte position start at top of file.][42973]
719   Was previously relative to the rustc's internal `CodeMap` struct which
720   required the unstable library `libsyntax` to correctly use.
721 - [`unused_results` lint no longer ignores booleans][43728]
722
723 [42565]: https://github.com/rust-lang/rust/pull/42565
724 [42973]: https://github.com/rust-lang/rust/pull/42973
725 [43348]: https://github.com/rust-lang/rust/pull/43348
726 [43459]: https://github.com/rust-lang/rust/pull/43459
727 [43506]: https://github.com/rust-lang/rust/pull/43506
728 [43540]: https://github.com/rust-lang/rust/pull/43540
729 [43690]: https://github.com/rust-lang/rust/pull/43690
730 [43728]: https://github.com/rust-lang/rust/pull/43728
731 [43838]: https://github.com/rust-lang/rust/pull/43838
732 [43863]: https://github.com/rust-lang/rust/pull/43863
733 [43880]: https://github.com/rust-lang/rust/pull/43880
734 [43911]: https://github.com/rust-lang/rust/pull/43911
735 [43916]: https://github.com/rust-lang/rust/pull/43916
736 [43917]: https://github.com/rust-lang/rust/pull/43917
737 [44204]: https://github.com/rust-lang/rust/pull/44204
738 [cargo/4123]: https://github.com/rust-lang/cargo/pull/4123
739 [cargo/4216]: https://github.com/rust-lang/cargo/pull/4216
740 [cargo/4270]: https://github.com/rust-lang/cargo/pull/4270
741 [cargo/4335]: https://github.com/rust-lang/cargo/pull/4335
742 [cargo/4364]: https://github.com/rust-lang/cargo/pull/4364
743 [cargo/4400]: https://github.com/rust-lang/cargo/pull/4400
744 [RFC 1969]: https://github.com/rust-lang/rfcs/pull/1969
745 [info/43880]: https://github.com/rust-lang/rust/issues/44224#issuecomment-330058902
746 [`std::mem::discriminant`]: https://doc.rust-lang.org/std/mem/fn.discriminant.html
747
748 Version 1.20.0 (2017-08-31)
749 ===========================
750
751 Language
752 --------
753 - [Associated constants are now stabilised.][42809]
754 - [A lot of macro bugs are now fixed.][42913]
755
756 Compiler
757 --------
758
759 - [Struct fields are now properly coerced to the expected field type.][42807]
760 - [Enabled wasm LLVM backend][42571] WASM can now be built with the
761   `wasm32-experimental-emscripten` target.
762 - [Changed some of the error messages to be more helpful.][42033]
763 - [Add support for RELRO(RELocation Read-Only) for platforms that support
764   it.][43170]
765 - [rustc now reports the total number of errors on compilation failure][43015]
766   previously this was only the number of errors in the pass that failed.
767 - [Expansion in rustc has been sped up 29x.][42533]
768 - [added `msp430-none-elf` target.][43099]
769 - [rustc will now suggest one-argument enum variant to fix type mismatch when
770   applicable][43178]
771 - [Fixes backtraces on Redox][43228]
772 - [rustc now identifies different versions of same crate when absolute paths of
773   different types match in an error message.][42826]
774
775 Libraries
776 ---------
777
778
779 - [Relaxed Debug constraints on `{HashMap,BTreeMap}::{Keys,Values}`.][42854]
780 - [Impl `PartialEq`, `Eq`, `PartialOrd`, `Ord`, `Debug`, `Hash` for unsized
781   tuples.][43011]
782 - [Impl `fmt::{Display, Debug}` for `Ref`, `RefMut`, `MutexGuard`,
783   `RwLockReadGuard`, `RwLockWriteGuard`][42822]
784 - [Impl `Clone` for `DefaultHasher`.][42799]
785 - [Impl `Sync` for `SyncSender`.][42397]
786 - [Impl `FromStr` for `char`][42271]
787 - [Fixed how `{f32, f64}::{is_sign_negative, is_sign_positive}` handles
788   NaN.][42431]
789 - [allow messages in the `unimplemented!()` macro.][42155]
790   ie. `unimplemented!("Waiting for 1.21 to be stable")`
791 - [`pub(restricted)` is now supported in the `thread_local!` macro.][43185]
792 - [Upgrade to Unicode 10.0.0][42999]
793 - [Reimplemented `{f32, f64}::{min, max}` in Rust instead of using CMath.][42430]
794 - [Skip the main thread's manual stack guard on Linux][43072]
795 - [Iterator::nth for `ops::{Range, RangeFrom}` is now done in O(1) time][43077]
796 - [`#[repr(align(N))]` attribute max number is now 2^31 - 1.][43097] This was
797   previously 2^15.
798 - [`{OsStr, Path}::Display` now avoids allocations where possible][42613]
799
800 Stabilized APIs
801 ---------------
802
803 - [`CStr::into_c_string`]
804 - [`CString::as_c_str`]
805 - [`CString::into_boxed_c_str`]
806 - [`Chain::get_mut`]
807 - [`Chain::get_ref`]
808 - [`Chain::into_inner`]
809 - [`Option::get_or_insert_with`]
810 - [`Option::get_or_insert`]
811 - [`OsStr::into_os_string`]
812 - [`OsString::into_boxed_os_str`]
813 - [`Take::get_mut`]
814 - [`Take::get_ref`]
815 - [`Utf8Error::error_len`]
816 - [`char::EscapeDebug`]
817 - [`char::escape_debug`]
818 - [`compile_error!`]
819 - [`f32::from_bits`]
820 - [`f32::to_bits`]
821 - [`f64::from_bits`]
822 - [`f64::to_bits`]
823 - [`mem::ManuallyDrop`]
824 - [`slice::sort_unstable_by_key`]
825 - [`slice::sort_unstable_by`]
826 - [`slice::sort_unstable`]
827 - [`str::from_boxed_utf8_unchecked`]
828 - [`str::as_bytes_mut`]
829 - [`str::as_bytes_mut`]
830 - [`str::from_utf8_mut`]
831 - [`str::from_utf8_unchecked_mut`]
832 - [`str::get_mut`]
833 - [`str::get_unchecked_mut`]
834 - [`str::get_unchecked`]
835 - [`str::get`]
836 - [`str::into_boxed_bytes`]
837
838
839 Cargo
840 -----
841 - [Cargo API token location moved from `~/.cargo/config` to
842   `~/.cargo/credentials`.][cargo/3978]
843 - [Cargo will now build `main.rs` binaries that are in sub-directories of
844   `src/bin`.][cargo/4214] ie. Having `src/bin/server/main.rs` and
845   `src/bin/client/main.rs` generates `target/debug/server` and `target/debug/client`
846 - [You can now specify version of a binary when installed through
847   `cargo install` using `--vers`.][cargo/4229]
848 - [Added `--no-fail-fast` flag to cargo to run all benchmarks regardless of
849   failure.][cargo/4248]
850 - [Changed the convention around which file is the crate root.][cargo/4259]
851 - [The `include`/`exclude` property in `Cargo.toml` now accepts gitignore paths
852   instead of glob patterns][cargo/4270]. Glob patterns are now deprecated.
853
854 Compatibility Notes
855 -------------------
856
857 - [Functions with `'static` in their return types will now not be as usable as
858   if they were using lifetime parameters instead.][42417]
859 - [The reimplementation of `{f32, f64}::is_sign_{negative, positive}` now
860   takes the sign of NaN into account where previously didn't.][42430]
861
862 [42033]: https://github.com/rust-lang/rust/pull/42033
863 [42155]: https://github.com/rust-lang/rust/pull/42155
864 [42271]: https://github.com/rust-lang/rust/pull/42271
865 [42397]: https://github.com/rust-lang/rust/pull/42397
866 [42417]: https://github.com/rust-lang/rust/pull/42417
867 [42430]: https://github.com/rust-lang/rust/pull/42430
868 [42431]: https://github.com/rust-lang/rust/pull/42431
869 [42533]: https://github.com/rust-lang/rust/pull/42533
870 [42571]: https://github.com/rust-lang/rust/pull/42571
871 [42613]: https://github.com/rust-lang/rust/pull/42613
872 [42799]: https://github.com/rust-lang/rust/pull/42799
873 [42807]: https://github.com/rust-lang/rust/pull/42807
874 [42809]: https://github.com/rust-lang/rust/pull/42809
875 [42822]: https://github.com/rust-lang/rust/pull/42822
876 [42826]: https://github.com/rust-lang/rust/pull/42826
877 [42854]: https://github.com/rust-lang/rust/pull/42854
878 [42913]: https://github.com/rust-lang/rust/pull/42913
879 [42999]: https://github.com/rust-lang/rust/pull/42999
880 [43011]: https://github.com/rust-lang/rust/pull/43011
881 [43015]: https://github.com/rust-lang/rust/pull/43015
882 [43072]: https://github.com/rust-lang/rust/pull/43072
883 [43077]: https://github.com/rust-lang/rust/pull/43077
884 [43097]: https://github.com/rust-lang/rust/pull/43097
885 [43099]: https://github.com/rust-lang/rust/pull/43099
886 [43170]: https://github.com/rust-lang/rust/pull/43170
887 [43178]: https://github.com/rust-lang/rust/pull/43178
888 [43185]: https://github.com/rust-lang/rust/pull/43185
889 [43228]: https://github.com/rust-lang/rust/pull/43228
890 [cargo/3978]: https://github.com/rust-lang/cargo/pull/3978
891 [cargo/4214]: https://github.com/rust-lang/cargo/pull/4214
892 [cargo/4229]: https://github.com/rust-lang/cargo/pull/4229
893 [cargo/4248]: https://github.com/rust-lang/cargo/pull/4248
894 [cargo/4259]: https://github.com/rust-lang/cargo/pull/4259
895 [cargo/4270]: https://github.com/rust-lang/cargo/pull/4270
896 [`CStr::into_c_string`]: https://doc.rust-lang.org/std/ffi/struct.CStr.html#method.into_c_string
897 [`CString::as_c_str`]: https://doc.rust-lang.org/std/ffi/struct.CString.html#method.as_c_str
898 [`CString::into_boxed_c_str`]: https://doc.rust-lang.org/std/ffi/struct.CString.html#method.into_boxed_c_str
899 [`Chain::get_mut`]: https://doc.rust-lang.org/std/io/struct.Chain.html#method.get_mut
900 [`Chain::get_ref`]: https://doc.rust-lang.org/std/io/struct.Chain.html#method.get_ref
901 [`Chain::into_inner`]: https://doc.rust-lang.org/std/io/struct.Chain.html#method.into_inner
902 [`Option::get_or_insert_with`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.get_or_insert_with
903 [`Option::get_or_insert`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.get_or_insert
904 [`OsStr::into_os_string`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html#method.into_os_string
905 [`OsString::into_boxed_os_str`]: https://doc.rust-lang.org/std/ffi/struct.OsString.html#method.into_boxed_os_str
906 [`Take::get_mut`]: https://doc.rust-lang.org/std/io/struct.Take.html#method.get_mut
907 [`Take::get_ref`]: https://doc.rust-lang.org/std/io/struct.Take.html#method.get_ref
908 [`Utf8Error::error_len`]: https://doc.rust-lang.org/std/str/struct.Utf8Error.html#method.error_len
909 [`char::EscapeDebug`]: https://doc.rust-lang.org/std/char/struct.EscapeDebug.html
910 [`char::escape_debug`]: https://doc.rust-lang.org/std/primitive.char.html#method.escape_debug
911 [`compile_error!`]: https://doc.rust-lang.org/std/macro.compile_error.html
912 [`f32::from_bits`]: https://doc.rust-lang.org/std/primitive.f32.html#method.from_bits
913 [`f32::to_bits`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_bits
914 [`f64::from_bits`]: https://doc.rust-lang.org/std/primitive.f64.html#method.from_bits
915 [`f64::to_bits`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_bits
916 [`mem::ManuallyDrop`]: https://doc.rust-lang.org/std/mem/union.ManuallyDrop.html
917 [`slice::sort_unstable_by_key`]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_unstable_by_key
918 [`slice::sort_unstable_by`]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_unstable_by
919 [`slice::sort_unstable`]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_unstable
920 [`str::from_boxed_utf8_unchecked`]: https://doc.rust-lang.org/std/str/fn.from_boxed_utf8_unchecked.html
921 [`str::as_bytes_mut`]: https://doc.rust-lang.org/std/primitive.str.html#method.as_bytes_mut
922 [`str::from_utf8_mut`]: https://doc.rust-lang.org/std/str/fn.from_utf8_mut.html
923 [`str::from_utf8_unchecked_mut`]: https://doc.rust-lang.org/std/str/fn.from_utf8_unchecked_mut.html
924 [`str::get_mut`]: https://doc.rust-lang.org/std/primitive.str.html#method.get_mut
925 [`str::get_unchecked_mut`]: https://doc.rust-lang.org/std/primitive.str.html#method.get_unchecked_mut
926 [`str::get_unchecked`]: https://doc.rust-lang.org/std/primitive.str.html#method.get_unchecked
927 [`str::get`]: https://doc.rust-lang.org/std/primitive.str.html#method.get
928 [`str::into_boxed_bytes`]: https://doc.rust-lang.org/std/primitive.str.html#method.into_boxed_bytes
929
930
931 Version 1.19.0 (2017-07-20)
932 ===========================
933
934 Language
935 --------
936
937 - [Numeric fields can now be used for creating tuple structs.][41145] [RFC 1506]
938   For example `struct Point(u32, u32); let x = Point { 0: 7, 1: 0 };`.
939 - [Macro recursion limit increased to 1024 from 64.][41676]
940 - [Added lint for detecting unused macros.][41907]
941 - [`loop` can now return a value with `break`.][42016] [RFC 1624]
942   For example: `let x = loop { break 7; };`
943 - [C compatible `union`s are now available.][42068] [RFC 1444] They can only
944   contain `Copy` types and cannot have a `Drop` implementation.
945   Example: `union Foo { bar: u8, baz: usize }`
946 - [Non capturing closures can now be coerced into `fn`s,][42162] [RFC 1558]
947   Example: `let foo: fn(u8) -> u8 = |v: u8| { v };`
948
949 Compiler
950 --------
951
952 - [Add support for bootstrapping the Rust compiler toolchain on Android.][41370]
953 - [Change `arm-linux-androideabi` to correspond to the `armeabi`
954   official ABI.][41656] If you wish to continue targeting the `armeabi-v7a` ABI
955   you should use `--target armv7-linux-androideabi`.
956 - [Fixed ICE when removing a source file between compilation sessions.][41873]
957 - [Minor optimisation of string operations.][42037]
958 - [Compiler error message is now `aborting due to previous error(s)` instead of
959   `aborting due to N previous errors`][42150] This was previously inaccurate and
960   would only count certain kinds of errors.
961 - [The compiler now supports Visual Studio 2017][42225]
962 - [The compiler is now built against LLVM 4.0.1 by default][42948]
963 - [Added a lot][42264] of [new error codes][42302]
964 - [Added `target-feature=+crt-static` option][37406] [RFC 1721] Which allows
965   libraries with C Run-time Libraries(CRT) to be statically linked.
966 - [Fixed various ARM codegen bugs][42740]
967
968 Libraries
969 ---------
970
971 - [`String` now implements `FromIterator<Cow<'a, str>>` and
972   `Extend<Cow<'a, str>>`][41449]
973 - [`Vec` now implements `From<&mut [T]>`][41530]
974 - [`Box<[u8]>` now implements `From<Box<str>>`][41258]
975 - [`SplitWhitespace` now implements `Clone`][41659]
976 - [`[u8]::reverse` is now 5x faster and `[u16]::reverse` is now
977   1.5x faster][41764]
978 - [`eprint!` and `eprintln!` macros added to prelude.][41192] Same as the `print!`
979   macros, but for printing to stderr.
980
981 Stabilized APIs
982 ---------------
983
984 - [`OsString::shrink_to_fit`]
985 - [`cmp::Reverse`]
986 - [`Command::envs`]
987 - [`thread::ThreadId`]
988
989 Cargo
990 -----
991
992 - [Build scripts can now add environment variables to the environment
993   the crate is being compiled in.
994   Example: `println!("cargo:rustc-env=FOO=bar");`][cargo/3929]
995 - [Subcommands now replace the current process rather than spawning a new
996   child process][cargo/3970]
997 - [Workspace members can now accept glob file patterns][cargo/3979]
998 - [Added `--all` flag to the `cargo bench` subcommand to run benchmarks of all
999   the members in a given workspace.][cargo/3988]
1000 - [Updated `libssh2-sys` to 0.2.6][cargo/4008]
1001 - [Target directory path is now in the cargo metadata][cargo/4022]
1002 - [Cargo no longer checks out a local working directory for the
1003   crates.io index][cargo/4026] This should provide smaller file size for the
1004   registry, and improve cloning times, especially on Windows machines.
1005 - [Added an `--exclude` option for excluding certain packages when using the
1006   `--all` option][cargo/4031]
1007 - [Cargo will now automatically retry when receiving a 5xx error
1008   from crates.io][cargo/4032]
1009 - [The `--features` option now accepts multiple comma or space
1010   delimited values.][cargo/4084]
1011 - [Added support for custom target specific runners][cargo/3954]
1012
1013 Misc
1014 ----
1015
1016 - [Added `rust-windbg.cmd`][39983] for loading rust `.natvis` files in the
1017   Windows Debugger.
1018 - [Rust will now release XZ compressed packages][rust-installer/57]
1019 - [rustup will now prefer to download rust packages with
1020   XZ compression][rustup/1100] over GZip packages.
1021 - [Added the ability to escape `#` in rust documentation][41785] By adding
1022   additional `#`'s ie. `##` is now `#`
1023
1024 Compatibility Notes
1025 -------------------
1026
1027 - [`MutexGuard<T>` may only be `Sync` if `T` is `Sync`.][41624]
1028 - [`-Z` flags are now no longer allowed to be used on the stable
1029   compiler.][41751] This has been a warning for a year previous to this.
1030 - [As a result of the `-Z` flag change, the `cargo-check` plugin no
1031   longer works][42844]. Users should migrate to the built-in `check`
1032   command, which has been available since 1.16.
1033 - [Ending a float literal with `._` is now a hard error.
1034   Example: `42._` .][41946]
1035 - [Any use of a private `extern crate` outside of its module is now a
1036   hard error.][36886] This was previously a warning.
1037 - [`use ::self::foo;` is now a hard error.][36888] `self` paths are always
1038   relative while the `::` prefix makes a path absolute, but was ignored and the
1039   path was relative regardless.
1040 - [Floating point constants in match patterns is now a hard error][36890]
1041   This was previously a warning.
1042 - [Struct or enum constants that don't derive `PartialEq` & `Eq` used
1043   match patterns is now a hard error][36891] This was previously a warning.
1044 - [Lifetimes named `'_` are no longer allowed.][36892] This was previously
1045   a warning.
1046 - [From the pound escape, lines consisting of multiple `#`s are
1047   now visible][41785]
1048 - [It is an error to re-export private enum variants][42460]. This is
1049   known to break a number of crates that depend on an older version of
1050   mustache.
1051 - [On Windows, if `VCINSTALLDIR` is set incorrectly, `rustc` will try
1052   to use it to find the linker, and the build will fail where it did
1053   not previously][42607]
1054
1055 [36886]: https://github.com/rust-lang/rust/issues/36886
1056 [36888]: https://github.com/rust-lang/rust/issues/36888
1057 [36890]: https://github.com/rust-lang/rust/issues/36890
1058 [36891]: https://github.com/rust-lang/rust/issues/36891
1059 [36892]: https://github.com/rust-lang/rust/issues/36892
1060 [37406]: https://github.com/rust-lang/rust/issues/37406
1061 [39983]: https://github.com/rust-lang/rust/pull/39983
1062 [41145]: https://github.com/rust-lang/rust/pull/41145
1063 [41192]: https://github.com/rust-lang/rust/pull/41192
1064 [41258]: https://github.com/rust-lang/rust/pull/41258
1065 [41370]: https://github.com/rust-lang/rust/pull/41370
1066 [41449]: https://github.com/rust-lang/rust/pull/41449
1067 [41530]: https://github.com/rust-lang/rust/pull/41530
1068 [41624]: https://github.com/rust-lang/rust/pull/41624
1069 [41656]: https://github.com/rust-lang/rust/pull/41656
1070 [41659]: https://github.com/rust-lang/rust/pull/41659
1071 [41676]: https://github.com/rust-lang/rust/pull/41676
1072 [41751]: https://github.com/rust-lang/rust/pull/41751
1073 [41764]: https://github.com/rust-lang/rust/pull/41764
1074 [41785]: https://github.com/rust-lang/rust/pull/41785
1075 [41873]: https://github.com/rust-lang/rust/pull/41873
1076 [41907]: https://github.com/rust-lang/rust/pull/41907
1077 [41946]: https://github.com/rust-lang/rust/pull/41946
1078 [42016]: https://github.com/rust-lang/rust/pull/42016
1079 [42037]: https://github.com/rust-lang/rust/pull/42037
1080 [42068]: https://github.com/rust-lang/rust/pull/42068
1081 [42150]: https://github.com/rust-lang/rust/pull/42150
1082 [42162]: https://github.com/rust-lang/rust/pull/42162
1083 [42225]: https://github.com/rust-lang/rust/pull/42225
1084 [42264]: https://github.com/rust-lang/rust/pull/42264
1085 [42302]: https://github.com/rust-lang/rust/pull/42302
1086 [42460]: https://github.com/rust-lang/rust/issues/42460
1087 [42607]: https://github.com/rust-lang/rust/issues/42607
1088 [42740]: https://github.com/rust-lang/rust/pull/42740
1089 [42844]: https://github.com/rust-lang/rust/issues/42844
1090 [42948]: https://github.com/rust-lang/rust/pull/42948
1091 [RFC 1444]: https://github.com/rust-lang/rfcs/pull/1444
1092 [RFC 1506]: https://github.com/rust-lang/rfcs/pull/1506
1093 [RFC 1558]: https://github.com/rust-lang/rfcs/pull/1558
1094 [RFC 1624]: https://github.com/rust-lang/rfcs/pull/1624
1095 [RFC 1721]: https://github.com/rust-lang/rfcs/pull/1721
1096 [`Command::envs`]: https://doc.rust-lang.org/std/process/struct.Command.html#method.envs
1097 [`OsString::shrink_to_fit`]: https://doc.rust-lang.org/std/ffi/struct.OsString.html#method.shrink_to_fit
1098 [`cmp::Reverse`]: https://doc.rust-lang.org/std/cmp/struct.Reverse.html
1099 [`thread::ThreadId`]: https://doc.rust-lang.org/std/thread/struct.ThreadId.html
1100 [cargo/3929]: https://github.com/rust-lang/cargo/pull/3929
1101 [cargo/3954]: https://github.com/rust-lang/cargo/pull/3954
1102 [cargo/3970]: https://github.com/rust-lang/cargo/pull/3970
1103 [cargo/3979]: https://github.com/rust-lang/cargo/pull/3979
1104 [cargo/3988]: https://github.com/rust-lang/cargo/pull/3988
1105 [cargo/4008]: https://github.com/rust-lang/cargo/pull/4008
1106 [cargo/4022]: https://github.com/rust-lang/cargo/pull/4022
1107 [cargo/4026]: https://github.com/rust-lang/cargo/pull/4026
1108 [cargo/4031]: https://github.com/rust-lang/cargo/pull/4031
1109 [cargo/4032]: https://github.com/rust-lang/cargo/pull/4032
1110 [cargo/4084]: https://github.com/rust-lang/cargo/pull/4084
1111 [rust-installer/57]: https://github.com/rust-lang/rust-installer/pull/57
1112 [rustup/1100]: https://github.com/rust-lang-nursery/rustup.rs/pull/1100
1113
1114
1115 Version 1.18.0 (2017-06-08)
1116 ===========================
1117
1118 Language
1119 --------
1120
1121 - [Stabilize pub(restricted)][40556] `pub` can now accept a module path to
1122   make the item visible to just that module tree. Also accepts the keyword
1123   `crate` to make something public to the whole crate but not users of the
1124   library. Example: `pub(crate) mod utils;`. [RFC 1422].
1125 - [Stabilize `#![windows_subsystem]` attribute][40870] conservative exposure of the
1126   `/SUBSYSTEM` linker flag on Windows platforms. [RFC 1665].
1127 - [Refactor of trait object type parsing][40043] Now `ty` in macros can accept
1128   types like `Write + Send`, trailing `+` are now supported in trait objects,
1129   and better error reporting for trait objects starting with `?Sized`.
1130 - [0e+10 is now a valid floating point literal][40589]
1131 - [Now warns if you bind a lifetime parameter to 'static][40734]
1132 - [Tuples, Enum variant fields, and structs with no `repr` attribute or with
1133   `#[repr(Rust)]` are reordered to minimize padding and produce a smaller
1134   representation in some cases.][40377]
1135
1136 Compiler
1137 --------
1138
1139 - [rustc can now emit mir with `--emit mir`][39891]
1140 - [Improved LLVM IR for trivial functions][40367]
1141 - [Added explanation for E0090(Wrong number of lifetimes are supplied)][40723]
1142 - [rustc compilation is now 15%-20% faster][41469] Thanks to optimisation
1143   opportunities found through profiling
1144 - [Improved backtrace formatting when panicking][38165]
1145
1146 Libraries
1147 ---------
1148
1149 - [Specialized `Vec::from_iter` being passed `vec::IntoIter`][40731] if the
1150   iterator hasn't been advanced the original `Vec` is reassembled with no actual
1151   iteration or reallocation.
1152 - [Simplified HashMap Bucket interface][40561] provides performance
1153   improvements for iterating and cloning.
1154 - [Specialize Vec::from_elem to use calloc][40409]
1155 - [Fixed Race condition in fs::create_dir_all][39799]
1156 - [No longer caching stdio on Windows][40516]
1157 - [Optimized insertion sort in slice][40807] insertion sort in some cases
1158   2.50%~ faster and in one case now 12.50% faster.
1159 - [Optimized `AtomicBool::fetch_nand`][41143]
1160
1161 Stabilized APIs
1162 ---------------
1163
1164 - [`Child::try_wait`]
1165 - [`HashMap::retain`]
1166 - [`HashSet::retain`]
1167 - [`PeekMut::pop`]
1168 - [`TcpStream::peek`]
1169 - [`UdpSocket::peek`]
1170 - [`UdpSocket::peek_from`]
1171
1172 Cargo
1173 -----
1174
1175 - [Added partial Pijul support][cargo/3842] Pijul is a version control system in Rust.
1176   You can now create new cargo projects with Pijul using `cargo new --vcs pijul`
1177 - [Now always emits build script warnings for crates that fail to build][cargo/3847]
1178 - [Added Android build support][cargo/3885]
1179 - [Added `--bins` and `--tests` flags][cargo/3901] now you can build all programs
1180   of a certain type, for example `cargo build --bins` will build all
1181   binaries.
1182 - [Added support for haiku][cargo/3952]
1183
1184 Misc
1185 ----
1186
1187 - [rustdoc can now use pulldown-cmark with the `--enable-commonmark` flag][40338]
1188 - [Added rust-windbg script for better debugging on Windows][39983]
1189 - [Rust now uses the official cross compiler for NetBSD][40612]
1190 - [rustdoc now accepts `#` at the start of files][40828]
1191 - [Fixed jemalloc support for musl][41168]
1192
1193 Compatibility Notes
1194 -------------------
1195
1196 - [Changes to how the `0` flag works in format!][40241] Padding zeroes are now
1197   always placed after the sign if it exists and before the digits. With the `#`
1198   flag the zeroes are placed after the prefix and before the digits.
1199 - [Due to the struct field optimisation][40377], using `transmute` on structs
1200   that have no `repr` attribute or `#[repr(Rust)]` will no longer work. This has
1201   always been undefined behavior, but is now more likely to break in practice.
1202 - [The refactor of trait object type parsing][40043] fixed a bug where `+` was
1203   receiving the wrong priority parsing things like `&for<'a> Tr<'a> + Send` as
1204   `&(for<'a> Tr<'a> + Send)` instead of `(&for<'a> Tr<'a>) + Send`
1205 - [Overlapping inherent `impl`s are now a hard error][40728]
1206 - [`PartialOrd` and `Ord` must agree on the ordering.][41270]
1207 - [`rustc main.rs -o out --emit=asm,llvm-ir`][41085] Now will output
1208   `out.asm` and `out.ll` instead of only one of the filetypes.
1209 - [ calling a function that returns `Self` will no longer work][41805] when
1210   the size of `Self` cannot be statically determined.
1211 - [rustc now builds with a "pthreads" flavour of MinGW for Windows GNU][40805]
1212   this has caused a few regressions namely:
1213
1214   - Changed the link order of local static/dynamic libraries (respecting the
1215     order on given rather than having the compiler reorder).
1216   - Changed how MinGW is linked, native code linked to dynamic libraries
1217     may require manually linking to the gcc support library (for the native
1218     code itself)
1219
1220 [38165]: https://github.com/rust-lang/rust/pull/38165
1221 [39799]: https://github.com/rust-lang/rust/pull/39799
1222 [39891]: https://github.com/rust-lang/rust/pull/39891
1223 [39983]: https://github.com/rust-lang/rust/pull/39983
1224 [40043]: https://github.com/rust-lang/rust/pull/40043
1225 [40241]: https://github.com/rust-lang/rust/pull/40241
1226 [40338]: https://github.com/rust-lang/rust/pull/40338
1227 [40367]: https://github.com/rust-lang/rust/pull/40367
1228 [40377]: https://github.com/rust-lang/rust/pull/40377
1229 [40409]: https://github.com/rust-lang/rust/pull/40409
1230 [40516]: https://github.com/rust-lang/rust/pull/40516
1231 [40556]: https://github.com/rust-lang/rust/pull/40556
1232 [40561]: https://github.com/rust-lang/rust/pull/40561
1233 [40589]: https://github.com/rust-lang/rust/pull/40589
1234 [40612]: https://github.com/rust-lang/rust/pull/40612
1235 [40723]: https://github.com/rust-lang/rust/pull/40723
1236 [40728]: https://github.com/rust-lang/rust/pull/40728
1237 [40731]: https://github.com/rust-lang/rust/pull/40731
1238 [40734]: https://github.com/rust-lang/rust/pull/40734
1239 [40805]: https://github.com/rust-lang/rust/pull/40805
1240 [40807]: https://github.com/rust-lang/rust/pull/40807
1241 [40828]: https://github.com/rust-lang/rust/pull/40828
1242 [40870]: https://github.com/rust-lang/rust/pull/40870
1243 [41085]: https://github.com/rust-lang/rust/pull/41085
1244 [41143]: https://github.com/rust-lang/rust/pull/41143
1245 [41168]: https://github.com/rust-lang/rust/pull/41168
1246 [41270]: https://github.com/rust-lang/rust/issues/41270
1247 [41469]: https://github.com/rust-lang/rust/pull/41469
1248 [41805]: https://github.com/rust-lang/rust/issues/41805
1249 [RFC 1422]: https://github.com/rust-lang/rfcs/blob/master/text/1422-pub-restricted.md
1250 [RFC 1665]: https://github.com/rust-lang/rfcs/blob/master/text/1665-windows-subsystem.md
1251 [`Child::try_wait`]: https://doc.rust-lang.org/std/process/struct.Child.html#method.try_wait
1252 [`HashMap::retain`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.retain
1253 [`HashSet::retain`]: https://doc.rust-lang.org/std/collections/struct.HashSet.html#method.retain
1254 [`PeekMut::pop`]: https://doc.rust-lang.org/std/collections/binary_heap/struct.PeekMut.html#method.pop
1255 [`TcpStream::peek`]: https://doc.rust-lang.org/std/net/struct.TcpStream.html#method.peek
1256 [`UdpSocket::peek_from`]: https://doc.rust-lang.org/std/net/struct.UdpSocket.html#method.peek_from
1257 [`UdpSocket::peek`]: https://doc.rust-lang.org/std/net/struct.UdpSocket.html#method.peek
1258 [cargo/3842]: https://github.com/rust-lang/cargo/pull/3842
1259 [cargo/3847]: https://github.com/rust-lang/cargo/pull/3847
1260 [cargo/3885]: https://github.com/rust-lang/cargo/pull/3885
1261 [cargo/3901]: https://github.com/rust-lang/cargo/pull/3901
1262 [cargo/3952]: https://github.com/rust-lang/cargo/pull/3952
1263
1264
1265 Version 1.17.0 (2017-04-27)
1266 ===========================
1267
1268 Language
1269 --------
1270
1271 * [The lifetime of statics and consts defaults to `'static`][39265]. [RFC 1623]
1272 * [Fields of structs may be initialized without duplicating the field/variable
1273   names][39761]. [RFC 1682]
1274 * [`Self` may be included in the `where` clause of `impls`][38864]. [RFC 1647]
1275 * [When coercing to an unsized type lifetimes must be equal][40319]. That is,
1276   there is no subtyping between `T` and `U` when `T: Unsize<U>`. For example,
1277   coercing `&mut [&'a X; N]` to `&mut [&'b X]` requires `'a` be equal to
1278   `'b`. Soundness fix.
1279 * [Values passed to the indexing operator, `[]`, automatically coerce][40166]
1280 * [Static variables may contain references to other statics][40027]
1281
1282 Compiler
1283 --------
1284
1285 * [Exit quickly on only `--emit dep-info`][40336]
1286 * [Make `-C relocation-model` more correctly determine whether the linker
1287   creates a position-independent executable][40245]
1288 * [Add `-C overflow-checks` to directly control whether integer overflow
1289   panics][40037]
1290 * [The rustc type checker now checks items on demand instead of in a single
1291   in-order pass][40008]. This is mostly an internal refactoring in support of
1292   future work, including incremental type checking, but also resolves [RFC
1293   1647], allowing `Self` to appear in `impl` `where` clauses.
1294 * [Optimize vtable loads][39995]
1295 * [Turn off vectorization for Emscripten targets][39990]
1296 * [Provide suggestions for unknown macros imported with `use`][39953]
1297 * [Fix ICEs in path resolution][39939]
1298 * [Strip exception handling code on Emscripten when `panic=abort`][39193]
1299 * [Add clearer error message using `&str + &str`][39116]
1300
1301 Stabilized APIs
1302 ---------------
1303
1304 * [`Arc::into_raw`]
1305 * [`Arc::from_raw`]
1306 * [`Arc::ptr_eq`]
1307 * [`Rc::into_raw`]
1308 * [`Rc::from_raw`]
1309 * [`Rc::ptr_eq`]
1310 * [`Ordering::then`]
1311 * [`Ordering::then_with`]
1312 * [`BTreeMap::range`]
1313 * [`BTreeMap::range_mut`]
1314 * [`collections::Bound`]
1315 * [`process::abort`]
1316 * [`ptr::read_unaligned`]
1317 * [`ptr::write_unaligned`]
1318 * [`Result::expect_err`]
1319 * [`Cell::swap`]
1320 * [`Cell::replace`]
1321 * [`Cell::into_inner`]
1322 * [`Cell::take`]
1323
1324 Libraries
1325 ---------
1326
1327 * [`BTreeMap` and `BTreeSet` can iterate over ranges][27787]
1328 * [`Cell` can store non-`Copy` types][39793]. [RFC 1651]
1329 * [`String` implements `FromIterator<&char>`][40028]
1330 * `Box` [implements][40009] a number of new conversions:
1331   `From<Box<str>> for String`,
1332   `From<Box<[T]>> for Vec<T>`,
1333   `From<Box<CStr>> for CString`,
1334   `From<Box<OsStr>> for OsString`,
1335   `From<Box<Path>> for PathBuf`,
1336   `Into<Box<str>> for String`,
1337   `Into<Box<[T]>> for Vec<T>`,
1338   `Into<Box<CStr>> for CString`,
1339   `Into<Box<OsStr>> for OsString`,
1340   `Into<Box<Path>> for PathBuf`,
1341   `Default for Box<str>`,
1342   `Default for Box<CStr>`,
1343   `Default for Box<OsStr>`,
1344   `From<&CStr> for Box<CStr>`,
1345   `From<&OsStr> for Box<OsStr>`,
1346   `From<&Path> for Box<Path>`
1347 * [`ffi::FromBytesWithNulError` implements `Error` and `Display`][39960]
1348 * [Specialize `PartialOrd<A> for [A] where A: Ord`][39642]
1349 * [Slightly optimize `slice::sort`][39538]
1350 * [Add `ToString` trait specialization for `Cow<'a, str>` and `String`][39440]
1351 * [`Box<[T]>` implements `From<&[T]> where T: Copy`,
1352   `Box<str>` implements `From<&str>`][39438]
1353 * [`IpAddr` implements `From` for various arrays. `SocketAddr` implements
1354   `From<(I, u16)> where I: Into<IpAddr>`][39372]
1355 * [`format!` estimates the needed capacity before writing a string][39356]
1356 * [Support unprivileged symlink creation in Windows][38921]
1357 * [`PathBuf` implements `Default`][38764]
1358 * [Implement `PartialEq<[A]>` for `VecDeque<A>`][38661]
1359 * [`HashMap` resizes adaptively][38368] to guard against DOS attacks
1360   and poor hash functions.
1361
1362 Cargo
1363 -----
1364
1365 * [Add `cargo check --all`][cargo/3731]
1366 * [Add an option to ignore SSL revocation checking][cargo/3699]
1367 * [Add `cargo run --package`][cargo/3691]
1368 * [Add `required_features`][cargo/3667]
1369 * [Assume `build.rs` is a build script][cargo/3664]
1370 * [Find workspace via `workspace_root` link in containing member][cargo/3562]
1371
1372 Misc
1373 ----
1374
1375 * [Documentation is rendered with mdbook instead of the obsolete, in-tree
1376   `rustbook`][39633]
1377 * [The "Unstable Book" documents nightly-only features][ubook]
1378 * [Improve the style of the sidebar in rustdoc output][40265]
1379 * [Configure build correctly on 64-bit CPU's with the armhf ABI][40261]
1380 * [Fix MSP430 breakage due to `i128`][40257]
1381 * [Preliminary Solaris/SPARCv9 support][39903]
1382 * [`rustc` is linked statically on Windows MSVC targets][39837], allowing it to
1383   run without installing the MSVC runtime.
1384 * [`rustdoc --test` includes file names in test names][39788]
1385 * This release includes builds of `std` for `sparc64-unknown-linux-gnu`,
1386   `aarch64-unknown-linux-fuchsia`, and `x86_64-unknown-linux-fuchsia`.
1387 * [Initial support for `aarch64-unknown-freebsd`][39491]
1388 * [Initial support for `i686-unknown-netbsd`][39426]
1389 * [This release no longer includes the old makefile build system][39431]. Rust
1390   is built with a custom build system, written in Rust, and with Cargo.
1391 * [Add Debug implementations for libcollection structs][39002]
1392 * [`TypeId` implements `PartialOrd` and `Ord`][38981]
1393 * [`--test-threads=0` produces an error][38945]
1394 * [`rustup` installs documentation by default][40526]
1395 * [The Rust source includes NatVis visualizations][39843]. These can be used by
1396   WinDbg and Visual Studio to improve the debugging experience.
1397
1398 Compatibility Notes
1399 -------------------
1400
1401 * [Rust 1.17 does not correctly detect the MSVC 2017 linker][38584]. As a
1402   workaround, either use MSVC 2015 or run vcvars.bat.
1403 * [When coercing to an unsized type lifetimes must be equal][40319]. That is,
1404   disallow subtyping between `T` and `U` when `T: Unsize<U>`, e.g. coercing
1405   `&mut [&'a X; N]` to `&mut [&'b X]` requires `'a` be equal to `'b`. Soundness
1406   fix.
1407 * [`format!` and `Display::to_string` panic if an underlying formatting
1408   implementation returns an error][40117]. Previously the error was silently
1409   ignored. It is incorrect for `write_fmt` to return an error when writing
1410   to a string.
1411 * [In-tree crates are verified to be unstable][39851]. Previously, some minor
1412   crates were marked stable and could be accessed from the stable toolchain.
1413 * [Rust git source no longer includes vendored crates][39728]. Those that need
1414   to build with vendored crates should build from release tarballs.
1415 * [Fix inert attributes from `proc_macro_derives`][39572]
1416 * [During crate resolution, rustc prefers a crate in the sysroot if two crates
1417   are otherwise identical][39518]. Unlikely to be encountered outside the Rust
1418   build system.
1419 * [Fixed bugs around how type inference interacts with dead-code][39485]. The
1420   existing code generally ignores the type of dead-code unless a type-hint is
1421   provided; this can cause surprising inference interactions particularly around
1422   defaulting. The new code uniformly ignores the result type of dead-code.
1423 * [Tuple-struct constructors with private fields are no longer visible][38932]
1424 * [Lifetime parameters that do not appear in the arguments are now considered
1425   early-bound][38897], resolving a soundness bug (#[32330]). The
1426   `hr_lifetime_in_assoc_type` future-compatibility lint has been in effect since
1427   April of 2016.
1428 * [rustdoc: fix doctests with non-feature crate attributes][38161]
1429 * [Make transmuting from fn item types to pointer-sized types a hard
1430   error][34198]
1431
1432 [27787]: https://github.com/rust-lang/rust/issues/27787
1433 [32330]: https://github.com/rust-lang/rust/issues/32330
1434 [34198]: https://github.com/rust-lang/rust/pull/34198
1435 [38161]: https://github.com/rust-lang/rust/pull/38161
1436 [38368]: https://github.com/rust-lang/rust/pull/38368
1437 [38584]: https://github.com/rust-lang/rust/issues/38584
1438 [38661]: https://github.com/rust-lang/rust/pull/38661
1439 [38764]: https://github.com/rust-lang/rust/pull/38764
1440 [38864]: https://github.com/rust-lang/rust/issues/38864
1441 [38897]: https://github.com/rust-lang/rust/pull/38897
1442 [38921]: https://github.com/rust-lang/rust/pull/38921
1443 [38932]: https://github.com/rust-lang/rust/pull/38932
1444 [38945]: https://github.com/rust-lang/rust/pull/38945
1445 [38981]: https://github.com/rust-lang/rust/pull/38981
1446 [39002]: https://github.com/rust-lang/rust/pull/39002
1447 [39116]: https://github.com/rust-lang/rust/pull/39116
1448 [39193]: https://github.com/rust-lang/rust/pull/39193
1449 [39265]: https://github.com/rust-lang/rust/pull/39265
1450 [39356]: https://github.com/rust-lang/rust/pull/39356
1451 [39372]: https://github.com/rust-lang/rust/pull/39372
1452 [39426]: https://github.com/rust-lang/rust/pull/39426
1453 [39431]: https://github.com/rust-lang/rust/pull/39431
1454 [39438]: https://github.com/rust-lang/rust/pull/39438
1455 [39440]: https://github.com/rust-lang/rust/pull/39440
1456 [39485]: https://github.com/rust-lang/rust/pull/39485
1457 [39491]: https://github.com/rust-lang/rust/pull/39491
1458 [39518]: https://github.com/rust-lang/rust/pull/39518
1459 [39538]: https://github.com/rust-lang/rust/pull/39538
1460 [39572]: https://github.com/rust-lang/rust/pull/39572
1461 [39633]: https://github.com/rust-lang/rust/pull/39633
1462 [39642]: https://github.com/rust-lang/rust/pull/39642
1463 [39728]: https://github.com/rust-lang/rust/pull/39728
1464 [39761]: https://github.com/rust-lang/rust/pull/39761
1465 [39788]: https://github.com/rust-lang/rust/pull/39788
1466 [39793]: https://github.com/rust-lang/rust/pull/39793
1467 [39837]: https://github.com/rust-lang/rust/pull/39837
1468 [39843]: https://github.com/rust-lang/rust/pull/39843
1469 [39851]: https://github.com/rust-lang/rust/pull/39851
1470 [39903]: https://github.com/rust-lang/rust/pull/39903
1471 [39939]: https://github.com/rust-lang/rust/pull/39939
1472 [39953]: https://github.com/rust-lang/rust/pull/39953
1473 [39960]: https://github.com/rust-lang/rust/pull/39960
1474 [39990]: https://github.com/rust-lang/rust/pull/39990
1475 [39995]: https://github.com/rust-lang/rust/pull/39995
1476 [40008]: https://github.com/rust-lang/rust/pull/40008
1477 [40009]: https://github.com/rust-lang/rust/pull/40009
1478 [40027]: https://github.com/rust-lang/rust/pull/40027
1479 [40028]: https://github.com/rust-lang/rust/pull/40028
1480 [40037]: https://github.com/rust-lang/rust/pull/40037
1481 [40117]: https://github.com/rust-lang/rust/pull/40117
1482 [40166]: https://github.com/rust-lang/rust/pull/40166
1483 [40245]: https://github.com/rust-lang/rust/pull/40245
1484 [40257]: https://github.com/rust-lang/rust/pull/40257
1485 [40261]: https://github.com/rust-lang/rust/pull/40261
1486 [40265]: https://github.com/rust-lang/rust/pull/40265
1487 [40319]: https://github.com/rust-lang/rust/pull/40319
1488 [40336]: https://github.com/rust-lang/rust/pull/40336
1489 [40526]: https://github.com/rust-lang/rust/pull/40526
1490 [RFC 1623]: https://github.com/rust-lang/rfcs/blob/master/text/1623-static.md
1491 [RFC 1647]: https://github.com/rust-lang/rfcs/blob/master/text/1647-allow-self-in-where-clauses.md
1492 [RFC 1651]: https://github.com/rust-lang/rfcs/blob/master/text/1651-movecell.md
1493 [RFC 1682]: https://github.com/rust-lang/rfcs/blob/master/text/1682-field-init-shorthand.md
1494 [`Arc::from_raw`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.from_raw
1495 [`Arc::into_raw`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.into_raw
1496 [`Arc::ptr_eq`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.ptr_eq
1497 [`BTreeMap::range_mut`]: https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.range_mut
1498 [`BTreeMap::range`]: https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.range
1499 [`Cell::into_inner`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.into_inner
1500 [`Cell::replace`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.replace
1501 [`Cell::swap`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.swap
1502 [`Cell::take`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.take
1503 [`Ordering::then_with`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.then_with
1504 [`Ordering::then`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.then
1505 [`Rc::from_raw`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.from_raw
1506 [`Rc::into_raw`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.into_raw
1507 [`Rc::ptr_eq`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.ptr_eq
1508 [`Result::expect_err`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.expect_err
1509 [`collections::Bound`]: https://doc.rust-lang.org/std/collections/enum.Bound.html
1510 [`process::abort`]: https://doc.rust-lang.org/std/process/fn.abort.html
1511 [`ptr::read_unaligned`]: https://doc.rust-lang.org/std/ptr/fn.read_unaligned.html
1512 [`ptr::write_unaligned`]: https://doc.rust-lang.org/std/ptr/fn.write_unaligned.html
1513 [cargo/3562]: https://github.com/rust-lang/cargo/pull/3562
1514 [cargo/3664]: https://github.com/rust-lang/cargo/pull/3664
1515 [cargo/3667]: https://github.com/rust-lang/cargo/pull/3667
1516 [cargo/3691]: https://github.com/rust-lang/cargo/pull/3691
1517 [cargo/3699]: https://github.com/rust-lang/cargo/pull/3699
1518 [cargo/3731]: https://github.com/rust-lang/cargo/pull/3731
1519 [mdbook]: https://crates.io/crates/mdbook
1520 [ubook]: https://doc.rust-lang.org/unstable-book/
1521
1522
1523 Version 1.16.0 (2017-03-16)
1524 ===========================
1525
1526 Language
1527 --------
1528
1529 * [The compiler's `dead_code` lint now accounts for type aliases][38051].
1530 * [Uninhabitable enums (those without any variants) no longer permit wildcard
1531   match patterns][38069]
1532 * [Clean up semantics of `self` in an import list][38313]
1533 * [`Self` may appear in `impl` headers][38920]
1534 * [`Self` may appear in struct expressions][39282]
1535
1536 Compiler
1537 --------
1538
1539 * [`rustc` now supports `--emit=metadata`, which causes rustc to emit
1540   a `.rmeta` file containing only crate metadata][38571]. This can be
1541   used by tools like the Rust Language Service to perform
1542   metadata-only builds.
1543 * [Levenshtein based typo suggestions now work in most places, while
1544   previously they worked only for fields and sometimes for local
1545   variables][38927]. Together with the overhaul of "no
1546   resolution"/"unexpected resolution" errors (#[38154]) they result in
1547   large and systematic improvement in resolution diagnostics.
1548 * [Fix `transmute::<T, U>` where `T` requires a bigger alignment than
1549   `U`][38670]
1550 * [rustc: use -Xlinker when specifying an rpath with ',' in it][38798]
1551 * [`rustc` no longer attempts to provide "consider using an explicit
1552   lifetime" suggestions][37057]. They were inaccurate.
1553
1554 Stabilized APIs
1555 ---------------
1556
1557 * [`VecDeque::truncate`]
1558 * [`VecDeque::resize`]
1559 * [`String::insert_str`]
1560 * [`Duration::checked_add`]
1561 * [`Duration::checked_sub`]
1562 * [`Duration::checked_div`]
1563 * [`Duration::checked_mul`]
1564 * [`str::replacen`]
1565 * [`str::repeat`]
1566 * [`SocketAddr::is_ipv4`]
1567 * [`SocketAddr::is_ipv6`]
1568 * [`IpAddr::is_ipv4`]
1569 * [`IpAddr::is_ipv6`]
1570 * [`Vec::dedup_by`]
1571 * [`Vec::dedup_by_key`]
1572 * [`Result::unwrap_or_default`]
1573 * [`<*const T>::wrapping_offset`]
1574 * [`<*mut T>::wrapping_offset`]
1575 * `CommandExt::creation_flags`
1576 * [`File::set_permissions`]
1577 * [`String::split_off`]
1578
1579 Libraries
1580 ---------
1581
1582 * [`[T]::binary_search` and `[T]::binary_search_by_key` now take
1583   their argument by `Borrow` parameter][37761]
1584 * [All public types in std implement `Debug`][38006]
1585 * [`IpAddr` implements `From<Ipv4Addr>` and `From<Ipv6Addr>`][38327]
1586 * [`Ipv6Addr` implements `From<[u16; 8]>`][38131]
1587 * [Ctrl-Z returns from `Stdin.read()` when reading from the console on
1588   Windows][38274]
1589 * [std: Fix partial writes in `LineWriter`][38062]
1590 * [std: Clamp max read/write sizes on Unix][38062]
1591 * [Use more specific panic message for `&str` slicing errors][38066]
1592 * [`TcpListener::set_only_v6` is deprecated][38304]. This
1593   functionality cannot be achieved in std currently.
1594 * [`writeln!`, like `println!`, now accepts a form with no string
1595   or formatting arguments, to just print a newline][38469]
1596 * [Implement `iter::Sum` and `iter::Product` for `Result`][38580]
1597 * [Reduce the size of static data in `std_unicode::tables`][38781]
1598 * [`char::EscapeDebug`, `EscapeDefault`, `EscapeUnicode`,
1599   `CaseMappingIter`, `ToLowercase`, `ToUppercase`, implement
1600   `Display`][38909]
1601 * [`Duration` implements `Sum`][38712]
1602 * [`String` implements `ToSocketAddrs`][39048]
1603
1604 Cargo
1605 -----
1606
1607 * [The `cargo check` command does a type check of a project without
1608   building it][cargo/3296]
1609 * [crates.io will display CI badges from Travis and AppVeyor, if
1610   specified in Cargo.toml][cargo/3546]
1611 * [crates.io will display categories listed in Cargo.toml][cargo/3301]
1612 * [Compilation profiles accept integer values for `debug`, in addition
1613   to `true` and `false`. These are passed to `rustc` as the value to
1614   `-C debuginfo`][cargo/3534]
1615 * [Implement `cargo --version --verbose`][cargo/3604]
1616 * [All builds now output 'dep-info' build dependencies compatible with
1617   make and ninja][cargo/3557]
1618 * [Build all workspace members with `build --all`][cargo/3511]
1619 * [Document all workspace members with `doc --all`][cargo/3515]
1620 * [Path deps outside workspace are not members][cargo/3443]
1621
1622 Misc
1623 ----
1624
1625 * [`rustdoc` has a `--sysroot` argument that, like `rustc`, specifies
1626   the path to the Rust implementation][38589]
1627 * [The `armv7-linux-androideabi` target no longer enables NEON
1628   extensions, per Google's ABI guide][38413]
1629 * [The stock standard library can be compiled for Redox OS][38401]
1630 * [Rust has initial SPARC support][38726]. Tier 3. No builds
1631   available.
1632 * [Rust has experimental support for Nvidia PTX][38559]. Tier 3. No
1633   builds available.
1634 * [Fix backtraces on i686-pc-windows-gnu by disabling FPO][39379]
1635
1636 Compatibility Notes
1637 -------------------
1638
1639 * [Uninhabitable enums (those without any variants) no longer permit wildcard
1640   match patterns][38069]
1641 * In this release, references to uninhabited types can not be
1642   pattern-matched. This was accidentally allowed in 1.15.
1643 * [The compiler's `dead_code` lint now accounts for type aliases][38051].
1644 * [Ctrl-Z returns from `Stdin.read()` when reading from the console on
1645   Windows][38274]
1646 * [Clean up semantics of `self` in an import list][38313]
1647 * Reimplemented lifetime elision. This change was almost entirely compatible
1648   with existing code, but it did close a number of small bugs and loopholes,
1649   as well as being more accepting in some other [cases][41105].
1650
1651 [37057]: https://github.com/rust-lang/rust/pull/37057
1652 [37761]: https://github.com/rust-lang/rust/pull/37761
1653 [38006]: https://github.com/rust-lang/rust/pull/38006
1654 [38051]: https://github.com/rust-lang/rust/pull/38051
1655 [38062]: https://github.com/rust-lang/rust/pull/38062
1656 [38062]: https://github.com/rust-lang/rust/pull/38622
1657 [38066]: https://github.com/rust-lang/rust/pull/38066
1658 [38069]: https://github.com/rust-lang/rust/pull/38069
1659 [38131]: https://github.com/rust-lang/rust/pull/38131
1660 [38154]: https://github.com/rust-lang/rust/pull/38154
1661 [38274]: https://github.com/rust-lang/rust/pull/38274
1662 [38304]: https://github.com/rust-lang/rust/pull/38304
1663 [38313]: https://github.com/rust-lang/rust/pull/38313
1664 [38314]: https://github.com/rust-lang/rust/pull/38314
1665 [38327]: https://github.com/rust-lang/rust/pull/38327
1666 [38401]: https://github.com/rust-lang/rust/pull/38401
1667 [38413]: https://github.com/rust-lang/rust/pull/38413
1668 [38469]: https://github.com/rust-lang/rust/pull/38469
1669 [38559]: https://github.com/rust-lang/rust/pull/38559
1670 [38571]: https://github.com/rust-lang/rust/pull/38571
1671 [38580]: https://github.com/rust-lang/rust/pull/38580
1672 [38589]: https://github.com/rust-lang/rust/pull/38589
1673 [38670]: https://github.com/rust-lang/rust/pull/38670
1674 [38712]: https://github.com/rust-lang/rust/pull/38712
1675 [38726]: https://github.com/rust-lang/rust/pull/38726
1676 [38781]: https://github.com/rust-lang/rust/pull/38781
1677 [38798]: https://github.com/rust-lang/rust/pull/38798
1678 [38909]: https://github.com/rust-lang/rust/pull/38909
1679 [38920]: https://github.com/rust-lang/rust/pull/38920
1680 [38927]: https://github.com/rust-lang/rust/pull/38927
1681 [39048]: https://github.com/rust-lang/rust/pull/39048
1682 [39282]: https://github.com/rust-lang/rust/pull/39282
1683 [39379]: https://github.com/rust-lang/rust/pull/39379
1684 [41105]: https://github.com/rust-lang/rust/issues/41105
1685 [`<*const T>::wrapping_offset`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_offset
1686 [`<*mut T>::wrapping_offset`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_offset
1687 [`Duration::checked_add`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_add
1688 [`Duration::checked_div`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_div
1689 [`Duration::checked_mul`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_mul
1690 [`Duration::checked_sub`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_sub
1691 [`File::set_permissions`]: https://doc.rust-lang.org/std/fs/struct.File.html#method.set_permissions
1692 [`IpAddr::is_ipv4`]: https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_ipv4
1693 [`IpAddr::is_ipv6`]: https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_ipv6
1694 [`Result::unwrap_or_default`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.unwrap_or_default
1695 [`SocketAddr::is_ipv4`]: https://doc.rust-lang.org/std/net/enum.SocketAddr.html#method.is_ipv4
1696 [`SocketAddr::is_ipv6`]: https://doc.rust-lang.org/std/net/enum.SocketAddr.html#method.is_ipv6
1697 [`String::insert_str`]: https://doc.rust-lang.org/std/string/struct.String.html#method.insert_str
1698 [`String::split_off`]: https://doc.rust-lang.org/std/string/struct.String.html#method.split_off
1699 [`Vec::dedup_by_key`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.dedup_by_key
1700 [`Vec::dedup_by`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.dedup_by
1701 [`VecDeque::resize`]:  https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.resize
1702 [`VecDeque::truncate`]: https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.truncate
1703 [`str::repeat`]: https://doc.rust-lang.org/std/primitive.str.html#method.repeat
1704 [`str::replacen`]: https://doc.rust-lang.org/std/primitive.str.html#method.replacen
1705 [cargo/3296]: https://github.com/rust-lang/cargo/pull/3296
1706 [cargo/3301]: https://github.com/rust-lang/cargo/pull/3301
1707 [cargo/3443]: https://github.com/rust-lang/cargo/pull/3443
1708 [cargo/3511]: https://github.com/rust-lang/cargo/pull/3511
1709 [cargo/3515]: https://github.com/rust-lang/cargo/pull/3515
1710 [cargo/3534]: https://github.com/rust-lang/cargo/pull/3534
1711 [cargo/3546]: https://github.com/rust-lang/cargo/pull/3546
1712 [cargo/3557]: https://github.com/rust-lang/cargo/pull/3557
1713 [cargo/3604]: https://github.com/rust-lang/cargo/pull/3604
1714 [RFC 1623]: https://github.com/rust-lang/rfcs/blob/master/text/1623-static.md
1715
1716
1717 Version 1.15.1 (2017-02-09)
1718 ===========================
1719
1720 * [Fix IntoIter::as_mut_slice's signature][39466]
1721 * [Compile compiler builtins with `-fPIC` on 32-bit platforms][39523]
1722
1723 [39466]: https://github.com/rust-lang/rust/pull/39466
1724 [39523]: https://github.com/rust-lang/rust/pull/39523
1725
1726
1727 Version 1.15.0 (2017-02-02)
1728 ===========================
1729
1730 Language
1731 --------
1732
1733 * Basic procedural macros allowing custom `#[derive]`, aka "macros 1.1", are
1734   stable. This allows popular code-generating crates like Serde and Diesel to
1735   work ergonomically. [RFC 1681].
1736 * [Tuple structs may be empty. Unary and empty tuple structs may be instantiated
1737   with curly braces][36868]. Part of [RFC 1506].
1738 * [A number of minor changes to name resolution have been activated][37127].
1739   They add up to more consistent semantics, allowing for future evolution of
1740   Rust macros. Specified in [RFC 1560], see its section on ["changes"] for
1741   details of what is different. The breaking changes here have been transitioned
1742   through the [`legacy_imports`] lint since 1.14, with no known regressions.
1743 * [In `macro_rules`, `path` fragments can now be parsed as type parameter
1744   bounds][38279]
1745 * [`?Sized` can be used in `where` clauses][37791]
1746 * [There is now a limit on the size of monomorphized types and it can be
1747   modified with the `#![type_size_limit]` crate attribute, similarly to
1748   the `#![recursion_limit]` attribute][37789]
1749
1750 Compiler
1751 --------
1752
1753 * [On Windows, the compiler will apply dllimport attributes when linking to
1754   extern functions][37973]. Additional attributes and flags can control which
1755   library kind is linked and its name. [RFC 1717].
1756 * [Rust-ABI symbols are no longer exported from cdylibs][38117]
1757 * [The `--test` flag works with procedural macro crates][38107]
1758 * [Fix `extern "aapcs" fn` ABI][37814]
1759 * [The `-C no-stack-check` flag is deprecated][37636]. It does nothing.
1760 * [The `format!` expander recognizes incorrect `printf` and shell-style
1761   formatting directives and suggests the correct format][37613].
1762 * [Only report one error for all unused imports in an import list][37456]
1763
1764 Compiler Performance
1765 --------------------
1766
1767 * [Avoid unnecessary `mk_ty` calls in `Ty::super_fold_with`][37705]
1768 * [Avoid more unnecessary `mk_ty` calls in `Ty::super_fold_with`][37979]
1769 * [Don't clone in `UnificationTable::probe`][37848]
1770 * [Remove `scope_auxiliary` to cut RSS by 10%][37764]
1771 * [Use small vectors in type walker][37760]
1772 * [Macro expansion performance was improved][37701]
1773 * [Change `HirVec<P<T>>` to `HirVec<T>` in `hir::Expr`][37642]
1774 * [Replace FNV with a faster hash function][37229]
1775
1776 Stabilized APIs
1777 ---------------
1778
1779 * [`std::iter::Iterator::min_by`]
1780 * [`std::iter::Iterator::max_by`]
1781 * [`std::os::*::fs::FileExt`]
1782 * [`std::sync::atomic::Atomic*::get_mut`]
1783 * [`std::sync::atomic::Atomic*::into_inner`]
1784 * [`std::vec::IntoIter::as_slice`]
1785 * [`std::vec::IntoIter::as_mut_slice`]
1786 * [`std::sync::mpsc::Receiver::try_iter`]
1787 * [`std::os::unix::process::CommandExt::before_exec`]
1788 * [`std::rc::Rc::strong_count`]
1789 * [`std::rc::Rc::weak_count`]
1790 * [`std::sync::Arc::strong_count`]
1791 * [`std::sync::Arc::weak_count`]
1792 * [`std::char::encode_utf8`]
1793 * [`std::char::encode_utf16`]
1794 * [`std::cell::Ref::clone`]
1795 * [`std::io::Take::into_inner`]
1796
1797 Libraries
1798 ---------
1799
1800 * [The standard sorting algorithm has been rewritten for dramatic performance
1801   improvements][38192]. It is a hybrid merge sort, drawing influences from
1802   Timsort. Previously it was a naive merge sort.
1803 * [`Iterator::nth` no longer has a `Sized` bound][38134]
1804 * [`Extend<&T>` is specialized for `Vec` where `T: Copy`][38182] to improve
1805   performance.
1806 * [`chars().count()` is much faster][37888] and so are [`chars().last()`
1807   and `char_indices().last()`][37882]
1808 * [Fix ARM Objective-C ABI in `std::env::args`][38146]
1809 * [Chinese characters display correctly in `fmt::Debug`][37855]
1810 * [Derive `Default` for `Duration`][37699]
1811 * [Support creation of anonymous pipes on WinXP/2k][37677]
1812 * [`mpsc::RecvTimeoutError` implements `Error`][37527]
1813 * [Don't pass overlapped handles to processes][38835]
1814
1815 Cargo
1816 -----
1817
1818 * [In this release, Cargo build scripts no longer have access to the `OUT_DIR`
1819   environment variable at build time via `env!("OUT_DIR")`][cargo/3368]. They
1820   should instead check the variable at runtime with `std::env`. That the value
1821   was set at build time was a bug, and incorrect when cross-compiling. This
1822   change is known to cause breakage.
1823 * [Add `--all` flag to `cargo test`][cargo/3221]
1824 * [Compile statically against the MSVC CRT][cargo/3363]
1825 * [Mix feature flags into fingerprint/metadata shorthash][cargo/3102]
1826 * [Link OpenSSL statically on OSX][cargo/3311]
1827 * [Apply new fingerprinting to build dir outputs][cargo/3310]
1828 * [Test for bad path overrides with summaries][cargo/3336]
1829 * [Require `cargo install --vers` to take a semver version][cargo/3338]
1830 * [Fix retrying crate downloads for network errors][cargo/3348]
1831 * [Implement string lookup for `build.rustflags` config key][cargo/3356]
1832 * [Emit more info on --message-format=json][cargo/3319]
1833 * [Assume `build.rs` in the same directory as `Cargo.toml` is a build script][cargo/3361]
1834 * [Don't ignore errors in workspace manifest][cargo/3409]
1835 * [Fix `--message-format JSON` when rustc emits non-JSON warnings][cargo/3410]
1836
1837 Tooling
1838 -------
1839
1840 * [Test runners (binaries built with `--test`) now support a `--list` argument
1841   that lists the tests it contains][38185]
1842 * [Test runners now support a `--exact` argument that makes the test filter
1843   match exactly, instead of matching only a substring of the test name][38181]
1844 * [rustdoc supports a `--playground-url` flag][37763]
1845 * [rustdoc provides more details about `#[should_panic]` errors][37749]
1846
1847 Misc
1848 ----
1849
1850 * [The Rust build system is now written in Rust][37817]. The Makefiles may
1851   continue to be used in this release by passing `--disable-rustbuild` to the
1852   configure script, but they will be deleted soon. Note that the new build
1853   system uses a different on-disk layout that will likely affect any scripts
1854   building Rust.
1855 * [Rust supports i686-unknown-openbsd][38086]. Tier 3 support. No testing or
1856   releases.
1857 * [Rust supports the MSP430][37627]. Tier 3 support. No testing or releases.
1858 * [Rust supports the ARMv5TE architecture][37615]. Tier 3 support. No testing or
1859   releases.
1860
1861 Compatibility Notes
1862 -------------------
1863
1864 * [A number of minor changes to name resolution have been activated][37127].
1865   They add up to more consistent semantics, allowing for future evolution of
1866   Rust macros. Specified in [RFC 1560], see its section on ["changes"] for
1867   details of what is different. The breaking changes here have been transitioned
1868   through the [`legacy_imports`] lint since 1.14, with no known regressions.
1869 * [In this release, Cargo build scripts no longer have access to the `OUT_DIR`
1870   environment variable at build time via `env!("OUT_DIR")`][cargo/3368]. They
1871   should instead check the variable at runtime with `std::env`. That the value
1872   was set at build time was a bug, and incorrect when cross-compiling. This
1873   change is known to cause breakage.
1874 * [Higher-ranked lifetimes are no longer allowed to appear _only_ in associated
1875   types][33685]. The [`hr_lifetime_in_assoc_type` lint] has been a warning since
1876   1.10 and is now an error by default. It will become a hard error in the near
1877   future.
1878 * [The semantics relating modules to file system directories are changing in
1879   minor ways][37602]. This is captured in the new `legacy_directory_ownership`
1880   lint, which is a warning in this release, and will become a hard error in the
1881   future.
1882 * [Rust-ABI symbols are no longer exported from cdylibs][38117]
1883 * [Once `Peekable` peeks a `None` it will return that `None` without re-querying
1884   the underlying iterator][37834]
1885
1886 ["changes"]: https://github.com/rust-lang/rfcs/blob/master/text/1560-name-resolution.md#changes-to-name-resolution-rules
1887 [33685]: https://github.com/rust-lang/rust/issues/33685
1888 [36868]: https://github.com/rust-lang/rust/pull/36868
1889 [37127]: https://github.com/rust-lang/rust/pull/37127
1890 [37229]: https://github.com/rust-lang/rust/pull/37229
1891 [37456]: https://github.com/rust-lang/rust/pull/37456
1892 [37527]: https://github.com/rust-lang/rust/pull/37527
1893 [37602]: https://github.com/rust-lang/rust/pull/37602
1894 [37613]: https://github.com/rust-lang/rust/pull/37613
1895 [37615]: https://github.com/rust-lang/rust/pull/37615
1896 [37636]: https://github.com/rust-lang/rust/pull/37636
1897 [37627]: https://github.com/rust-lang/rust/pull/37627
1898 [37642]: https://github.com/rust-lang/rust/pull/37642
1899 [37677]: https://github.com/rust-lang/rust/pull/37677
1900 [37699]: https://github.com/rust-lang/rust/pull/37699
1901 [37701]: https://github.com/rust-lang/rust/pull/37701
1902 [37705]: https://github.com/rust-lang/rust/pull/37705
1903 [37749]: https://github.com/rust-lang/rust/pull/37749
1904 [37760]: https://github.com/rust-lang/rust/pull/37760
1905 [37763]: https://github.com/rust-lang/rust/pull/37763
1906 [37764]: https://github.com/rust-lang/rust/pull/37764
1907 [37789]: https://github.com/rust-lang/rust/pull/37789
1908 [37791]: https://github.com/rust-lang/rust/pull/37791
1909 [37814]: https://github.com/rust-lang/rust/pull/37814
1910 [37817]: https://github.com/rust-lang/rust/pull/37817
1911 [37834]: https://github.com/rust-lang/rust/pull/37834
1912 [37848]: https://github.com/rust-lang/rust/pull/37848
1913 [37855]: https://github.com/rust-lang/rust/pull/37855
1914 [37882]: https://github.com/rust-lang/rust/pull/37882
1915 [37888]: https://github.com/rust-lang/rust/pull/37888
1916 [37973]: https://github.com/rust-lang/rust/pull/37973
1917 [37979]: https://github.com/rust-lang/rust/pull/37979
1918 [38086]: https://github.com/rust-lang/rust/pull/38086
1919 [38107]: https://github.com/rust-lang/rust/pull/38107
1920 [38117]: https://github.com/rust-lang/rust/pull/38117
1921 [38134]: https://github.com/rust-lang/rust/pull/38134
1922 [38146]: https://github.com/rust-lang/rust/pull/38146
1923 [38181]: https://github.com/rust-lang/rust/pull/38181
1924 [38182]: https://github.com/rust-lang/rust/pull/38182
1925 [38185]: https://github.com/rust-lang/rust/pull/38185
1926 [38192]: https://github.com/rust-lang/rust/pull/38192
1927 [38279]: https://github.com/rust-lang/rust/pull/38279
1928 [38835]: https://github.com/rust-lang/rust/pull/38835
1929 [RFC 1492]: https://github.com/rust-lang/rfcs/blob/master/text/1492-dotdot-in-patterns.md
1930 [RFC 1506]: https://github.com/rust-lang/rfcs/blob/master/text/1506-adt-kinds.md
1931 [RFC 1560]: https://github.com/rust-lang/rfcs/blob/master/text/1560-name-resolution.md
1932 [RFC 1681]: https://github.com/rust-lang/rfcs/blob/master/text/1681-macros-1.1.md
1933 [RFC 1717]: https://github.com/rust-lang/rfcs/blob/master/text/1717-dllimport.md
1934 [`hr_lifetime_in_assoc_type` lint]: https://github.com/rust-lang/rust/issues/33685
1935 [`legacy_imports`]: https://github.com/rust-lang/rust/pull/38271
1936 [cargo/3102]: https://github.com/rust-lang/cargo/pull/3102
1937 [cargo/3221]: https://github.com/rust-lang/cargo/pull/3221
1938 [cargo/3310]: https://github.com/rust-lang/cargo/pull/3310
1939 [cargo/3311]: https://github.com/rust-lang/cargo/pull/3311
1940 [cargo/3319]: https://github.com/rust-lang/cargo/pull/3319
1941 [cargo/3336]: https://github.com/rust-lang/cargo/pull/3336
1942 [cargo/3338]: https://github.com/rust-lang/cargo/pull/3338
1943 [cargo/3348]: https://github.com/rust-lang/cargo/pull/3348
1944 [cargo/3356]: https://github.com/rust-lang/cargo/pull/3356
1945 [cargo/3361]: https://github.com/rust-lang/cargo/pull/3361
1946 [cargo/3363]: https://github.com/rust-lang/cargo/pull/3363
1947 [cargo/3368]: https://github.com/rust-lang/cargo/issues/3368
1948 [cargo/3409]: https://github.com/rust-lang/cargo/pull/3409
1949 [cargo/3410]: https://github.com/rust-lang/cargo/pull/3410
1950 [`std::iter::Iterator::min_by`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.min_by
1951 [`std::iter::Iterator::max_by`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.max_by
1952 [`std::os::*::fs::FileExt`]: https://doc.rust-lang.org/std/os/unix/fs/trait.FileExt.html
1953 [`std::sync::atomic::Atomic*::get_mut`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU8.html#method.get_mut
1954 [`std::sync::atomic::Atomic*::into_inner`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU8.html#method.into_inner
1955 [`std::vec::IntoIter::as_slice`]: https://doc.rust-lang.org/std/vec/struct.IntoIter.html#method.as_slice
1956 [`std::vec::IntoIter::as_mut_slice`]: https://doc.rust-lang.org/std/vec/struct.IntoIter.html#method.as_mut_slice
1957 [`std::sync::mpsc::Receiver::try_iter`]: https://doc.rust-lang.org/std/sync/mpsc/struct.Receiver.html#method.try_iter
1958 [`std::os::unix::process::CommandExt::before_exec`]: https://doc.rust-lang.org/std/os/unix/process/trait.CommandExt.html#tymethod.before_exec
1959 [`std::rc::Rc::strong_count`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.strong_count
1960 [`std::rc::Rc::weak_count`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.weak_count
1961 [`std::sync::Arc::strong_count`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.strong_count
1962 [`std::sync::Arc::weak_count`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.weak_count
1963 [`std::char::encode_utf8`]: https://doc.rust-lang.org/std/primitive.char.html#method.encode_utf8
1964 [`std::char::encode_utf16`]: https://doc.rust-lang.org/std/primitive.char.html#method.encode_utf16
1965 [`std::cell::Ref::clone`]: https://doc.rust-lang.org/std/cell/struct.Ref.html#method.clone
1966 [`std::io::Take::into_inner`]: https://doc.rust-lang.org/std/io/struct.Take.html#method.into_inner
1967
1968
1969 Version 1.14.0 (2016-12-22)
1970 ===========================
1971
1972 Language
1973 --------
1974
1975 * [`..` matches multiple tuple fields in enum variants, structs
1976   and tuples][36843]. [RFC 1492].
1977 * [Safe `fn` items can be coerced to `unsafe fn` pointers][37389]
1978 * [`use *` and `use ::*` both glob-import from the crate root][37367]
1979 * [It's now possible to call a `Vec<Box<Fn()>>` without explicit
1980   dereferencing][36822]
1981
1982 Compiler
1983 --------
1984
1985 * [Mark enums with non-zero discriminant as non-zero][37224]
1986 * [Lower-case `static mut` names are linted like other
1987   statics and consts][37162]
1988 * [Fix ICE on some macros in const integer positions
1989    (e.g. `[u8; m!()]`)][36819]
1990 * [Improve error message and snippet for "did you mean `x`"][36798]
1991 * [Add a panic-strategy field to the target specification][36794]
1992 * [Include LLVM version in `--version --verbose`][37200]
1993
1994 Compile-time Optimizations
1995 --------------------------
1996
1997 * [Improve macro expansion performance][37569]
1998 * [Shrink `Expr_::ExprInlineAsm`][37445]
1999 * [Replace all uses of SHA-256 with BLAKE2b][37439]
2000 * [Reduce the number of bytes hashed by `IchHasher`][37427]
2001 * [Avoid more allocations when compiling html5ever][37373]
2002 * [Use `SmallVector` in `CombineFields::instantiate`][37322]
2003 * [Avoid some allocations in the macro parser][37318]
2004 * [Use a faster deflate setting][37298]
2005 * [Add `ArrayVec` and `AccumulateVec` to reduce heap allocations
2006   during interning of slices][37270]
2007 * [Optimize `write_metadata`][37267]
2008 * [Don't process obligation forest cycles when stalled][37231]
2009 * [Avoid many `CrateConfig` clones][37161]
2010 * [Optimize `Substs::super_fold_with`][37108]
2011 * [Optimize `ObligationForest`'s `NodeState` handling][36993]
2012 * [Speed up `plug_leaks`][36917]
2013
2014 Libraries
2015 ---------
2016
2017 * [`println!()`, with no arguments, prints newline][36825].
2018   Previously, an empty string was required to achieve the same.
2019 * [`Wrapping` impls standard binary and unary operators, as well as
2020    the `Sum` and `Product` iterators][37356]
2021 * [Implement `From<Cow<str>> for String` and `From<Cow<[T]>> for
2022   Vec<T>`][37326]
2023 * [Improve `fold` performance for `chain`, `cloned`, `map`, and
2024   `VecDeque` iterators][37315]
2025 * [Improve `SipHasher` performance on small values][37312]
2026 * [Add Iterator trait TrustedLen to enable better FromIterator /
2027   Extend][37306]
2028 * [Expand `.zip()` specialization to `.map()` and `.cloned()`][37230]
2029 * [`ReadDir` implements `Debug`][37221]
2030 * [Implement `RefUnwindSafe` for atomic types][37178]
2031 * [Specialize `Vec::extend` to `Vec::extend_from_slice`][37094]
2032 * [Avoid allocations in `Decoder::read_str`][37064]
2033 * [`io::Error` implements `From<io::ErrorKind>`][37037]
2034 * [Impl `Debug` for raw pointers to unsized data][36880]
2035 * [Don't reuse `HashMap` random seeds][37470]
2036 * [The internal memory layout of `HashMap` is more cache-friendly, for
2037   significant improvements in some operations][36692]
2038 * [`HashMap` uses less memory on 32-bit architectures][36595]
2039 * [Impl `Add<{str, Cow<str>}>` for `Cow<str>`][36430]
2040
2041 Cargo
2042 -----
2043
2044 * [Expose rustc cfg values to build scripts][cargo/3243]
2045 * [Allow cargo to work with read-only `CARGO_HOME`][cargo/3259]
2046 * [Fix passing --features when testing multiple packages][cargo/3280]
2047 * [Use a single profile set per workspace][cargo/3249]
2048 * [Load `replace` sections from lock files][cargo/3220]
2049 * [Ignore `panic` configuration for test/bench profiles][cargo/3175]
2050
2051 Tooling
2052 -------
2053
2054 * [rustup is the recommended Rust installation method][1.14rustup]
2055 * This release includes host (rustc) builds for Linux on MIPS, PowerPC, and
2056   S390x. These are [tier 2] platforms and may have major defects. Follow the
2057   instructions on the website to install, or add the targets to an existing
2058   installation with `rustup target add`. The new target triples are:
2059   - `mips-unknown-linux-gnu`
2060   - `mipsel-unknown-linux-gnu`
2061   - `mips64-unknown-linux-gnuabi64`
2062   - `mips64el-unknown-linux-gnuabi64 `
2063   - `powerpc-unknown-linux-gnu`
2064   - `powerpc64-unknown-linux-gnu`
2065   - `powerpc64le-unknown-linux-gnu`
2066   - `s390x-unknown-linux-gnu `
2067 * This release includes target (std) builds for ARM Linux running MUSL
2068   libc. These are [tier 2] platforms and may have major defects. Add the
2069   following triples to an existing rustup installation with `rustup target add`:
2070   - `arm-unknown-linux-musleabi`
2071   - `arm-unknown-linux-musleabihf`
2072   - `armv7-unknown-linux-musleabihf`
2073 * This release includes [experimental support for WebAssembly][1.14wasm], via
2074   the `wasm32-unknown-emscripten` target. This target is known to have major
2075   defects. Please test, report, and fix.
2076 * rustup no longer installs documentation by default. Run `rustup
2077   component add rust-docs` to install.
2078 * [Fix line stepping in debugger][37310]
2079 * [Enable line number debuginfo in releases][37280]
2080
2081 Misc
2082 ----
2083
2084 * [Disable jemalloc on aarch64/powerpc/mips][37392]
2085 * [Add support for Fuchsia OS][37313]
2086 * [Detect local-rebuild by only MAJOR.MINOR version][37273]
2087
2088 Compatibility Notes
2089 -------------------
2090
2091 * [A number of forward-compatibility lints used by the compiler
2092   to gradually introduce language changes have been converted
2093   to deny by default][36894]:
2094   - ["use of inaccessible extern crate erroneously allowed"][36886]
2095   - ["type parameter default erroneously allowed in invalid location"][36887]
2096   - ["detects super or self keywords at the beginning of global path"][36888]
2097   - ["two overlapping inherent impls define an item with the same name
2098     were erroneously allowed"][36889]
2099   - ["floating-point constants cannot be used in patterns"][36890]
2100   - ["constants of struct or enum type can only be used in a pattern if
2101      the struct or enum has `#[derive(PartialEq, Eq)]`"][36891]
2102   - ["lifetimes or labels named `'_` were erroneously allowed"][36892]
2103 * [Prohibit patterns in trait methods without bodies][37378]
2104 * [The atomic `Ordering` enum may not be matched exhaustively][37351]
2105 * [Future-proofing `#[no_link]` breaks some obscure cases][37247]
2106 * [The `$crate` macro variable is accepted in fewer locations][37213]
2107 * [Impls specifying extra region requirements beyond the trait
2108   they implement are rejected][37167]
2109 * [Enums may not be unsized][37111]. Unsized enums are intended to
2110   work but never have. For now they are forbidden.
2111 * [Enforce the shadowing restrictions from RFC 1560 for today's macros][36767]
2112
2113 [tier 2]: https://forge.rust-lang.org/platform-support.html
2114 [1.14rustup]: https://internals.rust-lang.org/t/beta-testing-rustup-rs/3316/204
2115 [1.14wasm]: https://users.rust-lang.org/t/compiling-to-the-web-with-rust-and-emscripten/7627
2116 [36430]: https://github.com/rust-lang/rust/pull/36430
2117 [36595]: https://github.com/rust-lang/rust/pull/36595
2118 [36595]: https://github.com/rust-lang/rust/pull/36595
2119 [36692]: https://github.com/rust-lang/rust/pull/36692
2120 [36767]: https://github.com/rust-lang/rust/pull/36767
2121 [36794]: https://github.com/rust-lang/rust/pull/36794
2122 [36798]: https://github.com/rust-lang/rust/pull/36798
2123 [36819]: https://github.com/rust-lang/rust/pull/36819
2124 [36822]: https://github.com/rust-lang/rust/pull/36822
2125 [36825]: https://github.com/rust-lang/rust/pull/36825
2126 [36843]: https://github.com/rust-lang/rust/pull/36843
2127 [36880]: https://github.com/rust-lang/rust/pull/36880
2128 [36886]: https://github.com/rust-lang/rust/issues/36886
2129 [36887]: https://github.com/rust-lang/rust/issues/36887
2130 [36888]: https://github.com/rust-lang/rust/issues/36888
2131 [36889]: https://github.com/rust-lang/rust/issues/36889
2132 [36890]: https://github.com/rust-lang/rust/issues/36890
2133 [36891]: https://github.com/rust-lang/rust/issues/36891
2134 [36892]: https://github.com/rust-lang/rust/issues/36892
2135 [36894]: https://github.com/rust-lang/rust/pull/36894
2136 [36917]: https://github.com/rust-lang/rust/pull/36917
2137 [36993]: https://github.com/rust-lang/rust/pull/36993
2138 [37037]: https://github.com/rust-lang/rust/pull/37037
2139 [37064]: https://github.com/rust-lang/rust/pull/37064
2140 [37094]: https://github.com/rust-lang/rust/pull/37094
2141 [37108]: https://github.com/rust-lang/rust/pull/37108
2142 [37111]: https://github.com/rust-lang/rust/pull/37111
2143 [37161]: https://github.com/rust-lang/rust/pull/37161
2144 [37162]: https://github.com/rust-lang/rust/pull/37162
2145 [37167]: https://github.com/rust-lang/rust/pull/37167
2146 [37178]: https://github.com/rust-lang/rust/pull/37178
2147 [37200]: https://github.com/rust-lang/rust/pull/37200
2148 [37213]: https://github.com/rust-lang/rust/pull/37213
2149 [37221]: https://github.com/rust-lang/rust/pull/37221
2150 [37224]: https://github.com/rust-lang/rust/pull/37224
2151 [37230]: https://github.com/rust-lang/rust/pull/37230
2152 [37231]: https://github.com/rust-lang/rust/pull/37231
2153 [37247]: https://github.com/rust-lang/rust/pull/37247
2154 [37267]: https://github.com/rust-lang/rust/pull/37267
2155 [37270]: https://github.com/rust-lang/rust/pull/37270
2156 [37273]: https://github.com/rust-lang/rust/pull/37273
2157 [37280]: https://github.com/rust-lang/rust/pull/37280
2158 [37298]: https://github.com/rust-lang/rust/pull/37298
2159 [37306]: https://github.com/rust-lang/rust/pull/37306
2160 [37310]: https://github.com/rust-lang/rust/pull/37310
2161 [37312]: https://github.com/rust-lang/rust/pull/37312
2162 [37313]: https://github.com/rust-lang/rust/pull/37313
2163 [37315]: https://github.com/rust-lang/rust/pull/37315
2164 [37318]: https://github.com/rust-lang/rust/pull/37318
2165 [37322]: https://github.com/rust-lang/rust/pull/37322
2166 [37326]: https://github.com/rust-lang/rust/pull/37326
2167 [37351]: https://github.com/rust-lang/rust/pull/37351
2168 [37356]: https://github.com/rust-lang/rust/pull/37356
2169 [37367]: https://github.com/rust-lang/rust/pull/37367
2170 [37373]: https://github.com/rust-lang/rust/pull/37373
2171 [37378]: https://github.com/rust-lang/rust/pull/37378
2172 [37389]: https://github.com/rust-lang/rust/pull/37389
2173 [37392]: https://github.com/rust-lang/rust/pull/37392
2174 [37427]: https://github.com/rust-lang/rust/pull/37427
2175 [37439]: https://github.com/rust-lang/rust/pull/37439
2176 [37445]: https://github.com/rust-lang/rust/pull/37445
2177 [37470]: https://github.com/rust-lang/rust/pull/37470
2178 [37569]: https://github.com/rust-lang/rust/pull/37569
2179 [RFC 1492]: https://github.com/rust-lang/rfcs/blob/master/text/1492-dotdot-in-patterns.md
2180 [cargo/3175]: https://github.com/rust-lang/cargo/pull/3175
2181 [cargo/3220]: https://github.com/rust-lang/cargo/pull/3220
2182 [cargo/3243]: https://github.com/rust-lang/cargo/pull/3243
2183 [cargo/3249]: https://github.com/rust-lang/cargo/pull/3249
2184 [cargo/3259]: https://github.com/rust-lang/cargo/pull/3259
2185 [cargo/3280]: https://github.com/rust-lang/cargo/pull/3280
2186
2187
2188 Version 1.13.0 (2016-11-10)
2189 ===========================
2190
2191 Language
2192 --------
2193
2194 * [Stabilize the `?` operator][36995]. `?` is a simple way to propagate
2195   errors, like the `try!` macro, described in [RFC 0243].
2196 * [Stabilize macros in type position][36014]. Described in [RFC 873].
2197 * [Stabilize attributes on statements][36995]. Described in [RFC 0016].
2198 * [Fix `#[derive]` for empty tuple structs/variants][35728]
2199 * [Fix lifetime rules for 'if' conditions][36029]
2200 * [Avoid loading and parsing unconfigured non-inline modules][36482]
2201
2202 Compiler
2203 --------
2204
2205 * [Add the `-C link-arg` argument][36574]
2206 * [Remove the old AST-based backend from rustc_trans][35764]
2207 * [Don't enable NEON by default on armv7 Linux][35814]
2208 * [Fix debug line number info for macro expansions][35238]
2209 * [Do not emit "class method" debuginfo for types that are not
2210   DICompositeType][36008]
2211 * [Warn about multiple conflicting #[repr] hints][34623]
2212 * [When sizing DST, don't double-count nested struct prefixes][36351]
2213 * [Default RUST_MIN_STACK to 16MiB for now][36505]
2214 * [Improve rlib metadata format][36551]. Reduces rlib size significantly.
2215 * [Reject macros with empty repetitions to avoid infinite loop][36721]
2216 * [Expand macros without recursing to avoid stack overflows][36214]
2217
2218 Diagnostics
2219 -----------
2220
2221 * [Replace macro backtraces with labeled local uses][35702]
2222 * [Improve error message for misplaced doc comments][33922]
2223 * [Buffer unix and lock windows to prevent message interleaving][35975]
2224 * [Update lifetime errors to specifically note temporaries][36171]
2225 * [Special case a few colors for Windows][36178]
2226 * [Suggest `use self` when such an import resolves][36289]
2227 * [Be more specific when type parameter shadows primitive type][36338]
2228 * Many minor improvements
2229
2230 Compile-time Optimizations
2231 --------------------------
2232
2233 * [Compute and cache HIR hashes at beginning][35854]
2234 * [Don't hash types in loan paths][36004]
2235 * [Cache projections in trans][35761]
2236 * [Optimize the parser's last token handling][36527]
2237 * [Only instantiate #[inline] functions in codegen units referencing
2238   them][36524]. This leads to big improvements in cases where crates export
2239   define many inline functions without using them directly.
2240 * [Lazily allocate TypedArena's first chunk][36592]
2241 * [Don't allocate during default HashSet creation][36734]
2242
2243 Stabilized APIs
2244 ---------------
2245
2246 * [`checked_abs`]
2247 * [`wrapping_abs`]
2248 * [`overflowing_abs`]
2249 * [`RefCell::try_borrow`]
2250 * [`RefCell::try_borrow_mut`]
2251
2252 Libraries
2253 ---------
2254
2255 * [Add `assert_ne!` and `debug_assert_ne!`][35074]
2256 * [Make `vec_deque::Drain`, `hash_map::Drain`, and `hash_set::Drain`
2257   covariant][35354]
2258 * [Implement `AsRef<[T]>` for `std::slice::Iter`][35559]
2259 * [Implement `Debug` for `std::vec::IntoIter`][35707]
2260 * [`CString`: avoid excessive growth just to 0-terminate][35871]
2261 * [Implement `CoerceUnsized` for `{Cell, RefCell, UnsafeCell}`][35627]
2262 * [Use arc4rand on FreeBSD][35884]
2263 * [memrchr: Correct aligned offset computation][35969]
2264 * [Improve Demangling of Rust Symbols][36059]
2265 * [Use monotonic time in condition variables][35048]
2266 * [Implement `Debug` for `std::path::{Components,Iter}`][36101]
2267 * [Implement conversion traits for `char`][35755]
2268 * [Fix illegal instruction caused by overflow in channel cloning][36104]
2269 * [Zero first byte of CString on drop][36264]
2270 * [Inherit overflow checks for sum and product][36372]
2271 * [Add missing Eq implementations][36423]
2272 * [Implement `Debug` for `DirEntry`][36631]
2273 * [When `getaddrinfo` returns `EAI_SYSTEM` retrieve actual error from
2274   `errno`][36754]
2275 * [`SipHasher`] is deprecated. Use [`DefaultHasher`].
2276 * [Implement more traits for `std::io::ErrorKind`][35911]
2277 * [Optimize BinaryHeap bounds checking][36072]
2278 * [Work around pointer aliasing issue in `Vec::extend_from_slice`,
2279   `extend_with_element`][36355]
2280 * [Fix overflow checking in unsigned pow()][34942]
2281
2282 Cargo
2283 -----
2284
2285 * This release includes security fixes to both curl and OpenSSL.
2286 * [Fix transitive doctests when panic=abort][cargo/3021]
2287 * [Add --all-features flag to cargo][cargo/3038]
2288 * [Reject path-based dependencies in `cargo package`][cargo/3060]
2289 * [Don't parse the home directory more than once][cargo/3078]
2290 * [Don't try to generate Cargo.lock on empty workspaces][cargo/3092]
2291 * [Update OpenSSL to 1.0.2j][cargo/3121]
2292 * [Add license and license_file to cargo metadata output][cargo/3110]
2293 * [Make crates-io registry URL optional in config; ignore all changes to
2294   source.crates-io][cargo/3089]
2295 * [Don't download dependencies from other platforms][cargo/3123]
2296 * [Build transitive dev-dependencies when needed][cargo/3125]
2297 * [Add support for per-target rustflags in .cargo/config][cargo/3157]
2298 * [Avoid updating registry when adding existing deps][cargo/3144]
2299 * [Warn about path overrides that won't work][cargo/3136]
2300 * [Use workspaces during `cargo install`][cargo/3146]
2301 * [Leak mspdbsrv.exe processes on Windows][cargo/3162]
2302 * [Add --message-format flag][cargo/3000]
2303 * [Pass target environment for rustdoc][cargo/3205]
2304 * [Use `CommandExt::exec` for `cargo run` on Unix][cargo/2818]
2305 * [Update curl and curl-sys][cargo/3241]
2306 * [Call rustdoc test with the correct cfg flags of a package][cargo/3242]
2307
2308 Tooling
2309 -------
2310
2311 * [rustdoc: Add the `--sysroot` argument][36586]
2312 * [rustdoc: Fix a couple of issues with the search results][35655]
2313 * [rustdoc: remove the `!` from macro URLs and titles][35234]
2314 * [gdb: Fix pretty-printing special-cased Rust types][35585]
2315 * [rustdoc: Filter more incorrect methods inherited through Deref][36266]
2316
2317 Misc
2318 ----
2319
2320 * [Remove unmaintained style guide][35124]
2321 * [Add s390x support][36369]
2322 * [Initial work at Haiku OS support][36727]
2323 * [Add mips-uclibc targets][35734]
2324 * [Crate-ify compiler-rt into compiler-builtins][35021]
2325 * [Add rustc version info (git hash + date) to dist tarball][36213]
2326 * Many documentation improvements
2327
2328 Compatibility Notes
2329 -------------------
2330
2331 * [`SipHasher`] is deprecated. Use [`DefaultHasher`].
2332 * [Deny (by default) transmuting from fn item types to pointer-sized
2333   types][34923]. Continuing the long transition to zero-sized fn items,
2334   per [RFC 401].
2335 * [Fix `#[derive]` for empty tuple structs/variants][35728].
2336   Part of [RFC 1506].
2337 * [Issue deprecation warnings for safe accesses to extern statics][36173]
2338 * [Fix lifetime rules for 'if' conditions][36029].
2339 * [Inherit overflow checks for sum and product][36372].
2340 * [Forbid user-defined macros named "macro_rules"][36730].
2341
2342 [33922]: https://github.com/rust-lang/rust/pull/33922
2343 [34623]: https://github.com/rust-lang/rust/pull/34623
2344 [34923]: https://github.com/rust-lang/rust/pull/34923
2345 [34942]: https://github.com/rust-lang/rust/pull/34942
2346 [34982]: https://github.com/rust-lang/rust/pull/34982
2347 [35021]: https://github.com/rust-lang/rust/pull/35021
2348 [35048]: https://github.com/rust-lang/rust/pull/35048
2349 [35074]: https://github.com/rust-lang/rust/pull/35074
2350 [35124]: https://github.com/rust-lang/rust/pull/35124
2351 [35234]: https://github.com/rust-lang/rust/pull/35234
2352 [35238]: https://github.com/rust-lang/rust/pull/35238
2353 [35354]: https://github.com/rust-lang/rust/pull/35354
2354 [35559]: https://github.com/rust-lang/rust/pull/35559
2355 [35585]: https://github.com/rust-lang/rust/pull/35585
2356 [35627]: https://github.com/rust-lang/rust/pull/35627
2357 [35655]: https://github.com/rust-lang/rust/pull/35655
2358 [35702]: https://github.com/rust-lang/rust/pull/35702
2359 [35707]: https://github.com/rust-lang/rust/pull/35707
2360 [35728]: https://github.com/rust-lang/rust/pull/35728
2361 [35734]: https://github.com/rust-lang/rust/pull/35734
2362 [35755]: https://github.com/rust-lang/rust/pull/35755
2363 [35761]: https://github.com/rust-lang/rust/pull/35761
2364 [35764]: https://github.com/rust-lang/rust/pull/35764
2365 [35814]: https://github.com/rust-lang/rust/pull/35814
2366 [35854]: https://github.com/rust-lang/rust/pull/35854
2367 [35871]: https://github.com/rust-lang/rust/pull/35871
2368 [35884]: https://github.com/rust-lang/rust/pull/35884
2369 [35911]: https://github.com/rust-lang/rust/pull/35911
2370 [35969]: https://github.com/rust-lang/rust/pull/35969
2371 [35975]: https://github.com/rust-lang/rust/pull/35975
2372 [36004]: https://github.com/rust-lang/rust/pull/36004
2373 [36008]: https://github.com/rust-lang/rust/pull/36008
2374 [36014]: https://github.com/rust-lang/rust/pull/36014
2375 [36029]: https://github.com/rust-lang/rust/pull/36029
2376 [36059]: https://github.com/rust-lang/rust/pull/36059
2377 [36072]: https://github.com/rust-lang/rust/pull/36072
2378 [36101]: https://github.com/rust-lang/rust/pull/36101
2379 [36104]: https://github.com/rust-lang/rust/pull/36104
2380 [36171]: https://github.com/rust-lang/rust/pull/36171
2381 [36173]: https://github.com/rust-lang/rust/pull/36173
2382 [36178]: https://github.com/rust-lang/rust/pull/36178
2383 [36213]: https://github.com/rust-lang/rust/pull/36213
2384 [36214]: https://github.com/rust-lang/rust/pull/36214
2385 [36264]: https://github.com/rust-lang/rust/pull/36264
2386 [36266]: https://github.com/rust-lang/rust/pull/36266
2387 [36289]: https://github.com/rust-lang/rust/pull/36289
2388 [36338]: https://github.com/rust-lang/rust/pull/36338
2389 [36351]: https://github.com/rust-lang/rust/pull/36351
2390 [36355]: https://github.com/rust-lang/rust/pull/36355
2391 [36369]: https://github.com/rust-lang/rust/pull/36369
2392 [36372]: https://github.com/rust-lang/rust/pull/36372
2393 [36423]: https://github.com/rust-lang/rust/pull/36423
2394 [36482]: https://github.com/rust-lang/rust/pull/36482
2395 [36505]: https://github.com/rust-lang/rust/pull/36505
2396 [36524]: https://github.com/rust-lang/rust/pull/36524
2397 [36527]: https://github.com/rust-lang/rust/pull/36527
2398 [36551]: https://github.com/rust-lang/rust/pull/36551
2399 [36574]: https://github.com/rust-lang/rust/pull/36574
2400 [36586]: https://github.com/rust-lang/rust/pull/36586
2401 [36592]: https://github.com/rust-lang/rust/pull/36592
2402 [36631]: https://github.com/rust-lang/rust/pull/36631
2403 [36639]: https://github.com/rust-lang/rust/pull/36639
2404 [36721]: https://github.com/rust-lang/rust/pull/36721
2405 [36727]: https://github.com/rust-lang/rust/pull/36727
2406 [36730]: https://github.com/rust-lang/rust/pull/36730
2407 [36734]: https://github.com/rust-lang/rust/pull/36734
2408 [36754]: https://github.com/rust-lang/rust/pull/36754
2409 [36995]: https://github.com/rust-lang/rust/pull/36995
2410 [RFC 0016]: https://github.com/rust-lang/rfcs/blob/master/text/0016-more-attributes.md
2411 [RFC 0243]: https://github.com/rust-lang/rfcs/blob/master/text/0243-trait-based-exception-handling.md
2412 [RFC 1506]: https://github.com/rust-lang/rfcs/blob/master/text/1506-adt-kinds.md
2413 [RFC 401]: https://github.com/rust-lang/rfcs/blob/master/text/0401-coercions.md
2414 [RFC 873]: https://github.com/rust-lang/rfcs/blob/master/text/0873-type-macros.md
2415 [cargo/2818]: https://github.com/rust-lang/cargo/pull/2818
2416 [cargo/3000]: https://github.com/rust-lang/cargo/pull/3000
2417 [cargo/3021]: https://github.com/rust-lang/cargo/pull/3021
2418 [cargo/3038]: https://github.com/rust-lang/cargo/pull/3038
2419 [cargo/3060]: https://github.com/rust-lang/cargo/pull/3060
2420 [cargo/3078]: https://github.com/rust-lang/cargo/pull/3078
2421 [cargo/3089]: https://github.com/rust-lang/cargo/pull/3089
2422 [cargo/3092]: https://github.com/rust-lang/cargo/pull/3092
2423 [cargo/3110]: https://github.com/rust-lang/cargo/pull/3110
2424 [cargo/3121]: https://github.com/rust-lang/cargo/pull/3121
2425 [cargo/3123]: https://github.com/rust-lang/cargo/pull/3123
2426 [cargo/3125]: https://github.com/rust-lang/cargo/pull/3125
2427 [cargo/3136]: https://github.com/rust-lang/cargo/pull/3136
2428 [cargo/3144]: https://github.com/rust-lang/cargo/pull/3144
2429 [cargo/3146]: https://github.com/rust-lang/cargo/pull/3146
2430 [cargo/3157]: https://github.com/rust-lang/cargo/pull/3157
2431 [cargo/3162]: https://github.com/rust-lang/cargo/pull/3162
2432 [cargo/3205]: https://github.com/rust-lang/cargo/pull/3205
2433 [cargo/3241]: https://github.com/rust-lang/cargo/pull/3241
2434 [cargo/3242]: https://github.com/rust-lang/cargo/pull/3242
2435 [rustup]: https://www.rustup.rs
2436 [`checked_abs`]: https://doc.rust-lang.org/std/primitive.i32.html#method.checked_abs
2437 [`wrapping_abs`]: https://doc.rust-lang.org/std/primitive.i32.html#method.wrapping_abs
2438 [`overflowing_abs`]: https://doc.rust-lang.org/std/primitive.i32.html#method.overflowing_abs
2439 [`RefCell::try_borrow`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.try_borrow
2440 [`RefCell::try_borrow_mut`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.try_borrow_mut
2441 [`SipHasher`]: https://doc.rust-lang.org/std/hash/struct.SipHasher.html
2442 [`DefaultHasher`]: https://doc.rust-lang.org/std/collections/hash_map/struct.DefaultHasher.html
2443
2444
2445 Version 1.12.1 (2016-10-20)
2446 ===========================
2447
2448 Regression Fixes
2449 ----------------
2450
2451 * [ICE: 'rustc' panicked at 'assertion failed: concrete_substs.is_normalized_for_trans()' #36381][36381]
2452 * [Confusion with double negation and booleans][36856]
2453 * [rustc 1.12.0 fails with SIGSEGV in release mode (syn crate 0.8.0)][36875]
2454 * [Rustc 1.12.0 Windows build of `ethcore` crate fails with LLVM error][36924]
2455 * [1.12.0: High memory usage when linking in release mode with debug info][36926]
2456 * [Corrupted memory after updated to 1.12][36936]
2457 * ["Let NullaryConstructor = something;" causes internal compiler error: "tried to overwrite interned AdtDef"][37026]
2458 * [Fix ICE: inject bitcast if types mismatch for invokes/calls/stores][37112]
2459 * [debuginfo: Handle spread_arg case in MIR-trans in a more stable way.][37153]
2460
2461 [36381]: https://github.com/rust-lang/rust/issues/36381
2462 [36856]: https://github.com/rust-lang/rust/issues/36856
2463 [36875]: https://github.com/rust-lang/rust/issues/36875
2464 [36924]: https://github.com/rust-lang/rust/issues/36924
2465 [36926]: https://github.com/rust-lang/rust/issues/36926
2466 [36936]: https://github.com/rust-lang/rust/issues/36936
2467 [37026]: https://github.com/rust-lang/rust/issues/37026
2468 [37112]: https://github.com/rust-lang/rust/issues/37112
2469 [37153]: https://github.com/rust-lang/rust/issues/37153
2470
2471
2472 Version 1.12.0 (2016-09-29)
2473 ===========================
2474
2475 Highlights
2476 ----------
2477
2478 * [`rustc` translates code to LLVM IR via its own "middle" IR (MIR)](https://github.com/rust-lang/rust/pull/34096).
2479   This translation pass is far simpler than the previous AST->LLVM pass, and
2480   creates opportunities to perform new optimizations directly on the MIR. It
2481   was previously described [on the Rust blog](https://blog.rust-lang.org/2016/04/19/MIR.html).
2482 * [`rustc` presents a new, more readable error format, along with
2483   machine-readable JSON error output for use by IDEs](https://github.com/rust-lang/rust/pull/35401).
2484   Most common editors supporting Rust have been updated to work with it. It was
2485   previously described [on the Rust blog](https://blog.rust-lang.org/2016/08/10/Shape-of-errors-to-come.html).
2486
2487 Compiler
2488 --------
2489
2490 * [`rustc` translates code to LLVM IR via its own "middle" IR (MIR)](https://github.com/rust-lang/rust/pull/34096).
2491   This translation pass is far simpler than the previous AST->LLVM pass, and
2492   creates opportunities to perform new optimizations directly on the MIR. It
2493   was previously described [on the Rust blog](https://blog.rust-lang.org/2016/04/19/MIR.html).
2494 * [Print the Rust target name, not the LLVM target name, with
2495   `--print target-list`](https://github.com/rust-lang/rust/pull/35489)
2496 * [The computation of `TypeId` is correct in some cases where it was previously
2497   producing inconsistent results](https://github.com/rust-lang/rust/pull/35267)
2498 * [The `mips-unknown-linux-gnu` target uses hardware floating point by default](https://github.com/rust-lang/rust/pull/34910)
2499 * [The `rustc` arguments, `--print target-cpus`, `--print target-features`,
2500   `--print relocation-models`, and `--print code-models` print the available
2501   options to the `-C target-cpu`, `-C target-feature`, `-C relocation-model` and
2502   `-C code-model` code generation arguments](https://github.com/rust-lang/rust/pull/34845)
2503 * [`rustc` supports three new MUSL targets on ARM: `arm-unknown-linux-musleabi`,
2504   `arm-unknown-linux-musleabihf`, and `armv7-unknown-linux-musleabihf`](https://github.com/rust-lang/rust/pull/35060).
2505   These targets produce statically-linked binaries. There are no binary release
2506   builds yet though.
2507
2508 Diagnostics
2509 -----------
2510
2511 * [`rustc` presents a new, more readable error format, along with
2512   machine-readable JSON error output for use by IDEs](https://github.com/rust-lang/rust/pull/35401).
2513   Most common editors supporting Rust have been updated to work with it. It was
2514   previously described [on the Rust blog](https://blog.rust-lang.org/2016/08/10/Shape-of-errors-to-come.html).
2515 * [In error descriptions, references are now described in plain English,
2516   instead of as "&-ptr"](https://github.com/rust-lang/rust/pull/35611)
2517 * [In error type descriptions, unknown numeric types are named `{integer}` or
2518   `{float}` instead of `_`](https://github.com/rust-lang/rust/pull/35080)
2519 * [`rustc` emits a clearer error when inner attributes follow a doc comment](https://github.com/rust-lang/rust/pull/34676)
2520
2521 Language
2522 --------
2523
2524 * [`macro_rules!` invocations can be made within `macro_rules!` invocations](https://github.com/rust-lang/rust/pull/34925)
2525 * [`macro_rules!` meta-variables are hygienic](https://github.com/rust-lang/rust/pull/35453)
2526 * [`macro_rules!` `tt` matchers can be reparsed correctly, making them much more
2527   useful](https://github.com/rust-lang/rust/pull/34908)
2528 * [`macro_rules!` `stmt` matchers correctly consume the entire contents when
2529   inside non-braces invocations](https://github.com/rust-lang/rust/pull/34886)
2530 * [Semicolons are properly required as statement delimiters inside
2531   `macro_rules!` invocations](https://github.com/rust-lang/rust/pull/34660)
2532 * [`cfg_attr` works on `path` attributes](https://github.com/rust-lang/rust/pull/34546)
2533
2534 Stabilized APIs
2535 ---------------
2536
2537 * [`Cell::as_ptr`](https://doc.rust-lang.org/std/cell/struct.Cell.html#method.as_ptr)
2538 * [`RefCell::as_ptr`](https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.as_ptr)
2539 * [`IpAddr::is_unspecified`](https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_unspecified)
2540 * [`IpAddr::is_loopback`](https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_loopback)
2541 * [`IpAddr::is_multicast`](https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_multicast)
2542 * [`Ipv4Addr::is_unspecified`](https://doc.rust-lang.org/std/net/struct.Ipv4Addr.html#method.is_unspecified)
2543 * [`Ipv6Addr::octets`](https://doc.rust-lang.org/std/net/struct.Ipv6Addr.html#method.octets)
2544 * [`LinkedList::contains`](https://doc.rust-lang.org/std/collections/linked_list/struct.LinkedList.html#method.contains)
2545 * [`VecDeque::contains`](https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.contains)
2546 * [`ExitStatusExt::from_raw`](https://doc.rust-lang.org/std/os/unix/process/trait.ExitStatusExt.html#tymethod.from_raw).
2547   Both on Unix and Windows.
2548 * [`Receiver::recv_timeout`](https://doc.rust-lang.org/std/sync/mpsc/struct.Receiver.html#method.recv_timeout)
2549 * [`RecvTimeoutError`](https://doc.rust-lang.org/std/sync/mpsc/enum.RecvTimeoutError.html)
2550 * [`BinaryHeap::peek_mut`](https://doc.rust-lang.org/std/collections/binary_heap/struct.BinaryHeap.html#method.peek_mut)
2551 * [`PeekMut`](https://doc.rust-lang.org/std/collections/binary_heap/struct.PeekMut.html)
2552 * [`iter::Product`](https://doc.rust-lang.org/std/iter/trait.Product.html)
2553 * [`iter::Sum`](https://doc.rust-lang.org/std/iter/trait.Sum.html)
2554 * [`OccupiedEntry::remove_entry`](https://doc.rust-lang.org/std/collections/btree_map/struct.OccupiedEntry.html#method.remove_entry)
2555 * [`VacantEntry::into_key`](https://doc.rust-lang.org/std/collections/btree_map/struct.VacantEntry.html#method.into_key)
2556
2557 Libraries
2558 ---------
2559
2560 * [The `format!` macro and friends now allow a single argument to be formatted
2561   in multiple styles](https://github.com/rust-lang/rust/pull/33642)
2562 * [The lifetime bounds on `[T]::binary_search_by` and
2563   `[T]::binary_search_by_key` have been adjusted to be more flexible](https://github.com/rust-lang/rust/pull/34762)
2564 * [`Option` implements `From` for its contained type](https://github.com/rust-lang/rust/pull/34828)
2565 * [`Cell`, `RefCell` and `UnsafeCell` implement `From` for their contained type](https://github.com/rust-lang/rust/pull/35392)
2566 * [`RwLock` panics if the reader count overflows](https://github.com/rust-lang/rust/pull/35378)
2567 * [`vec_deque::Drain`, `hash_map::Drain` and `hash_set::Drain` are covariant](https://github.com/rust-lang/rust/pull/35354)
2568 * [`vec::Drain` and `binary_heap::Drain` are covariant](https://github.com/rust-lang/rust/pull/34951)
2569 * [`Cow<str>` implements `FromIterator` for `char`, `&str` and `String`](https://github.com/rust-lang/rust/pull/35064)
2570 * [Sockets on Linux are correctly closed in subprocesses via `SOCK_CLOEXEC`](https://github.com/rust-lang/rust/pull/34946)
2571 * [`hash_map::Entry`, `hash_map::VacantEntry` and `hash_map::OccupiedEntry`
2572   implement `Debug`](https://github.com/rust-lang/rust/pull/34937)
2573 * [`btree_map::Entry`, `btree_map::VacantEntry` and `btree_map::OccupiedEntry`
2574   implement `Debug`](https://github.com/rust-lang/rust/pull/34885)
2575 * [`String` implements `AddAssign`](https://github.com/rust-lang/rust/pull/34890)
2576 * [Variadic `extern fn` pointers implement the `Clone`, `PartialEq`, `Eq`,
2577   `PartialOrd`, `Ord`, `Hash`, `fmt::Pointer`, and `fmt::Debug` traits](https://github.com/rust-lang/rust/pull/34879)
2578 * [`FileType` implements `Debug`](https://github.com/rust-lang/rust/pull/34757)
2579 * [References to `Mutex` and `RwLock` are unwind-safe](https://github.com/rust-lang/rust/pull/34756)
2580 * [`mpsc::sync_channel` `Receiver`s return any available message before
2581   reporting a disconnect](https://github.com/rust-lang/rust/pull/34731)
2582 * [Unicode definitions have been updated to 9.0](https://github.com/rust-lang/rust/pull/34599)
2583 * [`env` iterators implement `DoubleEndedIterator`](https://github.com/rust-lang/rust/pull/33312)
2584
2585 Cargo
2586 -----
2587
2588 * [Support local mirrors of registries](https://github.com/rust-lang/cargo/pull/2857)
2589 * [Add support for command aliases](https://github.com/rust-lang/cargo/pull/2679)
2590 * [Allow `opt-level="s"` / `opt-level="z"` in profile overrides](https://github.com/rust-lang/cargo/pull/3007)
2591 * [Make `cargo doc --open --target` work as expected](https://github.com/rust-lang/cargo/pull/2988)
2592 * [Speed up noop registry updates](https://github.com/rust-lang/cargo/pull/2974)
2593 * [Update OpenSSL](https://github.com/rust-lang/cargo/pull/2971)
2594 * [Fix `--panic=abort` with plugins](https://github.com/rust-lang/cargo/pull/2954)
2595 * [Always pass `-C metadata` to the compiler](https://github.com/rust-lang/cargo/pull/2946)
2596 * [Fix depending on git repos with workspaces](https://github.com/rust-lang/cargo/pull/2938)
2597 * [Add a `--lib` flag to `cargo new`](https://github.com/rust-lang/cargo/pull/2921)
2598 * [Add `http.cainfo` for custom certs](https://github.com/rust-lang/cargo/pull/2917)
2599 * [Indicate the compilation profile after compiling](https://github.com/rust-lang/cargo/pull/2909)
2600 * [Allow enabling features for dependencies with `--features`](https://github.com/rust-lang/cargo/pull/2876)
2601 * [Add `--jobs` flag to `cargo package`](https://github.com/rust-lang/cargo/pull/2867)
2602 * [Add `--dry-run` to `cargo publish`](https://github.com/rust-lang/cargo/pull/2849)
2603 * [Add support for `RUSTDOCFLAGS`](https://github.com/rust-lang/cargo/pull/2794)
2604
2605 Performance
2606 -----------
2607
2608 * [`panic::catch_unwind` is more optimized](https://github.com/rust-lang/rust/pull/35444)
2609 * [`panic::catch_unwind` no longer accesses thread-local storage on entry](https://github.com/rust-lang/rust/pull/34866)
2610
2611 Tooling
2612 -------
2613
2614 * [Test binaries now support a `--test-threads` argument to specify the number
2615   of threads used to run tests, and which acts the same as the
2616   `RUST_TEST_THREADS` environment variable](https://github.com/rust-lang/rust/pull/35414)
2617 * [The test runner now emits a warning when tests run over 60 seconds](https://github.com/rust-lang/rust/pull/35405)
2618 * [rustdoc: Fix methods in search results](https://github.com/rust-lang/rust/pull/34752)
2619 * [`rust-lldb` warns about unsupported versions of LLDB](https://github.com/rust-lang/rust/pull/34646)
2620 * [Rust releases now come with source packages that can be installed by rustup
2621   via `rustup component add rust-src`](https://github.com/rust-lang/rust/pull/34366).
2622   The resulting source code can be used by tools and IDES, located in the
2623   sysroot under `lib/rustlib/src`.
2624
2625 Misc
2626 ----
2627
2628 * [The compiler can now be built against LLVM 3.9](https://github.com/rust-lang/rust/pull/35594)
2629 * Many minor improvements to the documentation.
2630 * [The Rust exception handling "personality" routine is now written in Rust](https://github.com/rust-lang/rust/pull/34832)
2631
2632 Compatibility Notes
2633 -------------------
2634
2635 * [When printing Windows `OsStr`s, unpaired surrogate codepoints are escaped
2636   with the lowercase format instead of the uppercase](https://github.com/rust-lang/rust/pull/35084)
2637 * [When formatting strings, if "precision" is specified, the "fill",
2638   "align" and "width" specifiers are no longer ignored](https://github.com/rust-lang/rust/pull/34544)
2639 * [The `Debug` impl for strings no longer escapes all non-ASCII characters](https://github.com/rust-lang/rust/pull/34485)
2640
2641
2642 Version 1.11.0 (2016-08-18)
2643 ===========================
2644
2645 Language
2646 --------
2647
2648 * [`cfg_attr` works on `path` attributes](https://github.com/rust-lang/rust/pull/34546)
2649 * [Support nested `cfg_attr` attributes](https://github.com/rust-lang/rust/pull/34216)
2650 * [Allow statement-generating braced macro invocations at the end of blocks](https://github.com/rust-lang/rust/pull/34436)
2651 * [Macros can be expanded inside of trait definitions](https://github.com/rust-lang/rust/pull/34213)
2652 * [`#[macro_use]` works properly when it is itself expanded from a macro](https://github.com/rust-lang/rust/pull/34032)
2653
2654 Stabilized APIs
2655 ---------------
2656
2657 * [`BinaryHeap::append`](https://doc.rust-lang.org/std/collections/binary_heap/struct.BinaryHeap.html#method.append)
2658 * [`BTreeMap::append`](https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.append)
2659 * [`BTreeMap::split_off`](https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.split_off)
2660 * [`BTreeSet::append`](https://doc.rust-lang.org/std/collections/btree_set/struct.BTreeSet.html#method.append)
2661 * [`BTreeSet::split_off`](https://doc.rust-lang.org/std/collections/btree_set/struct.BTreeSet.html#method.split_off)
2662 * [`f32::to_degrees`](https://doc.rust-lang.org/std/primitive.f32.html#method.to_degrees)
2663   (in libcore - previously stabilized in libstd)
2664 * [`f32::to_radians`](https://doc.rust-lang.org/std/primitive.f32.html#method.to_radians)
2665   (in libcore - previously stabilized in libstd)
2666 * [`f64::to_degrees`](https://doc.rust-lang.org/std/primitive.f64.html#method.to_degrees)
2667   (in libcore - previously stabilized in libstd)
2668 * [`f64::to_radians`](https://doc.rust-lang.org/std/primitive.f64.html#method.to_radians)
2669   (in libcore - previously stabilized in libstd)
2670 * [`Iterator::sum`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.sum)
2671 * [`Iterator::product`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.sum)
2672 * [`Cell::get_mut`](https://doc.rust-lang.org/std/cell/struct.Cell.html#method.get_mut)
2673 * [`RefCell::get_mut`](https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.get_mut)
2674
2675 Libraries
2676 ---------
2677
2678 * [The `thread_local!` macro supports multiple definitions in a single
2679    invocation, and can apply attributes](https://github.com/rust-lang/rust/pull/34077)
2680 * [`Cow` implements `Default`](https://github.com/rust-lang/rust/pull/34305)
2681 * [`Wrapping` implements binary, octal, lower-hex and upper-hex
2682   `Display` formatting](https://github.com/rust-lang/rust/pull/34190)
2683 * [The range types implement `Hash`](https://github.com/rust-lang/rust/pull/34180)
2684 * [`lookup_host` ignores unknown address types](https://github.com/rust-lang/rust/pull/34067)
2685 * [`assert_eq!` accepts a custom error message, like `assert!` does](https://github.com/rust-lang/rust/pull/33976)
2686 * [The main thread is now called "main" instead of "&lt;main&gt;"](https://github.com/rust-lang/rust/pull/33803)
2687
2688 Cargo
2689 -----
2690
2691 * [Disallow specifying features of transitive deps](https://github.com/rust-lang/cargo/pull/2821)
2692 * [Add color support for Windows consoles](https://github.com/rust-lang/cargo/pull/2804)
2693 * [Fix `harness = false` on `[lib]` sections](https://github.com/rust-lang/cargo/pull/2795)
2694 * [Don't panic when `links` contains a '.'](https://github.com/rust-lang/cargo/pull/2787)
2695 * [Build scripts can emit warnings](https://github.com/rust-lang/cargo/pull/2630),
2696   and `-vv` prints warnings for all crates.
2697 * [Ignore file locks on OS X NFS mounts](https://github.com/rust-lang/cargo/pull/2720)
2698 * [Don't warn about `package.metadata` keys](https://github.com/rust-lang/cargo/pull/2668).
2699   This provides room for expansion by arbitrary tools.
2700 * [Add support for cdylib crate types](https://github.com/rust-lang/cargo/pull/2741)
2701 * [Prevent publishing crates when files are dirty](https://github.com/rust-lang/cargo/pull/2781)
2702 * [Don't fetch all crates on clean](https://github.com/rust-lang/cargo/pull/2704)
2703 * [Propagate --color option to rustc](https://github.com/rust-lang/cargo/pull/2779)
2704 * [Fix `cargo doc --open` on Windows](https://github.com/rust-lang/cargo/pull/2780)
2705 * [Improve autocompletion](https://github.com/rust-lang/cargo/pull/2772)
2706 * [Configure colors of stderr as well as stdout](https://github.com/rust-lang/cargo/pull/2739)
2707
2708 Performance
2709 -----------
2710
2711 * [Caching projections speeds up type check dramatically for some
2712   workloads](https://github.com/rust-lang/rust/pull/33816)
2713 * [The default `HashMap` hasher is SipHash 1-3 instead of SipHash 2-4](https://github.com/rust-lang/rust/pull/33940)
2714   This hasher is faster, but is believed to provide sufficient
2715   protection from collision attacks.
2716 * [Comparison of `Ipv4Addr` is 10x faster](https://github.com/rust-lang/rust/pull/33891)
2717
2718 Rustdoc
2719 -------
2720
2721 * [Fix empty implementation section on some module pages](https://github.com/rust-lang/rust/pull/34536)
2722 * [Fix inlined renamed re-exports in import lists](https://github.com/rust-lang/rust/pull/34479)
2723 * [Fix search result layout for enum variants and struct fields](https://github.com/rust-lang/rust/pull/34477)
2724 * [Fix issues with source links to external crates](https://github.com/rust-lang/rust/pull/34387)
2725 * [Fix redirect pages for renamed re-exports](https://github.com/rust-lang/rust/pull/34245)
2726
2727 Tooling
2728 -------
2729
2730 * [rustc is better at finding the MSVC toolchain](https://github.com/rust-lang/rust/pull/34492)
2731 * [When emitting debug info, rustc emits frame pointers for closures,
2732   shims and glue, as it does for all other functions](https://github.com/rust-lang/rust/pull/33909)
2733 * [rust-lldb warns about unsupported versions of LLDB](https://github.com/rust-lang/rust/pull/34646)
2734 * Many more errors have been given error codes and extended
2735   explanations
2736 * API documentation continues to be improved, with many new examples
2737
2738 Misc
2739 ----
2740
2741 * [rustc no longer hangs when dependencies recursively re-export
2742   submodules](https://github.com/rust-lang/rust/pull/34542)
2743 * [rustc requires LLVM 3.7+](https://github.com/rust-lang/rust/pull/34104)
2744 * [The 'How Safe and Unsafe Interact' chapter of The Rustonomicon was
2745   rewritten](https://github.com/rust-lang/rust/pull/33895)
2746 * [rustc support 16-bit pointer sizes](https://github.com/rust-lang/rust/pull/33460).
2747   No targets use this yet, but it works toward AVR support.
2748
2749 Compatibility Notes
2750 -------------------
2751
2752 * [`const`s and `static`s may not have unsized types](https://github.com/rust-lang/rust/pull/34443)
2753 * [The new follow-set rules that place restrictions on `macro_rules!`
2754   in order to ensure syntax forward-compatibility have been enabled](https://github.com/rust-lang/rust/pull/33982)
2755   This was an [amendment to RFC 550](https://github.com/rust-lang/rfcs/pull/1384),
2756   and has been a warning since 1.10.
2757 * [`cfg` attribute process has been refactored to fix various bugs](https://github.com/rust-lang/rust/pull/33706).
2758   This causes breakage in some corner cases.
2759
2760
2761 Version 1.10.0 (2016-07-07)
2762 ===========================
2763
2764 Language
2765 --------
2766
2767 * [Allow `concat_idents!` in type positions as well as in expression
2768   positions](https://github.com/rust-lang/rust/pull/33735).
2769 * [`Copy` types are required to have a trivial implementation of `Clone`](https://github.com/rust-lang/rust/pull/33420).
2770   [RFC 1521](https://github.com/rust-lang/rfcs/blob/master/text/1521-copy-clone-semantics.md).
2771 * [Single-variant enums support the `#[repr(..)]` attribute](https://github.com/rust-lang/rust/pull/33355).
2772 * [Fix `#[derive(RustcEncodable)]` in the presence of other `encode` methods](https://github.com/rust-lang/rust/pull/32908).
2773 * [`panic!` can be converted to a runtime abort with the
2774   `-C panic=abort` flag](https://github.com/rust-lang/rust/pull/32900).
2775   [RFC 1513](https://github.com/rust-lang/rfcs/blob/master/text/1513-less-unwinding.md).
2776 * [Add a new crate type, 'cdylib'](https://github.com/rust-lang/rust/pull/33553).
2777   cdylibs are dynamic libraries suitable for loading by non-Rust hosts.
2778   [RFC 1510](https://github.com/rust-lang/rfcs/blob/master/text/1510-rdylib.md).
2779   Note that Cargo does not yet directly support cdylibs.
2780
2781 Stabilized APIs
2782 ---------------
2783
2784 * `os::windows::fs::OpenOptionsExt::access_mode`
2785 * `os::windows::fs::OpenOptionsExt::share_mode`
2786 * `os::windows::fs::OpenOptionsExt::custom_flags`
2787 * `os::windows::fs::OpenOptionsExt::attributes`
2788 * `os::windows::fs::OpenOptionsExt::security_qos_flags`
2789 * `os::unix::fs::OpenOptionsExt::custom_flags`
2790 * [`sync::Weak::new`](http://doc.rust-lang.org/alloc/arc/struct.Weak.html#method.new)
2791 * `Default for sync::Weak`
2792 * [`panic::set_hook`](http://doc.rust-lang.org/std/panic/fn.set_hook.html)
2793 * [`panic::take_hook`](http://doc.rust-lang.org/std/panic/fn.take_hook.html)
2794 * [`panic::PanicInfo`](http://doc.rust-lang.org/std/panic/struct.PanicInfo.html)
2795 * [`panic::PanicInfo::payload`](http://doc.rust-lang.org/std/panic/struct.PanicInfo.html#method.payload)
2796 * [`panic::PanicInfo::location`](http://doc.rust-lang.org/std/panic/struct.PanicInfo.html#method.location)
2797 * [`panic::Location`](http://doc.rust-lang.org/std/panic/struct.Location.html)
2798 * [`panic::Location::file`](http://doc.rust-lang.org/std/panic/struct.Location.html#method.file)
2799 * [`panic::Location::line`](http://doc.rust-lang.org/std/panic/struct.Location.html#method.line)
2800 * [`ffi::CStr::from_bytes_with_nul`](http://doc.rust-lang.org/std/ffi/struct.CStr.html#method.from_bytes_with_nul)
2801 * [`ffi::CStr::from_bytes_with_nul_unchecked`](http://doc.rust-lang.org/std/ffi/struct.CStr.html#method.from_bytes_with_nul_unchecked)
2802 * [`ffi::FromBytesWithNulError`](http://doc.rust-lang.org/std/ffi/struct.FromBytesWithNulError.html)
2803 * [`fs::Metadata::modified`](http://doc.rust-lang.org/std/fs/struct.Metadata.html#method.modified)
2804 * [`fs::Metadata::accessed`](http://doc.rust-lang.org/std/fs/struct.Metadata.html#method.accessed)
2805 * [`fs::Metadata::created`](http://doc.rust-lang.org/std/fs/struct.Metadata.html#method.created)
2806 * `sync::atomic::Atomic{Usize,Isize,Bool,Ptr}::compare_exchange`
2807 * `sync::atomic::Atomic{Usize,Isize,Bool,Ptr}::compare_exchange_weak`
2808 * `collections::{btree,hash}_map::{Occupied,Vacant,}Entry::key`
2809 * `os::unix::net::{UnixStream, UnixListener, UnixDatagram, SocketAddr}`
2810 * [`SocketAddr::is_unnamed`](http://doc.rust-lang.org/std/os/unix/net/struct.SocketAddr.html#method.is_unnamed)
2811 * [`SocketAddr::as_pathname`](http://doc.rust-lang.org/std/os/unix/net/struct.SocketAddr.html#method.as_pathname)
2812 * [`UnixStream::connect`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.connect)
2813 * [`UnixStream::pair`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.pair)
2814 * [`UnixStream::try_clone`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.try_clone)
2815 * [`UnixStream::local_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.local_addr)
2816 * [`UnixStream::peer_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.peer_addr)
2817 * [`UnixStream::set_read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.read_timeout)
2818 * [`UnixStream::set_write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.write_timeout)
2819 * [`UnixStream::read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.read_timeout)
2820 * [`UnixStream::write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.write_timeout)
2821 * [`UnixStream::set_nonblocking`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.set_nonblocking)
2822 * [`UnixStream::take_error`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.take_error)
2823 * [`UnixStream::shutdown`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.shutdown)
2824 * Read/Write/RawFd impls for `UnixStream`
2825 * [`UnixListener::bind`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.bind)
2826 * [`UnixListener::accept`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.accept)
2827 * [`UnixListener::try_clone`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.try_clone)
2828 * [`UnixListener::local_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.local_addr)
2829 * [`UnixListener::set_nonblocking`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.set_nonblocking)
2830 * [`UnixListener::take_error`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.take_error)
2831 * [`UnixListener::incoming`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.incoming)
2832 * RawFd impls for `UnixListener`
2833 * [`UnixDatagram::bind`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.bind)
2834 * [`UnixDatagram::unbound`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.unbound)
2835 * [`UnixDatagram::pair`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.pair)
2836 * [`UnixDatagram::connect`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.connect)
2837 * [`UnixDatagram::try_clone`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.try_clone)
2838 * [`UnixDatagram::local_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.local_addr)
2839 * [`UnixDatagram::peer_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.peer_addr)
2840 * [`UnixDatagram::recv_from`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.recv_from)
2841 * [`UnixDatagram::recv`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.recv)
2842 * [`UnixDatagram::send_to`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.send_to)
2843 * [`UnixDatagram::send`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.send)
2844 * [`UnixDatagram::set_read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.set_read_timeout)
2845 * [`UnixDatagram::set_write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.set_write_timeout)
2846 * [`UnixDatagram::read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.read_timeout)
2847 * [`UnixDatagram::write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.write_timeout)
2848 * [`UnixDatagram::set_nonblocking`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.set_nonblocking)
2849 * [`UnixDatagram::take_error`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.take_error)
2850 * [`UnixDatagram::shutdown`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.shutdown)
2851 * RawFd impls for `UnixDatagram`
2852 * `{BTree,Hash}Map::values_mut`
2853 * [`<[_]>::binary_search_by_key`](http://doc.rust-lang.org/beta/std/primitive.slice.html#method.binary_search_by_key)
2854
2855 Libraries
2856 ---------
2857
2858 * [The `abs_sub` method of floats is deprecated](https://github.com/rust-lang/rust/pull/33664).
2859   The semantics of this minor method are subtle and probably not what
2860   most people want.
2861 * [Add implementation of Ord for Cell<T> and RefCell<T> where T: Ord](https://github.com/rust-lang/rust/pull/33306).
2862 * [On Linux, if `HashMap`s can't be initialized with `getrandom` they
2863   will fall back to `/dev/urandom` temporarily to avoid blocking
2864   during early boot](https://github.com/rust-lang/rust/pull/33086).
2865 * [Implemented negation for wrapping numerals](https://github.com/rust-lang/rust/pull/33067).
2866 * [Implement `Clone` for `binary_heap::IntoIter`](https://github.com/rust-lang/rust/pull/33050).
2867 * [Implement `Display` and `Hash` for `std::num::Wrapping`](https://github.com/rust-lang/rust/pull/33023).
2868 * [Add `Default` implementation for `&CStr`, `CString`](https://github.com/rust-lang/rust/pull/32990).
2869 * [Implement `From<Vec<T>>` and `Into<Vec<T>>` for `VecDeque<T>`](https://github.com/rust-lang/rust/pull/32866).
2870 * [Implement `Default` for `UnsafeCell`, `fmt::Error`, `Condvar`,
2871   `Mutex`, `RwLock`](https://github.com/rust-lang/rust/pull/32785).
2872
2873 Cargo
2874 -----
2875 * [Cargo.toml supports the `profile.*.panic` option](https://github.com/rust-lang/cargo/pull/2687).
2876   This controls the runtime behavior of the `panic!` macro
2877   and can be either "unwind" (the default), or "abort".
2878   [RFC 1513](https://github.com/rust-lang/rfcs/blob/master/text/1513-less-unwinding.md).
2879 * [Don't throw away errors with `-p` arguments](https://github.com/rust-lang/cargo/pull/2723).
2880 * [Report status to stderr instead of stdout](https://github.com/rust-lang/cargo/pull/2693).
2881 * [Build scripts are passed a `CARGO_MANIFEST_LINKS` environment
2882   variable that corresponds to the `links` field of the manifest](https://github.com/rust-lang/cargo/pull/2710).
2883 * [Ban keywords from crate names](https://github.com/rust-lang/cargo/pull/2707).
2884 * [Canonicalize `CARGO_HOME` on Windows](https://github.com/rust-lang/cargo/pull/2604).
2885 * [Retry network requests](https://github.com/rust-lang/cargo/pull/2396).
2886   By default they are retried twice, which can be customized with the
2887   `net.retry` value in `.cargo/config`.
2888 * [Don't print extra error info for failing subcommands](https://github.com/rust-lang/cargo/pull/2674).
2889 * [Add `--force` flag to `cargo install`](https://github.com/rust-lang/cargo/pull/2405).
2890 * [Don't use `flock` on NFS mounts](https://github.com/rust-lang/cargo/pull/2623).
2891 * [Prefer building `cargo install` artifacts in temporary directories](https://github.com/rust-lang/cargo/pull/2610).
2892   Makes it possible to install multiple crates in parallel.
2893 * [Add `cargo test --doc`](https://github.com/rust-lang/cargo/pull/2578).
2894 * [Add `cargo --explain`](https://github.com/rust-lang/cargo/pull/2551).
2895 * [Don't print warnings when `-q` is passed](https://github.com/rust-lang/cargo/pull/2576).
2896 * [Add `cargo doc --lib` and `--bin`](https://github.com/rust-lang/cargo/pull/2577).
2897 * [Don't require build script output to be UTF-8](https://github.com/rust-lang/cargo/pull/2560).
2898 * [Correctly attempt multiple git usernames](https://github.com/rust-lang/cargo/pull/2584).
2899
2900 Performance
2901 -----------
2902
2903 * [rustc memory usage was reduced by refactoring the context used for
2904   type checking](https://github.com/rust-lang/rust/pull/33425).
2905 * [Speed up creation of `HashMap`s by caching the random keys used
2906   to initialize the hash state](https://github.com/rust-lang/rust/pull/33318).
2907 * [The `find` implementation for `Chain` iterators is 2x faster](https://github.com/rust-lang/rust/pull/33289).
2908 * [Trait selection optimizations speed up type checking by 15%](https://github.com/rust-lang/rust/pull/33138).
2909 * [Efficient trie lookup for boolean Unicode properties](https://github.com/rust-lang/rust/pull/33098).
2910   10x faster than the previous lookup tables.
2911 * [Special case `#[derive(Copy, Clone)]` to avoid bloat](https://github.com/rust-lang/rust/pull/31414).
2912
2913 Usability
2914 ---------
2915
2916 * Many incremental improvements to documentation and rustdoc.
2917 * [rustdoc: List blanket trait impls](https://github.com/rust-lang/rust/pull/33514).
2918 * [rustdoc: Clean up ABI rendering](https://github.com/rust-lang/rust/pull/33151).
2919 * [Indexing with the wrong type produces a more informative error](https://github.com/rust-lang/rust/pull/33401).
2920 * [Improve diagnostics for constants being used in irrefutable patterns](https://github.com/rust-lang/rust/pull/33406).
2921 * [When many method candidates are in scope limit the suggestions to 10](https://github.com/rust-lang/rust/pull/33338).
2922 * [Remove confusing suggestion when calling a `fn` type](https://github.com/rust-lang/rust/pull/33325).
2923 * [Do not suggest changing `&mut self` to `&mut mut self`](https://github.com/rust-lang/rust/pull/33319).
2924
2925 Misc
2926 ----
2927
2928 * [Update i686-linux-android features to match Android ABI](https://github.com/rust-lang/rust/pull/33651).
2929 * [Update aarch64-linux-android features to match Android ABI](https://github.com/rust-lang/rust/pull/33500).
2930 * [`std` no longer prints backtraces on platforms where the running
2931   module must be loaded with `env::current_exe`, which can't be relied
2932   on](https://github.com/rust-lang/rust/pull/33554).
2933 * This release includes std binaries for the i586-unknown-linux-gnu,
2934   i686-unknown-linux-musl, and armv7-linux-androideabi targets. The
2935   i586 target is for old x86 hardware without SSE2, and the armv7
2936   target is for Android running on modern ARM architectures.
2937 * [The `rust-gdb` and `rust-lldb` scripts are distributed on all
2938   Unix platforms](https://github.com/rust-lang/rust/pull/32835).
2939 * [On Unix the runtime aborts by calling `libc::abort` instead of
2940   generating an illegal instruction](https://github.com/rust-lang/rust/pull/31457).
2941 * [Rust is now bootstrapped from the previous release of Rust,
2942   instead of a snapshot from an arbitrary commit](https://github.com/rust-lang/rust/pull/32942).
2943
2944 Compatibility Notes
2945 -------------------
2946
2947 * [`AtomicBool` is now bool-sized, not word-sized](https://github.com/rust-lang/rust/pull/33579).
2948 * [`target_env` for Linux ARM targets is just `gnu`, not
2949   `gnueabihf`, `gnueabi`, etc](https://github.com/rust-lang/rust/pull/33403).
2950 * [Consistently panic on overflow in `Duration::new`](https://github.com/rust-lang/rust/pull/33072).
2951 * [Change `String::truncate` to panic less](https://github.com/rust-lang/rust/pull/32977).
2952 * [Add `:block` to the follow set for `:ty` and `:path`](https://github.com/rust-lang/rust/pull/32945).
2953   Affects how macros are parsed.
2954 * [Fix macro hygiene bug](https://github.com/rust-lang/rust/pull/32923).
2955 * [Feature-gated attributes on macro-generated macro invocations are
2956   now rejected](https://github.com/rust-lang/rust/pull/32791).
2957 * [Suppress fallback and ambiguity errors during type inference](https://github.com/rust-lang/rust/pull/32258).
2958   This caused some minor changes to type inference.
2959
2960
2961 Version 1.9.0 (2016-05-26)
2962 ==========================
2963
2964 Language
2965 --------
2966
2967 * The `#[deprecated]` attribute when applied to an API will generate
2968   warnings when used. The warnings may be suppressed with
2969   `#[allow(deprecated)]`. [RFC 1270].
2970 * [`fn` item types are zero sized, and each `fn` names a unique
2971   type][1.9fn]. This will break code that transmutes `fn`s, so calling
2972   `transmute` on a `fn` type will generate a warning for a few cycles,
2973   then will be converted to an error.
2974 * [Field and method resolution understand visibility, so private
2975   fields and methods cannot prevent the proper use of public fields
2976   and methods][1.9fv].
2977 * [The parser considers unicode codepoints in the
2978   `PATTERN_WHITE_SPACE` category to be whitespace][1.9ws].
2979
2980 Stabilized APIs
2981 ---------------
2982
2983 * [`std::panic`]
2984 * [`std::panic::catch_unwind`][] (renamed from `recover`)
2985 * [`std::panic::resume_unwind`][] (renamed from `propagate`)
2986 * [`std::panic::AssertUnwindSafe`][] (renamed from `AssertRecoverSafe`)
2987 * [`std::panic::UnwindSafe`][] (renamed from `RecoverSafe`)
2988 * [`str::is_char_boundary`]
2989 * [`<*const T>::as_ref`]
2990 * [`<*mut T>::as_ref`]
2991 * [`<*mut T>::as_mut`]
2992 * [`AsciiExt::make_ascii_uppercase`]
2993 * [`AsciiExt::make_ascii_lowercase`]
2994 * [`char::decode_utf16`]
2995 * [`char::DecodeUtf16`]
2996 * [`char::DecodeUtf16Error`]
2997 * [`char::DecodeUtf16Error::unpaired_surrogate`]
2998 * [`BTreeSet::take`]
2999 * [`BTreeSet::replace`]
3000 * [`BTreeSet::get`]
3001 * [`HashSet::take`]
3002 * [`HashSet::replace`]
3003 * [`HashSet::get`]
3004 * [`OsString::with_capacity`]
3005 * [`OsString::clear`]
3006 * [`OsString::capacity`]
3007 * [`OsString::reserve`]
3008 * [`OsString::reserve_exact`]
3009 * [`OsStr::is_empty`]
3010 * [`OsStr::len`]
3011 * [`std::os::unix::thread`]
3012 * [`RawPthread`]
3013 * [`JoinHandleExt`]
3014 * [`JoinHandleExt::as_pthread_t`]
3015 * [`JoinHandleExt::into_pthread_t`]
3016 * [`HashSet::hasher`]
3017 * [`HashMap::hasher`]
3018 * [`CommandExt::exec`]
3019 * [`File::try_clone`]
3020 * [`SocketAddr::set_ip`]
3021 * [`SocketAddr::set_port`]
3022 * [`SocketAddrV4::set_ip`]
3023 * [`SocketAddrV4::set_port`]
3024 * [`SocketAddrV6::set_ip`]
3025 * [`SocketAddrV6::set_port`]
3026 * [`SocketAddrV6::set_flowinfo`]
3027 * [`SocketAddrV6::set_scope_id`]
3028 * [`slice::copy_from_slice`]
3029 * [`ptr::read_volatile`]
3030 * [`ptr::write_volatile`]
3031 * [`OpenOptions::create_new`]
3032 * [`TcpStream::set_nodelay`]
3033 * [`TcpStream::nodelay`]
3034 * [`TcpStream::set_ttl`]
3035 * [`TcpStream::ttl`]
3036 * [`TcpStream::set_only_v6`]
3037 * [`TcpStream::only_v6`]
3038 * [`TcpStream::take_error`]
3039 * [`TcpStream::set_nonblocking`]
3040 * [`TcpListener::set_ttl`]
3041 * [`TcpListener::ttl`]
3042 * [`TcpListener::set_only_v6`]
3043 * [`TcpListener::only_v6`]
3044 * [`TcpListener::take_error`]
3045 * [`TcpListener::set_nonblocking`]
3046 * [`UdpSocket::set_broadcast`]
3047 * [`UdpSocket::broadcast`]
3048 * [`UdpSocket::set_multicast_loop_v4`]
3049 * [`UdpSocket::multicast_loop_v4`]
3050 * [`UdpSocket::set_multicast_ttl_v4`]
3051 * [`UdpSocket::multicast_ttl_v4`]
3052 * [`UdpSocket::set_multicast_loop_v6`]
3053 * [`UdpSocket::multicast_loop_v6`]
3054 * [`UdpSocket::set_multicast_ttl_v6`]
3055 * [`UdpSocket::multicast_ttl_v6`]
3056 * [`UdpSocket::set_ttl`]
3057 * [`UdpSocket::ttl`]
3058 * [`UdpSocket::set_only_v6`]
3059 * [`UdpSocket::only_v6`]
3060 * [`UdpSocket::join_multicast_v4`]
3061 * [`UdpSocket::join_multicast_v6`]
3062 * [`UdpSocket::leave_multicast_v4`]
3063 * [`UdpSocket::leave_multicast_v6`]
3064 * [`UdpSocket::take_error`]
3065 * [`UdpSocket::connect`]
3066 * [`UdpSocket::send`]
3067 * [`UdpSocket::recv`]
3068 * [`UdpSocket::set_nonblocking`]
3069
3070 Libraries
3071 ---------
3072
3073 * [`std::sync::Once` is poisoned if its initialization function
3074   fails][1.9o].
3075 * [`cell::Ref` and `cell::RefMut` can contain unsized types][1.9cu].
3076 * [Most types implement `fmt::Debug`][1.9db].
3077 * [The default buffer size used by `BufReader` and `BufWriter` was
3078   reduced to 8K, from 64K][1.9bf]. This is in line with the buffer size
3079   used by other languages.
3080 * [`Instant`, `SystemTime` and `Duration` implement `+=` and `-=`.
3081   `Duration` additionally implements `*=` and `/=`][1.9ta].
3082 * [`Skip` is a `DoubleEndedIterator`][1.9sk].
3083 * [`From<[u8; 4]>` is implemented for `Ipv4Addr`][1.9fi].
3084 * [`Chain` implements `BufRead`][1.9ch].
3085 * [`HashMap`, `HashSet` and iterators are covariant][1.9hc].
3086
3087 Cargo
3088 -----
3089
3090 * [Cargo can now run concurrently][1.9cc].
3091 * [Top-level overrides allow specific revisions of crates to be
3092   overridden through the entire crate graph][1.9ct].  This is intended
3093   to make upgrades easier for large projects, by allowing crates to be
3094   forked temporarily until they've been upgraded and republished.
3095 * [Cargo exports a `CARGO_PKG_AUTHORS` environment variable][1.9cp].
3096 * [Cargo will pass the contents of the `RUSTFLAGS` variable to `rustc`
3097   on the commandline][1.9cf]. `rustc` arguments can also be specified
3098   in the `build.rustflags` configuration key.
3099
3100 Performance
3101 -----------
3102
3103 * [The time complexity of comparing variables for equivalence during type
3104   unification is reduced from _O_(_n_!) to _O_(_n_)][1.9tu]. This leads
3105   to major compilation time improvement in some scenarios.
3106 * [`ToString` is specialized for `str`, giving it the same performance
3107   as `to_owned`][1.9ts].
3108 * [Spawning processes with `Command::output` no longer creates extra
3109   threads][1.9sp].
3110 * [`#[derive(PartialEq)]` and `#[derive(PartialOrd)]` emit less code
3111   for C-like enums][1.9cl].
3112
3113 Misc
3114 ----
3115
3116 * [Passing the `--quiet` flag to a test runner will produce
3117   much-abbreviated output][1.9q].
3118 * The Rust Project now publishes std binaries for the
3119   `mips-unknown-linux-musl`, `mipsel-unknown-linux-musl`, and
3120   `i586-pc-windows-msvc` targets.
3121
3122 Compatibility Notes
3123 -------------------
3124
3125 * [`std::sync::Once` is poisoned if its initialization function
3126   fails][1.9o].
3127 * [It is illegal to define methods with the same name in overlapping
3128   inherent `impl` blocks][1.9sn].
3129 * [`fn` item types are zero sized, and each `fn` names a unique
3130   type][1.9fn]. This will break code that transmutes `fn`s, so calling
3131   `transmute` on a `fn` type will generate a warning for a few cycles,
3132   then will be converted to an error.
3133 * [Improvements to const evaluation may trigger new errors when integer
3134   literals are out of range][1.9ce].
3135
3136
3137 [1.9bf]: https://github.com/rust-lang/rust/pull/32695
3138 [1.9cc]: https://github.com/rust-lang/cargo/pull/2486
3139 [1.9ce]: https://github.com/rust-lang/rust/pull/30587
3140 [1.9cf]: https://github.com/rust-lang/cargo/pull/2241
3141 [1.9ch]: https://github.com/rust-lang/rust/pull/32541
3142 [1.9cl]: https://github.com/rust-lang/rust/pull/31977
3143 [1.9cp]: https://github.com/rust-lang/cargo/pull/2465
3144 [1.9ct]: https://github.com/rust-lang/cargo/pull/2385
3145 [1.9cu]: https://github.com/rust-lang/rust/pull/32652
3146 [1.9db]: https://github.com/rust-lang/rust/pull/32054
3147 [1.9fi]: https://github.com/rust-lang/rust/pull/32050
3148 [1.9fn]: https://github.com/rust-lang/rust/pull/31710
3149 [1.9fv]: https://github.com/rust-lang/rust/pull/31938
3150 [1.9hc]: https://github.com/rust-lang/rust/pull/32635
3151 [1.9o]: https://github.com/rust-lang/rust/pull/32325
3152 [1.9q]: https://github.com/rust-lang/rust/pull/31887
3153 [1.9sk]: https://github.com/rust-lang/rust/pull/31700
3154 [1.9sn]: https://github.com/rust-lang/rust/pull/31925
3155 [1.9sp]: https://github.com/rust-lang/rust/pull/31618
3156 [1.9ta]: https://github.com/rust-lang/rust/pull/32448
3157 [1.9ts]: https://github.com/rust-lang/rust/pull/32586
3158 [1.9tu]: https://github.com/rust-lang/rust/pull/32062
3159 [1.9ws]: https://github.com/rust-lang/rust/pull/29734
3160 [RFC 1270]: https://github.com/rust-lang/rfcs/blob/master/text/1270-deprecation.md
3161 [`<*const T>::as_ref`]: http://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.as_ref
3162 [`<*mut T>::as_mut`]: http://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.as_mut
3163 [`<*mut T>::as_ref`]: http://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.as_ref
3164 [`slice::copy_from_slice`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.copy_from_slice
3165 [`AsciiExt::make_ascii_lowercase`]: http://doc.rust-lang.org/nightly/std/ascii/trait.AsciiExt.html#tymethod.make_ascii_lowercase
3166 [`AsciiExt::make_ascii_uppercase`]: http://doc.rust-lang.org/nightly/std/ascii/trait.AsciiExt.html#tymethod.make_ascii_uppercase
3167 [`BTreeSet::get`]: http://doc.rust-lang.org/nightly/collections/btree/set/struct.BTreeSet.html#method.get
3168 [`BTreeSet::replace`]: http://doc.rust-lang.org/nightly/collections/btree/set/struct.BTreeSet.html#method.replace
3169 [`BTreeSet::take`]: http://doc.rust-lang.org/nightly/collections/btree/set/struct.BTreeSet.html#method.take
3170 [`CommandExt::exec`]: http://doc.rust-lang.org/nightly/std/os/unix/process/trait.CommandExt.html#tymethod.exec
3171 [`File::try_clone`]: http://doc.rust-lang.org/nightly/std/fs/struct.File.html#method.try_clone
3172 [`HashMap::hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashMap.html#method.hasher
3173 [`HashSet::get`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.get
3174 [`HashSet::hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.hasher
3175 [`HashSet::replace`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.replace
3176 [`HashSet::take`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.take
3177 [`JoinHandleExt::as_pthread_t`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/trait.JoinHandleExt.html#tymethod.as_pthread_t
3178 [`JoinHandleExt::into_pthread_t`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/trait.JoinHandleExt.html#tymethod.into_pthread_t
3179 [`JoinHandleExt`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/trait.JoinHandleExt.html
3180 [`OpenOptions::create_new`]: http://doc.rust-lang.org/nightly/std/fs/struct.OpenOptions.html#method.create_new
3181 [`OsStr::is_empty`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsStr.html#method.is_empty
3182 [`OsStr::len`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsStr.html#method.len
3183 [`OsString::capacity`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.capacity
3184 [`OsString::clear`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.clear
3185 [`OsString::reserve_exact`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.reserve_exact
3186 [`OsString::reserve`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.reserve
3187 [`OsString::with_capacity`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.with_capacity
3188 [`RawPthread`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/type.RawPthread.html
3189 [`SocketAddr::set_ip`]: http://doc.rust-lang.org/nightly/std/net/enum.SocketAddr.html#method.set_ip
3190 [`SocketAddr::set_port`]: http://doc.rust-lang.org/nightly/std/net/enum.SocketAddr.html#method.set_port
3191 [`SocketAddrV4::set_ip`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV4.html#method.set_ip
3192 [`SocketAddrV4::set_port`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV4.html#method.set_port
3193 [`SocketAddrV6::set_flowinfo`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_flowinfo
3194 [`SocketAddrV6::set_ip`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_ip
3195 [`SocketAddrV6::set_port`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_port
3196 [`SocketAddrV6::set_scope_id`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_scope_id
3197 [`TcpListener::only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.only_v6
3198 [`TcpListener::set_nonblocking`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_nonblocking
3199 [`TcpListener::set_only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_only_v6
3200 [`TcpListener::set_ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_ttl
3201 [`TcpListener::take_error`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.take_error
3202 [`TcpListener::ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.ttl
3203 [`TcpStream::nodelay`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.nodelay
3204 [`TcpStream::only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.only_v6
3205 [`TcpStream::set_nodelay`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_nodelay
3206 [`TcpStream::set_nonblocking`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_nonblocking
3207 [`TcpStream::set_only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_only_v6
3208 [`TcpStream::set_ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_ttl
3209 [`TcpStream::take_error`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.take_error
3210 [`TcpStream::ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.ttl
3211 [`UdpSocket::broadcast`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.broadcast
3212 [`UdpSocket::connect`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.connect
3213 [`UdpSocket::join_multicast_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.join_multicast_v4
3214 [`UdpSocket::join_multicast_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.join_multicast_v6
3215 [`UdpSocket::leave_multicast_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.leave_multicast_v4
3216 [`UdpSocket::leave_multicast_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.leave_multicast_v6
3217 [`UdpSocket::multicast_loop_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_loop_v4
3218 [`UdpSocket::multicast_loop_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_loop_v6
3219 [`UdpSocket::multicast_ttl_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_ttl_v4
3220 [`UdpSocket::multicast_ttl_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_ttl_v6
3221 [`UdpSocket::only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.only_v6
3222 [`UdpSocket::recv`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.recv
3223 [`UdpSocket::send`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.send
3224 [`UdpSocket::set_broadcast`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_broadcast
3225 [`UdpSocket::set_multicast_loop_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_loop_v4
3226 [`UdpSocket::set_multicast_loop_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_loop_v6
3227 [`UdpSocket::set_multicast_ttl_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_ttl_v4
3228 [`UdpSocket::set_multicast_ttl_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_ttl_v6
3229 [`UdpSocket::set_nonblocking`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_nonblocking
3230 [`UdpSocket::set_only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_only_v6
3231 [`UdpSocket::set_ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_ttl
3232 [`UdpSocket::take_error`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.take_error
3233 [`UdpSocket::ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.ttl
3234 [`char::DecodeUtf16Error::unpaired_surrogate`]: http://doc.rust-lang.org/nightly/std/char/struct.DecodeUtf16Error.html#method.unpaired_surrogate
3235 [`char::DecodeUtf16Error`]: http://doc.rust-lang.org/nightly/std/char/struct.DecodeUtf16Error.html
3236 [`char::DecodeUtf16`]: http://doc.rust-lang.org/nightly/std/char/struct.DecodeUtf16.html
3237 [`char::decode_utf16`]: http://doc.rust-lang.org/nightly/std/char/fn.decode_utf16.html
3238 [`ptr::read_volatile`]: http://doc.rust-lang.org/nightly/std/ptr/fn.read_volatile.html
3239 [`ptr::write_volatile`]: http://doc.rust-lang.org/nightly/std/ptr/fn.write_volatile.html
3240 [`std::os::unix::thread`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/index.html
3241 [`std::panic::AssertUnwindSafe`]: http://doc.rust-lang.org/nightly/std/panic/struct.AssertUnwindSafe.html
3242 [`std::panic::UnwindSafe`]: http://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html
3243 [`std::panic::catch_unwind`]: http://doc.rust-lang.org/nightly/std/panic/fn.catch_unwind.html
3244 [`std::panic::resume_unwind`]: http://doc.rust-lang.org/nightly/std/panic/fn.resume_unwind.html
3245 [`std::panic`]: http://doc.rust-lang.org/nightly/std/panic/index.html
3246 [`str::is_char_boundary`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.is_char_boundary
3247
3248
3249 Version 1.8.0 (2016-04-14)
3250 ==========================
3251
3252 Language
3253 --------
3254
3255 * Rust supports overloading of compound assignment statements like
3256   `+=` by implementing the [`AddAssign`], [`SubAssign`],
3257   [`MulAssign`], [`DivAssign`], [`RemAssign`], [`BitAndAssign`],
3258   [`BitOrAssign`], [`BitXorAssign`], [`ShlAssign`], or [`ShrAssign`]
3259   traits. [RFC 953].
3260 * Empty structs can be defined with braces, as in `struct Foo { }`, in
3261   addition to the non-braced form, `struct Foo;`. [RFC 218].
3262
3263 Libraries
3264 ---------
3265
3266 * Stabilized APIs:
3267   * [`str::encode_utf16`][] (renamed from `utf16_units`)
3268   * [`str::EncodeUtf16`][] (renamed from `Utf16Units`)
3269   * [`Ref::map`]
3270   * [`RefMut::map`]
3271   * [`ptr::drop_in_place`]
3272   * [`time::Instant`]
3273   * [`time::SystemTime`]
3274   * [`Instant::now`]
3275   * [`Instant::duration_since`][] (renamed from `duration_from_earlier`)
3276   * [`Instant::elapsed`]
3277   * [`SystemTime::now`]
3278   * [`SystemTime::duration_since`][] (renamed from `duration_from_earlier`)
3279   * [`SystemTime::elapsed`]
3280   * Various `Add`/`Sub` impls for `Time` and `SystemTime`
3281   * [`SystemTimeError`]
3282   * [`SystemTimeError::duration`]
3283   * Various impls for `SystemTimeError`
3284   * [`UNIX_EPOCH`]
3285   * [`AddAssign`], [`SubAssign`], [`MulAssign`], [`DivAssign`],
3286     [`RemAssign`], [`BitAndAssign`], [`BitOrAssign`],
3287     [`BitXorAssign`], [`ShlAssign`], [`ShrAssign`].
3288 * [The `write!` and `writeln!` macros correctly emit errors if any of
3289   their arguments can't be formatted][1.8w].
3290 * [Various I/O functions support large files on 32-bit Linux][1.8l].
3291 * [The Unix-specific `raw` modules, which contain a number of
3292   redefined C types are deprecated][1.8r], including `os::raw::unix`,
3293   `os::raw::macos`, and `os::raw::linux`. These modules defined types
3294   such as `ino_t` and `dev_t`. The inconsistency of these definitions
3295   across platforms was making it difficult to implement `std`
3296   correctly. Those that need these definitions should use the `libc`
3297   crate. [RFC 1415].
3298 * The Unix-specific `MetadataExt` traits, including
3299   `os::unix::fs::MetadataExt`, which expose values such as inode
3300   numbers [no longer return platform-specific types][1.8r], but
3301   instead return widened integers. [RFC 1415].
3302 * [`btree_set::{IntoIter, Iter, Range}` are covariant][1.8cv].
3303 * [Atomic loads and stores are not volatile][1.8a].
3304 * [All types in `sync::mpsc` implement `fmt::Debug`][1.8mp].
3305
3306 Performance
3307 -----------
3308
3309 * [Inlining hash functions lead to a 3% compile-time improvement in
3310   some workloads][1.8h].
3311 * When using jemalloc, its symbols are [unprefixed so that it
3312   overrides the libc malloc implementation][1.8h]. This means that for
3313   rustc, LLVM is now using jemalloc, which results in a 6%
3314   compile-time improvement on a specific workload.
3315 * [Avoid quadratic growth in function size due to cleanups][1.8cu].
3316
3317 Misc
3318 ----
3319
3320 * [32-bit MSVC builds finally implement unwinding][1.8ms].
3321   i686-pc-windows-msvc is now considered a tier-1 platform.
3322 * [The `--print targets` flag prints a list of supported targets][1.8t].
3323 * [The `--print cfg` flag prints the `cfg`s defined for the current
3324   target][1.8cf].
3325 * [`rustc` can be built with an new Cargo-based build system, written
3326   in Rust][1.8b].  It will eventually replace Rust's Makefile-based
3327   build system. To enable it configure with `configure --rustbuild`.
3328 * [Errors for non-exhaustive `match` patterns now list up to 3 missing
3329   variants while also indicating the total number of missing variants
3330   if more than 3][1.8m].
3331 * [Executable stacks are disabled on Linux and BSD][1.8nx].
3332 * The Rust Project now publishes binary releases of the standard
3333   library for a number of tier-2 targets:
3334   `armv7-unknown-linux-gnueabihf`, `powerpc-unknown-linux-gnu`,
3335   `powerpc64-unknown-linux-gnu`, `powerpc64le-unknown-linux-gnu`
3336   `x86_64-rumprun-netbsd`. These can be installed with
3337   tools such as [multirust][1.8mr].
3338
3339 Cargo
3340 -----
3341
3342 * [`cargo init` creates a new Cargo project in the current
3343   directory][1.8ci].  It is otherwise like `cargo new`.
3344 * [Cargo has configuration keys for `-v` and
3345   `--color`][1.8cc]. `verbose` and `color`, respectively, go in the
3346   `[term]` section of `.cargo/config`.
3347 * [Configuration keys that evaluate to strings or integers can be set
3348   via environment variables][1.8ce]. For example the `build.jobs` key
3349   can be set via `CARGO_BUILD_JOBS`. Environment variables take
3350   precedence over config files.
3351 * [Target-specific dependencies support Rust `cfg` syntax for
3352   describing targets][1.8cfg] so that dependencies for multiple
3353   targets can be specified together. [RFC 1361].
3354 * [The environment variables `CARGO_TARGET_ROOT`, `RUSTC`, and
3355   `RUSTDOC` take precedence over the `build.target-dir`,
3356   `build.rustc`, and `build.rustdoc` configuration values][1.8cv].
3357 * [The child process tree is killed on Windows when Cargo is
3358   killed][1.8ck].
3359 * [The `build.target` configuration value sets the target platform,
3360   like `--target`][1.8ct].
3361
3362 Compatibility Notes
3363 -------------------
3364
3365 * [Unstable compiler flags have been further restricted][1.8u]. Since
3366   1.0 `-Z` flags have been considered unstable, and other flags that
3367   were considered unstable additionally required passing `-Z
3368   unstable-options` to access. Unlike unstable language and library
3369   features though, these options have been accessible on the stable
3370   release channel. Going forward, *new unstable flags will not be
3371   available on the stable release channel*, and old unstable flags
3372   will warn about their usage. In the future, all unstable flags will
3373   be unavailable on the stable release channel.
3374 * [It is no longer possible to `match` on empty enum variants using
3375   the `Variant(..)` syntax][1.8v]. This has been a warning since 1.6.
3376 * The Unix-specific `MetadataExt` traits, including
3377   `os::unix::fs::MetadataExt`, which expose values such as inode
3378   numbers [no longer return platform-specific types][1.8r], but
3379   instead return widened integers. [RFC 1415].
3380 * [Modules sourced from the filesystem cannot appear within arbitrary
3381   blocks, but only within other modules][1.8mf].
3382 * [`--cfg` compiler flags are parsed strictly as identifiers][1.8c].
3383 * On Unix, [stack overflow triggers a runtime abort instead of a
3384   SIGSEGV][1.8so].
3385 * [`Command::spawn` and its equivalents return an error if any of
3386   its command-line arguments contain interior `NUL`s][1.8n].
3387 * [Tuple and unit enum variants from other crates are in the type
3388   namespace][1.8tn].
3389 * [On Windows `rustc` emits `.lib` files for the `staticlib` library
3390   type instead of `.a` files][1.8st]. Additionally, for the MSVC
3391   toolchain, `rustc` emits import libraries named `foo.dll.lib`
3392   instead of `foo.lib`.
3393
3394
3395 [1.8a]: https://github.com/rust-lang/rust/pull/30962
3396 [1.8b]: https://github.com/rust-lang/rust/pull/31123
3397 [1.8c]: https://github.com/rust-lang/rust/pull/31530
3398 [1.8cc]: https://github.com/rust-lang/cargo/pull/2397
3399 [1.8ce]: https://github.com/rust-lang/cargo/pull/2398
3400 [1.8cf]: https://github.com/rust-lang/rust/pull/31278
3401 [1.8cfg]: https://github.com/rust-lang/cargo/pull/2328
3402 [1.8ci]: https://github.com/rust-lang/cargo/pull/2081
3403 [1.8ck]: https://github.com/rust-lang/cargo/pull/2370
3404 [1.8ct]: https://github.com/rust-lang/cargo/pull/2335
3405 [1.8cu]: https://github.com/rust-lang/rust/pull/31390
3406 [1.8cv]: https://github.com/rust-lang/cargo/issues/2365
3407 [1.8cv]: https://github.com/rust-lang/rust/pull/30998
3408 [1.8h]: https://github.com/rust-lang/rust/pull/31460
3409 [1.8l]: https://github.com/rust-lang/rust/pull/31668
3410 [1.8m]: https://github.com/rust-lang/rust/pull/31020
3411 [1.8mf]: https://github.com/rust-lang/rust/pull/31534
3412 [1.8mp]: https://github.com/rust-lang/rust/pull/30894
3413 [1.8mr]: https://users.rust-lang.org/t/multirust-0-8-with-cross-std-installation/4901
3414 [1.8ms]: https://github.com/rust-lang/rust/pull/30448
3415 [1.8n]: https://github.com/rust-lang/rust/pull/31056
3416 [1.8nx]: https://github.com/rust-lang/rust/pull/30859
3417 [1.8r]: https://github.com/rust-lang/rust/pull/31551
3418 [1.8so]: https://github.com/rust-lang/rust/pull/31333
3419 [1.8st]: https://github.com/rust-lang/rust/pull/29520
3420 [1.8t]: https://github.com/rust-lang/rust/pull/31358
3421 [1.8tn]: https://github.com/rust-lang/rust/pull/30882
3422 [1.8u]: https://github.com/rust-lang/rust/pull/31793
3423 [1.8v]: https://github.com/rust-lang/rust/pull/31757
3424 [1.8w]: https://github.com/rust-lang/rust/pull/31904
3425 [RFC 1361]: https://github.com/rust-lang/rfcs/blob/master/text/1361-cargo-cfg-dependencies.md
3426 [RFC 1415]: https://github.com/rust-lang/rfcs/blob/master/text/1415-trim-std-os.md
3427 [RFC 218]: https://github.com/rust-lang/rfcs/blob/master/text/0218-empty-struct-with-braces.md
3428 [RFC 953]: https://github.com/rust-lang/rfcs/blob/master/text/0953-op-assign.md
3429 [`AddAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.AddAssign.html
3430 [`BitAndAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.BitAndAssign.html
3431 [`BitOrAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.BitOrAssign.html
3432 [`BitXorAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.BitXorAssign.html
3433 [`DivAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.DivAssign.html
3434 [`Instant::duration_since`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html#method.duration_since
3435 [`Instant::elapsed`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html#method.elapsed
3436 [`Instant::now`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html#method.now
3437 [`MulAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.MulAssign.html
3438 [`Ref::map`]: http://doc.rust-lang.org/nightly/std/cell/struct.Ref.html#method.map
3439 [`RefMut::map`]: http://doc.rust-lang.org/nightly/std/cell/struct.RefMut.html#method.map
3440 [`RemAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.RemAssign.html
3441 [`ShlAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.ShlAssign.html
3442 [`ShrAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.ShrAssign.html
3443 [`SubAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.SubAssign.html
3444 [`SystemTime::duration_since`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html#method.duration_since
3445 [`SystemTime::elapsed`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html#method.elapsed
3446 [`SystemTime::now`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html#method.now
3447 [`SystemTimeError::duration`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTimeError.html#method.duration
3448 [`SystemTimeError`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTimeError.html
3449 [`UNIX_EPOCH`]: http://doc.rust-lang.org/nightly/std/time/constant.UNIX_EPOCH.html
3450 [`ptr::drop_in_place`]: http://doc.rust-lang.org/nightly/std/ptr/fn.drop_in_place.html
3451 [`str::EncodeUtf16`]: http://doc.rust-lang.org/nightly/std/str/struct.EncodeUtf16.html
3452 [`str::encode_utf16`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.encode_utf16
3453 [`time::Instant`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html
3454 [`time::SystemTime`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html
3455
3456
3457 Version 1.7.0 (2016-03-03)
3458 ==========================
3459
3460 Libraries
3461 ---------
3462
3463 * Stabilized APIs
3464   * `Path`
3465     * [`Path::strip_prefix`][] (renamed from relative_from)
3466     * [`path::StripPrefixError`][] (new error type returned from strip_prefix)
3467   * `Ipv4Addr`
3468     * [`Ipv4Addr::is_loopback`]
3469     * [`Ipv4Addr::is_private`]
3470     * [`Ipv4Addr::is_link_local`]
3471     * [`Ipv4Addr::is_multicast`]
3472     * [`Ipv4Addr::is_broadcast`]
3473     * [`Ipv4Addr::is_documentation`]
3474   * `Ipv6Addr`
3475     * [`Ipv6Addr::is_unspecified`]
3476     * [`Ipv6Addr::is_loopback`]
3477     * [`Ipv6Addr::is_multicast`]
3478   * `Vec`
3479     * [`Vec::as_slice`]
3480     * [`Vec::as_mut_slice`]
3481   * `String`
3482     * [`String::as_str`]
3483     * [`String::as_mut_str`]
3484   * Slices
3485     * `<[T]>::`[`clone_from_slice`], which now requires the two slices to
3486     be the same length
3487     * `<[T]>::`[`sort_by_key`]
3488   * checked, saturated, and overflowing operations
3489     * [`i32::checked_rem`], [`i32::checked_neg`], [`i32::checked_shl`], [`i32::checked_shr`]
3490     * [`i32::saturating_mul`]
3491     * [`i32::overflowing_add`], [`i32::overflowing_sub`], [`i32::overflowing_mul`], [`i32::overflowing_div`]
3492     * [`i32::overflowing_rem`], [`i32::overflowing_neg`], [`i32::overflowing_shl`], [`i32::overflowing_shr`]
3493     * [`u32::checked_rem`], [`u32::checked_neg`], [`u32::checked_shl`], [`u32::checked_shl`]
3494     * [`u32::saturating_mul`]
3495     * [`u32::overflowing_add`], [`u32::overflowing_sub`], [`u32::overflowing_mul`], [`u32::overflowing_div`]
3496     * [`u32::overflowing_rem`], [`u32::overflowing_neg`], [`u32::overflowing_shl`], [`u32::overflowing_shr`]
3497     * and checked, saturated, and overflowing operations for other primitive types
3498   * FFI
3499     * [`ffi::IntoStringError`]
3500     * [`CString::into_string`]
3501     * [`CString::into_bytes`]
3502     * [`CString::into_bytes_with_nul`]
3503     * `From<CString> for Vec<u8>`
3504   * `IntoStringError`
3505     * [`IntoStringError::into_cstring`]
3506     * [`IntoStringError::utf8_error`]
3507     * `Error for IntoStringError`
3508   * Hashing
3509     * [`std::hash::BuildHasher`]
3510     * [`BuildHasher::Hasher`]
3511     * [`BuildHasher::build_hasher`]
3512     * [`std::hash::BuildHasherDefault`]
3513     * [`HashMap::with_hasher`]
3514     * [`HashMap::with_capacity_and_hasher`]
3515     * [`HashSet::with_hasher`]
3516     * [`HashSet::with_capacity_and_hasher`]
3517     * [`std::collections::hash_map::RandomState`]
3518     * [`RandomState::new`]
3519 * [Validating UTF-8 is faster by a factor of between 7 and 14x for
3520   ASCII input][1.7utf8]. This means that creating `String`s and `str`s
3521   from bytes is faster.
3522 * [The performance of `LineWriter` (and thus `io::stdout`) was
3523   improved by using `memchr` to search for newlines][1.7m].
3524 * [`f32::to_degrees` and `f32::to_radians` are stable][1.7f]. The
3525   `f64` variants were stabilized previously.
3526 * [`BTreeMap` was rewritten to use less memory and improve the performance
3527   of insertion and iteration, the latter by as much as 5x][1.7bm].
3528 * [`BTreeSet` and its iterators, `Iter`, `IntoIter`, and `Range` are
3529   covariant over their contained type][1.7bt].
3530 * [`LinkedList` and its iterators, `Iter` and `IntoIter` are covariant
3531   over their contained type][1.7ll].
3532 * [`str::replace` now accepts a `Pattern`][1.7rp], like other string
3533   searching methods.
3534 * [`Any` is implemented for unsized types][1.7a].
3535 * [`Hash` is implemented for `Duration`][1.7h].
3536
3537 Misc
3538 ----
3539
3540 * [When running tests with `--test`, rustdoc will pass `--cfg`
3541   arguments to the compiler][1.7dt].
3542 * [The compiler is built with RPATH information by default][1.7rpa].
3543   This means that it will be possible to run `rustc` when installed in
3544   unusual configurations without configuring the dynamic linker search
3545   path explicitly.
3546 * [`rustc` passes `--enable-new-dtags` to GNU ld][1.7dta]. This makes
3547   any RPATH entries (emitted with `-C rpath`) *not* take precedence
3548   over `LD_LIBRARY_PATH`.
3549
3550 Cargo
3551 -----
3552
3553 * [`cargo rustc` accepts a `--profile` flag that runs `rustc` under
3554   any of the compilation profiles, 'dev', 'bench', or 'test'][1.7cp].
3555 * [The `rerun-if-changed` build script directive no longer causes the
3556   build script to incorrectly run twice in certain scenarios][1.7rr].
3557
3558 Compatibility Notes
3559 -------------------
3560
3561 * Soundness fixes to the interactions between associated types and
3562   lifetimes, specified in [RFC 1214], [now generate errors][1.7sf] for
3563   code that violates the new rules. This is a significant change that
3564   is known to break existing code, so it has emitted warnings for the
3565   new error cases since 1.4 to give crate authors time to adapt. The
3566   details of what is changing are subtle; read the RFC for more.
3567 * [Several bugs in the compiler's visibility calculations were
3568   fixed][1.7v]. Since this was found to break significant amounts of
3569   code, the new errors will be emitted as warnings for several release
3570   cycles, under the `private_in_public` lint.
3571 * Defaulted type parameters were accidentally accepted in positions
3572   that were not intended. In this release, [defaulted type parameters
3573   appearing outside of type definitions will generate a
3574   warning][1.7d], which will become an error in future releases.
3575 * [Parsing "." as a float results in an error instead of 0][1.7p].
3576   That is, `".".parse::<f32>()` returns `Err`, not `Ok(0.0)`.
3577 * [Borrows of closure parameters may not outlive the closure][1.7bc].
3578
3579 [1.7a]: https://github.com/rust-lang/rust/pull/30928
3580 [1.7bc]: https://github.com/rust-lang/rust/pull/30341
3581 [1.7bm]: https://github.com/rust-lang/rust/pull/30426
3582 [1.7bt]: https://github.com/rust-lang/rust/pull/30998
3583 [1.7cp]: https://github.com/rust-lang/cargo/pull/2224
3584 [1.7d]: https://github.com/rust-lang/rust/pull/30724
3585 [1.7dt]: https://github.com/rust-lang/rust/pull/30372
3586 [1.7dta]: https://github.com/rust-lang/rust/pull/30394
3587 [1.7f]: https://github.com/rust-lang/rust/pull/30672
3588 [1.7h]: https://github.com/rust-lang/rust/pull/30818
3589 [1.7ll]: https://github.com/rust-lang/rust/pull/30663
3590 [1.7m]: https://github.com/rust-lang/rust/pull/30381
3591 [1.7p]: https://github.com/rust-lang/rust/pull/30681
3592 [1.7rp]: https://github.com/rust-lang/rust/pull/29498
3593 [1.7rpa]: https://github.com/rust-lang/rust/pull/30353
3594 [1.7rr]: https://github.com/rust-lang/cargo/pull/2279
3595 [1.7sf]: https://github.com/rust-lang/rust/pull/30389
3596 [1.7utf8]: https://github.com/rust-lang/rust/pull/30740
3597 [1.7v]: https://github.com/rust-lang/rust/pull/29973
3598 [RFC 1214]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
3599 [`BuildHasher::Hasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hasher.html
3600 [`BuildHasher::build_hasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.BuildHasher.html#tymethod.build_hasher
3601 [`CString::into_bytes_with_nul`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_bytes_with_nul
3602 [`CString::into_bytes`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_bytes
3603 [`CString::into_string`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_string
3604 [`HashMap::with_capacity_and_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashMap.html#method.with_capacity_and_hasher
3605 [`HashMap::with_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashMap.html#method.with_hasher
3606 [`HashSet::with_capacity_and_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.with_capacity_and_hasher
3607 [`HashSet::with_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.with_hasher
3608 [`IntoStringError::into_cstring`]: http://doc.rust-lang.org/nightly/std/ffi/struct.IntoStringError.html#method.into_cstring
3609 [`IntoStringError::utf8_error`]: http://doc.rust-lang.org/nightly/std/ffi/struct.IntoStringError.html#method.utf8_error
3610 [`Ipv4Addr::is_broadcast`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_broadcast
3611 [`Ipv4Addr::is_documentation`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_documentation
3612 [`Ipv4Addr::is_link_local`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_link_local
3613 [`Ipv4Addr::is_loopback`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_loopback
3614 [`Ipv4Addr::is_multicast`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_multicast
3615 [`Ipv4Addr::is_private`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_private
3616 [`Ipv6Addr::is_loopback`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_loopback
3617 [`Ipv6Addr::is_multicast`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_multicast
3618 [`Ipv6Addr::is_unspecified`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_unspecified
3619 [`Path::strip_prefix`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.strip_prefix
3620 [`RandomState::new`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.RandomState.html#method.new
3621 [`String::as_mut_str`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.as_mut_str
3622 [`String::as_str`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.as_str
3623 [`Vec::as_mut_slice`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.as_mut_slice
3624 [`Vec::as_slice`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.as_slice
3625 [`clone_from_slice`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.clone_from_slice
3626 [`ffi::IntoStringError`]: http://doc.rust-lang.org/nightly/std/ffi/struct.IntoStringError.html
3627 [`i32::checked_neg`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_neg
3628 [`i32::checked_rem`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_rem
3629 [`i32::checked_shl`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_shl
3630 [`i32::checked_shr`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_shr
3631 [`i32::overflowing_add`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_add
3632 [`i32::overflowing_div`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_div
3633 [`i32::overflowing_mul`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_mul
3634 [`i32::overflowing_neg`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_neg
3635 [`i32::overflowing_rem`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_rem
3636 [`i32::overflowing_shl`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_shl
3637 [`i32::overflowing_shr`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_shr
3638 [`i32::overflowing_sub`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_sub
3639 [`i32::saturating_mul`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.saturating_mul
3640 [`path::StripPrefixError`]: http://doc.rust-lang.org/nightly/std/path/struct.StripPrefixError.html
3641 [`sort_by_key`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.sort_by_key
3642 [`std::collections::hash_map::RandomState`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.RandomState.html
3643 [`std::hash::BuildHasherDefault`]: http://doc.rust-lang.org/nightly/std/hash/struct.BuildHasherDefault.html
3644 [`std::hash::BuildHasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.BuildHasher.html
3645 [`u32::checked_neg`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_neg
3646 [`u32::checked_rem`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_rem
3647 [`u32::checked_neg`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_neg
3648 [`u32::checked_shl`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_shl
3649 [`u32::overflowing_add`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_add
3650 [`u32::overflowing_div`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_div
3651 [`u32::overflowing_mul`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_mul
3652 [`u32::overflowing_neg`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_neg
3653 [`u32::overflowing_rem`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_rem
3654 [`u32::overflowing_shl`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_shl
3655 [`u32::overflowing_shr`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_shr
3656 [`u32::overflowing_sub`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_sub
3657 [`u32::saturating_mul`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.saturating_mul
3658
3659
3660 Version 1.6.0 (2016-01-21)
3661 ==========================
3662
3663 Language
3664 --------
3665
3666 * The `#![no_std]` attribute causes a crate to not be linked to the
3667   standard library, but only the [core library][1.6co], as described
3668   in [RFC 1184]. The core library defines common types and traits but
3669   has no platform dependencies whatsoever, and is the basis for Rust
3670   software in environments that cannot support a full port of the
3671   standard library, such as operating systems. Most of the core
3672   library is now stable.
3673
3674 Libraries
3675 ---------
3676
3677 * Stabilized APIs:
3678   [`Read::read_exact`],
3679   [`ErrorKind::UnexpectedEof`][] (renamed from `UnexpectedEOF`),
3680   [`fs::DirBuilder`], [`fs::DirBuilder::new`],
3681   [`fs::DirBuilder::recursive`], [`fs::DirBuilder::create`],
3682   [`os::unix::fs::DirBuilderExt`],
3683   [`os::unix::fs::DirBuilderExt::mode`], [`vec::Drain`],
3684   [`vec::Vec::drain`], [`string::Drain`], [`string::String::drain`],
3685   [`vec_deque::Drain`], [`vec_deque::VecDeque::drain`],
3686   [`collections::hash_map::Drain`],
3687   [`collections::hash_map::HashMap::drain`],
3688   [`collections::hash_set::Drain`],
3689   [`collections::hash_set::HashSet::drain`],
3690   [`collections::binary_heap::Drain`],
3691   [`collections::binary_heap::BinaryHeap::drain`],
3692   [`Vec::extend_from_slice`][] (renamed from `push_all`),
3693   [`Mutex::get_mut`], [`Mutex::into_inner`], [`RwLock::get_mut`],
3694   [`RwLock::into_inner`],
3695   [`Iterator::min_by_key`][] (renamed from `min_by`),
3696   [`Iterator::max_by_key`][] (renamed from `max_by`).
3697 * The [core library][1.6co] is stable, as are most of its APIs.
3698 * [The `assert_eq!` macro supports arguments that don't implement
3699   `Sized`][1.6ae], such as arrays. In this way it behaves more like
3700   `assert!`.
3701 * Several timer functions that take duration in milliseconds [are
3702   deprecated in favor of those that take `Duration`][1.6ms]. These
3703   include `Condvar::wait_timeout_ms`, `thread::sleep_ms`, and
3704   `thread::park_timeout_ms`.
3705 * The algorithm by which `Vec` reserves additional elements was
3706   [tweaked to not allocate excessive space][1.6a] while still growing
3707   exponentially.
3708 * `From` conversions are [implemented from integers to floats][1.6f]
3709   in cases where the conversion is lossless. Thus they are not
3710   implemented for 32-bit ints to `f32`, nor for 64-bit ints to `f32`
3711   or `f64`. They are also not implemented for `isize` and `usize`
3712   because the implementations would be platform-specific. `From` is
3713   also implemented from `f32` to `f64`.
3714 * `From<&Path>` and `From<PathBuf>` are implemented for `Cow<Path>`.
3715 * `From<T>` is implemented for `Box<T>`, `Rc<T>` and `Arc<T>`.
3716 * `IntoIterator` is implemented for `&PathBuf` and `&Path`.
3717 * [`BinaryHeap` was refactored][1.6bh] for modest performance
3718   improvements.
3719 * Sorting slices that are already sorted [is 50% faster in some
3720   cases][1.6s].
3721
3722 Cargo
3723 -----
3724
3725 * Cargo will look in `$CARGO_HOME/bin` for subcommands [by default][1.6c].
3726 * Cargo build scripts can specify their dependencies by emitting the
3727   [`rerun-if-changed`][1.6rr] key.
3728 * crates.io will reject publication of crates with dependencies that
3729   have a wildcard version constraint. Crates with wildcard
3730   dependencies were seen to cause a variety of problems, as described
3731   in [RFC 1241]. Since 1.5 publication of such crates has emitted a
3732   warning.
3733 * `cargo clean` [accepts a `--release` flag][1.6cc] to clean the
3734   release folder.  A variety of artifacts that Cargo failed to clean
3735   are now correctly deleted.
3736
3737 Misc
3738 ----
3739
3740 * The `unreachable_code` lint [warns when a function call's argument
3741   diverges][1.6dv].
3742 * The parser indicates [failures that may be caused by
3743   confusingly-similar Unicode characters][1.6uc]
3744 * Certain macro errors [are reported at definition time][1.6m], not
3745   expansion.
3746
3747 Compatibility Notes
3748 -------------------
3749
3750 * The compiler no longer makes use of the [`RUST_PATH`][1.6rp]
3751   environment variable when locating crates. This was a pre-cargo
3752   feature for integrating with the package manager that was
3753   accidentally never removed.
3754 * [A number of bugs were fixed in the privacy checker][1.6p] that
3755   could cause previously-accepted code to break.
3756 * [Modules and unit/tuple structs may not share the same name][1.6ts].
3757 * [Bugs in pattern matching unit structs were fixed][1.6us]. The tuple
3758   struct pattern syntax (`Foo(..)`) can no longer be used to match
3759   unit structs. This is a warning now, but will become an error in
3760   future releases. Patterns that share the same name as a const are
3761   now an error.
3762 * A bug was fixed that causes [rustc not to apply default type
3763   parameters][1.6xc] when resolving certain method implementations of
3764   traits defined in other crates.
3765
3766 [1.6a]: https://github.com/rust-lang/rust/pull/29454
3767 [1.6ae]: https://github.com/rust-lang/rust/pull/29770
3768 [1.6bh]: https://github.com/rust-lang/rust/pull/29811
3769 [1.6c]: https://github.com/rust-lang/cargo/pull/2192
3770 [1.6cc]: https://github.com/rust-lang/cargo/pull/2131
3771 [1.6co]: http://doc.rust-lang.org/beta/core/index.html
3772 [1.6dv]: https://github.com/rust-lang/rust/pull/30000
3773 [1.6f]: https://github.com/rust-lang/rust/pull/29129
3774 [1.6m]: https://github.com/rust-lang/rust/pull/29828
3775 [1.6ms]: https://github.com/rust-lang/rust/pull/29604
3776 [1.6p]: https://github.com/rust-lang/rust/pull/29726
3777 [1.6rp]: https://github.com/rust-lang/rust/pull/30034
3778 [1.6rr]: https://github.com/rust-lang/cargo/pull/2134
3779 [1.6s]: https://github.com/rust-lang/rust/pull/29675
3780 [1.6ts]: https://github.com/rust-lang/rust/issues/21546
3781 [1.6uc]: https://github.com/rust-lang/rust/pull/29837
3782 [1.6us]: https://github.com/rust-lang/rust/pull/29383
3783 [1.6xc]: https://github.com/rust-lang/rust/issues/30123
3784 [RFC 1184]: https://github.com/rust-lang/rfcs/blob/master/text/1184-stabilize-no_std.md
3785 [RFC 1241]: https://github.com/rust-lang/rfcs/blob/master/text/1241-no-wildcard-deps.md
3786 [`ErrorKind::UnexpectedEof`]: http://doc.rust-lang.org/nightly/std/io/enum.ErrorKind.html#variant.UnexpectedEof
3787 [`Iterator::max_by_key`]: http://doc.rust-lang.org/nightly/std/iter/trait.Iterator.html#method.max_by_key
3788 [`Iterator::min_by_key`]: http://doc.rust-lang.org/nightly/std/iter/trait.Iterator.html#method.min_by_key
3789 [`Mutex::get_mut`]: http://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html#method.get_mut
3790 [`Mutex::into_inner`]: http://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html#method.into_inner
3791 [`Read::read_exact`]: http://doc.rust-lang.org/nightly/std/io/trait.Read.html#method.read_exact
3792 [`RwLock::get_mut`]: http://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html#method.get_mut
3793 [`RwLock::into_inner`]: http://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html#method.into_inner
3794 [`Vec::extend_from_slice`]: http://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html#method.extend_from_slice
3795 [`collections::binary_heap::BinaryHeap::drain`]: http://doc.rust-lang.org/nightly/std/collections/binary_heap/struct.BinaryHeap.html#method.drain
3796 [`collections::binary_heap::Drain`]: http://doc.rust-lang.org/nightly/std/collections/binary_heap/struct.Drain.html
3797 [`collections::hash_map::Drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.Drain.html
3798 [`collections::hash_map::HashMap::drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.HashMap.html#method.drain
3799 [`collections::hash_set::Drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_set/struct.Drain.html
3800 [`collections::hash_set::HashSet::drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_set/struct.HashSet.html#method.drain
3801 [`fs::DirBuilder::create`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html#method.create
3802 [`fs::DirBuilder::new`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html#method.new
3803 [`fs::DirBuilder::recursive`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html#method.recursive
3804 [`fs::DirBuilder`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html
3805 [`os::unix::fs::DirBuilderExt::mode`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.DirBuilderExt.html#tymethod.mode
3806 [`os::unix::fs::DirBuilderExt`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.DirBuilderExt.html
3807 [`string::Drain`]: http://doc.rust-lang.org/nightly/std/string/struct.Drain.html
3808 [`string::String::drain`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.drain
3809 [`vec::Drain`]: http://doc.rust-lang.org/nightly/std/vec/struct.Drain.html
3810 [`vec::Vec::drain`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.drain
3811 [`vec_deque::Drain`]: http://doc.rust-lang.org/nightly/std/collections/vec_deque/struct.Drain.html
3812 [`vec_deque::VecDeque::drain`]: http://doc.rust-lang.org/nightly/std/collections/vec_deque/struct.VecDeque.html#method.drain
3813
3814
3815 Version 1.5.0 (2015-12-10)
3816 ==========================
3817
3818 * ~700 changes, numerous bugfixes
3819
3820 Highlights
3821 ----------
3822
3823 * Stabilized APIs:
3824   [`BinaryHeap::from`], [`BinaryHeap::into_sorted_vec`],
3825   [`BinaryHeap::into_vec`], [`Condvar::wait_timeout`],
3826   [`FileTypeExt::is_block_device`], [`FileTypeExt::is_char_device`],
3827   [`FileTypeExt::is_fifo`], [`FileTypeExt::is_socket`],
3828   [`FileTypeExt`], [`Formatter::alternate`], [`Formatter::fill`],
3829   [`Formatter::precision`], [`Formatter::sign_aware_zero_pad`],
3830   [`Formatter::sign_minus`], [`Formatter::sign_plus`],
3831   [`Formatter::width`], [`Iterator::cmp`], [`Iterator::eq`],
3832   [`Iterator::ge`], [`Iterator::gt`], [`Iterator::le`],
3833   [`Iterator::lt`], [`Iterator::ne`], [`Iterator::partial_cmp`],
3834   [`Path::canonicalize`], [`Path::exists`], [`Path::is_dir`],
3835   [`Path::is_file`], [`Path::metadata`], [`Path::read_dir`],
3836   [`Path::read_link`], [`Path::symlink_metadata`],
3837   [`Utf8Error::valid_up_to`], [`Vec::resize`],
3838   [`VecDeque::as_mut_slices`], [`VecDeque::as_slices`],
3839   [`VecDeque::insert`], [`VecDeque::shrink_to_fit`],
3840   [`VecDeque::swap_remove_back`], [`VecDeque::swap_remove_front`],
3841   [`slice::split_first_mut`], [`slice::split_first`],
3842   [`slice::split_last_mut`], [`slice::split_last`],
3843   [`char::from_u32_unchecked`], [`fs::canonicalize`],
3844   [`str::MatchIndices`], [`str::RMatchIndices`],
3845   [`str::match_indices`], [`str::rmatch_indices`],
3846   [`str::slice_mut_unchecked`], [`string::ParseError`].
3847 * Rust applications hosted on crates.io can be installed locally to
3848   `~/.cargo/bin` with the [`cargo install`] command. Among other
3849   things this makes it easier to augment Cargo with new subcommands:
3850   when a binary named e.g. `cargo-foo` is found in `$PATH` it can be
3851   invoked as `cargo foo`.
3852 * Crates with wildcard (`*`) dependencies will [emit warnings when
3853   published][1.5w]. In 1.6 it will no longer be possible to publish
3854   crates with wildcard dependencies.
3855
3856 Breaking Changes
3857 ----------------
3858
3859 * The rules determining when a particular lifetime must outlive
3860   a particular value (known as '[dropck]') have been [modified
3861   to not rely on parametricity][1.5p].
3862 * [Implementations of `AsRef` and `AsMut` were added to `Box`, `Rc`,
3863   and `Arc`][1.5a]. Because these smart pointer types implement
3864   `Deref`, this causes breakage in cases where the interior type
3865   contains methods of the same name.
3866 * [Correct a bug in Rc/Arc][1.5c] that caused [dropck] to be unaware
3867   that they could drop their content. Soundness fix.
3868 * All method invocations are [properly checked][1.5wf1] for
3869   [well-formedness][1.5wf2]. Soundness fix.
3870 * Traits whose supertraits contain `Self` are [not object
3871   safe][1.5o]. Soundness fix.
3872 * Target specifications support a [`no_default_libraries`][1.5nd]
3873   setting that controls whether `-nodefaultlibs` is passed to the
3874   linker, and in turn the `is_like_windows` setting no longer affects
3875   the `-nodefaultlibs` flag.
3876 * `#[derive(Show)]`, long-deprecated, [has been removed][1.5ds].
3877 * The `#[inline]` and `#[repr]` attributes [can only appear
3878   in valid locations][1.5at].
3879 * Native libraries linked from the local crate are [passed to
3880   the linker before native libraries from upstream crates][1.5nl].
3881 * Two rarely-used attributes, `#[no_debug]` and
3882   `#[omit_gdb_pretty_printer_section]` [are feature gated][1.5fg].
3883 * Negation of unsigned integers, which has been a warning for
3884   several releases, [is now behind a feature gate and will
3885   generate errors][1.5nu].
3886 * The parser accidentally accepted visibility modifiers on
3887   enum variants, a bug [which has been fixed][1.5ev].
3888 * [A bug was fixed that allowed `use` statements to import unstable
3889   features][1.5use].
3890
3891 Language
3892 --------
3893
3894 * When evaluating expressions at compile-time that are not
3895   compile-time constants (const-evaluating expressions in non-const
3896   contexts), incorrect code such as overlong bitshifts and arithmetic
3897   overflow will [generate a warning instead of an error][1.5ce],
3898   delaying the error until runtime. This will allow the
3899   const-evaluator to be expanded in the future backwards-compatibly.
3900 * The `improper_ctypes` lint [no longer warns about using `isize` and
3901   `usize` in FFI][1.5ict].
3902
3903 Libraries
3904 ---------
3905
3906 * `Arc<T>` and `Rc<T>` are [covariant with respect to `T` instead of
3907   invariant][1.5c].
3908 * `Default` is [implemented for mutable slices][1.5d].
3909 * `FromStr` is [implemented for `SockAddrV4` and `SockAddrV6`][1.5s].
3910 * There are now `From` conversions [between floating point
3911   types][1.5f] where the conversions are lossless.
3912 * There are now `From` conversions [between integer types][1.5i] where
3913   the conversions are lossless.
3914 * [`fs::Metadata` implements `Clone`][1.5fs].
3915 * The `parse` method [accepts a leading "+" when parsing
3916   integers][1.5pi].
3917 * [`AsMut` is implemented for `Vec`][1.5am].
3918 * The `clone_from` implementations for `String` and `BinaryHeap` [have
3919   been optimized][1.5cf] and no longer rely on the default impl.
3920 * The `extern "Rust"`, `extern "C"`, `unsafe extern "Rust"` and
3921   `unsafe extern "C"` function types now [implement `Clone`,
3922   `PartialEq`, `Eq`, `PartialOrd`, `Ord`, `Hash`, `fmt::Pointer`, and
3923   `fmt::Debug` for up to 12 arguments][1.5fp].
3924 * [Dropping `Vec`s is much faster in unoptimized builds when the
3925   element types don't implement `Drop`][1.5dv].
3926 * A bug that caused in incorrect behavior when [combining `VecDeque`
3927   with zero-sized types][1.5vdz] was resolved.
3928 * [`PartialOrd` for slices is faster][1.5po].
3929
3930 Miscellaneous
3931 -------------
3932
3933 * [Crate metadata size was reduced by 20%][1.5md].
3934 * [Improvements to code generation reduced the size of libcore by 3.3
3935   MB and rustc's memory usage by 18MB][1.5m].
3936 * [Improvements to deref translation increased performance in
3937   unoptimized builds][1.5dr].
3938 * Various errors in trait resolution [are deduplicated to only be
3939   reported once][1.5te].
3940 * Rust has preliminary [support for rumprun kernels][1.5rr].
3941 * Rust has preliminary [support for NetBSD on amd64][1.5na].
3942
3943 [1.5use]: https://github.com/rust-lang/rust/pull/28364
3944 [1.5po]: https://github.com/rust-lang/rust/pull/28436
3945 [1.5ev]: https://github.com/rust-lang/rust/pull/28442
3946 [1.5nu]: https://github.com/rust-lang/rust/pull/28468
3947 [1.5dr]: https://github.com/rust-lang/rust/pull/28491
3948 [1.5vdz]: https://github.com/rust-lang/rust/pull/28494
3949 [1.5md]: https://github.com/rust-lang/rust/pull/28521
3950 [1.5fg]: https://github.com/rust-lang/rust/pull/28522
3951 [1.5dv]: https://github.com/rust-lang/rust/pull/28531
3952 [1.5na]: https://github.com/rust-lang/rust/pull/28543
3953 [1.5fp]: https://github.com/rust-lang/rust/pull/28560
3954 [1.5rr]: https://github.com/rust-lang/rust/pull/28593
3955 [1.5cf]: https://github.com/rust-lang/rust/pull/28602
3956 [1.5nl]: https://github.com/rust-lang/rust/pull/28605
3957 [1.5te]: https://github.com/rust-lang/rust/pull/28645
3958 [1.5at]: https://github.com/rust-lang/rust/pull/28650
3959 [1.5am]: https://github.com/rust-lang/rust/pull/28663
3960 [1.5m]: https://github.com/rust-lang/rust/pull/28778
3961 [1.5ict]: https://github.com/rust-lang/rust/pull/28779
3962 [1.5a]: https://github.com/rust-lang/rust/pull/28811
3963 [1.5pi]: https://github.com/rust-lang/rust/pull/28826
3964 [1.5ce]: https://github.com/rust-lang/rfcs/blob/master/text/1229-compile-time-asserts.md
3965 [1.5p]: https://github.com/rust-lang/rfcs/blob/master/text/1238-nonparametric-dropck.md
3966 [1.5i]: https://github.com/rust-lang/rust/pull/28921
3967 [1.5fs]: https://github.com/rust-lang/rust/pull/29021
3968 [1.5f]: https://github.com/rust-lang/rust/pull/29129
3969 [1.5ds]: https://github.com/rust-lang/rust/pull/29148
3970 [1.5s]: https://github.com/rust-lang/rust/pull/29190
3971 [1.5d]: https://github.com/rust-lang/rust/pull/29245
3972 [1.5o]: https://github.com/rust-lang/rust/pull/29259
3973 [1.5nd]: https://github.com/rust-lang/rust/pull/28578
3974 [1.5wf2]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
3975 [1.5wf1]: https://github.com/rust-lang/rust/pull/28669
3976 [dropck]: https://doc.rust-lang.org/nightly/nomicon/dropck.html
3977 [1.5c]: https://github.com/rust-lang/rust/pull/29110
3978 [1.5w]: https://github.com/rust-lang/rfcs/blob/master/text/1241-no-wildcard-deps.md
3979 [`cargo install`]: https://github.com/rust-lang/rfcs/blob/master/text/1200-cargo-install.md
3980 [`BinaryHeap::from`]: http://doc.rust-lang.org/nightly/std/convert/trait.From.html#method.from
3981 [`BinaryHeap::into_sorted_vec`]: http://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html#method.into_sorted_vec
3982 [`BinaryHeap::into_vec`]: http://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html#method.into_vec
3983 [`Condvar::wait_timeout`]: http://doc.rust-lang.org/nightly/std/sync/struct.Condvar.html#method.wait_timeout
3984 [`FileTypeExt::is_block_device`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_block_device
3985 [`FileTypeExt::is_char_device`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_char_device
3986 [`FileTypeExt::is_fifo`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_fifo
3987 [`FileTypeExt::is_socket`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_socket
3988 [`FileTypeExt`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html
3989 [`Formatter::alternate`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.alternate
3990 [`Formatter::fill`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.fill
3991 [`Formatter::precision`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.precision
3992 [`Formatter::sign_aware_zero_pad`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.sign_aware_zero_pad
3993 [`Formatter::sign_minus`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.sign_minus
3994 [`Formatter::sign_plus`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.sign_plus
3995 [`Formatter::width`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.width
3996 [`Iterator::cmp`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.cmp
3997 [`Iterator::eq`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.eq
3998 [`Iterator::ge`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.ge
3999 [`Iterator::gt`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.gt
4000 [`Iterator::le`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.le
4001 [`Iterator::lt`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.lt
4002 [`Iterator::ne`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.ne
4003 [`Iterator::partial_cmp`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.partial_cmp
4004 [`Path::canonicalize`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.canonicalize
4005 [`Path::exists`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.exists
4006 [`Path::is_dir`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.is_dir
4007 [`Path::is_file`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.is_file
4008 [`Path::metadata`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.metadata
4009 [`Path::read_dir`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.read_dir
4010 [`Path::read_link`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.read_link
4011 [`Path::symlink_metadata`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.symlink_metadata
4012 [`Utf8Error::valid_up_to`]: http://doc.rust-lang.org/nightly/core/str/struct.Utf8Error.html#method.valid_up_to
4013 [`Vec::resize`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.resize
4014 [`VecDeque::as_mut_slices`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.as_mut_slices
4015 [`VecDeque::as_slices`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.as_slices
4016 [`VecDeque::insert`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.insert
4017 [`VecDeque::shrink_to_fit`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.shrink_to_fit
4018 [`VecDeque::swap_remove_back`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.swap_remove_back
4019 [`VecDeque::swap_remove_front`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.swap_remove_front
4020 [`slice::split_first_mut`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_first_mut
4021 [`slice::split_first`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_first
4022 [`slice::split_last_mut`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_last_mut
4023 [`slice::split_last`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_last
4024 [`char::from_u32_unchecked`]: http://doc.rust-lang.org/nightly/std/char/fn.from_u32_unchecked.html
4025 [`fs::canonicalize`]: http://doc.rust-lang.org/nightly/std/fs/fn.canonicalize.html
4026 [`str::MatchIndices`]: http://doc.rust-lang.org/nightly/std/str/struct.MatchIndices.html
4027 [`str::RMatchIndices`]: http://doc.rust-lang.org/nightly/std/str/struct.RMatchIndices.html
4028 [`str::match_indices`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.match_indices
4029 [`str::rmatch_indices`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.rmatch_indices
4030 [`str::slice_mut_unchecked`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.slice_mut_unchecked
4031 [`string::ParseError`]: http://doc.rust-lang.org/nightly/std/string/enum.ParseError.html
4032
4033 Version 1.4.0 (2015-10-29)
4034 ==========================
4035
4036 * ~1200 changes, numerous bugfixes
4037
4038 Highlights
4039 ----------
4040
4041 * Windows builds targeting the 64-bit MSVC ABI and linker (instead of
4042   GNU) are now supported and recommended for use.
4043
4044 Breaking Changes
4045 ----------------
4046
4047 * [Several changes have been made to fix type soundness and improve
4048   the behavior of associated types][sound]. See [RFC 1214]. Although
4049   we have mostly introduced these changes as warnings this release, to
4050   become errors next release, there are still some scenarios that will
4051   see immediate breakage.
4052 * [The `str::lines` and `BufRead::lines` iterators treat `\r\n` as
4053   line breaks in addition to `\n`][crlf].
4054 * [Loans of `'static` lifetime extend to the end of a function][stat].
4055 * [`str::parse` no longer introduces avoidable rounding error when
4056   parsing floating point numbers. Together with earlier changes to
4057   float formatting/output, "round trips" like f.to_string().parse()
4058   now preserve the value of f exactly. Additionally, leading plus
4059   signs are now accepted][fp3].
4060
4061
4062 Language
4063 --------
4064
4065 * `use` statements that import multiple items [can now rename
4066   them][i], as in `use foo::{bar as kitten, baz as puppy}`.
4067 * [Binops work correctly on fat pointers][binfat].
4068 * `pub extern crate`, which does not behave as expected, [issues a
4069   warning][pec] until a better solution is found.
4070
4071 Libraries
4072 ---------
4073
4074 * [Many APIs were stabilized][stab]: `<Box<str>>::into_string`,
4075   [`Arc::downgrade`], [`Arc::get_mut`], [`Arc::make_mut`],
4076   [`Arc::try_unwrap`], [`Box::from_raw`], [`Box::into_raw`], [`CStr::to_str`],
4077   [`CStr::to_string_lossy`], [`CString::from_raw`], [`CString::into_raw`],
4078   [`IntoRawFd::into_raw_fd`], [`IntoRawFd`],
4079   `IntoRawHandle::into_raw_handle`, `IntoRawHandle`,
4080   `IntoRawSocket::into_raw_socket`, `IntoRawSocket`, [`Rc::downgrade`],
4081   [`Rc::get_mut`], [`Rc::make_mut`], [`Rc::try_unwrap`], [`Result::expect`],
4082   [`String::into_boxed_str`], [`TcpStream::read_timeout`],
4083   [`TcpStream::set_read_timeout`], [`TcpStream::set_write_timeout`],
4084   [`TcpStream::write_timeout`], [`UdpSocket::read_timeout`],
4085   [`UdpSocket::set_read_timeout`], [`UdpSocket::set_write_timeout`],
4086   [`UdpSocket::write_timeout`], `Vec::append`, `Vec::split_off`,
4087   [`VecDeque::append`], [`VecDeque::retain`], [`VecDeque::split_off`],
4088   [`rc::Weak::upgrade`], [`rc::Weak`], [`slice::Iter::as_slice`],
4089   [`slice::IterMut::into_slice`], [`str::CharIndices::as_str`],
4090   [`str::Chars::as_str`], [`str::split_at_mut`], [`str::split_at`],
4091   [`sync::Weak::upgrade`], [`sync::Weak`], [`thread::park_timeout`],
4092   [`thread::sleep`].
4093 * [Some APIs were deprecated][dep]: `BTreeMap::with_b`,
4094   `BTreeSet::with_b`, `Option::as_mut_slice`, `Option::as_slice`,
4095   `Result::as_mut_slice`, `Result::as_slice`, `f32::from_str_radix`,
4096   `f64::from_str_radix`.
4097 * [Reverse-searching strings is faster with the 'two-way'
4098   algorithm][s].
4099 * [`std::io::copy` allows `?Sized` arguments][cc].
4100 * The `Windows`, `Chunks`, and `ChunksMut` iterators over slices all
4101   [override `count`, `nth` and `last` with an O(1)
4102   implementation][it].
4103 * [`Default` is implemented for arrays up to `[T; 32]`][d].
4104 * [`IntoRawFd` has been added to the Unix-specific prelude,
4105   `IntoRawSocket` and `IntoRawHandle` to the Windows-specific
4106   prelude][pr].
4107 * [`Extend<String>` and `FromIterator<String` are both implemented for
4108   `String`][es].
4109 * [`IntoIterator` is implemented for references to `Option` and
4110   `Result`][into2].
4111 * [`HashMap` and `HashSet` implement `Extend<&T>` where `T:
4112   Copy`][ext] as part of [RFC 839]. This will cause type inference
4113   breakage in rare situations.
4114 * [`BinaryHeap` implements `Debug`][bh2].
4115 * [`Borrow` and `BorrowMut` are implemented for fixed-size
4116   arrays][bm].
4117 * [`extern fn`s with the "Rust" and "C" ABIs implement common
4118   traits including `Eq`, `Ord`, `Debug`, `Hash`][fp].
4119 * [String comparison is faster][faststr].
4120 * `&mut T` where `T: std::fmt::Write` [also implements
4121   `std::fmt::Write`][mutw].
4122 * [A stable regression in `VecDeque::push_back` and other
4123   capacity-altering methods that caused panics for zero-sized types
4124   was fixed][vd].
4125 * [Function pointers implement traits for up to 12 parameters][fp2].
4126
4127 Miscellaneous
4128 -------------
4129
4130 * The compiler [no longer uses the 'morestack' feature to prevent
4131   stack overflow][mm]. Instead it uses guard pages and stack
4132   probes (though stack probes are not yet implemented on any platform
4133   but Windows).
4134 * [The compiler matches traits faster when projections are involved][p].
4135 * The 'improper_ctypes' lint [no longer warns about use of `isize` and
4136   `usize`][ffi].
4137 * [Cargo now displays useful information about what its doing during
4138   `cargo update`][cu].
4139
4140 [`Arc::downgrade`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.downgrade
4141 [`Arc::make_mut`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.make_mut
4142 [`Arc::get_mut`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.get_mut
4143 [`Arc::try_unwrap`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.try_unwrap
4144 [`Box::from_raw`]: http://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html#method.from_raw
4145 [`Box::into_raw`]: http://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html#method.into_raw
4146 [`CStr::to_str`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html#method.to_str
4147 [`CStr::to_string_lossy`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html#method.to_string_lossy
4148 [`CString::from_raw`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.from_raw
4149 [`CString::into_raw`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_raw
4150 [`IntoRawFd::into_raw_fd`]: http://doc.rust-lang.org/nightly/std/os/unix/io/trait.IntoRawFd.html#tymethod.into_raw_fd
4151 [`IntoRawFd`]: http://doc.rust-lang.org/nightly/std/os/unix/io/trait.IntoRawFd.html
4152 [`Rc::downgrade`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.downgrade
4153 [`Rc::get_mut`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.get_mut
4154 [`Rc::make_mut`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.make_mut
4155 [`Rc::try_unwrap`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.try_unwrap
4156 [`Result::expect`]: http://doc.rust-lang.org/nightly/core/result/enum.Result.html#method.expect
4157 [`String::into_boxed_str`]: http://doc.rust-lang.org/nightly/collections/string/struct.String.html#method.into_boxed_str
4158 [`TcpStream::read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.read_timeout
4159 [`TcpStream::set_read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_read_timeout
4160 [`TcpStream::write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.write_timeout
4161 [`TcpStream::set_write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_write_timeout
4162 [`UdpSocket::read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.read_timeout
4163 [`UdpSocket::set_read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_read_timeout
4164 [`UdpSocket::write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.write_timeout
4165 [`UdpSocket::set_write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_write_timeout
4166 [`VecDeque::append`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.append
4167 [`VecDeque::retain`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.retain
4168 [`VecDeque::split_off`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.split_off
4169 [`rc::Weak::upgrade`]: http://doc.rust-lang.org/nightly/std/rc/struct.Weak.html#method.upgrade
4170 [`rc::Weak`]: http://doc.rust-lang.org/nightly/std/rc/struct.Weak.html
4171 [`slice::Iter::as_slice`]: http://doc.rust-lang.org/nightly/std/slice/struct.Iter.html#method.as_slice
4172 [`slice::IterMut::into_slice`]: http://doc.rust-lang.org/nightly/std/slice/struct.IterMut.html#method.into_slice
4173 [`str::CharIndices::as_str`]: http://doc.rust-lang.org/nightly/std/str/struct.CharIndices.html#method.as_str
4174 [`str::Chars::as_str`]: http://doc.rust-lang.org/nightly/std/str/struct.Chars.html#method.as_str
4175 [`str::split_at_mut`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_at_mut
4176 [`str::split_at`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_at
4177 [`sync::Weak::upgrade`]: http://doc.rust-lang.org/nightly/std/sync/struct.Weak.html#method.upgrade
4178 [`sync::Weak`]: http://doc.rust-lang.org/nightly/std/sync/struct.Weak.html
4179 [`thread::park_timeout`]: http://doc.rust-lang.org/nightly/std/thread/fn.park_timeout.html
4180 [`thread::sleep`]: http://doc.rust-lang.org/nightly/std/thread/fn.sleep.html
4181 [bh2]: https://github.com/rust-lang/rust/pull/28156
4182 [binfat]: https://github.com/rust-lang/rust/pull/28270
4183 [bm]: https://github.com/rust-lang/rust/pull/28197
4184 [cc]: https://github.com/rust-lang/rust/pull/27531
4185 [crlf]: https://github.com/rust-lang/rust/pull/28034
4186 [cu]: https://github.com/rust-lang/cargo/pull/1931
4187 [d]: https://github.com/rust-lang/rust/pull/27825
4188 [dep]: https://github.com/rust-lang/rust/pull/28339
4189 [es]: https://github.com/rust-lang/rust/pull/27956
4190 [ext]: https://github.com/rust-lang/rust/pull/28094
4191 [faststr]: https://github.com/rust-lang/rust/pull/28338
4192 [ffi]: https://github.com/rust-lang/rust/pull/28779
4193 [fp]: https://github.com/rust-lang/rust/pull/28268
4194 [fp2]: https://github.com/rust-lang/rust/pull/28560
4195 [fp3]: https://github.com/rust-lang/rust/pull/27307
4196 [i]: https://github.com/rust-lang/rust/pull/27451
4197 [into2]: https://github.com/rust-lang/rust/pull/28039
4198 [it]: https://github.com/rust-lang/rust/pull/27652
4199 [mm]: https://github.com/rust-lang/rust/pull/27338
4200 [mutw]: https://github.com/rust-lang/rust/pull/28368
4201 [sound]: https://github.com/rust-lang/rust/pull/27641
4202 [p]: https://github.com/rust-lang/rust/pull/27866
4203 [pec]: https://github.com/rust-lang/rust/pull/28486
4204 [pr]: https://github.com/rust-lang/rust/pull/27896
4205 [RFC 839]: https://github.com/rust-lang/rfcs/blob/master/text/0839-embrace-extend-extinguish.md
4206 [RFC 1214]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
4207 [s]: https://github.com/rust-lang/rust/pull/27474
4208 [stab]: https://github.com/rust-lang/rust/pull/28339
4209 [stat]: https://github.com/rust-lang/rust/pull/28321
4210 [vd]: https://github.com/rust-lang/rust/pull/28494
4211
4212 Version 1.3.0 (2015-09-17)
4213 ==============================
4214
4215 * ~900 changes, numerous bugfixes
4216
4217 Highlights
4218 ----------
4219
4220 * The [new object lifetime defaults][nold] have been [turned
4221   on][nold2] after a cycle of warnings about the change. Now types
4222   like `&'a Box<Trait>` (or `&'a Rc<Trait>`, etc) will change from
4223   being interpreted as `&'a Box<Trait+'a>` to `&'a
4224   Box<Trait+'static>`.
4225 * [The Rustonomicon][nom] is a new book in the official documentation
4226   that dives into writing unsafe Rust.
4227 * The [`Duration`] API, [has been stabilized][ds]. This basic unit of
4228   timekeeping is employed by other std APIs, as well as out-of-tree
4229   time crates.
4230
4231 Breaking Changes
4232 ----------------
4233
4234 * The [new object lifetime defaults][nold] have been [turned
4235   on][nold2] after a cycle of warnings about the change.
4236 * There is a known [regression][lr] in how object lifetime elision is
4237   interpreted, the proper solution for which is undetermined.
4238 * The `#[prelude_import]` attribute, an internal implementation
4239   detail, was accidentally stabilized previously. [It has been put
4240   behind the `prelude_import` feature gate][pi]. This change is
4241   believed to break no existing code.
4242 * The behavior of [`size_of_val`][dst1] and [`align_of_val`][dst2] is
4243   [more sane for dynamically sized types][dst3]. Code that relied on
4244   the previous behavior is thought to be broken.
4245 * The `dropck` rules, which checks that destructors can't access
4246   destroyed values, [have been updated][dropck] to match the
4247   [RFC][dropckrfc]. This fixes some soundness holes, and as such will
4248   cause some previously-compiling code to no longer build.
4249
4250 Language
4251 --------
4252
4253 * The [new object lifetime defaults][nold] have been [turned
4254   on][nold2] after a cycle of warnings about the change.
4255 * Semicolons may [now follow types and paths in
4256   macros](https://github.com/rust-lang/rust/pull/27000).
4257 * The behavior of [`size_of_val`][dst1] and [`align_of_val`][dst2] is
4258   [more sane for dynamically sized types][dst3]. Code that relied on
4259   the previous behavior is not known to exist, and suspected to be
4260   broken.
4261 * `'static` variables [may now be recursive][st].
4262 * `ref` bindings choose between [`Deref`] and [`DerefMut`]
4263   implementations correctly.
4264 * The `dropck` rules, which checks that destructors can't access
4265   destroyed values, [have been updated][dropck] to match the
4266   [RFC][dropckrfc].
4267
4268 Libraries
4269 ---------
4270
4271 * The [`Duration`] API, [has been stabilized][ds], as well as the
4272   `std::time` module, which presently contains only `Duration`.
4273 * `Box<str>` and `Box<[T]>` both implement `Clone`.
4274 * The owned C string, [`CString`], implements [`Borrow`] and the
4275   borrowed C string, [`CStr`], implements [`ToOwned`]. The two of
4276   these allow C strings to be borrowed and cloned in generic code.
4277 * [`CStr`] implements [`Debug`].
4278 * [`AtomicPtr`] implements [`Debug`].
4279 * [`Error`] trait objects [can be downcast to their concrete types][e]
4280   in many common configurations, using the [`is`], [`downcast`],
4281   [`downcast_ref`] and [`downcast_mut`] methods, similarly to the
4282   [`Any`] trait.
4283 * Searching for substrings now [employs the two-way algorithm][search]
4284   instead of doing a naive search. This gives major speedups to a
4285   number of methods, including [`contains`][sc], [`find`][sf],
4286   [`rfind`][srf], [`split`][ss]. [`starts_with`][ssw] and
4287   [`ends_with`][sew] are also faster.
4288 * The performance of `PartialEq` for slices is [much faster][ps].
4289 * The [`Hash`] trait offers the default method, [`hash_slice`], which
4290   is overridden and optimized by the implementations for scalars.
4291 * The [`Hasher`] trait now has a number of specialized `write_*`
4292   methods for primitive types, for efficiency.
4293 * The I/O-specific error type, [`std::io::Error`][ie], gained a set of
4294   methods for accessing the 'inner error', if any: [`get_ref`][iegr],
4295   [`get_mut`][iegm], [`into_inner`][ieii]. As well, the implementation
4296   of [`std::error::Error::cause`][iec] also delegates to the inner
4297   error.
4298 * [`process::Child`][pc] gained the [`id`] method, which returns a
4299   `u32` representing the platform-specific process identifier.
4300 * The [`connect`] method on slices is deprecated, replaced by the new
4301   [`join`] method (note that both of these are on the *unstable*
4302   [`SliceConcatExt`] trait, but through the magic of the prelude are
4303   available to stable code anyway).
4304 * The [`Div`] operator is implemented for [`Wrapping`] types.
4305 * [`DerefMut` is implemented for `String`][dms].
4306 * Performance of SipHash (the default hasher for `HashMap`) is
4307   [better for long data][sh].
4308 * [`AtomicPtr`] implements [`Send`].
4309 * The [`read_to_end`] implementations for [`Stdin`] and [`File`]
4310   are now [specialized to use uninitialized buffers for increased
4311   performance][rte].
4312 * Lifetime parameters of foreign functions [are now resolved
4313   properly][f].
4314
4315 Misc
4316 ----
4317
4318 * Rust can now, with some coercion, [produce programs that run on
4319   Windows XP][xp], though XP is not considered a supported platform.
4320 * Porting Rust on Windows from the GNU toolchain to MSVC continues
4321   ([1][win1], [2][win2], [3][win3], [4][win4]). It is still not
4322   recommended for use in 1.3, though should be fully-functional
4323   in the [64-bit 1.4 beta][b14].
4324 * On Fedora-based systems installation will [properly configure the
4325   dynamic linker][fl].
4326 * The compiler gained many new extended error descriptions, which can
4327   be accessed with the `--explain` flag.
4328 * The `dropck` pass, which checks that destructors can't access
4329   destroyed values, [has been rewritten][dropck]. This fixes some
4330   soundness holes, and as such will cause some previously-compiling
4331   code to no longer build.
4332 * `rustc` now uses [LLVM to write archive files where possible][ar].
4333   Eventually this will eliminate the compiler's dependency on the ar
4334   utility.
4335 * Rust has [preliminary support for i686 FreeBSD][fb] (it has long
4336   supported FreeBSD on x86_64).
4337 * The [`unused_mut`][lum], [`unconditional_recursion`][lur],
4338   [`improper_ctypes`][lic], and [`negate_unsigned`][lnu] lints are
4339   more strict.
4340 * If landing pads are disabled (with `-Z no-landing-pads`), [`panic!`
4341   will kill the process instead of leaking][nlp].
4342
4343 [`Any`]: http://doc.rust-lang.org/nightly/std/any/trait.Any.html
4344 [`AtomicPtr`]: http://doc.rust-lang.org/nightly/std/sync/atomic/struct.AtomicPtr.html
4345 [`Borrow`]: http://doc.rust-lang.org/nightly/std/borrow/trait.Borrow.html
4346 [`CStr`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html
4347 [`CString`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html
4348 [`Debug`]: http://doc.rust-lang.org/nightly/std/fmt/trait.Debug.html
4349 [`DerefMut`]: http://doc.rust-lang.org/nightly/std/ops/trait.DerefMut.html
4350 [`Deref`]: http://doc.rust-lang.org/nightly/std/ops/trait.Deref.html
4351 [`Div`]: http://doc.rust-lang.org/nightly/std/ops/trait.Div.html
4352 [`Duration`]: http://doc.rust-lang.org/nightly/std/time/struct.Duration.html
4353 [`Error`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html
4354 [`File`]: http://doc.rust-lang.org/nightly/std/fs/struct.File.html
4355 [`Hash`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html
4356 [`Hasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hasher.html
4357 [`Send`]: http://doc.rust-lang.org/nightly/std/marker/trait.Send.html
4358 [`SliceConcatExt`]: http://doc.rust-lang.org/nightly/std/slice/trait.SliceConcatExt.html
4359 [`Stdin`]: http://doc.rust-lang.org/nightly/std/io/struct.Stdin.html
4360 [`ToOwned`]: http://doc.rust-lang.org/nightly/std/borrow/trait.ToOwned.html
4361 [`Wrapping`]: http://doc.rust-lang.org/nightly/std/num/struct.Wrapping.html
4362 [`connect`]: http://doc.rust-lang.org/nightly/std/slice/trait.SliceConcatExt.html#method.connect
4363 [`downcast_mut`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.downcast_mut
4364 [`downcast_ref`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.downcast_ref
4365 [`downcast`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.downcast
4366 [`hash_slice`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html#method.hash_slice
4367 [`id`]: http://doc.rust-lang.org/nightly/std/process/struct.Child.html#method.id
4368 [`is`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.is
4369 [`join`]: http://doc.rust-lang.org/nightly/std/slice/trait.SliceConcatExt.html#method.join
4370 [`read_to_end`]: http://doc.rust-lang.org/nightly/std/io/trait.Read.html#method.read_to_end
4371 [ar]: https://github.com/rust-lang/rust/pull/26926
4372 [b14]: https://static.rust-lang.org/dist/rust-beta-x86_64-pc-windows-msvc.msi
4373 [dms]: https://github.com/rust-lang/rust/pull/26241
4374 [dropck]: https://github.com/rust-lang/rust/pull/27261
4375 [dropckrfc]: https://github.com/rust-lang/rfcs/blob/master/text/0769-sound-generic-drop.md
4376 [ds]: https://github.com/rust-lang/rust/pull/26818
4377 [dst1]: http://doc.rust-lang.org/nightly/std/mem/fn.size_of_val.html
4378 [dst2]: http://doc.rust-lang.org/nightly/std/mem/fn.align_of_val.html
4379 [dst3]: https://github.com/rust-lang/rust/pull/27351
4380 [e]: https://github.com/rust-lang/rust/pull/24793
4381 [f]: https://github.com/rust-lang/rust/pull/26588
4382 [fb]: https://github.com/rust-lang/rust/pull/26959
4383 [fl]: https://github.com/rust-lang/rust-installer/pull/41
4384 [hs]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html#method.hash_slice
4385 [ie]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html
4386 [iec]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.cause
4387 [iegm]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.get_mut
4388 [iegr]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.get_ref
4389 [ieii]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.into_inner
4390 [lic]: https://github.com/rust-lang/rust/pull/26583
4391 [lnu]: https://github.com/rust-lang/rust/pull/27026
4392 [lr]: https://github.com/rust-lang/rust/issues/27248
4393 [lum]: https://github.com/rust-lang/rust/pull/26378
4394 [lur]: https://github.com/rust-lang/rust/pull/26783
4395 [nlp]: https://github.com/rust-lang/rust/pull/27176
4396 [nold2]: https://github.com/rust-lang/rust/pull/27045
4397 [nold]: https://github.com/rust-lang/rfcs/blob/master/text/1156-adjust-default-object-bounds.md
4398 [nom]: http://doc.rust-lang.org/nightly/nomicon/
4399 [pc]: http://doc.rust-lang.org/nightly/std/process/struct.Child.html
4400 [pi]: https://github.com/rust-lang/rust/pull/26699
4401 [ps]: https://github.com/rust-lang/rust/pull/26884
4402 [rte]: https://github.com/rust-lang/rust/pull/26950
4403 [sc]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.contains
4404 [search]: https://github.com/rust-lang/rust/pull/26327
4405 [sew]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.ends_with
4406 [sf]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.find
4407 [sh]: https://github.com/rust-lang/rust/pull/27280
4408 [srf]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.rfind
4409 [ss]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split
4410 [ssw]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.starts_with
4411 [st]: https://github.com/rust-lang/rust/pull/26630
4412 [win1]: https://github.com/rust-lang/rust/pull/26569
4413 [win2]: https://github.com/rust-lang/rust/pull/26741
4414 [win3]: https://github.com/rust-lang/rust/pull/26741
4415 [win4]: https://github.com/rust-lang/rust/pull/27210
4416 [xp]: https://github.com/rust-lang/rust/pull/26569
4417
4418 Version 1.2.0 (2015-08-07)
4419 ==========================
4420
4421 * ~1200 changes, numerous bugfixes
4422
4423 Highlights
4424 ----------
4425
4426 * [Dynamically-sized-type coercions][dst] allow smart pointer types
4427   like `Rc` to contain types without a fixed size, arrays and trait
4428   objects, finally enabling use of `Rc<[T]>` and completing the
4429   implementation of DST.
4430 * [Parallel codegen][parcodegen] is now working again, which can
4431   substantially speed up large builds in debug mode; It also gets
4432   another ~33% speedup when bootstrapping on a 4 core machine (using 8
4433   jobs). It's not enabled by default, but will be "in the near
4434   future". It can be activated with the `-C codegen-units=N` flag to
4435   `rustc`.
4436 * This is the first release with [experimental support for linking
4437   with the MSVC linker and lib C on Windows (instead of using the GNU
4438   variants via MinGW)][win]. It is yet recommended only for the most
4439   intrepid Rustaceans.
4440 * Benchmark compilations are showing a 30% improvement in
4441   bootstrapping over 1.1.
4442
4443 Breaking Changes
4444 ----------------
4445
4446 * The [`to_uppercase`] and [`to_lowercase`] methods on `char` now do
4447   unicode case mapping, which is a previously-planned change in
4448   behavior and considered a bugfix.
4449 * [`mem::align_of`] now specifies [the *minimum alignment* for
4450   T][align], which is usually the alignment programs are interested
4451   in, and the same value reported by clang's
4452   `alignof`. [`mem::min_align_of`] is deprecated. This is not known to
4453   break real code.
4454 * [The `#[packed]` attribute is no longer silently accepted by the
4455   compiler][packed]. This attribute did nothing and code that
4456   mentioned it likely did not work as intended.
4457 * Associated type defaults are [now behind the
4458   `associated_type_defaults` feature gate][ad]. In 1.1 associated type
4459   defaults *did not work*, but could be mentioned syntactically. As
4460   such this breakage has minimal impact.
4461
4462 Language
4463 --------
4464
4465 * Patterns with `ref mut` now correctly invoke [`DerefMut`] when
4466   matching against dereferencable values.
4467
4468 Libraries
4469 ---------
4470
4471 * The [`Extend`] trait, which grows a collection from an iterator, is
4472   implemented over iterators of references, for `String`, `Vec`,
4473   `LinkedList`, `VecDeque`, `EnumSet`, `BinaryHeap`, `VecMap`,
4474   `BTreeSet` and `BTreeMap`. [RFC][extend-rfc].
4475 * The [`iter::once`] function returns an iterator that yields a single
4476   element, and [`iter::empty`] returns an iterator that yields no
4477   elements.
4478 * The [`matches`] and [`rmatches`] methods on `str` return iterators
4479   over substring matches.
4480 * [`Cell`] and [`RefCell`] both implement `Eq`.
4481 * A number of methods for wrapping arithmetic are added to the
4482   integral types, [`wrapping_div`], [`wrapping_rem`],
4483   [`wrapping_neg`], [`wrapping_shl`], [`wrapping_shr`]. These are in
4484   addition to the existing [`wrapping_add`], [`wrapping_sub`], and
4485   [`wrapping_mul`] methods, and alternatives to the [`Wrapping`]
4486   type.. It is illegal for the default arithmetic operations in Rust
4487   to overflow; the desire to wrap must be explicit.
4488 * The `{:#?}` formatting specifier [displays the alternate,
4489   pretty-printed][debugfmt] form of the `Debug` formatter. This
4490   feature was actually introduced prior to 1.0 with little
4491   fanfare.
4492 * [`fmt::Formatter`] implements [`fmt::Write`], a `fmt`-specific trait
4493   for writing data to formatted strings, similar to [`io::Write`].
4494 * [`fmt::Formatter`] adds 'debug builder' methods, [`debug_struct`],
4495   [`debug_tuple`], [`debug_list`], [`debug_set`], [`debug_map`]. These
4496   are used by code generators to emit implementations of [`Debug`].
4497 * `str` has new [`to_uppercase`][strup] and [`to_lowercase`][strlow]
4498   methods that convert case, following Unicode case mapping.
4499 * It is now easier to handle poisoned locks. The [`PoisonError`]
4500   type, returned by failing lock operations, exposes `into_inner`,
4501   `get_ref`, and `get_mut`, which all give access to the inner lock
4502   guard, and allow the poisoned lock to continue to operate. The
4503   `is_poisoned` method of [`RwLock`] and [`Mutex`] can poll for a
4504   poisoned lock without attempting to take the lock.
4505 * On Unix the [`FromRawFd`] trait is implemented for [`Stdio`], and
4506   [`AsRawFd`] for [`ChildStdin`], [`ChildStdout`], [`ChildStderr`].
4507   On Windows the `FromRawHandle` trait is implemented for `Stdio`,
4508   and `AsRawHandle` for `ChildStdin`, `ChildStdout`,
4509   `ChildStderr`.
4510 * [`io::ErrorKind`] has a new variant, `InvalidData`, which indicates
4511   malformed input.
4512
4513 Misc
4514 ----
4515
4516 * `rustc` employs smarter heuristics for guessing at [typos].
4517 * `rustc` emits more efficient code for [no-op conversions between
4518   unsafe pointers][nop].
4519 * Fat pointers are now [passed in pairs of immediate arguments][fat],
4520   resulting in faster compile times and smaller code.
4521
4522 [`Extend`]: https://doc.rust-lang.org/nightly/std/iter/trait.Extend.html
4523 [extend-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0839-embrace-extend-extinguish.md
4524 [`iter::once`]: https://doc.rust-lang.org/nightly/std/iter/fn.once.html
4525 [`iter::empty`]: https://doc.rust-lang.org/nightly/std/iter/fn.empty.html
4526 [`matches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.matches
4527 [`rmatches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.rmatches
4528 [`Cell`]: https://doc.rust-lang.org/nightly/std/cell/struct.Cell.html
4529 [`RefCell`]: https://doc.rust-lang.org/nightly/std/cell/struct.RefCell.html
4530 [`wrapping_add`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_add
4531 [`wrapping_sub`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_sub
4532 [`wrapping_mul`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_mul
4533 [`wrapping_div`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_div
4534 [`wrapping_rem`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_rem
4535 [`wrapping_neg`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_neg
4536 [`wrapping_shl`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_shl
4537 [`wrapping_shr`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_shr
4538 [`Wrapping`]: https://doc.rust-lang.org/nightly/std/num/struct.Wrapping.html
4539 [`fmt::Formatter`]: https://doc.rust-lang.org/nightly/std/fmt/struct.Formatter.html
4540 [`fmt::Write`]: https://doc.rust-lang.org/nightly/std/fmt/trait.Write.html
4541 [`io::Write`]: https://doc.rust-lang.org/nightly/std/io/trait.Write.html
4542 [`debug_struct`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_struct
4543 [`debug_tuple`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_tuple
4544 [`debug_list`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_list
4545 [`debug_set`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_set
4546 [`debug_map`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_map
4547 [`Debug`]: https://doc.rust-lang.org/nightly/std/fmt/trait.Debug.html
4548 [strup]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.to_uppercase
4549 [strlow]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.to_lowercase
4550 [`to_uppercase`]: https://doc.rust-lang.org/nightly/std/primitive.char.html#method.to_uppercase
4551 [`to_lowercase`]: https://doc.rust-lang.org/nightly/std/primitive.char.html#method.to_lowercase
4552 [`PoisonError`]: https://doc.rust-lang.org/nightly/std/sync/struct.PoisonError.html
4553 [`RwLock`]: https://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html
4554 [`Mutex`]: https://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html
4555 [`FromRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.FromRawFd.html
4556 [`AsRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.AsRawFd.html
4557 [`Stdio`]: https://doc.rust-lang.org/nightly/std/process/struct.Stdio.html
4558 [`ChildStdin`]: https://doc.rust-lang.org/nightly/std/process/struct.ChildStdin.html
4559 [`ChildStdout`]: https://doc.rust-lang.org/nightly/std/process/struct.ChildStdout.html
4560 [`ChildStderr`]: https://doc.rust-lang.org/nightly/std/process/struct.ChildStderr.html
4561 [`io::ErrorKind`]: https://doc.rust-lang.org/nightly/std/io/enum.ErrorKind.html
4562 [debugfmt]: https://www.reddit.com/r/rust/comments/3ceaui/psa_produces_prettyprinted_debug_output/
4563 [`DerefMut`]: https://doc.rust-lang.org/nightly/std/ops/trait.DerefMut.html
4564 [`mem::align_of`]: https://doc.rust-lang.org/nightly/std/mem/fn.align_of.html
4565 [align]: https://github.com/rust-lang/rust/pull/25646
4566 [`mem::min_align_of`]: https://doc.rust-lang.org/nightly/std/mem/fn.min_align_of.html
4567 [typos]: https://github.com/rust-lang/rust/pull/26087
4568 [nop]: https://github.com/rust-lang/rust/pull/26336
4569 [fat]: https://github.com/rust-lang/rust/pull/26411
4570 [dst]: https://github.com/rust-lang/rfcs/blob/master/text/0982-dst-coercion.md
4571 [parcodegen]: https://github.com/rust-lang/rust/pull/26018
4572 [packed]: https://github.com/rust-lang/rust/pull/25541
4573 [ad]: https://github.com/rust-lang/rust/pull/27382
4574 [win]: https://github.com/rust-lang/rust/pull/25350
4575
4576 Version 1.1.0 (2015-06-25)
4577 =========================
4578
4579 * ~850 changes, numerous bugfixes
4580
4581 Highlights
4582 ----------
4583
4584 * The [`std::fs` module has been expanded][fs] to expand the set of
4585   functionality exposed:
4586   * `DirEntry` now supports optimizations like `file_type` and `metadata` which
4587     don't incur a syscall on some platforms.
4588   * A `symlink_metadata` function has been added.
4589   * The `fs::Metadata` structure now lowers to its OS counterpart, providing
4590     access to all underlying information.
4591 * The compiler now contains extended explanations of many errors. When an error
4592   with an explanation occurs the compiler suggests using the `--explain` flag
4593   to read the explanation. Error explanations are also [available online][err-index].
4594 * Thanks to multiple [improvements][sk] to [type checking][pre], as
4595   well as other work, the time to bootstrap the compiler decreased by
4596   32%.
4597
4598 Libraries
4599 ---------
4600
4601 * The [`str::split_whitespace`] method splits a string on unicode
4602   whitespace boundaries.
4603 * On both Windows and Unix, new extension traits provide conversion of
4604   I/O types to and from the underlying system handles. On Unix, these
4605   traits are [`FromRawFd`] and [`AsRawFd`], on Windows `FromRawHandle`
4606   and `AsRawHandle`. These are implemented for `File`, `TcpStream`,
4607   `TcpListener`, and `UpdSocket`. Further implementations for
4608   `std::process` will be stabilized later.
4609 * On Unix, [`std::os::unix::symlink`] creates symlinks. On
4610   Windows, symlinks can be created with
4611   `std::os::windows::symlink_dir` and
4612   `std::os::windows::symlink_file`.
4613 * The `mpsc::Receiver` type can now be converted into an iterator with
4614   `into_iter` on the [`IntoIterator`] trait.
4615 * `Ipv4Addr` can be created from `u32` with the `From<u32>`
4616   implementation of the [`From`] trait.
4617 * The `Debug` implementation for `RangeFull` [creates output that is
4618   more consistent with other implementations][rf].
4619 * [`Debug` is implemented for `File`][file].
4620 * The `Default` implementation for `Arc` [no longer requires `Sync +
4621   Send`][arc].
4622 * [The `Iterator` methods `count`, `nth`, and `last` have been
4623   overridden for slices to have O(1) performance instead of O(n)][si].
4624 * Incorrect handling of paths on Windows has been improved in both the
4625   compiler and the standard library.
4626 * [`AtomicPtr` gained a `Default` implementation][ap].
4627 * In accordance with Rust's policy on arithmetic overflow `abs` now
4628   [panics on overflow when debug assertions are enabled][abs].
4629 * The [`Cloned`] iterator, which was accidentally left unstable for
4630   1.0 [has been stabilized][c].
4631 * The [`Incoming`] iterator, which iterates over incoming TCP
4632   connections, and which was accidentally unnamable in 1.0, [is now
4633   properly exported][inc].
4634 * [`BinaryHeap`] no longer corrupts itself [when functions called by
4635   `sift_up` or `sift_down` panic][bh].
4636 * The [`split_off`] method of `LinkedList` [no longer corrupts
4637   the list in certain scenarios][ll].
4638
4639 Misc
4640 ----
4641
4642 * Type checking performance [has improved notably][sk] with
4643   [multiple improvements][pre].
4644 * The compiler [suggests code changes][ch] for more errors.
4645 * rustc and it's build system have experimental support for [building
4646   toolchains against MUSL][m] instead of glibc on Linux.
4647 * The compiler defines the `target_env` cfg value, which is used for
4648   distinguishing toolchains that are otherwise for the same
4649   platform. Presently this is set to `gnu` for common GNU Linux
4650   targets and for MinGW targets, and `musl` for MUSL Linux targets.
4651 * The [`cargo rustc`][crc] command invokes a build with custom flags
4652   to rustc.
4653 * [Android executables are always position independent][pie].
4654 * [The `drop_with_repr_extern` lint warns about mixing `repr(C)`
4655   with `Drop`][drop].
4656
4657 [`str::split_whitespace`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_whitespace
4658 [`FromRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.FromRawFd.html
4659 [`AsRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.AsRawFd.html
4660 [`std::os::unix::symlink`]: https://doc.rust-lang.org/nightly/std/os/unix/fs/fn.symlink.html
4661 [`IntoIterator`]: https://doc.rust-lang.org/nightly/std/iter/trait.IntoIterator.html
4662 [`From`]: https://doc.rust-lang.org/nightly/std/convert/trait.From.html
4663 [rf]: https://github.com/rust-lang/rust/pull/24491
4664 [err-index]: https://doc.rust-lang.org/error-index.html
4665 [sk]: https://github.com/rust-lang/rust/pull/24615
4666 [pre]: https://github.com/rust-lang/rust/pull/25323
4667 [file]: https://github.com/rust-lang/rust/pull/24598
4668 [ch]: https://github.com/rust-lang/rust/pull/24683
4669 [arc]: https://github.com/rust-lang/rust/pull/24695
4670 [si]: https://github.com/rust-lang/rust/pull/24701
4671 [ap]: https://github.com/rust-lang/rust/pull/24834
4672 [m]: https://github.com/rust-lang/rust/pull/24777
4673 [fs]: https://github.com/rust-lang/rfcs/blob/master/text/1044-io-fs-2.1.md
4674 [crc]: https://github.com/rust-lang/cargo/pull/1568
4675 [pie]: https://github.com/rust-lang/rust/pull/24953
4676 [abs]: https://github.com/rust-lang/rust/pull/25441
4677 [c]: https://github.com/rust-lang/rust/pull/25496
4678 [`Cloned`]: https://doc.rust-lang.org/nightly/std/iter/struct.Cloned.html
4679 [`Incoming`]: https://doc.rust-lang.org/nightly/std/net/struct.Incoming.html
4680 [inc]: https://github.com/rust-lang/rust/pull/25522
4681 [bh]: https://github.com/rust-lang/rust/pull/25856
4682 [`BinaryHeap`]: https://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html
4683 [ll]: https://github.com/rust-lang/rust/pull/26022
4684 [`split_off`]: https://doc.rust-lang.org/nightly/collections/linked_list/struct.LinkedList.html#method.split_off
4685 [drop]: https://github.com/rust-lang/rust/pull/24935
4686
4687 Version 1.0.0 (2015-05-15)
4688 ========================
4689
4690 * ~1500 changes, numerous bugfixes
4691
4692 Highlights
4693 ----------
4694
4695 * The vast majority of the standard library is now `#[stable]`. It is
4696   no longer possible to use unstable features with a stable build of
4697   the compiler.
4698 * Many popular crates on [crates.io] now work on the stable release
4699   channel.
4700 * Arithmetic on basic integer types now [checks for overflow in debug
4701   builds][overflow].
4702
4703 Language
4704 --------
4705
4706 * Several [restrictions have been added to trait coherence][coh] in
4707   order to make it easier for upstream authors to change traits
4708   without breaking downstream code.
4709 * Digits of binary and octal literals are [lexed more eagerly][lex] to
4710   improve error messages and macro behavior. For example, `0b1234` is
4711   now lexed as `0b1234` instead of two tokens, `0b1` and `234`.
4712 * Trait bounds [are always invariant][inv], eliminating the need for
4713   the `PhantomFn` and `MarkerTrait` lang items, which have been
4714   removed.
4715 * ["-" is no longer a valid character in crate names][cr], the `extern crate
4716   "foo" as bar` syntax has been replaced with `extern crate foo as
4717   bar`, and Cargo now automatically translates "-" in *package* names
4718   to underscore for the crate name.
4719 * [Lifetime shadowing is an error][lt].
4720 * [`Send` no longer implies `'static`][send-rfc].
4721 * [UFCS now supports trait-less associated paths][moar-ufcs] like
4722   `MyType::default()`.
4723 * Primitive types [now have inherent methods][prim-inherent],
4724   obviating the need for extension traits like `SliceExt`.
4725 * Methods with `Self: Sized` in their `where` clause are [considered
4726   object-safe][self-sized], allowing many extension traits like
4727   `IteratorExt` to be merged into the traits they extended.
4728 * You can now [refer to associated types][assoc-where] whose
4729   corresponding trait bounds appear only in a `where` clause.
4730 * The final bits of [OIBIT landed][oibit-final], meaning that traits
4731   like `Send` and `Sync` are now library-defined.
4732 * A [Reflect trait][reflect] was introduced, which means that
4733   downcasting via the `Any` trait is effectively limited to concrete
4734   types. This helps retain the potentially-important "parametricity"
4735   property: generic code cannot behave differently for different type
4736   arguments except in minor ways.
4737 * The `unsafe_destructor` feature is now deprecated in favor of the
4738   [new `dropck`][dropck]. This change is a major reduction in unsafe
4739   code.
4740
4741 Libraries
4742 ---------
4743
4744 * The `thread_local` module [has been renamed to `std::thread`][th].
4745 * The methods of `IteratorExt` [have been moved to the `Iterator`
4746   trait itself][ie].
4747 * Several traits that implement Rust's conventions for type
4748   conversions, `AsMut`, `AsRef`, `From`, and `Into` have been
4749   [centralized in the `std::convert` module][con].
4750 * The `FromError` trait [was removed in favor of `From`][fe].
4751 * The basic sleep function [has moved to
4752   `std::thread::sleep_ms`][slp].
4753 * The `splitn` function now takes an `n` parameter that represents the
4754   number of items yielded by the returned iterator [instead of the
4755   number of 'splits'][spl].
4756 * [On Unix, all file descriptors are `CLOEXEC` by default][clo].
4757 * [Derived implementations of `PartialOrd` now order enums according
4758   to their explicitly-assigned discriminants][po].
4759 * [Methods for searching strings are generic over `Pattern`s][pat],
4760   implemented presently by `&char`, `&str`, `FnMut(char) -> bool` and
4761   some others.
4762 * [In method resolution, object methods are resolved before inherent
4763   methods][meth].
4764 * [`String::from_str` has been deprecated in favor of the `From` impl,
4765   `String::from`][sf].
4766 * [`io::Error` implements `Sync`][ios].
4767 * [The `words` method on `&str` has been replaced with
4768   `split_whitespace`][sw], to avoid answering the tricky question, 'what is
4769   a word?'
4770 * The new path and IO modules are complete and `#[stable]`. This
4771   was the major library focus for this cycle.
4772 * The path API was [revised][path-normalize] to normalize `.`,
4773   adjusting the tradeoffs in favor of the most common usage.
4774 * A large number of remaining APIs in `std` were also stabilized
4775   during this cycle; about 75% of the non-deprecated API surface
4776   is now stable.
4777 * The new [string pattern API][string-pattern] landed, which makes
4778   the string slice API much more internally consistent and flexible.
4779 * A new set of [generic conversion traits][conversion] replaced
4780   many existing ad hoc traits.
4781 * Generic numeric traits were [completely removed][num-traits]. This
4782   was made possible thanks to inherent methods for primitive types,
4783   and the removal gives maximal flexibility for designing a numeric
4784   hierarchy in the future.
4785 * The `Fn` traits are now related via [inheritance][fn-inherit]
4786   and provide ergonomic [blanket implementations][fn-blanket].
4787 * The `Index` and `IndexMut` traits were changed to
4788   [take the index by value][index-value], enabling code like
4789   `hash_map["string"]` to work.
4790 * `Copy` now [inherits][copy-clone] from `Clone`, meaning that all
4791   `Copy` data is known to be `Clone` as well.
4792
4793 Misc
4794 ----
4795
4796 * Many errors now have extended explanations that can be accessed with
4797   the `--explain` flag to `rustc`.
4798 * Many new examples have been added to the standard library
4799   documentation.
4800 * rustdoc has received a number of improvements focused on completion
4801   and polish.
4802 * Metadata was tuned, shrinking binaries [by 27%][metadata-shrink].
4803 * Much headway was made on ecosystem-wide CI, making it possible
4804   to [compare builds for breakage][ci-compare].
4805
4806
4807 [crates.io]: http://crates.io
4808 [clo]: https://github.com/rust-lang/rust/pull/24034
4809 [coh]: https://github.com/rust-lang/rfcs/blob/master/text/1023-rebalancing-coherence.md
4810 [con]: https://github.com/rust-lang/rust/pull/23875
4811 [cr]: https://github.com/rust-lang/rust/pull/23419
4812 [fe]: https://github.com/rust-lang/rust/pull/23879
4813 [ie]: https://github.com/rust-lang/rust/pull/23300
4814 [inv]: https://github.com/rust-lang/rust/pull/23938
4815 [ios]: https://github.com/rust-lang/rust/pull/24133
4816 [lex]: https://github.com/rust-lang/rfcs/blob/master/text/0879-small-base-lexing.md
4817 [lt]: https://github.com/rust-lang/rust/pull/24057
4818 [meth]: https://github.com/rust-lang/rust/pull/24056
4819 [pat]: https://github.com/rust-lang/rfcs/blob/master/text/0528-string-patterns.md
4820 [po]: https://github.com/rust-lang/rust/pull/24270
4821 [sf]: https://github.com/rust-lang/rust/pull/24517
4822 [slp]: https://github.com/rust-lang/rust/pull/23949
4823 [spl]: https://github.com/rust-lang/rfcs/blob/master/text/0979-align-splitn-with-other-languages.md
4824 [sw]: https://github.com/rust-lang/rfcs/blob/master/text/1054-str-words.md
4825 [th]: https://github.com/rust-lang/rfcs/blob/master/text/0909-move-thread-local-to-std-thread.md
4826 [send-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0458-send-improvements.md
4827 [moar-ufcs]: https://github.com/rust-lang/rust/pull/22172
4828 [prim-inherent]: https://github.com/rust-lang/rust/pull/23104
4829 [overflow]: https://github.com/rust-lang/rfcs/blob/master/text/0560-integer-overflow.md
4830 [metadata-shrink]: https://github.com/rust-lang/rust/pull/22971
4831 [self-sized]: https://github.com/rust-lang/rust/pull/22301
4832 [assoc-where]: https://github.com/rust-lang/rust/pull/22512
4833 [string-pattern]: https://github.com/rust-lang/rust/pull/22466
4834 [oibit-final]: https://github.com/rust-lang/rust/pull/21689
4835 [reflect]: https://github.com/rust-lang/rust/pull/23712
4836 [conversion]: https://github.com/rust-lang/rfcs/pull/529
4837 [num-traits]: https://github.com/rust-lang/rust/pull/23549
4838 [index-value]: https://github.com/rust-lang/rust/pull/23601
4839 [dropck]: https://github.com/rust-lang/rfcs/pull/769
4840 [ci-compare]: https://gist.github.com/brson/a30a77836fbec057cbee
4841 [fn-inherit]: https://github.com/rust-lang/rust/pull/23282
4842 [fn-blanket]: https://github.com/rust-lang/rust/pull/23895
4843 [copy-clone]: https://github.com/rust-lang/rust/pull/23860
4844 [path-normalize]: https://github.com/rust-lang/rust/pull/23229
4845
4846
4847 Version 1.0.0-alpha.2 (2015-02-20)
4848 =====================================
4849
4850 * ~1300 changes, numerous bugfixes
4851
4852 * Highlights
4853
4854     * The various I/O modules were [overhauled][io-rfc] to reduce
4855       unnecessary abstractions and provide better interoperation with
4856       the underlying platform. The old `io` module remains temporarily
4857       at `std::old_io`.
4858     * The standard library now [participates in feature gating][feat],
4859       so use of unstable libraries now requires a `#![feature(...)]`
4860       attribute. The impact of this change is [described on the
4861       forum][feat-forum]. [RFC][feat-rfc].
4862
4863 * Language
4864
4865     * `for` loops [now operate on the `IntoIterator` trait][into],
4866       which eliminates the need to call `.iter()`, etc. to iterate
4867       over collections. There are some new subtleties to remember
4868       though regarding what sort of iterators various types yield, in
4869       particular that `for foo in bar { }` yields values from a move
4870       iterator, destroying the original collection. [RFC][into-rfc].
4871     * Objects now have [default lifetime bounds][obj], so you don't
4872       have to write `Box<Trait+'static>` when you don't care about
4873       storing references. [RFC][obj-rfc].
4874     * In types that implement `Drop`, [lifetimes must outlive the
4875       value][drop]. This will soon make it possible to safely
4876       implement `Drop` for types where `#[unsafe_destructor]` is now
4877       required. Read the [gorgeous RFC][drop-rfc] for details.
4878     * The fully qualified <T as Trait>::X syntax lets you set the Self
4879       type for a trait method or associated type. [RFC][ufcs-rfc].
4880     * References to types that implement `Deref<U>` now [automatically
4881       coerce to references][deref] to the dereferenced type `U`,
4882       e.g. `&T where T: Deref<U>` automatically coerces to `&U`. This
4883       should eliminate many unsightly uses of `&*`, as when converting
4884       from references to vectors into references to
4885       slices. [RFC][deref-rfc].
4886     * The explicit [closure kind syntax][close] (`|&:|`, `|&mut:|`,
4887       `|:|`) is obsolete and closure kind is inferred from context.
4888     * [`Self` is a keyword][Self].
4889
4890 * Libraries
4891
4892     * The `Show` and `String` formatting traits [have been
4893       renamed][fmt] to `Debug` and `Display` to more clearly reflect
4894       their related purposes. Automatically getting a string
4895       conversion to use with `format!("{:?}", something_to_debug)` is
4896       now written `#[derive(Debug)]`.
4897     * Abstract [OS-specific string types][osstr], `std::ff::{OsString,
4898       OsStr}`, provide strings in platform-specific encodings for easier
4899       interop with system APIs. [RFC][osstr-rfc].
4900     * The `boxed::into_raw` and `Box::from_raw` functions [convert
4901       between `Box<T>` and `*mut T`][boxraw], a common pattern for
4902       creating raw pointers.
4903
4904 * Tooling
4905
4906     * Certain long error messages of the form 'expected foo found bar'
4907       are now [split neatly across multiple
4908       lines][multiline]. Examples in the PR.
4909     * On Unix Rust can be [uninstalled][un] by running
4910       `/usr/local/lib/rustlib/uninstall.sh`.
4911     * The `#[rustc_on_unimplemented]` attribute, requiring the
4912       'on_unimplemented' feature, lets rustc [display custom error
4913       messages when a trait is expected to be implemented for a type
4914       but is not][onun].
4915
4916 * Misc
4917
4918     * Rust is tested against a [LALR grammar][lalr], which parses
4919       almost all the Rust files that rustc does.
4920
4921 [boxraw]: https://github.com/rust-lang/rust/pull/21318
4922 [close]: https://github.com/rust-lang/rust/pull/21843
4923 [deref]: https://github.com/rust-lang/rust/pull/21351
4924 [deref-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0241-deref-conversions.md
4925 [drop]: https://github.com/rust-lang/rust/pull/21972
4926 [drop-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0769-sound-generic-drop.md
4927 [feat]: https://github.com/rust-lang/rust/pull/21248
4928 [feat-forum]: https://users.rust-lang.org/t/psa-important-info-about-rustcs-new-feature-staging/82/5
4929 [feat-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0507-release-channels.md
4930 [fmt]: https://github.com/rust-lang/rust/pull/21457
4931 [into]: https://github.com/rust-lang/rust/pull/20790
4932 [into-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0235-collections-conventions.md#intoiterator-and-iterable
4933 [io-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0517-io-os-reform.md
4934 [lalr]: https://github.com/rust-lang/rust/pull/21452
4935 [multiline]: https://github.com/rust-lang/rust/pull/19870
4936 [obj]: https://github.com/rust-lang/rust/pull/22230
4937 [obj-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0599-default-object-bound.md
4938 [onun]: https://github.com/rust-lang/rust/pull/20889
4939 [osstr]: https://github.com/rust-lang/rust/pull/21488
4940 [osstr-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0517-io-os-reform.md
4941 [Self]: https://github.com/rust-lang/rust/pull/22158
4942 [ufcs-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0132-ufcs.md
4943 [un]: https://github.com/rust-lang/rust/pull/22256
4944
4945
4946 Version 1.0.0-alpha (2015-01-09)
4947 ==================================
4948
4949   * ~2400 changes, numerous bugfixes
4950
4951   * Highlights
4952
4953     * The language itself is considered feature complete for 1.0,
4954       though there will be many usability improvements and bugfixes
4955       before the final release.
4956     * Nearly 50% of the public API surface of the standard library has
4957       been declared 'stable'. Those interfaces are unlikely to change
4958       before 1.0.
4959     * The long-running debate over integer types has been
4960       [settled][ints]: Rust will ship with types named `isize` and
4961       `usize`, rather than `int` and `uint`, for pointer-sized
4962       integers. Guidelines will be rolled out during the alpha cycle.
4963     * Most crates that are not `std` have been moved out of the Rust
4964       distribution into the Cargo ecosystem so they can evolve
4965       separately and don't need to be stabilized as quickly, including
4966       'time', 'getopts', 'num', 'regex', and 'term'.
4967     * Documentation continues to be expanded with more API coverage, more
4968       examples, and more in-depth explanations. The guides have been
4969       consolidated into [The Rust Programming Language][trpl].
4970     * "[Rust By Example][rbe]" is now maintained by the Rust team.
4971     * All official Rust binary installers now come with [Cargo], the
4972       Rust package manager.
4973
4974 * Language
4975
4976     * Closures have been [completely redesigned][unboxed] to be
4977       implemented in terms of traits, can now be used as generic type
4978       bounds and thus monomorphized and inlined, or via an opaque
4979       pointer (boxed) as in the old system. The new system is often
4980       referred to as 'unboxed' closures.
4981     * Traits now support [associated types][assoc], allowing families
4982       of related types to be defined together and used generically in
4983       powerful ways.
4984     * Enum variants are [namespaced by their type names][enum].
4985     * [`where` clauses][where] provide a more versatile and attractive
4986       syntax for specifying generic bounds, though the previous syntax
4987       remains valid.
4988     * Rust again picks a [fallback][fb] (either i32 or f64) for uninferred
4989       numeric types.
4990     * Rust [no longer has a runtime][rt] of any description, and only
4991       supports OS threads, not green threads.
4992     * At long last, Rust has been overhauled for 'dynamically-sized
4993       types' ([DST]), which integrates 'fat pointers' (object types,
4994       arrays, and `str`) more deeply into the type system, making it
4995       more consistent.
4996     * Rust now has a general [range syntax][range], `i..j`, `i..`, and
4997       `..j` that produce range types and which, when combined with the
4998       `Index` operator and multidispatch, leads to a convenient slice
4999       notation, `[i..j]`.
5000     * The new range syntax revealed an ambiguity in the fixed-length
5001       array syntax, so now fixed length arrays [are written `[T;
5002       N]`][arrays].
5003     * The `Copy` trait is no longer implemented automatically. Unsafe
5004       pointers no longer implement `Sync` and `Send` so types
5005       containing them don't automatically either. `Sync` and `Send`
5006       are now 'unsafe traits' so one can "forcibly" implement them via
5007       `unsafe impl` if a type confirms to the requirements for them
5008       even though the internals do not (e.g. structs containing unsafe
5009       pointers like `Arc`). These changes are intended to prevent some
5010       footguns and are collectively known as [opt-in built-in
5011       traits][oibit] (though `Sync` and `Send` will soon become pure
5012       library types unknown to the compiler).
5013     * Operator traits now take their operands [by value][ops], and
5014       comparison traits can use multidispatch to compare one type
5015       against multiple other types, allowing e.g. `String` to be
5016       compared with `&str`.
5017     * `if let` and `while let` are no longer feature-gated.
5018     * Rust has adopted a more [uniform syntax for escaping unicode
5019       characters][unicode].
5020     * `macro_rules!` [has been declared stable][mac]. Though it is a
5021       flawed system it is sufficiently popular that it must be usable
5022       for 1.0. Effort has gone into [future-proofing][mac-future] it
5023       in ways that will allow other macro systems to be developed in
5024       parallel, and won't otherwise impact the evolution of the
5025       language.
5026     * The prelude has been [pared back significantly][prelude] such
5027       that it is the minimum necessary to support the most pervasive
5028       code patterns, and through [generalized where clauses][where]
5029       many of the prelude extension traits have been consolidated.
5030     * Rust's rudimentary reflection [has been removed][refl], as it
5031       incurred too much code generation for little benefit.
5032     * [Struct variants][structvars] are no longer feature-gated.
5033     * Trait bounds can be [polymorphic over lifetimes][hrtb]. Also
5034       known as 'higher-ranked trait bounds', this crucially allows
5035       unboxed closures to work.
5036     * Macros invocations surrounded by parens or square brackets and
5037       not terminated by a semicolon are [parsed as
5038       expressions][macros], which makes expressions like `vec![1i32,
5039       2, 3].len()` work as expected.
5040     * Trait objects now implement their traits automatically, and
5041       traits that can be coerced to objects now must be [object
5042       safe][objsafe].
5043     * Automatically deriving traits is now done with `#[derive(...)]`
5044       not `#[deriving(...)]` for [consistency with other naming
5045       conventions][derive].
5046     * Importing the containing module or enum at the same time as
5047       items or variants they contain is [now done with `self` instead
5048       of `mod`][self], as in use `foo::{self, bar}`
5049     * Glob imports are no longer feature-gated.
5050     * The `box` operator and `box` patterns have been feature-gated
5051       pending a redesign. For now unique boxes should be allocated
5052       like other containers, with `Box::new`.
5053
5054 * Libraries
5055
5056     * A [series][coll1] of [efforts][coll2] to establish
5057       [conventions][coll3] for collections types has resulted in API
5058       improvements throughout the standard library.
5059     * New [APIs for error handling][err] provide ergonomic interop
5060       between error types, and [new conventions][err-conv] describe
5061       more clearly the recommended error handling strategies in Rust.
5062     * The `fail!` macro has been renamed to [`panic!`][panic] so that
5063       it is easier to discuss failure in the context of error handling
5064       without making clarifications as to whether you are referring to
5065       the 'fail' macro or failure more generally.
5066     * On Linux, `OsRng` prefers the new, more reliable `getrandom`
5067       syscall when available.
5068     * The 'serialize' crate has been renamed 'rustc-serialize' and
5069       moved out of the distribution to Cargo. Although it is widely
5070       used now, it is expected to be superseded in the near future.
5071     * The `Show` formatter, typically implemented with
5072       `#[derive(Show)]` is [now requested with the `{:?}`
5073       specifier][show] and is intended for use by all types, for uses
5074       such as `println!` debugging. The new `String` formatter must be
5075       implemented by hand, uses the `{}` specifier, and is intended
5076       for full-fidelity conversions of things that can logically be
5077       represented as strings.
5078
5079 * Tooling
5080
5081     * [Flexible target specification][flex] allows rustc's code
5082       generation to be configured to support otherwise-unsupported
5083       platforms.
5084     * Rust comes with rust-gdb and rust-lldb scripts that launch their
5085       respective debuggers with Rust-appropriate pretty-printing.
5086     * The Windows installation of Rust is distributed with the
5087       MinGW components currently required to link binaries on that
5088       platform.
5089
5090 * Misc
5091
5092     * Nullable enum optimizations have been extended to more types so
5093       that e.g. `Option<Vec<T>>` and `Option<String>` take up no more
5094       space than the inner types themselves.
5095     * Work has begun on supporting AArch64.
5096
5097 [Cargo]: https://crates.io
5098 [unboxed]: http://smallcultfollowing.com/babysteps/blog/2014/11/26/purging-proc/
5099 [enum]: https://github.com/rust-lang/rfcs/blob/master/text/0390-enum-namespacing.md
5100 [flex]: https://github.com/rust-lang/rfcs/blob/master/text/0131-target-specification.md
5101 [err]: https://github.com/rust-lang/rfcs/blob/master/text/0201-error-chaining.md
5102 [err-conv]: https://github.com/rust-lang/rfcs/blob/master/text/0236-error-conventions.md
5103 [rt]: https://github.com/rust-lang/rfcs/blob/master/text/0230-remove-runtime.md
5104 [mac]: https://github.com/rust-lang/rfcs/blob/master/text/0453-macro-reform.md
5105 [mac-future]: https://github.com/rust-lang/rfcs/pull/550
5106 [DST]: http://smallcultfollowing.com/babysteps/blog/2014/01/05/dst-take-5/
5107 [coll1]: https://github.com/rust-lang/rfcs/blob/master/text/0235-collections-conventions.md
5108 [coll2]: https://github.com/rust-lang/rfcs/blob/master/text/0509-collections-reform-part-2.md
5109 [coll3]: https://github.com/rust-lang/rfcs/blob/master/text/0216-collection-views.md
5110 [ops]: https://github.com/rust-lang/rfcs/blob/master/text/0439-cmp-ops-reform.md
5111 [prelude]: https://github.com/rust-lang/rfcs/blob/master/text/0503-prelude-stabilization.md
5112 [where]: https://github.com/rust-lang/rfcs/blob/master/text/0135-where.md
5113 [refl]: https://github.com/rust-lang/rfcs/blob/master/text/0379-remove-reflection.md
5114 [panic]: https://github.com/rust-lang/rfcs/blob/master/text/0221-panic.md
5115 [structvars]: https://github.com/rust-lang/rfcs/blob/master/text/0418-struct-variants.md
5116 [hrtb]: https://github.com/rust-lang/rfcs/blob/master/text/0387-higher-ranked-trait-bounds.md
5117 [unicode]: https://github.com/rust-lang/rfcs/blob/master/text/0446-es6-unicode-escapes.md
5118 [oibit]: https://github.com/rust-lang/rfcs/blob/master/text/0019-opt-in-builtin-traits.md
5119 [macros]: https://github.com/rust-lang/rfcs/blob/master/text/0378-expr-macros.md
5120 [range]: https://github.com/rust-lang/rfcs/blob/master/text/0439-cmp-ops-reform.md#indexing-and-slicing
5121 [arrays]: https://github.com/rust-lang/rfcs/blob/master/text/0520-new-array-repeat-syntax.md
5122 [show]: https://github.com/rust-lang/rfcs/blob/master/text/0504-show-stabilization.md
5123 [derive]: https://github.com/rust-lang/rfcs/blob/master/text/0534-deriving2derive.md
5124 [self]: https://github.com/rust-lang/rfcs/blob/master/text/0532-self-in-use.md
5125 [fb]: https://github.com/rust-lang/rfcs/blob/master/text/0212-restore-int-fallback.md
5126 [objsafe]: https://github.com/rust-lang/rfcs/blob/master/text/0255-object-safety.md
5127 [assoc]: https://github.com/rust-lang/rfcs/blob/master/text/0195-associated-items.md
5128 [ints]: https://github.com/rust-lang/rfcs/pull/544#issuecomment-68760871
5129 [trpl]: https://doc.rust-lang.org/book/index.html
5130 [rbe]: http://rustbyexample.com/
5131
5132
5133 Version 0.12.0 (2014-10-09)
5134 =============================
5135
5136   * ~1900 changes, numerous bugfixes
5137
5138   * Highlights
5139
5140     * The introductory documentation (now called The Rust Guide) has
5141       been completely rewritten, as have a number of supplementary
5142       guides.
5143     * Rust's package manager, Cargo, continues to improve and is
5144       sometimes considered to be quite awesome.
5145     * Many API's in `std` have been reviewed and updated for
5146       consistency with the in-development Rust coding
5147       guidelines. The standard library documentation tracks
5148       stabilization progress.
5149     * Minor libraries have been moved out-of-tree to the rust-lang org
5150       on GitHub: uuid, semver, glob, num, hexfloat, fourcc. They can
5151       be installed with Cargo.
5152     * Lifetime elision allows lifetime annotations to be left off of
5153       function declarations in many common scenarios.
5154     * Rust now works on 64-bit Windows.
5155
5156   * Language
5157     * Indexing can be overloaded with the `Index` and `IndexMut`
5158       traits.
5159     * The `if let` construct takes a branch only if the `let` pattern
5160       matches, currently behind the 'if_let' feature gate.
5161     * 'where clauses', a more flexible syntax for specifying trait
5162       bounds that is more aesthetic, have been added for traits and
5163       free functions. Where clauses will in the future make it
5164       possible to constrain associated types, which would be
5165       impossible with the existing syntax.
5166     * A new slicing syntax (e.g. `[0..4]`) has been introduced behind
5167       the 'slicing_syntax' feature gate, and can be overloaded with
5168       the `Slice` or `SliceMut` traits.
5169     * The syntax for matching of sub-slices has been changed to use a
5170       postfix `..` instead of prefix (.e.g. `[a, b, c..]`), for
5171       consistency with other uses of `..` and to future-proof
5172       potential additional uses of the syntax.
5173     * The syntax for matching inclusive ranges in patterns has changed
5174       from `0..3` to `0...4` to be consistent with the exclusive range
5175       syntax for slicing.
5176     * Matching of sub-slices in non-tail positions (e.g.  `[a.., b,
5177       c]`) has been put behind the 'advanced_slice_patterns' feature
5178       gate and may be removed in the future.
5179     * Components of tuples and tuple structs can be extracted using
5180       the `value.0` syntax, currently behind the `tuple_indexing`
5181       feature gate.
5182     * The `#[crate_id]` attribute is no longer supported; versioning
5183       is handled by the package manager.
5184     * Renaming crate imports are now written `extern crate foo as bar`
5185       instead of `extern crate bar = foo`.
5186     * Renaming use statements are now written `use foo as bar` instead
5187       of `use bar = foo`.
5188     * `let` and `match` bindings and argument names in macros are now
5189       hygienic.
5190     * The new, more efficient, closure types ('unboxed closures') have
5191       been added under a feature gate, 'unboxed_closures'. These will
5192       soon replace the existing closure types, once higher-ranked
5193       trait lifetimes are added to the language.
5194     * `move` has been added as a keyword, for indicating closures
5195       that capture by value.
5196     * Mutation and assignment is no longer allowed in pattern guards.
5197     * Generic structs and enums can now have trait bounds.
5198     * The `Share` trait is now called `Sync` to free up the term
5199       'shared' to refer to 'shared reference' (the default reference
5200       type.
5201     * Dynamically-sized types have been mostly implemented,
5202       unifying the behavior of fat-pointer types with the rest of the
5203       type system.
5204     * As part of dynamically-sized types, the `Sized` trait has been
5205       introduced, which qualifying types implement by default, and
5206       which type parameters expect by default. To specify that a type
5207       parameter does not need to be sized, write `<Sized? T>`. Most
5208       types are `Sized`, notable exceptions being unsized arrays
5209       (`[T]`) and trait types.
5210     * Closures can return `!`, as in `|| -> !` or `proc() -> !`.
5211     * Lifetime bounds can now be applied to type parameters and object
5212       types.
5213     * The old, reference counted GC type, `Gc<T>` which was once
5214       denoted by the `@` sigil, has finally been removed. GC will be
5215       revisited in the future.
5216
5217   * Libraries
5218     * Library documentation has been improved for a number of modules.
5219     * Bit-vectors, collections::bitv has been modernized.
5220     * The url crate is deprecated in favor of
5221       http://github.com/servo/rust-url, which can be installed with
5222       Cargo.
5223     * Most I/O stream types can be cloned and subsequently closed from
5224       a different thread.
5225     * A `std::time::Duration` type has been added for use in I/O
5226       methods that rely on timers, as well as in the 'time' crate's
5227       `Timespec` arithmetic.
5228     * The runtime I/O abstraction layer that enabled the green thread
5229       scheduler to do non-thread-blocking I/O has been removed, along
5230       with the libuv-based implementation employed by the green thread
5231       scheduler. This will greatly simplify the future I/O work.
5232     * `collections::btree` has been rewritten to have a more
5233       idiomatic and efficient design.
5234
5235   * Tooling
5236     * rustdoc output now indicates the stability levels of API's.
5237     * The `--crate-name` flag can specify the name of the crate
5238       being compiled, like `#[crate_name]`.
5239     * The `-C metadata` specifies additional metadata to hash into
5240       symbol names, and `-C extra-filename` specifies additional
5241       information to put into the output filename, for use by the
5242       package manager for versioning.
5243     * debug info generation has continued to improve and should be
5244       more reliable under both gdb and lldb.
5245     * rustc has experimental support for compiling in parallel
5246       using the `-C codegen-units` flag.
5247     * rustc no longer encodes rpath information into binaries by
5248       default.
5249
5250   * Misc
5251     * Stack usage has been optimized with LLVM lifetime annotations.
5252     * Official Rust binaries on Linux are more compatible with older
5253       kernels and distributions, built on CentOS 5.10.
5254
5255
5256 Version 0.11.0 (2014-07-02)
5257 ==========================
5258
5259   * ~1700 changes, numerous bugfixes
5260
5261   * Language
5262     * ~[T] has been removed from the language. This type is superseded by
5263       the Vec<T> type.
5264     * ~str has been removed from the language. This type is superseded by
5265       the String type.
5266     * ~T has been removed from the language. This type is superseded by the
5267       Box<T> type.
5268     * @T has been removed from the language. This type is superseded by the
5269       standard library's std::gc::Gc<T> type.
5270     * Struct fields are now all private by default.
5271     * Vector indices and shift amounts are both required to be a `uint`
5272       instead of any integral type.
5273     * Byte character, byte string, and raw byte string literals are now all
5274       supported by prefixing the normal literal with a `b`.
5275     * Multiple ABIs are no longer allowed in an ABI string
5276     * The syntax for lifetimes on closures/procedures has been tweaked
5277       slightly: `<'a>|A, B|: 'b + K -> T`
5278     * Floating point modulus has been removed from the language; however it
5279       is still provided by a library implementation.
5280     * Private enum variants are now disallowed.
5281     * The `priv` keyword has been removed from the language.
5282     * A closure can no longer be invoked through a &-pointer.
5283     * The `use foo, bar, baz;` syntax has been removed from the language.
5284     * The transmute intrinsic no longer works on type parameters.
5285     * Statics now allow blocks/items in their definition.
5286     * Trait bounds are separated from objects with + instead of : now.
5287     * Objects can no longer be read while they are mutably borrowed.
5288     * The address of a static is now marked as insignificant unless the
5289       #[inline(never)] attribute is placed it.
5290     * The #[unsafe_destructor] attribute is now behind a feature gate.
5291     * Struct literals are no longer allowed in ambiguous positions such as
5292       if, while, match, and for..in.
5293     * Declaration of lang items and intrinsics are now feature-gated by
5294       default.
5295     * Integral literals no longer default to `int`, and floating point
5296       literals no longer default to `f64`. Literals must be suffixed with an
5297       appropriate type if inference cannot determine the type of the
5298       literal.
5299     * The Box<T> type is no longer implicitly borrowed to &mut T.
5300     * Procedures are now required to not capture borrowed references.
5301
5302   * Libraries
5303     * The standard library is now a "facade" over a number of underlying
5304       libraries. This means that development on the standard library should
5305       be speedier due to smaller crates, as well as a clearer line between
5306       all dependencies.
5307     * A new library, libcore, lives under the standard library's facade
5308       which is Rust's "0-assumption" library, suitable for embedded and
5309       kernel development for example.
5310     * A regex crate has been added to the standard distribution. This crate
5311       includes statically compiled regular expressions.
5312     * The unwrap/unwrap_err methods on Result require a Show bound for
5313       better error messages.
5314     * The return types of the std::comm primitives have been centralized
5315       around the Result type.
5316     * A number of I/O primitives have gained the ability to time out their
5317       operations.
5318     * A number of I/O primitives have gained the ability to close their
5319       reading/writing halves to cancel pending operations.
5320     * Reverse iterator methods have been removed in favor of `rev()` on
5321       their forward-iteration counterparts.
5322     * A bitflags! macro has been added to enable easy interop with C and
5323       management of bit flags.
5324     * A debug_assert! macro is now provided which is disabled when
5325       `--cfg ndebug` is passed to the compiler.
5326     * A graphviz crate has been added for creating .dot files.
5327     * The std::cast module has been migrated into std::mem.
5328     * The std::local_data api has been migrated from freestanding functions
5329       to being based on methods.
5330     * The Pod trait has been renamed to Copy.
5331     * jemalloc has been added as the default allocator for types.
5332     * The API for allocating memory has been changed to use proper alignment
5333       and sized deallocation
5334     * Connecting a TcpStream or binding a TcpListener is now based on a
5335       string address and a u16 port. This allows connecting to a hostname as
5336       opposed to an IP.
5337     * The Reader trait now contains a core method, read_at_least(), which
5338       correctly handles many repeated 0-length reads.
5339     * The process-spawning API is now centered around a builder-style
5340       Command struct.
5341     * The :? printing qualifier has been moved from the standard library to
5342       an external libdebug crate.
5343     * Eq/Ord have been renamed to PartialEq/PartialOrd. TotalEq/TotalOrd
5344       have been renamed to Eq/Ord.
5345     * The select/plural methods have been removed from format!. The escapes
5346       for { and } have also changed from \{ and \} to {{ and }},
5347       respectively.
5348     * The TaskBuilder API has been re-worked to be a true builder, and
5349       extension traits for spawning native/green tasks have been added.
5350
5351   * Tooling
5352     * All breaking changes to the language or libraries now have their
5353       commit message annotated with `[breaking-change]` to allow for easy
5354       discovery of breaking changes.
5355     * The compiler will now try to suggest how to annotate lifetimes if a
5356       lifetime-related error occurs.
5357     * Debug info continues to be improved greatly with general bug fixes and
5358       better support for situations like link time optimization (LTO).
5359     * Usage of syntax extensions when cross-compiling has been fixed.
5360     * Functionality equivalent to GCC & Clang's -ffunction-sections,
5361       -fdata-sections and --gc-sections has been enabled by default
5362     * The compiler is now stricter about where it will load module files
5363       from when a module is declared via `mod foo;`.
5364     * The #[phase(syntax)] attribute has been renamed to #[phase(plugin)].
5365       Syntax extensions are now discovered via a "plugin registrar" type
5366       which will be extended in the future to other various plugins.
5367     * Lints have been restructured to allow for dynamically loadable lints.
5368     * A number of rustdoc improvements:
5369       * The HTML output has been visually redesigned.
5370       * Markdown is now powered by hoedown instead of sundown.
5371       * Searching heuristics have been greatly improved.
5372       * The search index has been reduced in size by a great amount.
5373       * Cross-crate documentation via `pub use` has been greatly improved.
5374       * Primitive types are now hyperlinked and documented.
5375     * Documentation has been moved from static.rust-lang.org/doc to
5376       doc.rust-lang.org
5377     * A new sandbox, play.rust-lang.org, is available for running and
5378       sharing rust code examples on-line.
5379     * Unused attributes are now more robustly warned about.
5380     * The dead_code lint now warns about unused struct fields.
5381     * Cross-compiling to iOS is now supported.
5382     * Cross-compiling to mipsel is now supported.
5383     * Stability attributes are now inherited by default and no longer apply
5384       to intra-crate usage, only inter-crate usage.
5385     * Error message related to non-exhaustive match expressions have been
5386       greatly improved.
5387
5388
5389 Version 0.10 (2014-04-03)
5390 =========================
5391
5392   * ~1500 changes, numerous bugfixes
5393
5394   * Language
5395     * A new RFC process is now in place for modifying the language.
5396     * Patterns with `@`-pointers have been removed from the language.
5397     * Patterns with unique vectors (`~[T]`) have been removed from the
5398       language.
5399     * Patterns with unique strings (`~str`) have been removed from the
5400       language.
5401     * `@str` has been removed from the language.
5402     * `@[T]` has been removed from the language.
5403     * `@self` has been removed from the language.
5404     * `@Trait` has been removed from the language.
5405     * Headers on `~` allocations which contain `@` boxes inside the type for
5406       reference counting have been removed.
5407     * The semantics around the lifetimes of temporary expressions have changed,
5408       see #3511 and #11585 for more information.
5409     * Cross-crate syntax extensions are now possible, but feature gated. See
5410       #11151 for more information. This includes both `macro_rules!` macros as
5411       well as syntax extensions such as `format!`.
5412     * New lint modes have been added, and older ones have been turned on to be
5413       warn-by-default.
5414       * Unnecessary parentheses
5415       * Uppercase statics
5416       * Camel Case types
5417       * Uppercase variables
5418       * Publicly visible private types
5419       * `#[deriving]` with raw pointers
5420     * Unsafe functions can no longer be coerced to closures.
5421     * Various obscure macros such as `log_syntax!` are now behind feature gates.
5422     * The `#[simd]` attribute is now behind a feature gate.
5423     * Visibility is no longer allowed on `extern crate` statements, and
5424       unnecessary visibility (`priv`) is no longer allowed on `use` statements.
5425     * Trailing commas are now allowed in argument lists and tuple patterns.
5426     * The `do` keyword has been removed, it is now a reserved keyword.
5427     * Default type parameters have been implemented, but are feature gated.
5428     * Borrowed variables through captures in closures are now considered soundly.
5429     * `extern mod` is now `extern crate`
5430     * The `Freeze` trait has been removed.
5431     * The `Share` trait has been added for types that can be shared among
5432       threads.
5433     * Labels in macros are now hygienic.
5434     * Expression/statement macro invocations can be delimited with `{}` now.
5435     * Treatment of types allowed in `static mut` locations has been tweaked.
5436     * The `*` and `.` operators are now overloadable through the `Deref` and
5437       `DerefMut` traits.
5438     * `~Trait` and `proc` no longer have `Send` bounds by default.
5439     * Partial type hints are now supported with the `_` type marker.
5440     * An `Unsafe` type was introduced for interior mutability. It is now
5441       considered undefined to transmute from `&T` to `&mut T` without using the
5442       `Unsafe` type.
5443     * The #[linkage] attribute was implemented for extern statics/functions.
5444     * The inner attribute syntax has changed from `#[foo];` to `#![foo]`.
5445     * `Pod` was renamed to `Copy`.
5446
5447   * Libraries
5448     * The `libextra` library has been removed. It has now been decomposed into
5449       component libraries with smaller and more focused nuggets of
5450       functionality. The full list of libraries can be found on the
5451       documentation index page.
5452     * std: `std::condition` has been removed. All I/O errors are now propagated
5453       through the `Result` type. In order to assist with error handling, a
5454       `try!` macro for unwrapping errors with an early return and a lint for
5455       unused results has been added. See #12039 for more information.
5456     * std: The `vec` module has been renamed to `slice`.
5457     * std: A new vector type, `Vec<T>`, has been added in preparation for DST.
5458       This will become the only growable vector in the future.
5459     * std: `std::io` now has more public re-exports. Types such as `BufferedReader`
5460       are now found at `std::io::BufferedReader` instead of
5461       `std::io::buffered::BufferedReader`.
5462     * std: `print` and `println` are no longer in the prelude, the `print!` and
5463       `println!` macros are intended to be used instead.
5464     * std: `Rc` now has a `Weak` pointer for breaking cycles, and it no longer
5465       attempts to statically prevent cycles.
5466     * std: The standard distribution is adopting the policy of pushing failure
5467       to the user rather than failing in libraries. Many functions (such as
5468       `slice::last()`) now return `Option<T>` instead of `T` + failing.
5469     * std: `fmt::Default` has been renamed to `fmt::Show`, and it now has a new
5470       deriving mode: `#[deriving(Show)]`.
5471     * std: `ToStr` is now implemented for all types implementing `Show`.
5472     * std: The formatting trait methods now take `&self` instead of `&T`
5473     * std: The `invert()` method on iterators has been renamed to `rev()`
5474     * std: `std::num` has seen a reduction in the genericity of its traits,
5475       consolidating functionality into a few core traits.
5476     * std: Backtraces are now printed on task failure if the environment
5477       variable `RUST_BACKTRACE` is present.
5478     * std: Naming conventions for iterators have been standardized. More details
5479       can be found on the wiki's style guide.
5480     * std: `eof()` has been removed from the `Reader` trait. Specific types may
5481       still implement the function.
5482     * std: Networking types are now cloneable to allow simultaneous reads/writes.
5483     * std: `assert_approx_eq!` has been removed
5484     * std: The `e` and `E` formatting specifiers for floats have been added to
5485       print them in exponential notation.
5486     * std: The `Times` trait has been removed
5487     * std: Indications of variance and opting out of builtin bounds is done
5488       through marker types in `std::kinds::marker` now
5489     * std: `hash` has been rewritten, `IterBytes` has been removed, and
5490       `#[deriving(Hash)]` is now possible.
5491     * std: `SharedChan` has been removed, `Sender` is now cloneable.
5492     * std: `Chan` and `Port` were renamed to `Sender` and `Receiver`.
5493     * std: `Chan::new` is now `channel()`.
5494     * std: A new synchronous channel type has been implemented.
5495     * std: A `select!` macro is now provided for selecting over `Receiver`s.
5496     * std: `hashmap` and `trie` have been moved to `libcollections`
5497     * std: `run` has been rolled into `io::process`
5498     * std: `assert_eq!` now uses `{}` instead of `{:?}`
5499     * std: The equality and comparison traits have seen some reorganization.
5500     * std: `rand` has moved to `librand`.
5501     * std: `to_{lower,upper}case` has been implemented for `char`.
5502     * std: Logging has been moved to `liblog`.
5503     * collections: `HashMap` has been rewritten for higher performance and less
5504       memory usage.
5505     * native: The default runtime is now `libnative`. If `libgreen` is desired,
5506       it can be booted manually. The runtime guide has more information and
5507       examples.
5508     * native: All I/O functionality except signals has been implemented.
5509     * green: Task spawning with `libgreen` has been optimized with stack caching
5510       and various trimming of code.
5511     * green: Tasks spawned by `libgreen` now have an unmapped guard page.
5512     * sync: The `extra::sync` module has been updated to modern rust (and moved
5513       to the `sync` library), tweaking and improving various interfaces while
5514       dropping redundant functionality.
5515     * sync: A new `Barrier` type has been added to the `sync` library.
5516     * sync: An efficient mutex for native and green tasks has been implemented.
5517     * serialize: The `base64` module has seen some improvement. It treats
5518       newlines better, has non-string error values, and has seen general
5519       cleanup.
5520     * fourcc: A `fourcc!` macro was introduced
5521     * hexfloat: A `hexfloat!` macro was implemented for specifying floats via a
5522       hexadecimal literal.
5523
5524   * Tooling
5525     * `rustpkg` has been deprecated and removed from the main repository. Its
5526       replacement, `cargo`, is under development.
5527     * Nightly builds of rust are now available
5528     * The memory usage of rustc has been improved many times throughout this
5529       release cycle.
5530     * The build process supports disabling rpath support for the rustc binary
5531       itself.
5532     * Code generation has improved in some cases, giving more information to the
5533       LLVM optimization passes to enable more extensive optimizations.
5534     * Debuginfo compatibility with lldb on OSX has been restored.
5535     * The master branch is now gated on an android bot, making building for
5536       android much more reliable.
5537     * Output flags have been centralized into one `--emit` flag.
5538     * Crate type flags have been centralized into one `--crate-type` flag.
5539     * Codegen flags have been consolidated behind a `-C` flag.
5540     * Linking against outdated crates now has improved error messages.
5541     * Error messages with lifetimes will often suggest how to annotate the
5542       function to fix the error.
5543     * Many more types are documented in the standard library, and new guides
5544       were written.
5545     * Many `rustdoc` improvements:
5546       * code blocks are syntax highlighted.
5547       * render standalone markdown files.
5548       * the --test flag tests all code blocks by default.
5549       * exported macros are displayed.
5550       * re-exported types have their documentation inlined at the location of the
5551         first re-export.
5552       * search works across crates that have been rendered to the same output
5553         directory.
5554
5555
5556 Version 0.9 (2014-01-09)
5557 ==========================
5558
5559    * ~1800 changes, numerous bugfixes
5560
5561    * Language
5562       * The `float` type has been removed. Use `f32` or `f64` instead.
5563       * A new facility for enabling experimental features (feature gating) has
5564         been added, using the crate-level `#[feature(foo)]` attribute.
5565       * Managed boxes (@) are now behind a feature gate
5566         (`#[feature(managed_boxes)]`) in preparation for future removal. Use the
5567         standard library's `Gc` or `Rc` types instead.
5568       * `@mut` has been removed. Use `std::cell::{Cell, RefCell}` instead.
5569       * Jumping back to the top of a loop is now done with `continue` instead of
5570         `loop`.
5571       * Strings can no longer be mutated through index assignment.
5572       * Raw strings can be created via the basic `r"foo"` syntax or with matched
5573         hash delimiters, as in `r###"foo"###`.
5574       * `~fn` is now written `proc (args) -> retval { ... }` and may only be
5575         called once.
5576       * The `&fn` type is now written `|args| -> ret` to match the literal form.
5577       * `@fn`s have been removed.
5578       * `do` only works with procs in order to make it obvious what the cost
5579         of `do` is.
5580       * Single-element tuple-like structs can no longer be dereferenced to
5581         obtain the inner value. A more comprehensive solution for overloading
5582         the dereference operator will be provided in the future.
5583       * The `#[link(...)]` attribute has been replaced with
5584         `#[crate_id = "name#vers"]`.
5585       * Empty `impl`s must be terminated with empty braces and may not be
5586         terminated with a semicolon.
5587       * Keywords are no longer allowed as lifetime names; the `self` lifetime
5588         no longer has any special meaning.
5589       * The old `fmt!` string formatting macro has been removed.
5590       * `printf!` and `printfln!` (old-style formatting) removed in favor of
5591         `print!` and `println!`.
5592       * `mut` works in patterns now, as in `let (mut x, y) = (1, 2);`.
5593       * The `extern mod foo (name = "bar")` syntax has been removed. Use
5594         `extern mod foo = "bar"` instead.
5595       * New reserved keywords: `alignof`, `offsetof`, `sizeof`.
5596       * Macros can have attributes.
5597       * Macros can expand to items with attributes.
5598       * Macros can expand to multiple items.
5599       * The `asm!` macro is feature-gated (`#[feature(asm)]`).
5600       * Comments may be nested.
5601       * Values automatically coerce to trait objects they implement, without
5602         an explicit `as`.
5603       * Enum discriminants are no longer an entire word but as small as needed to
5604         contain all the variants. The `repr` attribute can be used to override
5605         the discriminant size, as in `#[repr(int)]` for integer-sized, and
5606         `#[repr(C)]` to match C enums.
5607       * Non-string literals are not allowed in attributes (they never worked).
5608       * The FFI now supports variadic functions.
5609       * Octal numeric literals, as in `0o7777`.
5610       * The `concat!` syntax extension performs compile-time string concatenation.
5611       * The `#[fixed_stack_segment]` and `#[rust_stack]` attributes have been
5612         removed as Rust no longer uses segmented stacks.
5613       * Non-ascii identifiers are feature-gated (`#[feature(non_ascii_idents)]`).
5614       * Ignoring all fields of an enum variant or tuple-struct is done with `..`,
5615         not `*`; ignoring remaining fields of a struct is also done with `..`,
5616         not `_`; ignoring a slice of a vector is done with `..`, not `.._`.
5617       * `rustc` supports the "win64" calling convention via `extern "win64"`.
5618       * `rustc` supports the "system" calling convention, which defaults to the
5619         preferred convention for the target platform, "stdcall" on 32-bit Windows,
5620         "C" elsewhere.
5621       * The `type_overflow` lint (default: warn) checks literals for overflow.
5622       * The `unsafe_block` lint (default: allow) checks for usage of `unsafe`.
5623       * The `attribute_usage` lint (default: warn) warns about unknown
5624         attributes.
5625       * The `unknown_features` lint (default: warn) warns about unknown
5626         feature gates.
5627       * The `dead_code` lint (default: warn) checks for dead code.
5628       * Rust libraries can be linked statically to one another
5629       * `#[link_args]` is behind the `link_args` feature gate.
5630       * Native libraries are now linked with `#[link(name = "foo")]`
5631       * Native libraries can be statically linked to a rust crate
5632         (`#[link(name = "foo", kind = "static")]`).
5633       * Native OS X frameworks are now officially supported
5634         (`#[link(name = "foo", kind = "framework")]`).
5635       * The `#[thread_local]` attribute creates thread-local (not task-local)
5636         variables. Currently behind the `thread_local` feature gate.
5637       * The `return` keyword may be used in closures.
5638       * Types that can be copied via a memcpy implement the `Pod` kind.
5639       * The `cfg` attribute can now be used on struct fields and enum variants.
5640
5641    * Libraries
5642       * std: The `option` and `result` API's have been overhauled to make them
5643         simpler, more consistent, and more composable.
5644       * std: The entire `std::io` module has been replaced with one that is
5645         more comprehensive and that properly interfaces with the underlying
5646         scheduler. File, TCP, UDP, Unix sockets, pipes, and timers are all
5647         implemented.
5648       * std: `io::util` contains a number of useful implementations of
5649         `Reader` and `Writer`, including `NullReader`, `NullWriter`,
5650         `ZeroReader`, `TeeReader`.
5651       * std: The reference counted pointer type `extra::rc` moved into std.
5652       * std: The `Gc` type in the `gc` module will replace `@` (it is currently
5653         just a wrapper around it).
5654       * std: The `Either` type has been removed.
5655       * std: `fmt::Default` can be implemented for any type to provide default
5656         formatting to the `format!` macro, as in `format!("{}", myfoo)`.
5657       * std: The `rand` API continues to be tweaked.
5658       * std: The `rust_begin_unwind` function, useful for inserting breakpoints
5659         on failure in gdb, is now named `rust_fail`.
5660       * std: The `each_key` and `each_value` methods on `HashMap` have been
5661         replaced by the `keys` and `values` iterators.
5662       * std: Functions dealing with type size and alignment have moved from the
5663         `sys` module to the `mem` module.
5664       * std: The `path` module was written and API changed.
5665       * std: `str::from_utf8` has been changed to cast instead of allocate.
5666       * std: `starts_with` and `ends_with` methods added to vectors via the
5667         `ImmutableEqVector` trait, which is in the prelude.
5668       * std: Vectors can be indexed with the `get_opt` method, which returns `None`
5669         if the index is out of bounds.
5670       * std: Task failure no longer propagates between tasks, as the model was
5671         complex, expensive, and incompatible with thread-based tasks.
5672       * std: The `Any` type can be used for dynamic typing.
5673       * std: `~Any` can be passed to the `fail!` macro and retrieved via
5674         `task::try`.
5675       * std: Methods that produce iterators generally do not have an `_iter`
5676         suffix now.
5677       * std: `cell::Cell` and `cell::RefCell` can be used to introduce mutability
5678         roots (mutable fields, etc.). Use instead of e.g. `@mut`.
5679       * std: `util::ignore` renamed to `prelude::drop`.
5680       * std: Slices have `sort` and `sort_by` methods via the `MutableVector`
5681         trait.
5682       * std: `vec::raw` has seen a lot of cleanup and API changes.
5683       * std: The standard library no longer includes any C++ code, and very
5684         minimal C, eliminating the dependency on libstdc++.
5685       * std: Runtime scheduling and I/O functionality has been factored out into
5686         extensible interfaces and is now implemented by two different crates:
5687         libnative, for native threading and I/O; and libgreen, for green threading
5688         and I/O. This paves the way for using the standard library in more limited
5689         embedded environments.
5690       * std: The `comm` module has been rewritten to be much faster, have a
5691         simpler, more consistent API, and to work for both native and green
5692         threading.
5693       * std: All libuv dependencies have been moved into the rustuv crate.
5694       * native: New implementations of runtime scheduling on top of OS threads.
5695       * native: New native implementations of TCP, UDP, file I/O, process spawning,
5696         and other I/O.
5697       * green: The green thread scheduler and message passing types are almost
5698         entirely lock-free.
5699       * extra: The `flatpipes` module had bitrotted and was removed.
5700       * extra: All crypto functions have been removed and Rust now has a policy of
5701         not reimplementing crypto in the standard library. In the future crypto
5702         will be provided by external crates with bindings to established libraries.
5703       * extra: `c_vec` has been modernized.
5704       * extra: The `sort` module has been removed. Use the `sort` method on
5705         mutable slices.
5706
5707    * Tooling
5708       * The `rust` and `rusti` commands have been removed, due to lack of
5709         maintenance.
5710       * `rustdoc` was completely rewritten.
5711       * `rustdoc` can test code examples in documentation.
5712       * `rustpkg` can test packages with the argument, 'test'.
5713       * `rustpkg` supports arbitrary dependencies, including C libraries.
5714       * `rustc`'s support for generating debug info is improved again.
5715       * `rustc` has better error reporting for unbalanced delimiters.
5716       * `rustc`'s JIT support was removed due to bitrot.
5717       * Executables and static libraries can be built with LTO (-Z lto)
5718       * `rustc` adds a `--dep-info` flag for communicating dependencies to
5719         build tools.
5720
5721
5722 Version 0.8 (2013-09-26)
5723 ============================
5724
5725    * ~2200 changes, numerous bugfixes
5726
5727    * Language
5728       * The `for` loop syntax has changed to work with the `Iterator` trait.
5729       * At long last, unwinding works on Windows.
5730       * Default methods are ready for use.
5731       * Many trait inheritance bugs fixed.
5732       * Owned and borrowed trait objects work more reliably.
5733       * `copy` is no longer a keyword. It has been replaced by the `Clone` trait.
5734       * rustc can omit emission of code for the `debug!` macro if it is passed
5735         `--cfg ndebug`
5736       * mod.rs is now "blessed". When loading `mod foo;`, rustc will now look
5737         for foo.rs, then foo/mod.rs, and will generate an error when both are
5738         present.
5739       * Strings no longer contain trailing nulls. The new `std::c_str` module
5740         provides new mechanisms for converting to C strings.
5741       * The type of foreign functions is now `extern "C" fn` instead of `*u8'.
5742       * The FFI has been overhauled such that foreign functions are called directly,
5743         instead of through a stack-switching wrapper.
5744       * Calling a foreign function must be done through a Rust function with the
5745         `#[fixed_stack_segment]` attribute.
5746       * The `externfn!` macro can be used to declare both a foreign function and
5747         a `#[fixed_stack_segment]` wrapper at once.
5748       * `pub` and `priv` modifiers on `extern` blocks are no longer parsed.
5749       * `unsafe` is no longer allowed on extern fns - they are all unsafe.
5750       * `priv` is disallowed everywhere except for struct fields and enum variants.
5751       * `&T` (besides `&'static T`) is no longer allowed in `@T`.
5752       * `ref` bindings in irrefutable patterns work correctly now.
5753       * `char` is now prevented from containing invalid code points.
5754       * Casting to `bool` is no longer allowed.
5755       * `\0` is now accepted as an escape in chars and strings.
5756       * `yield` is a reserved keyword.
5757       * `typeof` is a reserved keyword.
5758       * Crates may be imported by URL with `extern mod foo = "url";`.
5759       * Explicit enum discriminants may be given as uints as in `enum E { V = 0u }`
5760       * Static vectors can be initialized with repeating elements,
5761         e.g. `static foo: [u8, .. 100]: [0, .. 100];`.
5762       * Static structs can be initialized with functional record update,
5763         e.g. `static foo: Foo = Foo { a: 5, .. bar };`.
5764       * `cfg!` can be used to conditionally execute code based on the crate
5765         configuration, similarly to `#[cfg(...)]`.
5766       * The `unnecessary_qualification` lint detects unneeded module
5767         prefixes (default: allow).
5768       * Arithmetic operations have been implemented on the SIMD types in
5769         `std::unstable::simd`.
5770       * Exchange allocation headers were removed, reducing memory usage.
5771       * `format!` implements a completely new, extensible, and higher-performance
5772         string formatting system. It will replace `fmt!`.
5773       * `print!` and `println!` write formatted strings (using the `format!`
5774         extension) to stdout.
5775       * `write!` and `writeln!` write formatted strings (using the `format!`
5776         extension) to the new Writers in `std::rt::io`.
5777       * The library section in which a function or static is placed may
5778         be specified with `#[link_section = "..."]`.
5779       * The `proto!` syntax extension for defining bounded message protocols
5780         was removed.
5781       * `macro_rules!` is hygienic for `let` declarations.
5782       * The `#[export_name]` attribute specifies the name of a symbol.
5783       * `unreachable!` can be used to indicate unreachable code, and fails
5784         if executed.
5785
5786    * Libraries
5787       * std: Transitioned to the new runtime, written in Rust.
5788       * std: Added an experimental I/O library, `rt::io`, based on the new
5789         runtime.
5790       * std: A new generic `range` function was added to the prelude, replacing
5791         `uint::range` and friends.
5792       * std: `range_rev` no longer exists. Since range is an iterator it can be
5793         reversed with `range(lo, hi).invert()`.
5794       * std: The `chain` method on option renamed to `and_then`; `unwrap_or_default`
5795         renamed to `unwrap_or`.
5796       * std: The `iterator` module was renamed to `iter`.
5797       * std: Integral types now support the `checked_add`, `checked_sub`, and
5798         `checked_mul` operations for detecting overflow.
5799       * std: Many methods in `str`, `vec`, `option, `result` were renamed for
5800         consistency.
5801       * std: Methods are standardizing on conventions for casting methods:
5802         `to_foo` for copying, `into_foo` for moving, `as_foo` for temporary
5803         and cheap casts.
5804       * std: The `CString` type in `c_str` provides new ways to convert to and
5805         from C strings.
5806       * std: `DoubleEndedIterator` can yield elements in two directions.
5807       * std: The `mut_split` method on vectors partitions an `&mut [T]` into
5808         two splices.
5809       * std: `str::from_bytes` renamed to `str::from_utf8`.
5810       * std: `pop_opt` and `shift_opt` methods added to vectors.
5811       * std: The task-local data interface no longer uses @, and keys are
5812         no longer function pointers.
5813       * std: The `swap_unwrap` method of `Option` renamed to `take_unwrap`.
5814       * std: Added `SharedPort` to `comm`.
5815       * std: `Eq` has a default method for `ne`; only `eq` is required
5816         in implementations.
5817       * std: `Ord` has default methods for `le`, `gt` and `ge`; only `lt`
5818         is required in implementations.
5819       * std: `is_utf8` performance is improved, impacting many string functions.
5820       * std: `os::MemoryMap` provides cross-platform mmap.
5821       * std: `ptr::offset` is now unsafe, but also more optimized. Offsets that
5822         are not 'in-bounds' are considered undefined.
5823       * std: Many freestanding functions in `vec` removed in favor of methods.
5824       * std: Many freestanding functions on scalar types removed in favor of
5825         methods.
5826       * std: Many options to task builders were removed since they don't make
5827         sense in the new scheduler design.
5828       * std: More containers implement `FromIterator` so can be created by the
5829         `collect` method.
5830       * std: More complete atomic types in `unstable::atomics`.
5831       * std: `comm::PortSet` removed.
5832       * std: Mutating methods in the `Set` and `Map` traits have been moved into
5833         the `MutableSet` and `MutableMap` traits. `Container::is_empty`,
5834         `Map::contains_key`, `MutableMap::insert`, and `MutableMap::remove` have
5835         default implementations.
5836       * std: Various `from_str` functions were removed in favor of a generic
5837         `from_str` which is available in the prelude.
5838       * std: `util::unreachable` removed in favor of the `unreachable!` macro.
5839       * extra: `dlist`, the doubly-linked list was modernized.
5840       * extra: Added a `hex` module with `ToHex` and `FromHex` traits.
5841       * extra: Added `glob` module, replacing `std::os::glob`.
5842       * extra: `rope` was removed.
5843       * extra: `deque` was renamed to `ringbuf`. `RingBuf` implements `Deque`.
5844       * extra: `net`, and `timer` were removed. The experimental replacements
5845         are `std::rt::io::net` and `std::rt::io::timer`.
5846       * extra: Iterators implemented for `SmallIntMap`.
5847       * extra: Iterators implemented for `Bitv` and `BitvSet`.
5848       * extra: `SmallIntSet` removed. Use `BitvSet`.
5849       * extra: Performance of JSON parsing greatly improved.
5850       * extra: `semver` updated to SemVer 2.0.0.
5851       * extra: `term` handles more terminals correctly.
5852       * extra: `dbg` module removed.
5853       * extra: `par` module removed.
5854       * extra: `future` was cleaned up, with some method renames.
5855       * extra: Most free functions in `getopts` were converted to methods.
5856
5857    * Other
5858       * rustc's debug info generation (`-Z debug-info`) is greatly improved.
5859       * rustc accepts `--target-cpu` to compile to a specific CPU architecture,
5860         similarly to gcc's `--march` flag.
5861       * rustc's performance compiling small crates is much better.
5862       * rustpkg has received many improvements.
5863       * rustpkg supports git tags as package IDs.
5864       * rustpkg builds into target-specific directories so it can be used for
5865         cross-compiling.
5866       * The number of concurrent test tasks is controlled by the environment
5867         variable RUST_TEST_TASKS.
5868       * The test harness can now report metrics for benchmarks.
5869       * All tools have man pages.
5870       * Programs compiled with `--test` now support the `-h` and `--help` flags.
5871       * The runtime uses jemalloc for allocations.
5872       * Segmented stacks are temporarily disabled as part of the transition to
5873         the new runtime. Stack overflows are possible!
5874       * A new documentation backend, rustdoc_ng, is available for use. It is
5875         still invoked through the normal `rustdoc` command.
5876
5877
5878 Version 0.7 (2013-07-03)
5879 =======================
5880
5881    * ~2000 changes, numerous bugfixes
5882
5883    * Language
5884       * `impl`s no longer accept a visibility qualifier. Put them on methods
5885         instead.
5886       * The borrow checker has been rewritten with flow-sensitivity, fixing
5887         many bugs and inconveniences.
5888       * The `self` parameter no longer implicitly means `&'self self`,
5889         and can be explicitly marked with a lifetime.
5890       * Overloadable compound operators (`+=`, etc.) have been temporarily
5891         removed due to bugs.
5892       * The `for` loop protocol now requires `for`-iterators to return `bool`
5893         so they compose better.
5894       * The `Durable` trait is replaced with the `'static` bounds.
5895       * Trait default methods work more often.
5896       * Structs with the `#[packed]` attribute have byte alignment and
5897         no padding between fields.
5898       * Type parameters bound by `Copy` must now be copied explicitly with
5899         the `copy` keyword.
5900       * It is now illegal to move out of a dereferenced unsafe pointer.
5901       * `Option<~T>` is now represented as a nullable pointer.
5902       * `@mut` does dynamic borrow checks correctly.
5903       * The `main` function is only detected at the topmost level of the crate.
5904         The `#[main]` attribute is still valid anywhere.
5905       * Struct fields may no longer be mutable. Use inherited mutability.
5906       * The `#[no_send]` attribute makes a type that would otherwise be
5907         `Send`, not.
5908       * The `#[no_freeze]` attribute makes a type that would otherwise be
5909         `Freeze`, not.
5910       * Unbounded recursion will abort the process after reaching the limit
5911         specified by the `RUST_MAX_STACK` environment variable (default: 1GB).
5912       * The `vecs_implicitly_copyable` lint mode has been removed. Vectors
5913         are never implicitly copyable.
5914       * `#[static_assert]` makes compile-time assertions about static bools.
5915       * At long last, 'argument modes' no longer exist.
5916       * The rarely used `use mod` statement no longer exists.
5917
5918    * Syntax extensions
5919       * `fail!` and `assert!` accept `~str`, `&'static str` or `fmt!`-style
5920         argument list.
5921       * `Encodable`, `Decodable`, `Ord`, `TotalOrd`, `TotalEq`, `DeepClone`,
5922         `Rand`, `Zero` and `ToStr` can all be automatically derived with
5923         `#[deriving(...)]`.
5924       * The `bytes!` macro returns a vector of bytes for string, u8, char,
5925         and unsuffixed integer literals.
5926
5927    * Libraries
5928       * The `core` crate was renamed to `std`.
5929       * The `std` crate was renamed to `extra`.
5930       * More and improved documentation.
5931       * std: `iterator` module for external iterator objects.
5932       * Many old-style (internal, higher-order function) iterators replaced by
5933         implementations of `Iterator`.
5934       * std: Many old internal vector and string iterators,
5935         incl. `any`, `all`. removed.
5936       * std: The `finalize` method of `Drop` renamed to `drop`.
5937       * std: The `drop` method now takes `&mut self` instead of `&self`.
5938       * std: The prelude no longer re-exports any modules, only types and traits.
5939       * std: Prelude additions: `print`, `println`, `FromStr`, `ApproxEq`, `Equiv`,
5940         `Iterator`, `IteratorUtil`, many numeric traits, many tuple traits.
5941       * std: New numeric traits: `Fractional`, `Real`, `RealExt`, `Integer`, `Ratio`,
5942         `Algebraic`, `Trigonometric`, `Exponential`, `Primitive`.
5943       * std: Tuple traits and accessors defined for up to 12-tuples, e.g.
5944         `(0, 1, 2).n2()` or `(0, 1, 2).n2_ref()`.
5945       * std: Many types implement `Clone`.
5946       * std: `path` type renamed to `Path`.
5947       * std: `mut` module and `Mut` type removed.
5948       * std: Many standalone functions removed in favor of methods and iterators
5949         in `vec`, `str`. In the future methods will also work as functions.
5950       * std: `reinterpret_cast` removed. Use `transmute`.
5951       * std: ascii string handling in `std::ascii`.
5952       * std: `Rand` is implemented for ~/@.
5953       * std: `run` module for spawning processes overhauled.
5954       * std: Various atomic types added to `unstable::atomic`.
5955       * std: Various types implement `Zero`.
5956       * std: `LinearMap` and `LinearSet` renamed to `HashMap` and `HashSet`.
5957       * std: Borrowed pointer functions moved from `ptr` to `borrow`.
5958       * std: Added `os::mkdir_recursive`.
5959       * std: Added `os::glob` function performs filesystems globs.
5960       * std: `FuzzyEq` renamed to `ApproxEq`.
5961       * std: `Map` now defines `pop` and `swap` methods.
5962       * std: `Cell` constructors converted to static methods.
5963       * extra: `rc` module adds the reference counted pointers, `Rc` and `RcMut`.
5964       * extra: `flate` module moved from `std` to `extra`.
5965       * extra: `fileinput` module for iterating over a series of files.
5966       * extra: `Complex` number type and `complex` module.
5967       * extra: `Rational` number type and `rational` module.
5968       * extra: `BigInt`, `BigUint` implement numeric and comparison traits.
5969       * extra: `term` uses terminfo now, is more correct.
5970       * extra: `arc` functions converted to methods.
5971       * extra: Implementation of fixed output size variations of SHA-2.
5972
5973    * Tooling
5974       * `unused_variable`  lint mode for unused variables (default: warn).
5975       * `unused_unsafe` lint mode for detecting unnecessary `unsafe` blocks
5976         (default: warn).
5977       * `unused_mut` lint mode for identifying unused `mut` qualifiers
5978         (default: warn).
5979       * `dead_assignment` lint mode for unread variables (default: warn).
5980       * `unnecessary_allocation` lint mode detects some heap allocations that are
5981         immediately borrowed so could be written without allocating (default: warn).
5982       * `missing_doc` lint mode (default: allow).
5983       * `unreachable_code` lint mode (default: warn).
5984       * The `rusti` command has been rewritten and a number of bugs addressed.
5985       * rustc outputs in color on more terminals.
5986       * rustc accepts a `--link-args` flag to pass arguments to the linker.
5987       * rustc accepts a `-Z print-link-args` flag for debugging linkage.
5988       * Compiling with `-g` will make the binary record information about
5989         dynamic borrowcheck failures for debugging.
5990       * rustdoc has a nicer stylesheet.
5991       * Various improvements to rustdoc.
5992       * Improvements to rustpkg (see the detailed release notes).
5993
5994
5995 Version 0.6 (2013-04-03)
5996 ========================
5997
5998    * ~2100 changes, numerous bugfixes
5999
6000    * Syntax changes
6001       * The self type parameter in traits is now spelled `Self`
6002       * The `self` parameter in trait and impl methods must now be explicitly
6003         named (for example: `fn f(&self) { }`). Implicit self is deprecated.
6004       * Static methods no longer require the `static` keyword and instead
6005         are distinguished by the lack of a `self` parameter
6006       * Replaced the `Durable` trait with the `'static` lifetime
6007       * The old closure type syntax with the trailing sigil has been
6008         removed in favor of the more consistent leading sigil
6009       * `super` is a keyword, and may be prefixed to paths
6010       * Trait bounds are separated with `+` instead of whitespace
6011       * Traits are implemented with `impl Trait for Type`
6012         instead of `impl Type: Trait`
6013       * Lifetime syntax is now `&'l foo` instead of `&l/foo`
6014       * The `export` keyword has finally been removed
6015       * The `move` keyword has been removed (see "Semantic changes")
6016       * The interior mutability qualifier on vectors, `[mut T]`, has been
6017         removed. Use `&mut [T]`, etc.
6018       * `mut` is no longer valid in `~mut T`. Use inherited mutability
6019       * `fail` is no longer a keyword. Use `fail!()`
6020       * `assert` is no longer a keyword. Use `assert!()`
6021       * `log` is no longer a keyword. use `debug!`, etc.
6022       * 1-tuples may be represented as `(T,)`
6023       * Struct fields may no longer be `mut`. Use inherited mutability,
6024         `@mut T`, `core::mut` or `core::cell`
6025       * `extern mod { ... }` is no longer valid syntax for foreign
6026         function modules. Use extern blocks: `extern { ... }`
6027       * Newtype enums removed. Use tuple-structs.
6028       * Trait implementations no longer support visibility modifiers
6029       * Pattern matching over vectors improved and expanded
6030       * `const` renamed to `static` to correspond to lifetime name,
6031         and make room for future `static mut` unsafe mutable globals.
6032       * Replaced `#[deriving_eq]` with `#[deriving(Eq)]`, etc.
6033       * `Clone` implementations can be automatically generated with
6034         `#[deriving(Clone)]`
6035       * Casts to traits must use a pointer sigil, e.g. `@foo as @Bar`
6036         instead of `foo as Bar`.
6037       * Fixed length vector types are now written as `[int, .. 3]`
6038         instead of `[int * 3]`.
6039       * Fixed length vector types can express the length as a constant
6040         expression. (ex: `[int, .. GL_BUFFER_SIZE - 2]`)
6041
6042    * Semantic changes
6043       * Types with owned pointers or custom destructors move by default,
6044         eliminating the `move` keyword
6045       * All foreign functions are considered unsafe
6046       * &mut is now unaliasable
6047       * Writes to borrowed @mut pointers are prevented dynamically
6048       * () has size 0
6049       * The name of the main function can be customized using #[main]
6050       * The default type of an inferred closure is &fn instead of @fn
6051       * `use` statements may no longer be "chained" - they cannot import
6052         identifiers imported by previous `use` statements
6053       * `use` statements are crate relative, importing from the "top"
6054         of the crate by default. Paths may be prefixed with `super::`
6055         or `self::` to change the search behavior.
6056       * Method visibility is inherited from the implementation declaration
6057       * Structural records have been removed
6058       * Many more types can be used in static items, including enums
6059         'static-lifetime pointers and vectors
6060       * Pattern matching over vectors improved and expanded
6061       * Typechecking of closure types has been overhauled to
6062         improve inference and eliminate unsoundness
6063       * Macros leave scope at the end of modules, unless that module is
6064         tagged with #[macro_escape]
6065
6066    * Libraries
6067       * Added big integers to `std::bigint`
6068       * Removed `core::oldcomm` module
6069       * Added pipe-based `core::comm` module
6070       * Numeric traits have been reorganized under `core::num`
6071       * `vec::slice` finally returns a slice
6072       * `debug!` and friends don't require a format string, e.g. `debug!(Foo)`
6073       * Containers reorganized around traits in `core::container`
6074       * `core::dvec` removed, `~[T]` is a drop-in replacement
6075       * `core::send_map` renamed to `core::hashmap`
6076       * `std::map` removed; replaced with `core::hashmap`
6077       * `std::treemap` reimplemented as an owned balanced tree
6078       * `std::deque` and `std::smallintmap` reimplemented as owned containers
6079       * `core::trie` added as a fast ordered map for integer keys
6080       * Set types added to `core::hashmap`, `core::trie` and `std::treemap`
6081       * `Ord` split into `Ord` and `TotalOrd`. `Ord` is still used to
6082         overload the comparison operators, whereas `TotalOrd` is used
6083         by certain container types
6084
6085    * Other
6086       * Replaced the 'cargo' package manager with 'rustpkg'
6087       * Added all-purpose 'rust' tool
6088       * `rustc --test` now supports benchmarks with the `#[bench]` attribute
6089       * rustc now *attempts* to offer spelling suggestions
6090       * Improved support for ARM and Android
6091       * Preliminary MIPS backend
6092       * Improved foreign function ABI implementation for x86, x86_64
6093       * Various memory usage improvements
6094       * Rust code may be embedded in foreign code under limited circumstances
6095       * Inline assembler supported by new asm!() syntax extension.
6096
6097
6098 Version 0.5 (2012-12-21)
6099 ===========================
6100
6101    * ~900 changes, numerous bugfixes
6102
6103    * Syntax changes
6104       * Removed `<-` move operator
6105       * Completed the transition from the `#fmt` extension syntax to `fmt!`
6106       * Removed old fixed length vector syntax - `[T]/N`
6107       * New token-based quasi-quoters, `quote_tokens!`, `quote_expr!`, etc.
6108       * Macros may now expand to items and statements
6109       * `a.b()` is always parsed as a method call, never as a field projection
6110       * `Eq` and `IterBytes` implementations can be automatically generated
6111         with `#[deriving_eq]` and `#[deriving_iter_bytes]` respectively
6112       * Removed the special crate language for `.rc` files
6113       * Function arguments may consist of any irrefutable pattern
6114
6115    * Semantic changes
6116       * `&` and `~` pointers may point to objects
6117       * Tuple structs - `struct Foo(Bar, Baz)`. Will replace newtype enums.
6118       * Enum variants may be structs
6119       * Destructors can be added to all nominal types with the Drop trait
6120       * Structs and nullary enum variants may be constants
6121       * Values that cannot be implicitly copied are now automatically moved
6122         without writing `move` explicitly
6123       * `&T` may now be coerced to `*T`
6124       * Coercions happen in `let` statements as well as function calls
6125       * `use` statements now take crate-relative paths
6126       * The module and type namespaces have been merged so that static
6127         method names can be resolved under the trait in which they are
6128         declared
6129
6130    * Improved support for language features
6131       * Trait inheritance works in many scenarios
6132       * More support for explicit self arguments in methods - `self`, `&self`
6133         `@self`, and `~self` all generally work as expected
6134       * Static methods work in more situations
6135       * Experimental: Traits may declare default methods for the implementations
6136         to use
6137
6138    * Libraries
6139       * New condition handling system in `core::condition`
6140       * Timsort added to `std::sort`
6141       * New priority queue, `std::priority_queue`
6142       * Pipes for serializable types, `std::flatpipes'
6143       * Serialization overhauled to be trait-based
6144       * Expanded `getopts` definitions
6145       * Moved futures to `std`
6146       * More functions are pure now
6147       * `core::comm` renamed to `oldcomm`. Still deprecated
6148       * `rustdoc` and `cargo` are libraries now
6149
6150    * Misc
6151       * Added a preliminary REPL, `rusti`
6152       * License changed from MIT to dual MIT/APL2
6153
6154
6155 Version 0.4 (2012-10-15)
6156 ==========================
6157
6158    * ~2000 changes, numerous bugfixes
6159
6160    * Syntax
6161       * All keywords are now strict and may not be used as identifiers anywhere
6162       * Keyword removal: 'again', 'import', 'check', 'new', 'owned', 'send',
6163         'of', 'with', 'to', 'class'.
6164       * Classes are replaced with simpler structs
6165       * Explicit method self types
6166       * `ret` became `return` and `alt` became `match`
6167       * `import` is now `use`; `use is now `extern mod`
6168       * `extern mod { ... }` is now `extern { ... }`
6169       * `use mod` is the recommended way to import modules
6170       * `pub` and `priv` replace deprecated export lists
6171       * The syntax of `match` pattern arms now uses fat arrow (=>)
6172       * `main` no longer accepts an args vector; use `os::args` instead
6173
6174    * Semantics
6175       * Trait implementations are now coherent, ala Haskell typeclasses
6176       * Trait methods may be static
6177       * Argument modes are deprecated
6178       * Borrowed pointers are much more mature and recommended for use
6179       * Strings and vectors in the static region are stored in constant memory
6180       * Typestate was removed
6181       * Resolution rewritten to be more reliable
6182       * Support for 'dual-mode' data structures (freezing and thawing)
6183
6184    * Libraries
6185       * Most binary operators can now be overloaded via the traits in
6186         `core::ops'
6187       * `std::net::url` for representing URLs
6188       * Sendable hash maps in `core::send_map`
6189       * `core::task' gained a (currently unsafe) task-local storage API
6190
6191    * Concurrency
6192       * An efficient new intertask communication primitive called the pipe,
6193         along with a number of higher-level channel types, in `core::pipes`
6194       * `std::arc`, an atomically reference counted, immutable, shared memory
6195         type
6196       * `std::sync`, various exotic synchronization tools based on arcs and pipes
6197       * Futures are now based on pipes and sendable
6198       * More robust linked task failure
6199       * Improved task builder API
6200
6201    * Other
6202       * Improved error reporting
6203       * Preliminary JIT support
6204       * Preliminary work on precise GC
6205       * Extensive architectural improvements to rustc
6206       * Begun a transition away from buggy C++-based reflection (shape) code to
6207         Rust-based (visitor) code
6208       * All hash functions and tables converted to secure, randomized SipHash
6209
6210
6211 Version 0.3  (2012-07-12)
6212 ========================
6213
6214    * ~1900 changes, numerous bugfixes
6215
6216    * New coding conveniences
6217       * Integer-literal suffix inference
6218       * Per-item control over warnings, errors
6219       * #[cfg(windows)] and #[cfg(unix)] attributes
6220       * Documentation comments
6221       * More compact closure syntax
6222       * 'do' expressions for treating higher-order functions as
6223         control structures
6224       * *-patterns (wildcard extended to all constructor fields)
6225
6226    * Semantic cleanup
6227       * Name resolution pass and exhaustiveness checker rewritten
6228       * Region pointers and borrow checking supersede alias
6229         analysis
6230       * Init-ness checking is now provided by a region-based liveness
6231         pass instead of the typestate pass; same for last-use analysis
6232       * Extensive work on region pointers
6233
6234    * Experimental new language features
6235       * Slices and fixed-size, interior-allocated vectors
6236       * #!-comments for lang versioning, shell execution
6237       * Destructors and iface implementation for classes;
6238         type-parameterized classes and class methods
6239       * 'const' type kind for types that can be used to implement
6240         shared-memory concurrency patterns
6241
6242    * Type reflection
6243
6244    * Removal of various obsolete features
6245       * Keywords: 'be', 'prove', 'syntax', 'note', 'mutable', 'bind',
6246                  'crust', 'native' (now 'extern'), 'cont' (now 'again')
6247
6248       * Constructs: do-while loops ('do' repurposed), fn binding,
6249                     resources (replaced by destructors)
6250
6251    * Compiler reorganization
6252       * Syntax-layer of compiler split into separate crate
6253       * Clang (from LLVM project) integrated into build
6254       * Typechecker split into sub-modules
6255
6256    * New library code
6257       * New time functions
6258       * Extension methods for many built-in types
6259       * Arc: atomic-refcount read-only / exclusive-use shared cells
6260       * Par: parallel map and search routines
6261       * Extensive work on libuv interface
6262       * Much vector code moved to libraries
6263       * Syntax extensions: #line, #col, #file, #mod, #stringify,
6264         #include, #include_str, #include_bin
6265
6266    * Tool improvements
6267       * Cargo automatically resolves dependencies
6268
6269
6270 Version 0.2  (2012-03-29)
6271 =========================
6272
6273    * >1500 changes, numerous bugfixes
6274
6275    * New docs and doc tooling
6276
6277    * New port: FreeBSD x86_64
6278
6279    * Compilation model enhancements
6280       * Generics now specialized, multiply instantiated
6281       * Functions now inlined across separate crates
6282
6283    * Scheduling, stack and threading fixes
6284       * Noticeably improved message-passing performance
6285       * Explicit schedulers
6286       * Callbacks from C
6287       * Helgrind clean
6288
6289    * Experimental new language features
6290       * Operator overloading
6291       * Region pointers
6292       * Classes
6293
6294    * Various language extensions
6295       * C-callback function types: 'crust fn ...'
6296       * Infinite-loop construct: 'loop { ... }'
6297       * Shorten 'mutable' to 'mut'
6298       * Required mutable-local qualifier: 'let mut ...'
6299       * Basic glob-exporting: 'export foo::*;'
6300       * Alt now exhaustive, 'alt check' for runtime-checked
6301       * Block-function form of 'for' loop, with 'break' and 'ret'.
6302
6303    * New library code
6304       * AST quasi-quote syntax extension
6305       * Revived libuv interface
6306       * New modules: core::{future, iter}, std::arena
6307       * Merged per-platform std::{os*, fs*} to core::{libc, os}
6308       * Extensive cleanup, regularization in libstd, libcore
6309
6310
6311 Version 0.1  (2012-01-20)
6312 ===============================
6313
6314    * Most language features work, including:
6315       * Unique pointers, unique closures, move semantics
6316       * Interface-constrained generics
6317       * Static interface dispatch
6318       * Stack growth
6319       * Multithread task scheduling
6320       * Typestate predicates
6321       * Failure unwinding, destructors
6322       * Pattern matching and destructuring assignment
6323       * Lightweight block-lambda syntax
6324       * Preliminary macro-by-example
6325
6326    * Compiler works with the following configurations:
6327       * Linux: x86 and x86_64 hosts and targets
6328       * macOS: x86 and x86_64 hosts and targets
6329       * Windows: x86 hosts and targets
6330
6331    * Cross compilation / multi-target configuration supported.
6332
6333    * Preliminary API-documentation and package-management tools included.
6334
6335 Known issues:
6336
6337    * Documentation is incomplete.
6338
6339    * Performance is below intended target.
6340
6341    * Standard library APIs are subject to extensive change, reorganization.
6342
6343    * Language-level versioning is not yet operational - future code will
6344      break unexpectedly.