]> git.lizzy.rs Git - rust.git/blob - RELEASES.md
Make sure CFG_RELEASE_CHANNEL is always set.
[rust.git] / RELEASES.md
1 Version 1.19.0 (2017-07-20)
2 ===========================
3
4 Language
5 --------
6
7 - [Numeric fields can now be used for creating tuple structs.][41145] [RFC 1506]
8   For example `struct Point(u32, u32); let x = Point { 0: 7, 1: 0 };`.
9 - [Macro recursion limit increased to 1024 from 64.][41676]
10 - [Added lint for detecting unused macros.][41907]
11 - [`loop` can now return a value with `break`.][42016] [RFC 1624]
12   For example: `let x = loop { break 7; };`
13 - [C compatible `union`s are now available.][42068] [RFC 1444] They can only
14   contain `Copy` types and cannot have a `Drop` implementation.
15   Example: `union Foo { bar: u8, baz: usize }`
16 - [Non capturing closures can now be coerced into `fn`s,][42162] [RFC 1558]
17   Example: `let foo: fn(u8) -> u8 = |v: u8| { v };`
18
19 Compiler
20 --------
21
22 - [Add support for bootstrapping the Rust compiler toolchain on Android.][41370]
23 - [Change `arm-linux-androideabi` to correspond to the `armeabi`
24   official ABI.][41656] If you wish to continue targeting the `armeabi-v7a` ABI
25   you should use `--target armv7-linux-androideabi`.
26 - [Fixed ICE when removing a source file between compilation sessions.][41873]
27 - [Minor optimisation of string operations.][42037]
28 - [Compiler error message is now `aborting due to previous error(s)` instead of
29   `aborting due to N previous errors`][42150] This was previously inaccurate and
30   would only count certain kinds of errors.
31 - [The compiler now supports Visual Studio 2017][42225]
32 - [The compiler is now built against LLVM 4.0.1 by default][42948]
33 - [Added a lot][42264] of [new error codes][42302]
34 - [Added `target-feature=+crt-static` option][37406] [RFC 1721] Which allows
35   libraries with C Run-time Libraries(CRT) to be statically linked.
36 - [Fixed various ARM codegen bugs][42740]
37
38 Libraries
39 ---------
40
41 - [`String` now implements `FromIterator<Cow<'a, str>>` and
42   `Extend<Cow<'a, str>>`][41449]
43 - [`Vec` now implements `From<&mut [T]>`][41530]
44 - [`Box<[u8]>` now implements `From<Box<str>>`][41258]
45 - [`SplitWhitespace` now implements `Clone`][41659]
46 - [`[u8]::reverse` is now 5x faster and `[u16]::reverse` is now
47   1.5x faster][41764]
48 - [`eprint!` and `eprintln!` macros added to prelude.][41192] Same as the `print!`
49   macros, but for printing to stderr.
50
51 Stabilized APIs
52 ---------------
53
54 - [`OsString::shrink_to_fit`]
55 - [`cmp::Reverse`]
56 - [`Command::envs`]
57 - [`thread::ThreadId`]
58
59 Cargo
60 -----
61
62 - [Build scripts can now add environment variables to the environment
63   the crate is being compiled in.
64   Example: `println!("cargo:rustc-env=FOO=bar");`][cargo/3929]
65 - [Subcommands now replace the current process rather than spawning a new
66   child process][cargo/3970]
67 - [Workspace members can now accept glob file patterns][cargo/3979]
68 - [Added `--all` flag to the `cargo bench` subcommand to run benchmarks of all
69   the members in a given workspace.][cargo/3988]
70 - [Updated `libssh2-sys` to 0.2.6][cargo/4008]
71 - [Target directory path is now in the cargo metadata][cargo/4022]
72 - [Cargo no longer checks out a local working directory for the
73   crates.io index][cargo/4026] This should provide smaller file size for the
74   registry, and improve cloning times, especially on Windows machines.
75 - [Added an `--exclude` option for excluding certain packages when using the
76   `--all` option][cargo/4031]
77 - [Cargo will now automatically retry when receiving a 5xx error
78   from crates.io][cargo/4032]
79 - [The `--features` option now accepts multiple comma or space
80   delimited values.][cargo/4084]
81 - [Added support for custom target specific runners][cargo/3954]
82
83 Misc
84 ----
85
86 - [Added `rust-windbg.cmd`][39983] for loading rust `.natvis` files in the
87   Windows Debugger.
88 - [Rust will now release XZ compressed packages][rust-installer/57]
89 - [rustup will now prefer to download rust packages with
90   XZ compression][rustup/1100] over GZip packages.
91 - [Added the ability to escape `#` in rust documentation][41785] By adding
92   additional `#`'s ie. `##` is now `#`
93
94 Compatibility Notes
95 -------------------
96
97 - [`MutexGuard<T>` may only be `Sync` if `T` is `Sync`.][41624]
98 - [`-Z` flags are now no longer allowed to be used on the stable
99   compiler.][41751] This has been a warning for a year previous to this.
100 - [As a result of the `-Z` flag change, the `cargo-check` plugin no
101   longer works][42844]. Users should migrate to the built-in `check`
102   command, which has been available since 1.16.
103 - [Ending a float literal with `._` is now a hard error.
104   Example: `42._` .][41946]
105 - [Any use of a private `extern crate` outside of its module is now a
106   hard error.][36886] This was previously a warning.
107 - [`use ::self::foo;` is now a hard error.][36888] `self` paths are always
108   relative while the `::` prefix makes a path absolute, but was ignored and the
109   path was relative regardless.
110 - [Floating point constants in match patterns is now a hard error][36890]
111   This was previously a warning.
112 - [Struct or enum constants that don't derive `PartialEq` & `Eq` used
113   match patterns is now a hard error][36891] This was previously a warning.
114 - [Lifetimes named `'_` are no longer allowed.][36892] This was previously
115   a warning.
116 - [From the pound escape, lines consisting of multiple `#`s are
117   now visible][41785]
118 - [It is an error to reexport private enum variants][42460]. This is
119   known to break a number of crates that depend on an older version of
120   mustache.
121 - [On Windows, if `VCINSTALLDIR` is set incorrectly, `rustc` will try
122   to use it to find the linker, and the build will fail where it did
123   not previously][42607]
124
125 [36886]: https://github.com/rust-lang/rust/issues/36886
126 [36888]: https://github.com/rust-lang/rust/issues/36888
127 [36890]: https://github.com/rust-lang/rust/issues/36890
128 [36891]: https://github.com/rust-lang/rust/issues/36891
129 [36892]: https://github.com/rust-lang/rust/issues/36892
130 [37406]: https://github.com/rust-lang/rust/issues/37406
131 [39983]: https://github.com/rust-lang/rust/pull/39983
132 [41145]: https://github.com/rust-lang/rust/pull/41145
133 [41192]: https://github.com/rust-lang/rust/pull/41192
134 [41258]: https://github.com/rust-lang/rust/pull/41258
135 [41370]: https://github.com/rust-lang/rust/pull/41370
136 [41449]: https://github.com/rust-lang/rust/pull/41449
137 [41530]: https://github.com/rust-lang/rust/pull/41530
138 [41624]: https://github.com/rust-lang/rust/pull/41624
139 [41656]: https://github.com/rust-lang/rust/pull/41656
140 [41659]: https://github.com/rust-lang/rust/pull/41659
141 [41676]: https://github.com/rust-lang/rust/pull/41676
142 [41751]: https://github.com/rust-lang/rust/pull/41751
143 [41764]: https://github.com/rust-lang/rust/pull/41764
144 [41785]: https://github.com/rust-lang/rust/pull/41785
145 [41873]: https://github.com/rust-lang/rust/pull/41873
146 [41907]: https://github.com/rust-lang/rust/pull/41907
147 [41946]: https://github.com/rust-lang/rust/pull/41946
148 [42016]: https://github.com/rust-lang/rust/pull/42016
149 [42037]: https://github.com/rust-lang/rust/pull/42037
150 [42068]: https://github.com/rust-lang/rust/pull/42068
151 [42150]: https://github.com/rust-lang/rust/pull/42150
152 [42162]: https://github.com/rust-lang/rust/pull/42162
153 [42225]: https://github.com/rust-lang/rust/pull/42225
154 [42264]: https://github.com/rust-lang/rust/pull/42264
155 [42302]: https://github.com/rust-lang/rust/pull/42302
156 [42460]: https://github.com/rust-lang/rust/issues/42460
157 [42607]: https://github.com/rust-lang/rust/issues/42607
158 [42740]: https://github.com/rust-lang/rust/pull/42740
159 [42844]: https://github.com/rust-lang/rust/issues/42844
160 [42948]: https://github.com/rust-lang/rust/pull/42948
161 [RFC 1444]: https://github.com/rust-lang/rfcs/pull/1444
162 [RFC 1506]: https://github.com/rust-lang/rfcs/pull/1506
163 [RFC 1558]: https://github.com/rust-lang/rfcs/pull/1558
164 [RFC 1624]: https://github.com/rust-lang/rfcs/pull/1624
165 [RFC 1721]: https://github.com/rust-lang/rfcs/pull/1721
166 [`Command::envs`]: https://doc.rust-lang.org/std/process/struct.Command.html#method.envs
167 [`OsString::shrink_to_fit`]: https://doc.rust-lang.org/std/ffi/struct.OsString.html#method.shrink_to_fit
168 [`cmp::Reverse`]: https://doc.rust-lang.org/std/cmp/struct.Reverse.html
169 [`thread::ThreadId`]: https://doc.rust-lang.org/std/thread/struct.ThreadId.html
170 [cargo/3929]: https://github.com/rust-lang/cargo/pull/3929
171 [cargo/3954]: https://github.com/rust-lang/cargo/pull/3954
172 [cargo/3970]: https://github.com/rust-lang/cargo/pull/3970
173 [cargo/3979]: https://github.com/rust-lang/cargo/pull/3979
174 [cargo/3988]: https://github.com/rust-lang/cargo/pull/3988
175 [cargo/4008]: https://github.com/rust-lang/cargo/pull/4008
176 [cargo/4022]: https://github.com/rust-lang/cargo/pull/4022
177 [cargo/4026]: https://github.com/rust-lang/cargo/pull/4026
178 [cargo/4031]: https://github.com/rust-lang/cargo/pull/4031
179 [cargo/4032]: https://github.com/rust-lang/cargo/pull/4032
180 [cargo/4084]: https://github.com/rust-lang/cargo/pull/4084
181 [rust-installer/57]: https://github.com/rust-lang/rust-installer/pull/57
182 [rustup/1100]: https://github.com/rust-lang-nursery/rustup.rs/pull/1100
183
184
185 Version 1.18.0 (2017-06-08)
186 ===========================
187
188 Language
189 --------
190
191 - [Stabilize pub(restricted)][40556] `pub` can now accept a module path to
192   make the item visible to just that module tree. Also accepts the keyword
193   `crate` to make something public to the whole crate but not users of the
194   library. Example: `pub(crate) mod utils;`. [RFC 1422].
195 - [Stabilize `#![windows_subsystem]` attribute][40870] conservative exposure of the
196   `/SUBSYSTEM` linker flag on Windows platforms. [RFC 1665].
197 - [Refactor of trait object type parsing][40043] Now `ty` in macros can accept
198   types like `Write + Send`, trailing `+` are now supported in trait objects,
199   and better error reporting for trait objects starting with `?Sized`.
200 - [0e+10 is now a valid floating point literal][40589]
201 - [Now warns if you bind a lifetime parameter to 'static][40734]
202 - [Tuples, Enum variant fields, and structs with no `repr` attribute or with
203   `#[repr(Rust)]` are reordered to minimize padding and produce a smaller
204   representation in some cases.][40377]
205
206 Compiler
207 --------
208
209 - [rustc can now emit mir with `--emit mir`][39891]
210 - [Improved LLVM IR for trivial functions][40367]
211 - [Added explanation for E0090(Wrong number of lifetimes are supplied)][40723]
212 - [rustc compilation is now 15%-20% faster][41469] Thanks to optimisation
213   opportunities found through profiling
214 - [Improved backtrace formatting when panicking][38165]
215
216 Libraries
217 ---------
218
219 - [Specialized `Vec::from_iter` being passed `vec::IntoIter`][40731] if the
220   iterator hasn't been advanced the original `Vec` is reassembled with no actual
221   iteration or reallocation.
222 - [Simplified HashMap Bucket interface][40561] provides performance
223   improvements for iterating and cloning.
224 - [Specialize Vec::from_elem to use calloc][40409]
225 - [Fixed Race condition in fs::create_dir_all][39799]
226 - [No longer caching stdio on Windows][40516]
227 - [Optimized insertion sort in slice][40807] insertion sort in some cases
228   2.50%~ faster and in one case now 12.50% faster.
229 - [Optimized `AtomicBool::fetch_nand`][41143]
230
231 Stabilized APIs
232 ---------------
233
234 - [`Child::try_wait`]
235 - [`HashMap::retain`]
236 - [`HashSet::retain`]
237 - [`PeekMut::pop`]
238 - [`TcpStream::peek`]
239 - [`UdpSocket::peek`]
240 - [`UdpSocket::peek_from`]
241
242 Cargo
243 -----
244
245 - [Added partial Pijul support][cargo/3842] Pijul is a version control system in Rust.
246   You can now create new cargo projects with Pijul using `cargo new --vcs pijul`
247 - [Now always emits build script warnings for crates that fail to build][cargo/3847]
248 - [Added Android build support][cargo/3885]
249 - [Added `--bins` and `--tests` flags][cargo/3901] now you can build all programs
250   of a certain type, for example `cargo build --bins` will build all
251   binaries.
252 - [Added support for haiku][cargo/3952]
253
254 Misc
255 ----
256
257 - [rustdoc can now use pulldown-cmark with the `--enable-commonmark` flag][40338]
258 - [Added rust-winbg script for better debugging on Windows][39983]
259 - [Rust now uses the official cross compiler for NetBSD][40612]
260 - [rustdoc now accepts `#` at the start of files][40828]
261 - [Fixed jemalloc support for musl][41168]
262
263 Compatibility Notes
264 -------------------
265
266 - [Changes to how the `0` flag works in format!][40241] Padding zeroes are now
267   always placed after the sign if it exists and before the digits. With the `#`
268   flag the zeroes are placed after the prefix and before the digits.
269 - [Due to the struct field optimisation][40377], using `transmute` on structs
270   that have no `repr` attribute or `#[repr(Rust)]` will no longer work. This has
271   always been undefined behavior, but is now more likely to break in practice.
272 - [The refactor of trait object type parsing][40043] fixed a bug where `+` was
273   receiving the wrong priority parsing things like `&for<'a> Tr<'a> + Send` as
274   `&(for<'a> Tr<'a> + Send)` instead of `(&for<'a> Tr<'a>) + Send`
275 - [Overlapping inherent `impl`s are now a hard error][40728]
276 - [`PartialOrd` and `Ord` must agree on the ordering.][41270]
277 - [`rustc main.rs -o out --emit=asm,llvm-ir`][41085] Now will output
278   `out.asm` and `out.ll` instead of only one of the filetypes.
279 - [ calling a function that returns `Self` will no longer work][41805] when
280   the size of `Self` cannot be statically determined.
281 - [rustc now builds with a "pthreads" flavour of MinGW for Windows GNU][40805]
282   this has caused a few regressions namely:
283
284   - Changed the link order of local static/dynamic libraries (respecting the
285     order on given rather than having the compiler reorder).
286   - Changed how MinGW is linked, native code linked to dynamic libraries
287     may require manually linking to the gcc support library (for the native
288     code itself)
289
290 [38165]: https://github.com/rust-lang/rust/pull/38165
291 [39799]: https://github.com/rust-lang/rust/pull/39799
292 [39891]: https://github.com/rust-lang/rust/pull/39891
293 [39983]: https://github.com/rust-lang/rust/pull/39983
294 [40043]: https://github.com/rust-lang/rust/pull/40043
295 [40241]: https://github.com/rust-lang/rust/pull/40241
296 [40338]: https://github.com/rust-lang/rust/pull/40338
297 [40367]: https://github.com/rust-lang/rust/pull/40367
298 [40377]: https://github.com/rust-lang/rust/pull/40377
299 [40409]: https://github.com/rust-lang/rust/pull/40409
300 [40516]: https://github.com/rust-lang/rust/pull/40516
301 [40556]: https://github.com/rust-lang/rust/pull/40556
302 [40561]: https://github.com/rust-lang/rust/pull/40561
303 [40589]: https://github.com/rust-lang/rust/pull/40589
304 [40612]: https://github.com/rust-lang/rust/pull/40612
305 [40723]: https://github.com/rust-lang/rust/pull/40723
306 [40728]: https://github.com/rust-lang/rust/pull/40728
307 [40731]: https://github.com/rust-lang/rust/pull/40731
308 [40734]: https://github.com/rust-lang/rust/pull/40734
309 [40805]: https://github.com/rust-lang/rust/pull/40805
310 [40807]: https://github.com/rust-lang/rust/pull/40807
311 [40828]: https://github.com/rust-lang/rust/pull/40828
312 [40870]: https://github.com/rust-lang/rust/pull/40870
313 [41085]: https://github.com/rust-lang/rust/pull/41085
314 [41143]: https://github.com/rust-lang/rust/pull/41143
315 [41168]: https://github.com/rust-lang/rust/pull/41168
316 [41270]: https://github.com/rust-lang/rust/issues/41270
317 [41469]: https://github.com/rust-lang/rust/pull/41469
318 [41805]: https://github.com/rust-lang/rust/issues/41805
319 [RFC 1422]: https://github.com/rust-lang/rfcs/blob/master/text/1422-pub-restricted.md
320 [RFC 1665]: https://github.com/rust-lang/rfcs/blob/master/text/1665-windows-subsystem.md
321 [`Child::try_wait`]: https://doc.rust-lang.org/std/process/struct.Child.html#method.try_wait
322 [`HashMap::retain`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.retain
323 [`HashSet::retain`]: https://doc.rust-lang.org/std/collections/struct.HashSet.html#method.retain
324 [`PeekMut::pop`]: https://doc.rust-lang.org/std/collections/binary_heap/struct.PeekMut.html#method.pop
325 [`TcpStream::peek`]: https://doc.rust-lang.org/std/net/struct.TcpStream.html#method.peek
326 [`UdpSocket::peek_from`]: https://doc.rust-lang.org/std/net/struct.UdpSocket.html#method.peek_from
327 [`UdpSocket::peek`]: https://doc.rust-lang.org/std/net/struct.UdpSocket.html#method.peek
328 [cargo/3842]: https://github.com/rust-lang/cargo/pull/3842
329 [cargo/3847]: https://github.com/rust-lang/cargo/pull/3847
330 [cargo/3885]: https://github.com/rust-lang/cargo/pull/3885
331 [cargo/3901]: https://github.com/rust-lang/cargo/pull/3901
332 [cargo/3952]: https://github.com/rust-lang/cargo/pull/3952
333
334
335 Version 1.17.0 (2017-04-27)
336 ===========================
337
338 Language
339 --------
340
341 * [The lifetime of statics and consts defaults to `'static`][39265]. [RFC 1623]
342 * [Fields of structs may be initialized without duplicating the field/variable
343   names][39761]. [RFC 1682]
344 * [`Self` may be included in the `where` clause of `impls`][38864]. [RFC 1647]
345 * [When coercing to an unsized type lifetimes must be equal][40319]. That is,
346   there is no subtyping between `T` and `U` when `T: Unsize<U>`. For example,
347   coercing `&mut [&'a X; N]` to `&mut [&'b X]` requires `'a` be equal to
348   `'b`. Soundness fix.
349 * [Values passed to the indexing operator, `[]`, automatically coerce][40166]
350 * [Static variables may contain references to other statics][40027]
351
352 Compiler
353 --------
354
355 * [Exit quickly on only `--emit dep-info`][40336]
356 * [Make `-C relocation-model` more correctly determine whether the linker
357   creates a position-independent executable][40245]
358 * [Add `-C overflow-checks` to directly control whether integer overflow
359   panics][40037]
360 * [The rustc type checker now checks items on demand instead of in a single
361   in-order pass][40008]. This is mostly an internal refactoring in support of
362   future work, including incremental type checking, but also resolves [RFC
363   1647], allowing `Self` to appear in `impl` `where` clauses.
364 * [Optimize vtable loads][39995]
365 * [Turn off vectorization for Emscripten targets][39990]
366 * [Provide suggestions for unknown macros imported with `use`][39953]
367 * [Fix ICEs in path resolution][39939]
368 * [Strip exception handling code on Emscripten when `panic=abort`][39193]
369 * [Add clearer error message using `&str + &str`][39116]
370
371 Stabilized APIs
372 ---------------
373
374 * [`Arc::into_raw`]
375 * [`Arc::from_raw`]
376 * [`Arc::ptr_eq`]
377 * [`Rc::into_raw`]
378 * [`Rc::from_raw`]
379 * [`Rc::ptr_eq`]
380 * [`Ordering::then`]
381 * [`Ordering::then_with`]
382 * [`BTreeMap::range`]
383 * [`BTreeMap::range_mut`]
384 * [`collections::Bound`]
385 * [`process::abort`]
386 * [`ptr::read_unaligned`]
387 * [`ptr::write_unaligned`]
388 * [`Result::expect_err`]
389 * [`Cell::swap`]
390 * [`Cell::replace`]
391 * [`Cell::into_inner`]
392 * [`Cell::take`]
393
394 Libraries
395 ---------
396
397 * [`BTreeMap` and `BTreeSet` can iterate over ranges][27787]
398 * [`Cell` can store non-`Copy` types][39793]. [RFC 1651]
399 * [`String` implements `FromIterator<&char>`][40028]
400 * `Box` [implements][40009] a number of new conversions:
401   `From<Box<str>> for String`,
402   `From<Box<[T]>> for Vec<T>`,
403   `From<Box<CStr>> for CString`,
404   `From<Box<OsStr>> for OsString`,
405   `From<Box<Path>> for PathBuf`,
406   `Into<Box<str>> for String`,
407   `Into<Box<[T]>> for Vec<T>`,
408   `Into<Box<CStr>> for CString`,
409   `Into<Box<OsStr>> for OsString`,
410   `Into<Box<Path>> for PathBuf`,
411   `Default for Box<str>`,
412   `Default for Box<CStr>`,
413   `Default for Box<OsStr>`,
414   `From<&CStr> for Box<CStr>`,
415   `From<&OsStr> for Box<OsStr>`,
416   `From<&Path> for Box<Path>`
417 * [`ffi::FromBytesWithNulError` implements `Error` and `Display`][39960]
418 * [Specialize `PartialOrd<A> for [A] where A: Ord`][39642]
419 * [Slightly optimize `slice::sort`][39538]
420 * [Add `ToString` trait specialization for `Cow<'a, str>` and `String`][39440]
421 * [`Box<[T]>` implements `From<&[T]> where T: Copy`,
422   `Box<str>` implements `From<&str>`][39438]
423 * [`IpAddr` implements `From` for various arrays. `SocketAddr` implements
424   `From<(I, u16)> where I: Into<IpAddr>`][39372]
425 * [`format!` estimates the needed capacity before writing a string][39356]
426 * [Support unprivileged symlink creation in Windows][38921]
427 * [`PathBuf` implements `Default`][38764]
428 * [Implement `PartialEq<[A]>` for `VecDeque<A>`][38661]
429 * [`HashMap` resizes adaptively][38368] to guard against DOS attacks
430   and poor hash functions.
431
432 Cargo
433 -----
434
435 * [Add `cargo check --all`][cargo/3731]
436 * [Add an option to ignore SSL revocation checking][cargo/3699]
437 * [Add `cargo run --package`][cargo/3691]
438 * [Add `required_features`][cargo/3667]
439 * [Assume `build.rs` is a build script][cargo/3664]
440 * [Find workspace via `workspace_root` link in containing member][cargo/3562]
441
442 Misc
443 ----
444
445 * [Documentation is rendered with mdbook instead of the obsolete, in-tree
446   `rustbook`][39633]
447 * [The "Unstable Book" documents nightly-only features][ubook]
448 * [Improve the style of the sidebar in rustdoc output][40265]
449 * [Configure build correctly on 64-bit CPU's with the armhf ABI][40261]
450 * [Fix MSP430 breakage due to `i128`][40257]
451 * [Preliminary Solaris/SPARCv9 support][39903]
452 * [`rustc` is linked statically on Windows MSVC targets][39837], allowing it to
453   run without installing the MSVC runtime.
454 * [`rustdoc --test` includes file names in test names][39788]
455 * This release includes builds of `std` for `sparc64-unknown-linux-gnu`,
456   `aarch64-unknown-linux-fuchsia`, and `x86_64-unknown-linux-fuchsia`.
457 * [Initial support for `aarch64-unknown-freebsd`][39491]
458 * [Initial support for `i686-unknown-netbsd`][39426]
459 * [This release no longer includes the old makefile build system][39431]. Rust
460   is built with a custom build system, written in Rust, and with Cargo.
461 * [Add Debug implementations for libcollection structs][39002]
462 * [`TypeId` implements `PartialOrd` and `Ord`][38981]
463 * [`--test-threads=0` produces an error][38945]
464 * [`rustup` installs documentation by default][40526]
465 * [The Rust source includes NatVis visualizations][39843]. These can be used by
466   WinDbg and Visual Studio to improve the debugging experience.
467
468 Compatibility Notes
469 -------------------
470
471 * [Rust 1.17 does not correctly detect the MSVC 2017 linker][38584]. As a
472   workaround, either use MSVC 2015 or run vcvars.bat.
473 * [When coercing to an unsized type lifetimes must be equal][40319]. That is,
474   disallow subtyping between `T` and `U` when `T: Unsize<U>`, e.g. coercing
475   `&mut [&'a X; N]` to `&mut [&'b X]` requires `'a` be equal to `'b`. Soundness
476   fix.
477 * [`format!` and `Display::to_string` panic if an underlying formatting
478   implementation returns an error][40117]. Previously the error was silently
479   ignored. It is incorrect for `write_fmt` to return an error when writing
480   to a string.
481 * [In-tree crates are verified to be unstable][39851]. Previously, some minor
482   crates were marked stable and could be accessed from the stable toolchain.
483 * [Rust git source no longer includes vendored crates][39728]. Those that need
484   to build with vendored crates should build from release tarballs.
485 * [Fix inert attributes from `proc_macro_derives`][39572]
486 * [During crate resolution, rustc prefers a crate in the sysroot if two crates
487   are otherwise identical][39518]. Unlikely to be encountered outside the Rust
488   build system.
489 * [Fixed bugs around how type inference interacts with dead-code][39485]. The
490   existing code generally ignores the type of dead-code unless a type-hint is
491   provided; this can cause surprising inference interactions particularly around
492   defaulting. The new code uniformly ignores the result type of dead-code.
493 * [Tuple-struct constructors with private fields are no longer visible][38932]
494 * [Lifetime parameters that do not appear in the arguments are now considered
495   early-bound][38897], resolving a soundness bug (#[32330]). The
496   `hr_lifetime_in_assoc_type` future-compatibility lint has been in effect since
497   April of 2016.
498 * [rustdoc: fix doctests with non-feature crate attributes][38161]
499 * [Make transmuting from fn item types to pointer-sized types a hard
500   error][34198]
501
502 [27787]: https://github.com/rust-lang/rust/issues/27787
503 [32330]: https://github.com/rust-lang/rust/issues/32330
504 [34198]: https://github.com/rust-lang/rust/pull/34198
505 [38161]: https://github.com/rust-lang/rust/pull/38161
506 [38368]: https://github.com/rust-lang/rust/pull/38368
507 [38584]: https://github.com/rust-lang/rust/issues/38584
508 [38661]: https://github.com/rust-lang/rust/pull/38661
509 [38764]: https://github.com/rust-lang/rust/pull/38764
510 [38864]: https://github.com/rust-lang/rust/issues/38864
511 [38897]: https://github.com/rust-lang/rust/pull/38897
512 [38921]: https://github.com/rust-lang/rust/pull/38921
513 [38932]: https://github.com/rust-lang/rust/pull/38932
514 [38945]: https://github.com/rust-lang/rust/pull/38945
515 [38981]: https://github.com/rust-lang/rust/pull/38981
516 [39002]: https://github.com/rust-lang/rust/pull/39002
517 [39116]: https://github.com/rust-lang/rust/pull/39116
518 [39193]: https://github.com/rust-lang/rust/pull/39193
519 [39265]: https://github.com/rust-lang/rust/pull/39265
520 [39356]: https://github.com/rust-lang/rust/pull/39356
521 [39372]: https://github.com/rust-lang/rust/pull/39372
522 [39426]: https://github.com/rust-lang/rust/pull/39426
523 [39431]: https://github.com/rust-lang/rust/pull/39431
524 [39438]: https://github.com/rust-lang/rust/pull/39438
525 [39440]: https://github.com/rust-lang/rust/pull/39440
526 [39485]: https://github.com/rust-lang/rust/pull/39485
527 [39491]: https://github.com/rust-lang/rust/pull/39491
528 [39518]: https://github.com/rust-lang/rust/pull/39518
529 [39538]: https://github.com/rust-lang/rust/pull/39538
530 [39572]: https://github.com/rust-lang/rust/pull/39572
531 [39633]: https://github.com/rust-lang/rust/pull/39633
532 [39642]: https://github.com/rust-lang/rust/pull/39642
533 [39728]: https://github.com/rust-lang/rust/pull/39728
534 [39761]: https://github.com/rust-lang/rust/pull/39761
535 [39788]: https://github.com/rust-lang/rust/pull/39788
536 [39793]: https://github.com/rust-lang/rust/pull/39793
537 [39837]: https://github.com/rust-lang/rust/pull/39837
538 [39843]: https://github.com/rust-lang/rust/pull/39843
539 [39851]: https://github.com/rust-lang/rust/pull/39851
540 [39903]: https://github.com/rust-lang/rust/pull/39903
541 [39939]: https://github.com/rust-lang/rust/pull/39939
542 [39953]: https://github.com/rust-lang/rust/pull/39953
543 [39960]: https://github.com/rust-lang/rust/pull/39960
544 [39990]: https://github.com/rust-lang/rust/pull/39990
545 [39995]: https://github.com/rust-lang/rust/pull/39995
546 [40008]: https://github.com/rust-lang/rust/pull/40008
547 [40009]: https://github.com/rust-lang/rust/pull/40009
548 [40027]: https://github.com/rust-lang/rust/pull/40027
549 [40028]: https://github.com/rust-lang/rust/pull/40028
550 [40037]: https://github.com/rust-lang/rust/pull/40037
551 [40117]: https://github.com/rust-lang/rust/pull/40117
552 [40166]: https://github.com/rust-lang/rust/pull/40166
553 [40245]: https://github.com/rust-lang/rust/pull/40245
554 [40257]: https://github.com/rust-lang/rust/pull/40257
555 [40261]: https://github.com/rust-lang/rust/pull/40261
556 [40265]: https://github.com/rust-lang/rust/pull/40265
557 [40319]: https://github.com/rust-lang/rust/pull/40319
558 [40336]: https://github.com/rust-lang/rust/pull/40336
559 [40526]: https://github.com/rust-lang/rust/pull/40526
560 [RFC 1623]: https://github.com/rust-lang/rfcs/blob/master/text/1623-static.md
561 [RFC 1647]: https://github.com/rust-lang/rfcs/blob/master/text/1647-allow-self-in-where-clauses.md
562 [RFC 1651]: https://github.com/rust-lang/rfcs/blob/master/text/1651-movecell.md
563 [RFC 1682]: https://github.com/rust-lang/rfcs/blob/master/text/1682-field-init-shorthand.md
564 [`Arc::from_raw`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.from_raw
565 [`Arc::into_raw`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.into_raw
566 [`Arc::ptr_eq`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.ptr_eq
567 [`BTreeMap::range_mut`]: https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.range_mut
568 [`BTreeMap::range`]: https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.range
569 [`Cell::into_inner`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.into_inner
570 [`Cell::replace`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.replace
571 [`Cell::swap`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.swap
572 [`Cell::take`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.take
573 [`Ordering::then_with`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.then_with
574 [`Ordering::then`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.then
575 [`Rc::from_raw`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.from_raw
576 [`Rc::into_raw`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.into_raw
577 [`Rc::ptr_eq`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.ptr_eq
578 [`Result::expect_err`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.expect_err
579 [`collections::Bound`]: https://doc.rust-lang.org/std/collections/enum.Bound.html
580 [`process::abort`]: https://doc.rust-lang.org/std/process/fn.abort.html
581 [`ptr::read_unaligned`]: https://doc.rust-lang.org/std/ptr/fn.read_unaligned.html
582 [`ptr::write_unaligned`]: https://doc.rust-lang.org/std/ptr/fn.write_unaligned.html
583 [cargo/3562]: https://github.com/rust-lang/cargo/pull/3562
584 [cargo/3664]: https://github.com/rust-lang/cargo/pull/3664
585 [cargo/3667]: https://github.com/rust-lang/cargo/pull/3667
586 [cargo/3691]: https://github.com/rust-lang/cargo/pull/3691
587 [cargo/3699]: https://github.com/rust-lang/cargo/pull/3699
588 [cargo/3731]: https://github.com/rust-lang/cargo/pull/3731
589 [mdbook]: https://crates.io/crates/mdbook
590 [ubook]: https://doc.rust-lang.org/unstable-book/
591
592
593 Version 1.16.0 (2017-03-16)
594 ===========================
595
596 Language
597 --------
598
599 * [The compiler's `dead_code` lint now accounts for type aliases][38051].
600 * [Uninhabitable enums (those without any variants) no longer permit wildcard
601   match patterns][38069]
602 * [Clean up semantics of `self` in an import list][38313]
603 * [`Self` may appear in `impl` headers][38920]
604 * [`Self` may appear in struct expressions][39282]
605
606 Compiler
607 --------
608
609 * [`rustc` now supports `--emit=metadata`, which causes rustc to emit
610   a `.rmeta` file containing only crate metadata][38571]. This can be
611   used by tools like the Rust Language Service to perform
612   metadata-only builds.
613 * [Levenshtein based typo suggestions now work in most places, while
614   previously they worked only for fields and sometimes for local
615   variables][38927]. Together with the overhaul of "no
616   resolution"/"unexpected resolution" errors (#[38154]) they result in
617   large and systematic improvement in resolution diagnostics.
618 * [Fix `transmute::<T, U>` where `T` requires a bigger alignment than
619   `U`][38670]
620 * [rustc: use -Xlinker when specifying an rpath with ',' in it][38798]
621 * [`rustc` no longer attempts to provide "consider using an explicit
622   lifetime" suggestions][37057]. They were inaccurate.
623
624 Stabilized APIs
625 ---------------
626
627 * [`VecDeque::truncate`]
628 * [`VecDeque::resize`]
629 * [`String::insert_str`]
630 * [`Duration::checked_add`]
631 * [`Duration::checked_sub`]
632 * [`Duration::checked_div`]
633 * [`Duration::checked_mul`]
634 * [`str::replacen`]
635 * [`str::repeat`]
636 * [`SocketAddr::is_ipv4`]
637 * [`SocketAddr::is_ipv6`]
638 * [`IpAddr::is_ipv4`]
639 * [`IpAddr::is_ipv6`]
640 * [`Vec::dedup_by`]
641 * [`Vec::dedup_by_key`]
642 * [`Result::unwrap_or_default`]
643 * [`<*const T>::wrapping_offset`]
644 * [`<*mut T>::wrapping_offset`]
645 * `CommandExt::creation_flags`
646 * [`File::set_permissions`]
647 * [`String::split_off`]
648
649 Libraries
650 ---------
651
652 * [`[T]::binary_search` and `[T]::binary_search_by_key` now take
653   their argument by `Borrow` parameter][37761]
654 * [All public types in std implement `Debug`][38006]
655 * [`IpAddr` implements `From<Ipv4Addr>` and `From<Ipv6Addr>`][38327]
656 * [`Ipv6Addr` implements `From<[u16; 8]>`][38131]
657 * [Ctrl-Z returns from `Stdin.read()` when reading from the console on
658   Windows][38274]
659 * [std: Fix partial writes in `LineWriter`][38062]
660 * [std: Clamp max read/write sizes on Unix][38062]
661 * [Use more specific panic message for `&str` slicing errors][38066]
662 * [`TcpListener::set_only_v6` is deprecated][38304]. This
663   functionality cannot be achieved in std currently.
664 * [`writeln!`, like `println!`, now accepts a form with no string
665   or formatting arguments, to just print a newline][38469]
666 * [Implement `iter::Sum` and `iter::Product` for `Result`][38580]
667 * [Reduce the size of static data in `std_unicode::tables`][38781]
668 * [`char::EscapeDebug`, `EscapeDefault`, `EscapeUnicode`,
669   `CaseMappingIter`, `ToLowercase`, `ToUppercase`, implement
670   `Display`][38909]
671 * [`Duration` implements `Sum`][38712]
672 * [`String` implements `ToSocketAddrs`][39048]
673
674 Cargo
675 -----
676
677 * [The `cargo check` command does a type check of a project without
678   building it][cargo/3296]
679 * [crates.io will display CI badges from Travis and AppVeyor, if
680   specified in Cargo.toml][cargo/3546]
681 * [crates.io will display categories listed in Cargo.toml][cargo/3301]
682 * [Compilation profiles accept integer values for `debug`, in addition
683   to `true` and `false`. These are passed to `rustc` as the value to
684   `-C debuginfo`][cargo/3534]
685 * [Implement `cargo --version --verbose`][cargo/3604]
686 * [All builds now output 'dep-info' build dependencies compatible with
687   make and ninja][cargo/3557]
688 * [Build all workspace members with `build --all`][cargo/3511]
689 * [Document all workspace members with `doc --all`][cargo/3515]
690 * [Path deps outside workspace are not members][cargo/3443]
691
692 Misc
693 ----
694
695 * [`rustdoc` has a `--sysroot` argument that, like `rustc`, specifies
696   the path to the Rust implementation][38589]
697 * [The `armv7-linux-androideabi` target no longer enables NEON
698   extensions, per Google's ABI guide][38413]
699 * [The stock standard library can be compiled for Redox OS][38401]
700 * [Rust has initial SPARC support][38726]. Tier 3. No builds
701   available.
702 * [Rust has experimental support for Nvidia PTX][38559]. Tier 3. No
703   builds available.
704 * [Fix backtraces on i686-pc-windows-gnu by disabling FPO][39379]
705
706 Compatibility Notes
707 -------------------
708
709 * [Uninhabitable enums (those without any variants) no longer permit wildcard
710   match patterns][38069]
711 * In this release, references to uninhabited types can not be
712   pattern-matched. This was accidentally allowed in 1.15.
713 * [The compiler's `dead_code` lint now accounts for type aliases][38051].
714 * [Ctrl-Z returns from `Stdin.read()` when reading from the console on
715   Windows][38274]
716 * [Clean up semantics of `self` in an import list][38313]
717
718 [37057]: https://github.com/rust-lang/rust/pull/37057
719 [37761]: https://github.com/rust-lang/rust/pull/37761
720 [38006]: https://github.com/rust-lang/rust/pull/38006
721 [38051]: https://github.com/rust-lang/rust/pull/38051
722 [38062]: https://github.com/rust-lang/rust/pull/38062
723 [38062]: https://github.com/rust-lang/rust/pull/38622
724 [38066]: https://github.com/rust-lang/rust/pull/38066
725 [38069]: https://github.com/rust-lang/rust/pull/38069
726 [38131]: https://github.com/rust-lang/rust/pull/38131
727 [38154]: https://github.com/rust-lang/rust/pull/38154
728 [38274]: https://github.com/rust-lang/rust/pull/38274
729 [38304]: https://github.com/rust-lang/rust/pull/38304
730 [38313]: https://github.com/rust-lang/rust/pull/38313
731 [38314]: https://github.com/rust-lang/rust/pull/38314
732 [38327]: https://github.com/rust-lang/rust/pull/38327
733 [38401]: https://github.com/rust-lang/rust/pull/38401
734 [38413]: https://github.com/rust-lang/rust/pull/38413
735 [38469]: https://github.com/rust-lang/rust/pull/38469
736 [38559]: https://github.com/rust-lang/rust/pull/38559
737 [38571]: https://github.com/rust-lang/rust/pull/38571
738 [38580]: https://github.com/rust-lang/rust/pull/38580
739 [38589]: https://github.com/rust-lang/rust/pull/38589
740 [38670]: https://github.com/rust-lang/rust/pull/38670
741 [38712]: https://github.com/rust-lang/rust/pull/38712
742 [38726]: https://github.com/rust-lang/rust/pull/38726
743 [38781]: https://github.com/rust-lang/rust/pull/38781
744 [38798]: https://github.com/rust-lang/rust/pull/38798
745 [38909]: https://github.com/rust-lang/rust/pull/38909
746 [38920]: https://github.com/rust-lang/rust/pull/38920
747 [38927]: https://github.com/rust-lang/rust/pull/38927
748 [39048]: https://github.com/rust-lang/rust/pull/39048
749 [39282]: https://github.com/rust-lang/rust/pull/39282
750 [39379]: https://github.com/rust-lang/rust/pull/39379
751 [`<*const T>::wrapping_offset`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_offset
752 [`<*mut T>::wrapping_offset`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_offset
753 [`Duration::checked_add`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_add
754 [`Duration::checked_div`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_div
755 [`Duration::checked_mul`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_mul
756 [`Duration::checked_sub`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_sub
757 [`File::set_permissions`]: https://doc.rust-lang.org/std/fs/struct.File.html#method.set_permissions
758 [`IpAddr::is_ipv4`]: https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_ipv4
759 [`IpAddr::is_ipv6`]: https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_ipv6
760 [`Result::unwrap_or_default`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.unwrap_or_default
761 [`SocketAddr::is_ipv4`]: https://doc.rust-lang.org/std/net/enum.SocketAddr.html#method.is_ipv4
762 [`SocketAddr::is_ipv6`]: https://doc.rust-lang.org/std/net/enum.SocketAddr.html#method.is_ipv6
763 [`String::insert_str`]: https://doc.rust-lang.org/std/string/struct.String.html#method.insert_str
764 [`String::split_off`]: https://doc.rust-lang.org/std/string/struct.String.html#method.split_off
765 [`Vec::dedup_by_key`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.dedup_by_key
766 [`Vec::dedup_by`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.dedup_by
767 [`VecDeque::resize`]:  https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.resize
768 [`VecDeque::truncate`]: https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.truncate
769 [`str::repeat`]: https://doc.rust-lang.org/std/primitive.str.html#method.repeat
770 [`str::replacen`]: https://doc.rust-lang.org/std/primitive.str.html#method.replacen
771 [cargo/3296]: https://github.com/rust-lang/cargo/pull/3296
772 [cargo/3301]: https://github.com/rust-lang/cargo/pull/3301
773 [cargo/3443]: https://github.com/rust-lang/cargo/pull/3443
774 [cargo/3511]: https://github.com/rust-lang/cargo/pull/3511
775 [cargo/3515]: https://github.com/rust-lang/cargo/pull/3515
776 [cargo/3534]: https://github.com/rust-lang/cargo/pull/3534
777 [cargo/3546]: https://github.com/rust-lang/cargo/pull/3546
778 [cargo/3557]: https://github.com/rust-lang/cargo/pull/3557
779 [cargo/3604]: https://github.com/rust-lang/cargo/pull/3604
780 [RFC 1623]: https://github.com/rust-lang/rfcs/blob/master/text/1623-static.md
781
782
783 Version 1.15.1 (2017-02-09)
784 ===========================
785
786 * [Fix IntoIter::as_mut_slice's signature][39466]
787 * [Compile compiler builtins with `-fPIC` on 32-bit platforms][39523]
788
789 [39466]: https://github.com/rust-lang/rust/pull/39466
790 [39523]: https://github.com/rust-lang/rust/pull/39523
791
792
793 Version 1.15.0 (2017-02-02)
794 ===========================
795
796 Language
797 --------
798
799 * Basic procedural macros allowing custom `#[derive]`, aka "macros 1.1", are
800   stable. This allows popular code-generating crates like Serde and Diesel to
801   work ergonomically. [RFC 1681].
802 * [Tuple structs may be empty. Unary and empty tuple structs may be instantiated
803   with curly braces][36868]. Part of [RFC 1506].
804 * [A number of minor changes to name resolution have been activated][37127].
805   They add up to more consistent semantics, allowing for future evolution of
806   Rust macros. Specified in [RFC 1560], see its section on ["changes"] for
807   details of what is different. The breaking changes here have been transitioned
808   through the [`legacy_imports`] lint since 1.14, with no known regressions.
809 * [In `macro_rules`, `path` fragments can now be parsed as type parameter
810   bounds][38279]
811 * [`?Sized` can be used in `where` clauses][37791]
812 * [There is now a limit on the size of monomorphized types and it can be
813   modified with the `#![type_size_limit]` crate attribute, similarly to
814   the `#![recursion_limit]` attribute][37789]
815
816 Compiler
817 --------
818
819 * [On Windows, the compiler will apply dllimport attributes when linking to
820   extern functions][37973]. Additional attributes and flags can control which
821   library kind is linked and its name. [RFC 1717].
822 * [Rust-ABI symbols are no longer exported from cdylibs][38117]
823 * [The `--test` flag works with procedural macro crates][38107]
824 * [Fix `extern "aapcs" fn` ABI][37814]
825 * [The `-C no-stack-check` flag is deprecated][37636]. It does nothing.
826 * [The `format!` expander recognizes incorrect `printf` and shell-style
827   formatting directives and suggests the correct format][37613].
828 * [Only report one error for all unused imports in an import list][37456]
829
830 Compiler Performance
831 --------------------
832
833 * [Avoid unnecessary `mk_ty` calls in `Ty::super_fold_with`][37705]
834 * [Avoid more unnecessary `mk_ty` calls in `Ty::super_fold_with`][37979]
835 * [Don't clone in `UnificationTable::probe`][37848]
836 * [Remove `scope_auxiliary` to cut RSS by 10%][37764]
837 * [Use small vectors in type walker][37760]
838 * [Macro expansion performance was improved][37701]
839 * [Change `HirVec<P<T>>` to `HirVec<T>` in `hir::Expr`][37642]
840 * [Replace FNV with a faster hash function][37229]
841
842 Stabilized APIs
843 ---------------
844
845 * [`std::iter::Iterator::min_by`]
846 * [`std::iter::Iterator::max_by`]
847 * [`std::os::*::fs::FileExt`]
848 * [`std::sync::atomic::Atomic*::get_mut`]
849 * [`std::sync::atomic::Atomic*::into_inner`]
850 * [`std::vec::IntoIter::as_slice`]
851 * [`std::vec::IntoIter::as_mut_slice`]
852 * [`std::sync::mpsc::Receiver::try_iter`]
853 * [`std::os::unix::process::CommandExt::before_exec`]
854 * [`std::rc::Rc::strong_count`]
855 * [`std::rc::Rc::weak_count`]
856 * [`std::sync::Arc::strong_count`]
857 * [`std::sync::Arc::weak_count`]
858 * [`std::char::encode_utf8`]
859 * [`std::char::encode_utf16`]
860 * [`std::cell::Ref::clone`]
861 * [`std::io::Take::into_inner`]
862
863 Libraries
864 ---------
865
866 * [The standard sorting algorithm has been rewritten for dramatic performance
867   improvements][38192]. It is a hybrid merge sort, drawing influences from
868   Timsort. Previously it was a naive merge sort.
869 * [`Iterator::nth` no longer has a `Sized` bound][38134]
870 * [`Extend<&T>` is specialized for `Vec` where `T: Copy`][38182] to improve
871   performance.
872 * [`chars().count()` is much faster][37888] and so are [`chars().last()`
873   and `char_indices().last()`][37882]
874 * [Fix ARM Objective-C ABI in `std::env::args`][38146]
875 * [Chinese characters display correctly in `fmt::Debug`][37855]
876 * [Derive `Default` for `Duration`][37699]
877 * [Support creation of anonymous pipes on WinXP/2k][37677]
878 * [`mpsc::RecvTimeoutError` implements `Error`][37527]
879 * [Don't pass overlapped handles to processes][38835]
880
881 Cargo
882 -----
883
884 * [In this release, Cargo build scripts no longer have access to the `OUT_DIR`
885   environment variable at build time via `env!("OUT_DIR")`][cargo/3368]. They
886   should instead check the variable at runtime with `std::env`. That the value
887   was set at build time was a bug, and incorrect when cross-compiling. This
888   change is known to cause breakage.
889 * [Add `--all` flag to `cargo test`][cargo/3221]
890 * [Compile statically against the MSVC CRT][cargo/3363]
891 * [Mix feature flags into fingerprint/metadata shorthash][cargo/3102]
892 * [Link OpenSSL statically on OSX][cargo/3311]
893 * [Apply new fingerprinting to build dir outputs][cargo/3310]
894 * [Test for bad path overrides with summaries][cargo/3336]
895 * [Require `cargo install --vers` to take a semver version][cargo/3338]
896 * [Fix retrying crate downloads for network errors][cargo/3348]
897 * [Implement string lookup for `build.rustflags` config key][cargo/3356]
898 * [Emit more info on --message-format=json][cargo/3319]
899 * [Assume `build.rs` in the same directory as `Cargo.toml` is a build script][cargo/3361]
900 * [Don't ignore errors in workspace manifest][cargo/3409]
901 * [Fix `--message-format JSON` when rustc emits non-JSON warnings][cargo/3410]
902
903 Tooling
904 -------
905
906 * [Test runners (binaries built with `--test`) now support a `--list` argument
907   that lists the tests it contains][38185]
908 * [Test runners now support a `--exact` argument that makes the test filter
909   match exactly, instead of matching only a substring of the test name][38181]
910 * [rustdoc supports a `--playground-url` flag][37763]
911 * [rustdoc provides more details about `#[should_panic]` errors][37749]
912
913 Misc
914 ----
915
916 * [The Rust build system is now written in Rust][37817]. The Makefiles may
917   continue to be used in this release by passing `--disable-rustbuild` to the
918   configure script, but they will be deleted soon. Note that the new build
919   system uses a different on-disk layout that will likely affect any scripts
920   building Rust.
921 * [Rust supports i686-unknown-openbsd][38086]. Tier 3 support. No testing or
922   releases.
923 * [Rust supports the MSP430][37627]. Tier 3 support. No testing or releases.
924 * [Rust supports the ARMv5TE architecture][37615]. Tier 3 support. No testing or
925   releases.
926
927 Compatibility Notes
928 -------------------
929
930 * [A number of minor changes to name resolution have been activated][37127].
931   They add up to more consistent semantics, allowing for future evolution of
932   Rust macros. Specified in [RFC 1560], see its section on ["changes"] for
933   details of what is different. The breaking changes here have been transitioned
934   through the [`legacy_imports`] lint since 1.14, with no known regressions.
935 * [In this release, Cargo build scripts no longer have access to the `OUT_DIR`
936   environment variable at build time via `env!("OUT_DIR")`][cargo/3368]. They
937   should instead check the variable at runtime with `std::env`. That the value
938   was set at build time was a bug, and incorrect when cross-compiling. This
939   change is known to cause breakage.
940 * [Higher-ranked lifetimes are no longer allowed to appear _only_ in associated
941   types][33685]. The [`hr_lifetime_in_assoc_type` lint] has been a warning since
942   1.10 and is now an error by default. It will become a hard error in the near
943   future.
944 * [The semantics relating modules to file system directories are changing in
945   minor ways][37602]. This is captured in the new `legacy_directory_ownership`
946   lint, which is a warning in this release, and will become a hard error in the
947   future.
948 * [Rust-ABI symbols are no longer exported from cdylibs][38117]
949 * [Once `Peekable` peeks a `None` it will return that `None` without re-querying
950   the underlying iterator][37834]
951
952 ["changes"]: https://github.com/rust-lang/rfcs/blob/master/text/1560-name-resolution.md#changes-to-name-resolution-rules
953 [33685]: https://github.com/rust-lang/rust/issues/33685
954 [36868]: https://github.com/rust-lang/rust/pull/36868
955 [37127]: https://github.com/rust-lang/rust/pull/37127
956 [37229]: https://github.com/rust-lang/rust/pull/37229
957 [37456]: https://github.com/rust-lang/rust/pull/37456
958 [37527]: https://github.com/rust-lang/rust/pull/37527
959 [37602]: https://github.com/rust-lang/rust/pull/37602
960 [37613]: https://github.com/rust-lang/rust/pull/37613
961 [37615]: https://github.com/rust-lang/rust/pull/37615
962 [37636]: https://github.com/rust-lang/rust/pull/37636
963 [37627]: https://github.com/rust-lang/rust/pull/37627
964 [37642]: https://github.com/rust-lang/rust/pull/37642
965 [37677]: https://github.com/rust-lang/rust/pull/37677
966 [37699]: https://github.com/rust-lang/rust/pull/37699
967 [37701]: https://github.com/rust-lang/rust/pull/37701
968 [37705]: https://github.com/rust-lang/rust/pull/37705
969 [37749]: https://github.com/rust-lang/rust/pull/37749
970 [37760]: https://github.com/rust-lang/rust/pull/37760
971 [37763]: https://github.com/rust-lang/rust/pull/37763
972 [37764]: https://github.com/rust-lang/rust/pull/37764
973 [37789]: https://github.com/rust-lang/rust/pull/37789
974 [37791]: https://github.com/rust-lang/rust/pull/37791
975 [37814]: https://github.com/rust-lang/rust/pull/37814
976 [37817]: https://github.com/rust-lang/rust/pull/37817
977 [37834]: https://github.com/rust-lang/rust/pull/37834
978 [37848]: https://github.com/rust-lang/rust/pull/37848
979 [37855]: https://github.com/rust-lang/rust/pull/37855
980 [37882]: https://github.com/rust-lang/rust/pull/37882
981 [37888]: https://github.com/rust-lang/rust/pull/37888
982 [37973]: https://github.com/rust-lang/rust/pull/37973
983 [37979]: https://github.com/rust-lang/rust/pull/37979
984 [38086]: https://github.com/rust-lang/rust/pull/38086
985 [38107]: https://github.com/rust-lang/rust/pull/38107
986 [38117]: https://github.com/rust-lang/rust/pull/38117
987 [38134]: https://github.com/rust-lang/rust/pull/38134
988 [38146]: https://github.com/rust-lang/rust/pull/38146
989 [38181]: https://github.com/rust-lang/rust/pull/38181
990 [38182]: https://github.com/rust-lang/rust/pull/38182
991 [38185]: https://github.com/rust-lang/rust/pull/38185
992 [38192]: https://github.com/rust-lang/rust/pull/38192
993 [38279]: https://github.com/rust-lang/rust/pull/38279
994 [38835]: https://github.com/rust-lang/rust/pull/38835
995 [RFC 1492]: https://github.com/rust-lang/rfcs/blob/master/text/1492-dotdot-in-patterns.md
996 [RFC 1506]: https://github.com/rust-lang/rfcs/blob/master/text/1506-adt-kinds.md
997 [RFC 1560]: https://github.com/rust-lang/rfcs/blob/master/text/1560-name-resolution.md
998 [RFC 1681]: https://github.com/rust-lang/rfcs/blob/master/text/1681-macros-1.1.md
999 [RFC 1717]: https://github.com/rust-lang/rfcs/blob/master/text/1717-dllimport.md
1000 [`hr_lifetime_in_assoc_type` lint]: https://github.com/rust-lang/rust/issues/33685
1001 [`legacy_imports`]: https://github.com/rust-lang/rust/pull/38271
1002 [cargo/3102]: https://github.com/rust-lang/cargo/pull/3102
1003 [cargo/3221]: https://github.com/rust-lang/cargo/pull/3221
1004 [cargo/3310]: https://github.com/rust-lang/cargo/pull/3310
1005 [cargo/3311]: https://github.com/rust-lang/cargo/pull/3311
1006 [cargo/3319]: https://github.com/rust-lang/cargo/pull/3319
1007 [cargo/3336]: https://github.com/rust-lang/cargo/pull/3336
1008 [cargo/3338]: https://github.com/rust-lang/cargo/pull/3338
1009 [cargo/3348]: https://github.com/rust-lang/cargo/pull/3348
1010 [cargo/3356]: https://github.com/rust-lang/cargo/pull/3356
1011 [cargo/3361]: https://github.com/rust-lang/cargo/pull/3361
1012 [cargo/3363]: https://github.com/rust-lang/cargo/pull/3363
1013 [cargo/3368]: https://github.com/rust-lang/cargo/issues/3368
1014 [cargo/3409]: https://github.com/rust-lang/cargo/pull/3409
1015 [cargo/3410]: https://github.com/rust-lang/cargo/pull/3410
1016 [`std::iter::Iterator::min_by`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.min_by
1017 [`std::iter::Iterator::max_by`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.max_by
1018 [`std::os::*::fs::FileExt`]: https://doc.rust-lang.org/std/os/unix/fs/trait.FileExt.html
1019 [`std::sync::atomic::Atomic*::get_mut`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU8.html#method.get_mut
1020 [`std::sync::atomic::Atomic*::into_inner`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU8.html#method.into_inner
1021 [`std::vec::IntoIter::as_slice`]: https://doc.rust-lang.org/std/vec/struct.IntoIter.html#method.as_slice
1022 [`std::vec::IntoIter::as_mut_slice`]: https://doc.rust-lang.org/std/vec/struct.IntoIter.html#method.as_mut_slice
1023 [`std::sync::mpsc::Receiver::try_iter`]: https://doc.rust-lang.org/std/sync/mpsc/struct.Receiver.html#method.try_iter
1024 [`std::os::unix::process::CommandExt::before_exec`]: https://doc.rust-lang.org/std/os/unix/process/trait.CommandExt.html#tymethod.before_exec
1025 [`std::rc::Rc::strong_count`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.strong_count
1026 [`std::rc::Rc::weak_count`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.weak_count
1027 [`std::sync::Arc::strong_count`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.strong_count
1028 [`std::sync::Arc::weak_count`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.weak_count
1029 [`std::char::encode_utf8`]: https://doc.rust-lang.org/std/primitive.char.html#method.encode_utf8
1030 [`std::char::encode_utf16`]: https://doc.rust-lang.org/std/primitive.char.html#method.encode_utf16
1031 [`std::cell::Ref::clone`]: https://doc.rust-lang.org/std/cell/struct.Ref.html#method.clone
1032 [`std::io::Take::into_inner`]: https://doc.rust-lang.org/std/io/struct.Take.html#method.into_inner
1033
1034
1035 Version 1.14.0 (2016-12-22)
1036 ===========================
1037
1038 Language
1039 --------
1040
1041 * [`..` matches multiple tuple fields in enum variants, structs
1042   and tuples][36843]. [RFC 1492].
1043 * [Safe `fn` items can be coerced to `unsafe fn` pointers][37389]
1044 * [`use *` and `use ::*` both glob-import from the crate root][37367]
1045 * [It's now possible to call a `Vec<Box<Fn()>>` without explicit
1046   dereferencing][36822]
1047
1048 Compiler
1049 --------
1050
1051 * [Mark enums with non-zero discriminant as non-zero][37224]
1052 * [Lower-case `static mut` names are linted like other
1053   statics and consts][37162]
1054 * [Fix ICE on some macros in const integer positions
1055    (e.g. `[u8; m!()]`)][36819]
1056 * [Improve error message and snippet for "did you mean `x`"][36798]
1057 * [Add a panic-strategy field to the target specification][36794]
1058 * [Include LLVM version in `--version --verbose`][37200]
1059
1060 Compile-time Optimizations
1061 --------------------------
1062
1063 * [Improve macro expansion performance][37569]
1064 * [Shrink `Expr_::ExprInlineAsm`][37445]
1065 * [Replace all uses of SHA-256 with BLAKE2b][37439]
1066 * [Reduce the number of bytes hashed by `IchHasher`][37427]
1067 * [Avoid more allocations when compiling html5ever][37373]
1068 * [Use `SmallVector` in `CombineFields::instantiate`][37322]
1069 * [Avoid some allocations in the macro parser][37318]
1070 * [Use a faster deflate setting][37298]
1071 * [Add `ArrayVec` and `AccumulateVec` to reduce heap allocations
1072   during interning of slices][37270]
1073 * [Optimize `write_metadata`][37267]
1074 * [Don't process obligation forest cycles when stalled][37231]
1075 * [Avoid many `CrateConfig` clones][37161]
1076 * [Optimize `Substs::super_fold_with`][37108]
1077 * [Optimize `ObligationForest`'s `NodeState` handling][36993]
1078 * [Speed up `plug_leaks`][36917]
1079
1080 Libraries
1081 ---------
1082
1083 * [`println!()`, with no arguments, prints newline][36825].
1084   Previously, an empty string was required to achieve the same.
1085 * [`Wrapping` impls standard binary and unary operators, as well as
1086    the `Sum` and `Product` iterators][37356]
1087 * [Implement `From<Cow<str>> for String` and `From<Cow<[T]>> for
1088   Vec<T>`][37326]
1089 * [Improve `fold` performance for `chain`, `cloned`, `map`, and
1090   `VecDeque` iterators][37315]
1091 * [Improve `SipHasher` performance on small values][37312]
1092 * [Add Iterator trait TrustedLen to enable better FromIterator /
1093   Extend][37306]
1094 * [Expand `.zip()` specialization to `.map()` and `.cloned()`][37230]
1095 * [`ReadDir` implements `Debug`][37221]
1096 * [Implement `RefUnwindSafe` for atomic types][37178]
1097 * [Specialize `Vec::extend` to `Vec::extend_from_slice`][37094]
1098 * [Avoid allocations in `Decoder::read_str`][37064]
1099 * [`io::Error` implements `From<io::ErrorKind>`][37037]
1100 * [Impl `Debug` for raw pointers to unsized data][36880]
1101 * [Don't reuse `HashMap` random seeds][37470]
1102 * [The internal memory layout of `HashMap` is more cache-friendly, for
1103   significant improvements in some operations][36692]
1104 * [`HashMap` uses less memory on 32-bit architectures][36595]
1105 * [Impl `Add<{str, Cow<str>}>` for `Cow<str>`][36430]
1106
1107 Cargo
1108 -----
1109
1110 * [Expose rustc cfg values to build scripts][cargo/3243]
1111 * [Allow cargo to work with read-only `CARGO_HOME`][cargo/3259]
1112 * [Fix passing --features when testing multiple packages][cargo/3280]
1113 * [Use a single profile set per workspace][cargo/3249]
1114 * [Load `replace` sections from lock files][cargo/3220]
1115 * [Ignore `panic` configuration for test/bench profiles][cargo/3175]
1116
1117 Tooling
1118 -------
1119
1120 * [rustup is the recommended Rust installation method][1.14rustup]
1121 * This release includes host (rustc) builds for Linux on MIPS, PowerPC, and
1122   S390x. These are [tier 2] platforms and may have major defects. Follow the
1123   instructions on the website to install, or add the targets to an existing
1124   installation with `rustup target add`. The new target triples are:
1125   - `mips-unknown-linux-gnu`
1126   - `mipsel-unknown-linux-gnu`
1127   - `mips64-unknown-linux-gnuabi64`
1128   - `mips64el-unknown-linux-gnuabi64 `
1129   - `powerpc-unknown-linux-gnu`
1130   - `powerpc64-unknown-linux-gnu`
1131   - `powerpc64le-unknown-linux-gnu`
1132   - `s390x-unknown-linux-gnu `
1133 * This release includes target (std) builds for ARM Linux running MUSL
1134   libc. These are [tier 2] platforms and may have major defects. Add the
1135   following triples to an existing rustup installation with `rustup target add`:
1136   - `arm-unknown-linux-musleabi`
1137   - `arm-unknown-linux-musleabihf`
1138   - `armv7-unknown-linux-musleabihf`
1139 * This release includes [experimental support for WebAssembly][1.14wasm], via
1140   the `wasm32-unknown-emscripten` target. This target is known to have major
1141   defects. Please test, report, and fix.
1142 * rustup no longer installs documentation by default. Run `rustup
1143   component add rust-docs` to install.
1144 * [Fix line stepping in debugger][37310]
1145 * [Enable line number debuginfo in releases][37280]
1146
1147 Misc
1148 ----
1149
1150 * [Disable jemalloc on aarch64/powerpc/mips][37392]
1151 * [Add support for Fuchsia OS][37313]
1152 * [Detect local-rebuild by only MAJOR.MINOR version][37273]
1153
1154 Compatibility Notes
1155 -------------------
1156
1157 * [A number of forward-compatibility lints used by the compiler
1158   to gradually introduce language changes have been converted
1159   to deny by default][36894]:
1160   - ["use of inaccessible extern crate erroneously allowed"][36886]
1161   - ["type parameter default erroneously allowed in invalid location"][36887]
1162   - ["detects super or self keywords at the beginning of global path"][36888]
1163   - ["two overlapping inherent impls define an item with the same name
1164     were erroneously allowed"][36889]
1165   - ["floating-point constants cannot be used in patterns"][36890]
1166   - ["constants of struct or enum type can only be used in a pattern if
1167      the struct or enum has `#[derive(PartialEq, Eq)]`"][36891]
1168   - ["lifetimes or labels named `'_` were erroneously allowed"][36892]
1169 * [Prohibit patterns in trait methods without bodies][37378]
1170 * [The atomic `Ordering` enum may not be matched exhaustively][37351]
1171 * [Future-proofing `#[no_link]` breaks some obscure cases][37247]
1172 * [The `$crate` macro variable is accepted in fewer locations][37213]
1173 * [Impls specifying extra region requirements beyond the trait
1174   they implement are rejected][37167]
1175 * [Enums may not be unsized][37111]. Unsized enums are intended to
1176   work but never have. For now they are forbidden.
1177 * [Enforce the shadowing restrictions from RFC 1560 for today's macros][36767]
1178
1179 [tier 2]: https://forge.rust-lang.org/platform-support.html
1180 [1.14rustup]: https://internals.rust-lang.org/t/beta-testing-rustup-rs/3316/204
1181 [1.14wasm]: https://users.rust-lang.org/t/compiling-to-the-web-with-rust-and-emscripten/7627
1182 [36430]: https://github.com/rust-lang/rust/pull/36430
1183 [36595]: https://github.com/rust-lang/rust/pull/36595
1184 [36595]: https://github.com/rust-lang/rust/pull/36595
1185 [36692]: https://github.com/rust-lang/rust/pull/36692
1186 [36767]: https://github.com/rust-lang/rust/pull/36767
1187 [36794]: https://github.com/rust-lang/rust/pull/36794
1188 [36798]: https://github.com/rust-lang/rust/pull/36798
1189 [36819]: https://github.com/rust-lang/rust/pull/36819
1190 [36822]: https://github.com/rust-lang/rust/pull/36822
1191 [36825]: https://github.com/rust-lang/rust/pull/36825
1192 [36843]: https://github.com/rust-lang/rust/pull/36843
1193 [36880]: https://github.com/rust-lang/rust/pull/36880
1194 [36886]: https://github.com/rust-lang/rust/issues/36886
1195 [36887]: https://github.com/rust-lang/rust/issues/36887
1196 [36888]: https://github.com/rust-lang/rust/issues/36888
1197 [36889]: https://github.com/rust-lang/rust/issues/36889
1198 [36890]: https://github.com/rust-lang/rust/issues/36890
1199 [36891]: https://github.com/rust-lang/rust/issues/36891
1200 [36892]: https://github.com/rust-lang/rust/issues/36892
1201 [36894]: https://github.com/rust-lang/rust/pull/36894
1202 [36917]: https://github.com/rust-lang/rust/pull/36917
1203 [36993]: https://github.com/rust-lang/rust/pull/36993
1204 [37037]: https://github.com/rust-lang/rust/pull/37037
1205 [37064]: https://github.com/rust-lang/rust/pull/37064
1206 [37094]: https://github.com/rust-lang/rust/pull/37094
1207 [37108]: https://github.com/rust-lang/rust/pull/37108
1208 [37111]: https://github.com/rust-lang/rust/pull/37111
1209 [37161]: https://github.com/rust-lang/rust/pull/37161
1210 [37162]: https://github.com/rust-lang/rust/pull/37162
1211 [37167]: https://github.com/rust-lang/rust/pull/37167
1212 [37178]: https://github.com/rust-lang/rust/pull/37178
1213 [37200]: https://github.com/rust-lang/rust/pull/37200
1214 [37213]: https://github.com/rust-lang/rust/pull/37213
1215 [37221]: https://github.com/rust-lang/rust/pull/37221
1216 [37224]: https://github.com/rust-lang/rust/pull/37224
1217 [37230]: https://github.com/rust-lang/rust/pull/37230
1218 [37231]: https://github.com/rust-lang/rust/pull/37231
1219 [37247]: https://github.com/rust-lang/rust/pull/37247
1220 [37267]: https://github.com/rust-lang/rust/pull/37267
1221 [37270]: https://github.com/rust-lang/rust/pull/37270
1222 [37273]: https://github.com/rust-lang/rust/pull/37273
1223 [37280]: https://github.com/rust-lang/rust/pull/37280
1224 [37298]: https://github.com/rust-lang/rust/pull/37298
1225 [37306]: https://github.com/rust-lang/rust/pull/37306
1226 [37310]: https://github.com/rust-lang/rust/pull/37310
1227 [37312]: https://github.com/rust-lang/rust/pull/37312
1228 [37313]: https://github.com/rust-lang/rust/pull/37313
1229 [37315]: https://github.com/rust-lang/rust/pull/37315
1230 [37318]: https://github.com/rust-lang/rust/pull/37318
1231 [37322]: https://github.com/rust-lang/rust/pull/37322
1232 [37326]: https://github.com/rust-lang/rust/pull/37326
1233 [37351]: https://github.com/rust-lang/rust/pull/37351
1234 [37356]: https://github.com/rust-lang/rust/pull/37356
1235 [37367]: https://github.com/rust-lang/rust/pull/37367
1236 [37373]: https://github.com/rust-lang/rust/pull/37373
1237 [37378]: https://github.com/rust-lang/rust/pull/37378
1238 [37389]: https://github.com/rust-lang/rust/pull/37389
1239 [37392]: https://github.com/rust-lang/rust/pull/37392
1240 [37427]: https://github.com/rust-lang/rust/pull/37427
1241 [37439]: https://github.com/rust-lang/rust/pull/37439
1242 [37445]: https://github.com/rust-lang/rust/pull/37445
1243 [37470]: https://github.com/rust-lang/rust/pull/37470
1244 [37569]: https://github.com/rust-lang/rust/pull/37569
1245 [RFC 1492]: https://github.com/rust-lang/rfcs/blob/master/text/1492-dotdot-in-patterns.md
1246 [cargo/3175]: https://github.com/rust-lang/cargo/pull/3175
1247 [cargo/3220]: https://github.com/rust-lang/cargo/pull/3220
1248 [cargo/3243]: https://github.com/rust-lang/cargo/pull/3243
1249 [cargo/3249]: https://github.com/rust-lang/cargo/pull/3249
1250 [cargo/3259]: https://github.com/rust-lang/cargo/pull/3259
1251 [cargo/3280]: https://github.com/rust-lang/cargo/pull/3280
1252
1253
1254 Version 1.13.0 (2016-11-10)
1255 ===========================
1256
1257 Language
1258 --------
1259
1260 * [Stabilize the `?` operator][36995]. `?` is a simple way to propagate
1261   errors, like the `try!` macro, described in [RFC 0243].
1262 * [Stabilize macros in type position][36014]. Described in [RFC 873].
1263 * [Stabilize attributes on statements][36995]. Described in [RFC 0016].
1264 * [Fix `#[derive]` for empty tuple structs/variants][35728]
1265 * [Fix lifetime rules for 'if' conditions][36029]
1266 * [Avoid loading and parsing unconfigured non-inline modules][36482]
1267
1268 Compiler
1269 --------
1270
1271 * [Add the `-C link-arg` argument][36574]
1272 * [Remove the old AST-based backend from rustc_trans][35764]
1273 * [Don't enable NEON by default on armv7 Linux][35814]
1274 * [Fix debug line number info for macro expansions][35238]
1275 * [Do not emit "class method" debuginfo for types that are not
1276   DICompositeType][36008]
1277 * [Warn about multiple conflicting #[repr] hints][34623]
1278 * [When sizing DST, don't double-count nested struct prefixes][36351]
1279 * [Default RUST_MIN_STACK to 16MiB for now][36505]
1280 * [Improve rlib metadata format][36551]. Reduces rlib size significantly.
1281 * [Reject macros with empty repetitions to avoid infinite loop][36721]
1282 * [Expand macros without recursing to avoid stack overflows][36214]
1283
1284 Diagnostics
1285 -----------
1286
1287 * [Replace macro backtraces with labeled local uses][35702]
1288 * [Improve error message for missplaced doc comments][33922]
1289 * [Buffer unix and lock windows to prevent message interleaving][35975]
1290 * [Update lifetime errors to specifically note temporaries][36171]
1291 * [Special case a few colors for Windows][36178]
1292 * [Suggest `use self` when such an import resolves][36289]
1293 * [Be more specific when type parameter shadows primitive type][36338]
1294 * Many minor improvements
1295
1296 Compile-time Optimizations
1297 --------------------------
1298
1299 * [Compute and cache HIR hashes at beginning][35854]
1300 * [Don't hash types in loan paths][36004]
1301 * [Cache projections in trans][35761]
1302 * [Optimize the parser's last token handling][36527]
1303 * [Only instantiate #[inline] functions in codegen units referencing
1304   them][36524]. This leads to big improvements in cases where crates export
1305   define many inline functions without using them directly.
1306 * [Lazily allocate TypedArena's first chunk][36592]
1307 * [Don't allocate during default HashSet creation][36734]
1308
1309 Stabilized APIs
1310 ---------------
1311
1312 * [`checked_abs`]
1313 * [`wrapping_abs`]
1314 * [`overflowing_abs`]
1315 * [`RefCell::try_borrow`]
1316 * [`RefCell::try_borrow_mut`]
1317
1318 Libraries
1319 ---------
1320
1321 * [Add `assert_ne!` and `debug_assert_ne!`][35074]
1322 * [Make `vec_deque::Drain`, `hash_map::Drain`, and `hash_set::Drain`
1323   covariant][35354]
1324 * [Implement `AsRef<[T]>` for `std::slice::Iter`][35559]
1325 * [Implement `Debug` for `std::vec::IntoIter`][35707]
1326 * [`CString`: avoid excessive growth just to 0-terminate][35871]
1327 * [Implement `CoerceUnsized` for `{Cell, RefCell, UnsafeCell}`][35627]
1328 * [Use arc4rand on FreeBSD][35884]
1329 * [memrchr: Correct aligned offset computation][35969]
1330 * [Improve Demangling of Rust Symbols][36059]
1331 * [Use monotonic time in condition variables][35048]
1332 * [Implement `Debug` for `std::path::{Components,Iter}`][36101]
1333 * [Implement conversion traits for `char`][35755]
1334 * [Fix illegal instruction caused by overflow in channel cloning][36104]
1335 * [Zero first byte of CString on drop][36264]
1336 * [Inherit overflow checks for sum and product][36372]
1337 * [Add missing Eq implementations][36423]
1338 * [Implement `Debug` for `DirEntry`][36631]
1339 * [When `getaddrinfo` returns `EAI_SYSTEM` retrieve actual error from
1340   `errno`][36754]
1341 * [`SipHasher`] is deprecated. Use [`DefaultHasher`].
1342 * [Implement more traits for `std::io::ErrorKind`][35911]
1343 * [Optimize BinaryHeap bounds checking][36072]
1344 * [Work around pointer aliasing issue in `Vec::extend_from_slice`,
1345   `extend_with_element`][36355]
1346 * [Fix overflow checking in unsigned pow()][34942]
1347
1348 Cargo
1349 -----
1350
1351 * This release includes security fixes to both curl and OpenSSL.
1352 * [Fix transitive doctests when panic=abort][cargo/3021]
1353 * [Add --all-features flag to cargo][cargo/3038]
1354 * [Reject path-based dependencies in `cargo package`][cargo/3060]
1355 * [Don't parse the home directory more than once][cargo/3078]
1356 * [Don't try to generate Cargo.lock on empty workspaces][cargo/3092]
1357 * [Update OpenSSL to 1.0.2j][cargo/3121]
1358 * [Add license and license_file to cargo metadata output][cargo/3110]
1359 * [Make crates-io registry URL optional in config; ignore all changes to
1360   source.crates-io][cargo/3089]
1361 * [Don't download dependencies from other platforms][cargo/3123]
1362 * [Build transitive dev-dependencies when needed][cargo/3125]
1363 * [Add support for per-target rustflags in .cargo/config][cargo/3157]
1364 * [Avoid updating registry when adding existing deps][cargo/3144]
1365 * [Warn about path overrides that won't work][cargo/3136]
1366 * [Use workspaces during `cargo install`][cargo/3146]
1367 * [Leak mspdbsrv.exe processes on Windows][cargo/3162]
1368 * [Add --message-format flag][cargo/3000]
1369 * [Pass target environment for rustdoc][cargo/3205]
1370 * [Use `CommandExt::exec` for `cargo run` on Unix][cargo/2818]
1371 * [Update curl and curl-sys][cargo/3241]
1372 * [Call rustdoc test with the correct cfg flags of a package][cargo/3242]
1373
1374 Tooling
1375 -------
1376
1377 * [rustdoc: Add the `--sysroot` argument][36586]
1378 * [rustdoc: Fix a couple of issues with the search results][35655]
1379 * [rustdoc: remove the `!` from macro URLs and titles][35234]
1380 * [gdb: Fix pretty-printing special-cased Rust types][35585]
1381 * [rustdoc: Filter more incorrect methods inherited through Deref][36266]
1382
1383 Misc
1384 ----
1385
1386 * [Remove unmaintained style guide][35124]
1387 * [Add s390x support][36369]
1388 * [Initial work at Haiku OS support][36727]
1389 * [Add mips-uclibc targets][35734]
1390 * [Crate-ify compiler-rt into compiler-builtins][35021]
1391 * [Add rustc version info (git hash + date) to dist tarball][36213]
1392 * Many documentation improvements
1393
1394 Compatibility Notes
1395 -------------------
1396
1397 * [`SipHasher`] is deprecated. Use [`DefaultHasher`].
1398 * [Deny (by default) transmuting from fn item types to pointer-sized
1399   types][34923]. Continuing the long transition to zero-sized fn items,
1400   per [RFC 401].
1401 * [Fix `#[derive]` for empty tuple structs/variants][35728].
1402   Part of [RFC 1506].
1403 * [Issue deprecation warnings for safe accesses to extern statics][36173]
1404 * [Fix lifetime rules for 'if' conditions][36029].
1405 * [Inherit overflow checks for sum and product][36372].
1406 * [Forbid user-defined macros named "macro_rules"][36730].
1407
1408 [33922]: https://github.com/rust-lang/rust/pull/33922
1409 [34623]: https://github.com/rust-lang/rust/pull/34623
1410 [34923]: https://github.com/rust-lang/rust/pull/34923
1411 [34942]: https://github.com/rust-lang/rust/pull/34942
1412 [34982]: https://github.com/rust-lang/rust/pull/34982
1413 [35021]: https://github.com/rust-lang/rust/pull/35021
1414 [35048]: https://github.com/rust-lang/rust/pull/35048
1415 [35074]: https://github.com/rust-lang/rust/pull/35074
1416 [35124]: https://github.com/rust-lang/rust/pull/35124
1417 [35234]: https://github.com/rust-lang/rust/pull/35234
1418 [35238]: https://github.com/rust-lang/rust/pull/35238
1419 [35354]: https://github.com/rust-lang/rust/pull/35354
1420 [35559]: https://github.com/rust-lang/rust/pull/35559
1421 [35585]: https://github.com/rust-lang/rust/pull/35585
1422 [35627]: https://github.com/rust-lang/rust/pull/35627
1423 [35655]: https://github.com/rust-lang/rust/pull/35655
1424 [35702]: https://github.com/rust-lang/rust/pull/35702
1425 [35707]: https://github.com/rust-lang/rust/pull/35707
1426 [35728]: https://github.com/rust-lang/rust/pull/35728
1427 [35734]: https://github.com/rust-lang/rust/pull/35734
1428 [35755]: https://github.com/rust-lang/rust/pull/35755
1429 [35761]: https://github.com/rust-lang/rust/pull/35761
1430 [35764]: https://github.com/rust-lang/rust/pull/35764
1431 [35814]: https://github.com/rust-lang/rust/pull/35814
1432 [35854]: https://github.com/rust-lang/rust/pull/35854
1433 [35871]: https://github.com/rust-lang/rust/pull/35871
1434 [35884]: https://github.com/rust-lang/rust/pull/35884
1435 [35911]: https://github.com/rust-lang/rust/pull/35911
1436 [35969]: https://github.com/rust-lang/rust/pull/35969
1437 [35975]: https://github.com/rust-lang/rust/pull/35975
1438 [36004]: https://github.com/rust-lang/rust/pull/36004
1439 [36008]: https://github.com/rust-lang/rust/pull/36008
1440 [36014]: https://github.com/rust-lang/rust/pull/36014
1441 [36029]: https://github.com/rust-lang/rust/pull/36029
1442 [36059]: https://github.com/rust-lang/rust/pull/36059
1443 [36072]: https://github.com/rust-lang/rust/pull/36072
1444 [36101]: https://github.com/rust-lang/rust/pull/36101
1445 [36104]: https://github.com/rust-lang/rust/pull/36104
1446 [36171]: https://github.com/rust-lang/rust/pull/36171
1447 [36173]: https://github.com/rust-lang/rust/pull/36173
1448 [36178]: https://github.com/rust-lang/rust/pull/36178
1449 [36213]: https://github.com/rust-lang/rust/pull/36213
1450 [36214]: https://github.com/rust-lang/rust/pull/36214
1451 [36264]: https://github.com/rust-lang/rust/pull/36264
1452 [36266]: https://github.com/rust-lang/rust/pull/36266
1453 [36289]: https://github.com/rust-lang/rust/pull/36289
1454 [36338]: https://github.com/rust-lang/rust/pull/36338
1455 [36351]: https://github.com/rust-lang/rust/pull/36351
1456 [36355]: https://github.com/rust-lang/rust/pull/36355
1457 [36369]: https://github.com/rust-lang/rust/pull/36369
1458 [36372]: https://github.com/rust-lang/rust/pull/36372
1459 [36423]: https://github.com/rust-lang/rust/pull/36423
1460 [36482]: https://github.com/rust-lang/rust/pull/36482
1461 [36505]: https://github.com/rust-lang/rust/pull/36505
1462 [36524]: https://github.com/rust-lang/rust/pull/36524
1463 [36527]: https://github.com/rust-lang/rust/pull/36527
1464 [36551]: https://github.com/rust-lang/rust/pull/36551
1465 [36574]: https://github.com/rust-lang/rust/pull/36574
1466 [36586]: https://github.com/rust-lang/rust/pull/36586
1467 [36592]: https://github.com/rust-lang/rust/pull/36592
1468 [36631]: https://github.com/rust-lang/rust/pull/36631
1469 [36639]: https://github.com/rust-lang/rust/pull/36639
1470 [36721]: https://github.com/rust-lang/rust/pull/36721
1471 [36727]: https://github.com/rust-lang/rust/pull/36727
1472 [36730]: https://github.com/rust-lang/rust/pull/36730
1473 [36734]: https://github.com/rust-lang/rust/pull/36734
1474 [36754]: https://github.com/rust-lang/rust/pull/36754
1475 [36995]: https://github.com/rust-lang/rust/pull/36995
1476 [RFC 0016]: https://github.com/rust-lang/rfcs/blob/master/text/0016-more-attributes.md
1477 [RFC 0243]: https://github.com/rust-lang/rfcs/blob/master/text/0243-trait-based-exception-handling.md
1478 [RFC 1506]: https://github.com/rust-lang/rfcs/blob/master/text/1506-adt-kinds.md
1479 [RFC 401]: https://github.com/rust-lang/rfcs/blob/master/text/0401-coercions.md
1480 [RFC 873]: https://github.com/rust-lang/rfcs/blob/master/text/0873-type-macros.md
1481 [cargo/2818]: https://github.com/rust-lang/cargo/pull/2818
1482 [cargo/3000]: https://github.com/rust-lang/cargo/pull/3000
1483 [cargo/3021]: https://github.com/rust-lang/cargo/pull/3021
1484 [cargo/3038]: https://github.com/rust-lang/cargo/pull/3038
1485 [cargo/3060]: https://github.com/rust-lang/cargo/pull/3060
1486 [cargo/3078]: https://github.com/rust-lang/cargo/pull/3078
1487 [cargo/3089]: https://github.com/rust-lang/cargo/pull/3089
1488 [cargo/3092]: https://github.com/rust-lang/cargo/pull/3092
1489 [cargo/3110]: https://github.com/rust-lang/cargo/pull/3110
1490 [cargo/3121]: https://github.com/rust-lang/cargo/pull/3121
1491 [cargo/3123]: https://github.com/rust-lang/cargo/pull/3123
1492 [cargo/3125]: https://github.com/rust-lang/cargo/pull/3125
1493 [cargo/3136]: https://github.com/rust-lang/cargo/pull/3136
1494 [cargo/3144]: https://github.com/rust-lang/cargo/pull/3144
1495 [cargo/3146]: https://github.com/rust-lang/cargo/pull/3146
1496 [cargo/3157]: https://github.com/rust-lang/cargo/pull/3157
1497 [cargo/3162]: https://github.com/rust-lang/cargo/pull/3162
1498 [cargo/3205]: https://github.com/rust-lang/cargo/pull/3205
1499 [cargo/3241]: https://github.com/rust-lang/cargo/pull/3241
1500 [cargo/3242]: https://github.com/rust-lang/cargo/pull/3242
1501 [rustup]: https://www.rustup.rs
1502 [`checked_abs`]: https://doc.rust-lang.org/std/primitive.i32.html#method.checked_abs
1503 [`wrapping_abs`]: https://doc.rust-lang.org/std/primitive.i32.html#method.wrapping_abs
1504 [`overflowing_abs`]: https://doc.rust-lang.org/std/primitive.i32.html#method.overflowing_abs
1505 [`RefCell::try_borrow`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.try_borrow
1506 [`RefCell::try_borrow_mut`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.try_borrow_mut
1507 [`SipHasher`]: https://doc.rust-lang.org/std/hash/struct.SipHasher.html
1508 [`DefaultHasher`]: https://doc.rust-lang.org/std/collections/hash_map/struct.DefaultHasher.html
1509
1510
1511 Version 1.12.1 (2016-10-20)
1512 ===========================
1513
1514 Regression Fixes
1515 ----------------
1516
1517 * [ICE: 'rustc' panicked at 'assertion failed: concrete_substs.is_normalized_for_trans()' #36381][36381]
1518 * [Confusion with double negation and booleans][36856]
1519 * [rustc 1.12.0 fails with SIGSEGV in release mode (syn crate 0.8.0)][36875]
1520 * [Rustc 1.12.0 Windows build of `ethcore` crate fails with LLVM error][36924]
1521 * [1.12.0: High memory usage when linking in release mode with debug info][36926]
1522 * [Corrupted memory after updated to 1.12][36936]
1523 * ["Let NullaryConstructor = something;" causes internal compiler error: "tried to overwrite interned AdtDef"][37026]
1524 * [Fix ICE: inject bitcast if types mismatch for invokes/calls/stores][37112]
1525 * [debuginfo: Handle spread_arg case in MIR-trans in a more stable way.][37153]
1526
1527 [36381]: https://github.com/rust-lang/rust/issues/36381
1528 [36856]: https://github.com/rust-lang/rust/issues/36856
1529 [36875]: https://github.com/rust-lang/rust/issues/36875
1530 [36924]: https://github.com/rust-lang/rust/issues/36924
1531 [36926]: https://github.com/rust-lang/rust/issues/36926
1532 [36936]: https://github.com/rust-lang/rust/issues/36936
1533 [37026]: https://github.com/rust-lang/rust/issues/37026
1534 [37112]: https://github.com/rust-lang/rust/issues/37112
1535 [37153]: https://github.com/rust-lang/rust/issues/37153
1536
1537
1538 Version 1.12.0 (2016-09-29)
1539 ===========================
1540
1541 Highlights
1542 ----------
1543
1544 * [`rustc` translates code to LLVM IR via its own "middle" IR (MIR)](https://github.com/rust-lang/rust/pull/34096).
1545   This translation pass is far simpler than the previous AST->LLVM pass, and
1546   creates opportunities to perform new optimizations directly on the MIR. It
1547   was previously described [on the Rust blog](https://blog.rust-lang.org/2016/04/19/MIR.html).
1548 * [`rustc` presents a new, more readable error format, along with
1549   machine-readable JSON error output for use by IDEs](https://github.com/rust-lang/rust/pull/35401).
1550   Most common editors supporting Rust have been updated to work with it. It was
1551   previously described [on the Rust blog](https://blog.rust-lang.org/2016/08/10/Shape-of-errors-to-come.html).
1552
1553 Compiler
1554 --------
1555
1556 * [`rustc` translates code to LLVM IR via its own "middle" IR (MIR)](https://github.com/rust-lang/rust/pull/34096).
1557   This translation pass is far simpler than the previous AST->LLVM pass, and
1558   creates opportunities to perform new optimizations directly on the MIR. It
1559   was previously described [on the Rust blog](https://blog.rust-lang.org/2016/04/19/MIR.html).
1560 * [Print the Rust target name, not the LLVM target name, with
1561   `--print target-list`](https://github.com/rust-lang/rust/pull/35489)
1562 * [The computation of `TypeId` is correct in some cases where it was previously
1563   producing inconsistent results](https://github.com/rust-lang/rust/pull/35267)
1564 * [The `mips-unknown-linux-gnu` target uses hardware floating point by default](https://github.com/rust-lang/rust/pull/34910)
1565 * [The `rustc` arguments, `--print target-cpus`, `--print target-features`,
1566   `--print relocation-models`, and `--print code-models` print the available
1567   options to the `-C target-cpu`, `-C target-feature`, `-C relocation-model` and
1568   `-C code-model` code generation arguments](https://github.com/rust-lang/rust/pull/34845)
1569 * [`rustc` supports three new MUSL targets on ARM: `arm-unknown-linux-musleabi`,
1570   `arm-unknown-linux-musleabihf`, and `armv7-unknown-linux-musleabihf`](https://github.com/rust-lang/rust/pull/35060).
1571   These targets produce statically-linked binaries. There are no binary release
1572   builds yet though.
1573
1574 Diagnostics
1575 -----------
1576
1577 * [`rustc` presents a new, more readable error format, along with
1578   machine-readable JSON error output for use by IDEs](https://github.com/rust-lang/rust/pull/35401).
1579   Most common editors supporting Rust have been updated to work with it. It was
1580   previously described [on the Rust blog](https://blog.rust-lang.org/2016/08/10/Shape-of-errors-to-come.html).
1581 * [In error descriptions, references are now described in plain English,
1582   instead of as "&-ptr"](https://github.com/rust-lang/rust/pull/35611)
1583 * [In error type descriptions, unknown numeric types are named `{integer}` or
1584   `{float}` instead of `_`](https://github.com/rust-lang/rust/pull/35080)
1585 * [`rustc` emits a clearer error when inner attributes follow a doc comment](https://github.com/rust-lang/rust/pull/34676)
1586
1587 Language
1588 --------
1589
1590 * [`macro_rules!` invocations can be made within `macro_rules!` invocations](https://github.com/rust-lang/rust/pull/34925)
1591 * [`macro_rules!` meta-variables are hygienic](https://github.com/rust-lang/rust/pull/35453)
1592 * [`macro_rules!` `tt` matchers can be reparsed correctly, making them much more
1593   useful](https://github.com/rust-lang/rust/pull/34908)
1594 * [`macro_rules!` `stmt` matchers correctly consume the entire contents when
1595   inside non-braces invocations](https://github.com/rust-lang/rust/pull/34886)
1596 * [Semicolons are properly required as statement delimeters inside
1597   `macro_rules!` invocations](https://github.com/rust-lang/rust/pull/34660)
1598 * [`cfg_attr` works on `path` attributes](https://github.com/rust-lang/rust/pull/34546)
1599
1600 Stabilized APIs
1601 ---------------
1602
1603 * [`Cell::as_ptr`](https://doc.rust-lang.org/std/cell/struct.Cell.html#method.as_ptr)
1604 * [`RefCell::as_ptr`](https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.as_ptr)
1605 * [`IpAddr::is_unspecified`](https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_unspecified)
1606 * [`IpAddr::is_loopback`](https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_loopback)
1607 * [`IpAddr::is_multicast`](https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_multicast)
1608 * [`Ipv4Addr::is_unspecified`](https://doc.rust-lang.org/std/net/struct.Ipv4Addr.html#method.is_unspecified)
1609 * [`Ipv6Addr::octets`](https://doc.rust-lang.org/std/net/struct.Ipv6Addr.html#method.octets)
1610 * [`LinkedList::contains`](https://doc.rust-lang.org/std/collections/linked_list/struct.LinkedList.html#method.contains)
1611 * [`VecDeque::contains`](https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.contains)
1612 * [`ExitStatusExt::from_raw`](https://doc.rust-lang.org/std/os/unix/process/trait.ExitStatusExt.html#tymethod.from_raw).
1613   Both on Unix and Windows.
1614 * [`Receiver::recv_timeout`](https://doc.rust-lang.org/std/sync/mpsc/struct.Receiver.html#method.recv_timeout)
1615 * [`RecvTimeoutError`](https://doc.rust-lang.org/std/sync/mpsc/enum.RecvTimeoutError.html)
1616 * [`BinaryHeap::peek_mut`](https://doc.rust-lang.org/std/collections/binary_heap/struct.BinaryHeap.html#method.peek_mut)
1617 * [`PeekMut`](https://doc.rust-lang.org/std/collections/binary_heap/struct.PeekMut.html)
1618 * [`iter::Product`](https://doc.rust-lang.org/std/iter/trait.Product.html)
1619 * [`iter::Sum`](https://doc.rust-lang.org/std/iter/trait.Sum.html)
1620 * [`OccupiedEntry::remove_entry`](https://doc.rust-lang.org/std/collections/btree_map/struct.OccupiedEntry.html#method.remove_entry)
1621 * [`VacantEntry::into_key`](https://doc.rust-lang.org/std/collections/btree_map/struct.VacantEntry.html#method.into_key)
1622
1623 Libraries
1624 ---------
1625
1626 * [The `format!` macro and friends now allow a single argument to be formatted
1627   in multiple styles](https://github.com/rust-lang/rust/pull/33642)
1628 * [The lifetime bounds on `[T]::binary_search_by` and
1629   `[T]::binary_search_by_key` have been adjusted to be more flexible](https://github.com/rust-lang/rust/pull/34762)
1630 * [`Option` implements `From` for its contained type](https://github.com/rust-lang/rust/pull/34828)
1631 * [`Cell`, `RefCell` and `UnsafeCell` implement `From` for their contained type](https://github.com/rust-lang/rust/pull/35392)
1632 * [`RwLock` panics if the reader count overflows](https://github.com/rust-lang/rust/pull/35378)
1633 * [`vec_deque::Drain`, `hash_map::Drain` and `hash_set::Drain` are covariant](https://github.com/rust-lang/rust/pull/35354)
1634 * [`vec::Drain` and `binary_heap::Drain` are covariant](https://github.com/rust-lang/rust/pull/34951)
1635 * [`Cow<str>` implements `FromIterator` for `char`, `&str` and `String`](https://github.com/rust-lang/rust/pull/35064)
1636 * [Sockets on Linux are correctly closed in subprocesses via `SOCK_CLOEXEC`](https://github.com/rust-lang/rust/pull/34946)
1637 * [`hash_map::Entry`, `hash_map::VacantEntry` and `hash_map::OccupiedEntry`
1638   implement `Debug`](https://github.com/rust-lang/rust/pull/34937)
1639 * [`btree_map::Entry`, `btree_map::VacantEntry` and `btree_map::OccupiedEntry`
1640   implement `Debug`](https://github.com/rust-lang/rust/pull/34885)
1641 * [`String` implements `AddAssign`](https://github.com/rust-lang/rust/pull/34890)
1642 * [Variadic `extern fn` pointers implement the `Clone`, `PartialEq`, `Eq`,
1643   `PartialOrd`, `Ord`, `Hash`, `fmt::Pointer`, and `fmt::Debug` traits](https://github.com/rust-lang/rust/pull/34879)
1644 * [`FileType` implements `Debug`](https://github.com/rust-lang/rust/pull/34757)
1645 * [References to `Mutex` and `RwLock` are unwind-safe](https://github.com/rust-lang/rust/pull/34756)
1646 * [`mpsc::sync_channel` `Receiver`s return any available message before
1647   reporting a disconnect](https://github.com/rust-lang/rust/pull/34731)
1648 * [Unicode definitions have been updated to 9.0](https://github.com/rust-lang/rust/pull/34599)
1649 * [`env` iterators implement `DoubleEndedIterator`](https://github.com/rust-lang/rust/pull/33312)
1650
1651 Cargo
1652 -----
1653
1654 * [Support local mirrors of registries](https://github.com/rust-lang/cargo/pull/2857)
1655 * [Add support for command aliases](https://github.com/rust-lang/cargo/pull/2679)
1656 * [Allow `opt-level="s"` / `opt-level="z"` in profile overrides](https://github.com/rust-lang/cargo/pull/3007)
1657 * [Make `cargo doc --open --target` work as expected](https://github.com/rust-lang/cargo/pull/2988)
1658 * [Speed up noop registry updates](https://github.com/rust-lang/cargo/pull/2974)
1659 * [Update OpenSSL](https://github.com/rust-lang/cargo/pull/2971)
1660 * [Fix `--panic=abort` with plugins](https://github.com/rust-lang/cargo/pull/2954)
1661 * [Always pass `-C metadata` to the compiler](https://github.com/rust-lang/cargo/pull/2946)
1662 * [Fix depending on git repos with workspaces](https://github.com/rust-lang/cargo/pull/2938)
1663 * [Add a `--lib` flag to `cargo new`](https://github.com/rust-lang/cargo/pull/2921)
1664 * [Add `http.cainfo` for custom certs](https://github.com/rust-lang/cargo/pull/2917)
1665 * [Indicate the compilation profile after compiling](https://github.com/rust-lang/cargo/pull/2909)
1666 * [Allow enabling features for dependencies with `--features`](https://github.com/rust-lang/cargo/pull/2876)
1667 * [Add `--jobs` flag to `cargo package`](https://github.com/rust-lang/cargo/pull/2867)
1668 * [Add `--dry-run` to `cargo publish`](https://github.com/rust-lang/cargo/pull/2849)
1669 * [Add support for `RUSTDOCFLAGS`](https://github.com/rust-lang/cargo/pull/2794)
1670
1671 Performance
1672 -----------
1673
1674 * [`panic::catch_unwind` is more optimized](https://github.com/rust-lang/rust/pull/35444)
1675 * [`panic::catch_unwind` no longer accesses thread-local storage on entry](https://github.com/rust-lang/rust/pull/34866)
1676
1677 Tooling
1678 -------
1679
1680 * [Test binaries now support a `--test-threads` argument to specify the number
1681   of threads used to run tests, and which acts the same as the
1682   `RUST_TEST_THREADS` environment variable](https://github.com/rust-lang/rust/pull/35414)  
1683 * [The test runner now emits a warning when tests run over 60 seconds](https://github.com/rust-lang/rust/pull/35405)
1684 * [rustdoc: Fix methods in search results](https://github.com/rust-lang/rust/pull/34752)
1685 * [`rust-lldb` warns about unsupported versions of LLDB](https://github.com/rust-lang/rust/pull/34646)
1686 * [Rust releases now come with source packages that can be installed by rustup
1687   via `rustup component add rust-src`](https://github.com/rust-lang/rust/pull/34366).
1688   The resulting source code can be used by tools and IDES, located in the
1689   sysroot under `lib/rustlib/src`.
1690
1691 Misc
1692 ----
1693
1694 * [The compiler can now be built against LLVM 3.9](https://github.com/rust-lang/rust/pull/35594)
1695 * Many minor improvements to the documentation.
1696 * [The Rust exception handling "personality" routine is now written in Rust](https://github.com/rust-lang/rust/pull/34832)
1697
1698 Compatibility Notes
1699 -------------------
1700
1701 * [When printing Windows `OsStr`s, unpaired surrogate codepoints are escaped
1702   with the lowercase format instead of the uppercase](https://github.com/rust-lang/rust/pull/35084)
1703 * [When formatting strings, if "precision" is specified, the "fill",
1704   "align" and "width" specifiers are no longer ignored](https://github.com/rust-lang/rust/pull/34544)
1705 * [The `Debug` impl for strings no longer escapes all non-ASCII characters](https://github.com/rust-lang/rust/pull/34485)
1706
1707
1708 Version 1.11.0 (2016-08-18)
1709 ===========================
1710
1711 Language
1712 --------
1713
1714 * [`cfg_attr` works on `path` attributes](https://github.com/rust-lang/rust/pull/34546)
1715 * [Support nested `cfg_attr` attributes](https://github.com/rust-lang/rust/pull/34216)
1716 * [Allow statement-generating braced macro invocations at the end of blocks](https://github.com/rust-lang/rust/pull/34436)
1717 * [Macros can be expanded inside of trait definitions](https://github.com/rust-lang/rust/pull/34213)
1718 * [`#[macro_use]` works properly when it is itself expanded from a macro](https://github.com/rust-lang/rust/pull/34032)
1719
1720 Stabilized APIs
1721 ---------------
1722
1723 * [`BinaryHeap::append`](https://doc.rust-lang.org/std/collections/binary_heap/struct.BinaryHeap.html#method.append)
1724 * [`BTreeMap::append`](https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.append)
1725 * [`BTreeMap::split_off`](https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.split_off)
1726 * [`BTreeSet::append`](https://doc.rust-lang.org/std/collections/btree_set/struct.BTreeSet.html#method.append)
1727 * [`BTreeSet::split_off`](https://doc.rust-lang.org/std/collections/btree_set/struct.BTreeSet.html#method.split_off)
1728 * [`f32::to_degrees`](https://doc.rust-lang.org/std/primitive.f32.html#method.to_degrees)
1729   (in libcore - previously stabilized in libstd)
1730 * [`f32::to_radians`](https://doc.rust-lang.org/std/primitive.f32.html#method.to_radians)
1731   (in libcore - previously stabilized in libstd)
1732 * [`f64::to_degrees`](https://doc.rust-lang.org/std/primitive.f64.html#method.to_degrees)
1733   (in libcore - previously stabilized in libstd)
1734 * [`f64::to_radians`](https://doc.rust-lang.org/std/primitive.f64.html#method.to_radians)
1735   (in libcore - previously stabilized in libstd)
1736 * [`Iterator::sum`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.sum)
1737 * [`Iterator::product`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.sum)
1738 * [`Cell::get_mut`](https://doc.rust-lang.org/std/cell/struct.Cell.html#method.get_mut)
1739 * [`RefCell::get_mut`](https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.get_mut)
1740
1741 Libraries
1742 ---------
1743
1744 * [The `thread_local!` macro supports multiple definitions in a single
1745    invocation, and can apply attributes](https://github.com/rust-lang/rust/pull/34077)
1746 * [`Cow` implements `Default`](https://github.com/rust-lang/rust/pull/34305)
1747 * [`Wrapping` implements binary, octal, lower-hex and upper-hex
1748   `Display` formatting](https://github.com/rust-lang/rust/pull/34190)
1749 * [The range types implement `Hash`](https://github.com/rust-lang/rust/pull/34180)
1750 * [`lookup_host` ignores unknown address types](https://github.com/rust-lang/rust/pull/34067)
1751 * [`assert_eq!` accepts a custom error message, like `assert!` does](https://github.com/rust-lang/rust/pull/33976)
1752 * [The main thread is now called "main" instead of "&lt;main&gt;"](https://github.com/rust-lang/rust/pull/33803)
1753
1754 Cargo
1755 -----
1756
1757 * [Disallow specifying features of transitive deps](https://github.com/rust-lang/cargo/pull/2821)
1758 * [Add color support for Windows consoles](https://github.com/rust-lang/cargo/pull/2804)
1759 * [Fix `harness = false` on `[lib]` sections](https://github.com/rust-lang/cargo/pull/2795)
1760 * [Don't panic when `links` contains a '.'](https://github.com/rust-lang/cargo/pull/2787)
1761 * [Build scripts can emit warnings](https://github.com/rust-lang/cargo/pull/2630),
1762   and `-vv` prints warnings for all crates.
1763 * [Ignore file locks on OS X NFS mounts](https://github.com/rust-lang/cargo/pull/2720)
1764 * [Don't warn about `package.metadata` keys](https://github.com/rust-lang/cargo/pull/2668).
1765   This provides room for expansion by arbitrary tools.
1766 * [Add support for cdylib crate types](https://github.com/rust-lang/cargo/pull/2741)
1767 * [Prevent publishing crates when files are dirty](https://github.com/rust-lang/cargo/pull/2781)
1768 * [Don't fetch all crates on clean](https://github.com/rust-lang/cargo/pull/2704)
1769 * [Propagate --color option to rustc](https://github.com/rust-lang/cargo/pull/2779)
1770 * [Fix `cargo doc --open` on Windows](https://github.com/rust-lang/cargo/pull/2780)
1771 * [Improve autocompletion](https://github.com/rust-lang/cargo/pull/2772)
1772 * [Configure colors of stderr as well as stdout](https://github.com/rust-lang/cargo/pull/2739)
1773
1774 Performance
1775 -----------
1776
1777 * [Caching projections speeds up type check dramatically for some
1778   workloads](https://github.com/rust-lang/rust/pull/33816)
1779 * [The default `HashMap` hasher is SipHash 1-3 instead of SipHash 2-4](https://github.com/rust-lang/rust/pull/33940)
1780   This hasher is faster, but is believed to provide sufficient
1781   protection from collision attacks.
1782 * [Comparison of `Ipv4Addr` is 10x faster](https://github.com/rust-lang/rust/pull/33891)
1783
1784 Rustdoc
1785 -------
1786
1787 * [Fix empty implementation section on some module pages](https://github.com/rust-lang/rust/pull/34536)
1788 * [Fix inlined renamed reexports in import lists](https://github.com/rust-lang/rust/pull/34479)
1789 * [Fix search result layout for enum variants and struct fields](https://github.com/rust-lang/rust/pull/34477)
1790 * [Fix issues with source links to external crates](https://github.com/rust-lang/rust/pull/34387)
1791 * [Fix redirect pages for renamed reexports](https://github.com/rust-lang/rust/pull/34245)
1792
1793 Tooling
1794 -------
1795
1796 * [rustc is better at finding the MSVC toolchain](https://github.com/rust-lang/rust/pull/34492)
1797 * [When emitting debug info, rustc emits frame pointers for closures,
1798   shims and glue, as it does for all other functions](https://github.com/rust-lang/rust/pull/33909)
1799 * [rust-lldb warns about unsupported versions of LLDB](https://github.com/rust-lang/rust/pull/34646)
1800 * Many more errors have been given error codes and extended
1801   explanations
1802 * API documentation continues to be improved, with many new examples
1803
1804 Misc
1805 ----
1806
1807 * [rustc no longer hangs when dependencies recursively re-export
1808   submodules](https://github.com/rust-lang/rust/pull/34542)
1809 * [rustc requires LLVM 3.7+](https://github.com/rust-lang/rust/pull/34104)
1810 * [The 'How Safe and Unsafe Interact' chapter of The Rustonomicon was
1811   rewritten](https://github.com/rust-lang/rust/pull/33895)
1812 * [rustc support 16-bit pointer sizes](https://github.com/rust-lang/rust/pull/33460).
1813   No targets use this yet, but it works toward AVR support.
1814
1815 Compatibility Notes
1816 -------------------
1817
1818 * [`const`s and `static`s may not have unsized types](https://github.com/rust-lang/rust/pull/34443)
1819 * [The new follow-set rules that place restrictions on `macro_rules!`
1820   in order to ensure syntax forward-compatibility have been enabled](https://github.com/rust-lang/rust/pull/33982)
1821   This was an [ammendment to RFC 550](https://github.com/rust-lang/rfcs/pull/1384),
1822   and has been a warning since 1.10.
1823 * [`cfg` attribute process has been refactored to fix various bugs](https://github.com/rust-lang/rust/pull/33706).
1824   This causes breakage in some corner cases.
1825
1826
1827 Version 1.10.0 (2016-07-07)
1828 ===========================
1829
1830 Language
1831 --------
1832
1833 * [Allow `concat_idents!` in type positions as well as in expression
1834   positions](https://github.com/rust-lang/rust/pull/33735).
1835 * [`Copy` types are required to have a trivial implementation of `Clone`](https://github.com/rust-lang/rust/pull/33420).
1836   [RFC 1521](https://github.com/rust-lang/rfcs/blob/master/text/1521-copy-clone-semantics.md).
1837 * [Single-variant enums support the `#[repr(..)]` attribute](https://github.com/rust-lang/rust/pull/33355).
1838 * [Fix `#[derive(RustcEncodable)]` in the presence of other `encode` methods](https://github.com/rust-lang/rust/pull/32908).
1839 * [`panic!` can be converted to a runtime abort with the
1840   `-C panic=abort` flag](https://github.com/rust-lang/rust/pull/32900).
1841   [RFC 1513](https://github.com/rust-lang/rfcs/blob/master/text/1513-less-unwinding.md).
1842 * [Add a new crate type, 'cdylib'](https://github.com/rust-lang/rust/pull/33553).
1843   cdylibs are dynamic libraries suitable for loading by non-Rust hosts.
1844   [RFC 1510](https://github.com/rust-lang/rfcs/blob/master/text/1510-rdylib.md).
1845   Note that Cargo does not yet directly support cdylibs.
1846
1847 Stabilized APIs
1848 ---------------
1849
1850 * `os::windows::fs::OpenOptionsExt::access_mode`
1851 * `os::windows::fs::OpenOptionsExt::share_mode`
1852 * `os::windows::fs::OpenOptionsExt::custom_flags`
1853 * `os::windows::fs::OpenOptionsExt::attributes`
1854 * `os::windows::fs::OpenOptionsExt::security_qos_flags`
1855 * `os::unix::fs::OpenOptionsExt::custom_flags`
1856 * [`sync::Weak::new`](http://doc.rust-lang.org/alloc/arc/struct.Weak.html#method.new)
1857 * `Default for sync::Weak`
1858 * [`panic::set_hook`](http://doc.rust-lang.org/std/panic/fn.set_hook.html)
1859 * [`panic::take_hook`](http://doc.rust-lang.org/std/panic/fn.take_hook.html)
1860 * [`panic::PanicInfo`](http://doc.rust-lang.org/std/panic/struct.PanicInfo.html)
1861 * [`panic::PanicInfo::payload`](http://doc.rust-lang.org/std/panic/struct.PanicInfo.html#method.payload)
1862 * [`panic::PanicInfo::location`](http://doc.rust-lang.org/std/panic/struct.PanicInfo.html#method.location)
1863 * [`panic::Location`](http://doc.rust-lang.org/std/panic/struct.Location.html)
1864 * [`panic::Location::file`](http://doc.rust-lang.org/std/panic/struct.Location.html#method.file)
1865 * [`panic::Location::line`](http://doc.rust-lang.org/std/panic/struct.Location.html#method.line)
1866 * [`ffi::CStr::from_bytes_with_nul`](http://doc.rust-lang.org/std/ffi/struct.CStr.html#method.from_bytes_with_nul)
1867 * [`ffi::CStr::from_bytes_with_nul_unchecked`](http://doc.rust-lang.org/std/ffi/struct.CStr.html#method.from_bytes_with_nul_unchecked)
1868 * [`ffi::FromBytesWithNulError`](http://doc.rust-lang.org/std/ffi/struct.FromBytesWithNulError.html)
1869 * [`fs::Metadata::modified`](http://doc.rust-lang.org/std/fs/struct.Metadata.html#method.modified)
1870 * [`fs::Metadata::accessed`](http://doc.rust-lang.org/std/fs/struct.Metadata.html#method.accessed)
1871 * [`fs::Metadata::created`](http://doc.rust-lang.org/std/fs/struct.Metadata.html#method.created)
1872 * `sync::atomic::Atomic{Usize,Isize,Bool,Ptr}::compare_exchange`
1873 * `sync::atomic::Atomic{Usize,Isize,Bool,Ptr}::compare_exchange_weak`
1874 * `collections::{btree,hash}_map::{Occupied,Vacant,}Entry::key`
1875 * `os::unix::net::{UnixStream, UnixListener, UnixDatagram, SocketAddr}`
1876 * [`SocketAddr::is_unnamed`](http://doc.rust-lang.org/std/os/unix/net/struct.SocketAddr.html#method.is_unnamed)
1877 * [`SocketAddr::as_pathname`](http://doc.rust-lang.org/std/os/unix/net/struct.SocketAddr.html#method.as_pathname)
1878 * [`UnixStream::connect`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.connect)
1879 * [`UnixStream::pair`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.pair)
1880 * [`UnixStream::try_clone`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.try_clone)
1881 * [`UnixStream::local_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.local_addr)
1882 * [`UnixStream::peer_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.peer_addr)
1883 * [`UnixStream::set_read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.read_timeout)
1884 * [`UnixStream::set_write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.write_timeout)
1885 * [`UnixStream::read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.read_timeout)
1886 * [`UnixStream::write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.write_timeout)
1887 * [`UnixStream::set_nonblocking`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.set_nonblocking)
1888 * [`UnixStream::take_error`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.take_error)
1889 * [`UnixStream::shutdown`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.shutdown)
1890 * Read/Write/RawFd impls for `UnixStream`
1891 * [`UnixListener::bind`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.bind)
1892 * [`UnixListener::accept`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.accept)
1893 * [`UnixListener::try_clone`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.try_clone)
1894 * [`UnixListener::local_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.local_addr)
1895 * [`UnixListener::set_nonblocking`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.set_nonblocking)
1896 * [`UnixListener::take_error`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.take_error)
1897 * [`UnixListener::incoming`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.incoming)
1898 * RawFd impls for `UnixListener`
1899 * [`UnixDatagram::bind`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.bind)
1900 * [`UnixDatagram::unbound`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.unbound)
1901 * [`UnixDatagram::pair`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.pair)
1902 * [`UnixDatagram::connect`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.connect)
1903 * [`UnixDatagram::try_clone`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.try_clone)
1904 * [`UnixDatagram::local_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.local_addr)
1905 * [`UnixDatagram::peer_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.peer_addr)
1906 * [`UnixDatagram::recv_from`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.recv_from)
1907 * [`UnixDatagram::recv`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.recv)
1908 * [`UnixDatagram::send_to`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.send_to)
1909 * [`UnixDatagram::send`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.send)
1910 * [`UnixDatagram::set_read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.set_read_timeout)
1911 * [`UnixDatagram::set_write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.set_write_timeout)
1912 * [`UnixDatagram::read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.read_timeout)
1913 * [`UnixDatagram::write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.write_timeout)
1914 * [`UnixDatagram::set_nonblocking`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.set_nonblocking)
1915 * [`UnixDatagram::take_error`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.take_error)
1916 * [`UnixDatagram::shutdown`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.shutdown)
1917 * RawFd impls for `UnixDatagram`
1918 * `{BTree,Hash}Map::values_mut`
1919 * [`<[_]>::binary_search_by_key`](http://doc.rust-lang.org/beta/std/primitive.slice.html#method.binary_search_by_key)
1920
1921 Libraries
1922 ---------
1923
1924 * [The `abs_sub` method of floats is deprecated](https://github.com/rust-lang/rust/pull/33664).
1925   The semantics of this minor method are subtle and probably not what
1926   most people want.
1927 * [Add implementation of Ord for Cell<T> and RefCell<T> where T: Ord](https://github.com/rust-lang/rust/pull/33306).
1928 * [On Linux, if `HashMap`s can't be initialized with `getrandom` they
1929   will fall back to `/dev/urandom` temporarily to avoid blocking
1930   during early boot](https://github.com/rust-lang/rust/pull/33086).
1931 * [Implemented negation for wrapping numerals](https://github.com/rust-lang/rust/pull/33067).
1932 * [Implement `Clone` for `binary_heap::IntoIter`](https://github.com/rust-lang/rust/pull/33050).
1933 * [Implement `Display` and `Hash` for `std::num::Wrapping`](https://github.com/rust-lang/rust/pull/33023).
1934 * [Add `Default` implementation for `&CStr`, `CString`](https://github.com/rust-lang/rust/pull/32990).
1935 * [Implement `From<Vec<T>>` and `Into<Vec<T>>` for `VecDeque<T>`](https://github.com/rust-lang/rust/pull/32866).
1936 * [Implement `Default` for `UnsafeCell`, `fmt::Error`, `Condvar`,
1937   `Mutex`, `RwLock`](https://github.com/rust-lang/rust/pull/32785).
1938
1939 Cargo
1940 -----
1941 * [Cargo.toml supports the `profile.*.panic` option](https://github.com/rust-lang/cargo/pull/2687).
1942   This controls the runtime behavior of the `panic!` macro
1943   and can be either "unwind" (the default), or "abort".
1944   [RFC 1513](https://github.com/rust-lang/rfcs/blob/master/text/1513-less-unwinding.md).
1945 * [Don't throw away errors with `-p` arguments](https://github.com/rust-lang/cargo/pull/2723).
1946 * [Report status to stderr instead of stdout](https://github.com/rust-lang/cargo/pull/2693).
1947 * [Build scripts are passed a `CARGO_MANIFEST_LINKS` environment
1948   variable that corresponds to the `links` field of the manifest](https://github.com/rust-lang/cargo/pull/2710).
1949 * [Ban keywords from crate names](https://github.com/rust-lang/cargo/pull/2707).
1950 * [Canonicalize `CARGO_HOME` on Windows](https://github.com/rust-lang/cargo/pull/2604).
1951 * [Retry network requests](https://github.com/rust-lang/cargo/pull/2396).
1952   By default they are retried twice, which can be customized with the
1953   `net.retry` value in `.cargo/config`.
1954 * [Don't print extra error info for failing subcommands](https://github.com/rust-lang/cargo/pull/2674).
1955 * [Add `--force` flag to `cargo install`](https://github.com/rust-lang/cargo/pull/2405).
1956 * [Don't use `flock` on NFS mounts](https://github.com/rust-lang/cargo/pull/2623).
1957 * [Prefer building `cargo install` artifacts in temporary directories](https://github.com/rust-lang/cargo/pull/2610).
1958   Makes it possible to install multiple crates in parallel.
1959 * [Add `cargo test --doc`](https://github.com/rust-lang/cargo/pull/2578).
1960 * [Add `cargo --explain`](https://github.com/rust-lang/cargo/pull/2551).
1961 * [Don't print warnings when `-q` is passed](https://github.com/rust-lang/cargo/pull/2576).
1962 * [Add `cargo doc --lib` and `--bin`](https://github.com/rust-lang/cargo/pull/2577).
1963 * [Don't require build script output to be UTF-8](https://github.com/rust-lang/cargo/pull/2560).
1964 * [Correctly attempt multiple git usernames](https://github.com/rust-lang/cargo/pull/2584).
1965
1966 Performance
1967 -----------
1968
1969 * [rustc memory usage was reduced by refactoring the context used for
1970   type checking](https://github.com/rust-lang/rust/pull/33425).
1971 * [Speed up creation of `HashMap`s by caching the random keys used
1972   to initialize the hash state](https://github.com/rust-lang/rust/pull/33318).
1973 * [The `find` implementation for `Chain` iterators is 2x faster](https://github.com/rust-lang/rust/pull/33289).
1974 * [Trait selection optimizations speed up type checking by 15%](https://github.com/rust-lang/rust/pull/33138).
1975 * [Efficient trie lookup for boolean Unicode properties](https://github.com/rust-lang/rust/pull/33098).
1976   10x faster than the previous lookup tables.
1977 * [Special case `#[derive(Copy, Clone)]` to avoid bloat](https://github.com/rust-lang/rust/pull/31414).
1978
1979 Usability
1980 ---------
1981
1982 * Many incremental improvements to documentation and rustdoc.
1983 * [rustdoc: List blanket trait impls](https://github.com/rust-lang/rust/pull/33514).
1984 * [rustdoc: Clean up ABI rendering](https://github.com/rust-lang/rust/pull/33151).
1985 * [Indexing with the wrong type produces a more informative error](https://github.com/rust-lang/rust/pull/33401).
1986 * [Improve diagnostics for constants being used in irrefutable patterns](https://github.com/rust-lang/rust/pull/33406).
1987 * [When many method candidates are in scope limit the suggestions to 10](https://github.com/rust-lang/rust/pull/33338).
1988 * [Remove confusing suggestion when calling a `fn` type](https://github.com/rust-lang/rust/pull/33325).
1989 * [Do not suggest changing `&mut self` to `&mut mut self`](https://github.com/rust-lang/rust/pull/33319).
1990
1991 Misc
1992 ----
1993
1994 * [Update i686-linux-android features to match Android ABI](https://github.com/rust-lang/rust/pull/33651).
1995 * [Update aarch64-linux-android features to match Android ABI](https://github.com/rust-lang/rust/pull/33500).
1996 * [`std` no longer prints backtraces on platforms where the running
1997   module must be loaded with `env::current_exe`, which can't be relied
1998   on](https://github.com/rust-lang/rust/pull/33554).
1999 * This release includes std binaries for the i586-unknown-linux-gnu,
2000   i686-unknown-linux-musl, and armv7-linux-androideabi targets. The
2001   i586 target is for old x86 hardware without SSE2, and the armv7
2002   target is for Android running on modern ARM architectures.
2003 * [The `rust-gdb` and `rust-lldb` scripts are distributed on all
2004   Unix platforms](https://github.com/rust-lang/rust/pull/32835).
2005 * [On Unix the runtime aborts by calling `libc::abort` instead of
2006   generating an illegal instruction](https://github.com/rust-lang/rust/pull/31457).
2007 * [Rust is now bootstrapped from the previous release of Rust,
2008   instead of a snapshot from an arbitrary commit](https://github.com/rust-lang/rust/pull/32942).
2009
2010 Compatibility Notes
2011 -------------------
2012
2013 * [`AtomicBool` is now bool-sized, not word-sized](https://github.com/rust-lang/rust/pull/33579).
2014 * [`target_env` for Linux ARM targets is just `gnu`, not
2015   `gnueabihf`, `gnueabi`, etc](https://github.com/rust-lang/rust/pull/33403).
2016 * [Consistently panic on overflow in `Duration::new`](https://github.com/rust-lang/rust/pull/33072).
2017 * [Change `String::truncate` to panic less](https://github.com/rust-lang/rust/pull/32977).
2018 * [Add `:block` to the follow set for `:ty` and `:path`](https://github.com/rust-lang/rust/pull/32945).
2019   Affects how macros are parsed.
2020 * [Fix macro hygiene bug](https://github.com/rust-lang/rust/pull/32923).
2021 * [Feature-gated attributes on macro-generated macro invocations are
2022   now rejected](https://github.com/rust-lang/rust/pull/32791).
2023 * [Suppress fallback and ambiguity errors during type inference](https://github.com/rust-lang/rust/pull/32258).
2024   This caused some minor changes to type inference.
2025
2026
2027 Version 1.9.0 (2016-05-26)
2028 ==========================
2029
2030 Language
2031 --------
2032
2033 * The `#[deprecated]` attribute when applied to an API will generate
2034   warnings when used. The warnings may be suppressed with
2035   `#[allow(deprecated)]`. [RFC 1270].
2036 * [`fn` item types are zero sized, and each `fn` names a unique
2037   type][1.9fn]. This will break code that transmutes `fn`s, so calling
2038   `transmute` on a `fn` type will generate a warning for a few cycles,
2039   then will be converted to an error.
2040 * [Field and method resolution understand visibility, so private
2041   fields and methods cannot prevent the proper use of public fields
2042   and methods][1.9fv].
2043 * [The parser considers unicode codepoints in the
2044   `PATTERN_WHITE_SPACE` category to be whitespace][1.9ws].
2045
2046 Stabilized APIs
2047 ---------------
2048
2049 * [`std::panic`]
2050 * [`std::panic::catch_unwind`][] (renamed from `recover`)
2051 * [`std::panic::resume_unwind`][] (renamed from `propagate`)
2052 * [`std::panic::AssertUnwindSafe`][] (renamed from `AssertRecoverSafe`)
2053 * [`std::panic::UnwindSafe`][] (renamed from `RecoverSafe`)
2054 * [`str::is_char_boundary`]
2055 * [`<*const T>::as_ref`]
2056 * [`<*mut T>::as_ref`]
2057 * [`<*mut T>::as_mut`]
2058 * [`AsciiExt::make_ascii_uppercase`]
2059 * [`AsciiExt::make_ascii_lowercase`]
2060 * [`char::decode_utf16`]
2061 * [`char::DecodeUtf16`]
2062 * [`char::DecodeUtf16Error`]
2063 * [`char::DecodeUtf16Error::unpaired_surrogate`]
2064 * [`BTreeSet::take`]
2065 * [`BTreeSet::replace`]
2066 * [`BTreeSet::get`]
2067 * [`HashSet::take`]
2068 * [`HashSet::replace`]
2069 * [`HashSet::get`]
2070 * [`OsString::with_capacity`]
2071 * [`OsString::clear`]
2072 * [`OsString::capacity`]
2073 * [`OsString::reserve`]
2074 * [`OsString::reserve_exact`]
2075 * [`OsStr::is_empty`]
2076 * [`OsStr::len`]
2077 * [`std::os::unix::thread`]
2078 * [`RawPthread`]
2079 * [`JoinHandleExt`]
2080 * [`JoinHandleExt::as_pthread_t`]
2081 * [`JoinHandleExt::into_pthread_t`]
2082 * [`HashSet::hasher`]
2083 * [`HashMap::hasher`]
2084 * [`CommandExt::exec`]
2085 * [`File::try_clone`]
2086 * [`SocketAddr::set_ip`]
2087 * [`SocketAddr::set_port`]
2088 * [`SocketAddrV4::set_ip`]
2089 * [`SocketAddrV4::set_port`]
2090 * [`SocketAddrV6::set_ip`]
2091 * [`SocketAddrV6::set_port`]
2092 * [`SocketAddrV6::set_flowinfo`]
2093 * [`SocketAddrV6::set_scope_id`]
2094 * [`slice::copy_from_slice`]
2095 * [`ptr::read_volatile`]
2096 * [`ptr::write_volatile`]
2097 * [`OpenOptions::create_new`]
2098 * [`TcpStream::set_nodelay`]
2099 * [`TcpStream::nodelay`]
2100 * [`TcpStream::set_ttl`]
2101 * [`TcpStream::ttl`]
2102 * [`TcpStream::set_only_v6`]
2103 * [`TcpStream::only_v6`]
2104 * [`TcpStream::take_error`]
2105 * [`TcpStream::set_nonblocking`]
2106 * [`TcpListener::set_ttl`]
2107 * [`TcpListener::ttl`]
2108 * [`TcpListener::set_only_v6`]
2109 * [`TcpListener::only_v6`]
2110 * [`TcpListener::take_error`]
2111 * [`TcpListener::set_nonblocking`]
2112 * [`UdpSocket::set_broadcast`]
2113 * [`UdpSocket::broadcast`]
2114 * [`UdpSocket::set_multicast_loop_v4`]
2115 * [`UdpSocket::multicast_loop_v4`]
2116 * [`UdpSocket::set_multicast_ttl_v4`]
2117 * [`UdpSocket::multicast_ttl_v4`]
2118 * [`UdpSocket::set_multicast_loop_v6`]
2119 * [`UdpSocket::multicast_loop_v6`]
2120 * [`UdpSocket::set_multicast_ttl_v6`]
2121 * [`UdpSocket::multicast_ttl_v6`]
2122 * [`UdpSocket::set_ttl`]
2123 * [`UdpSocket::ttl`]
2124 * [`UdpSocket::set_only_v6`]
2125 * [`UdpSocket::only_v6`]
2126 * [`UdpSocket::join_multicast_v4`]
2127 * [`UdpSocket::join_multicast_v6`]
2128 * [`UdpSocket::leave_multicast_v4`]
2129 * [`UdpSocket::leave_multicast_v6`]
2130 * [`UdpSocket::take_error`]
2131 * [`UdpSocket::connect`]
2132 * [`UdpSocket::send`]
2133 * [`UdpSocket::recv`]
2134 * [`UdpSocket::set_nonblocking`]
2135
2136 Libraries
2137 ---------
2138
2139 * [`std::sync::Once` is poisoned if its initialization function
2140   fails][1.9o].
2141 * [`cell::Ref` and `cell::RefMut` can contain unsized types][1.9cu].
2142 * [Most types implement `fmt::Debug`][1.9db].
2143 * [The default buffer size used by `BufReader` and `BufWriter` was
2144   reduced to 8K, from 64K][1.9bf]. This is in line with the buffer size
2145   used by other languages.
2146 * [`Instant`, `SystemTime` and `Duration` implement `+=` and `-=`.
2147   `Duration` additionally implements `*=` and `/=`][1.9ta].
2148 * [`Skip` is a `DoubleEndedIterator`][1.9sk].
2149 * [`From<[u8; 4]>` is implemented for `Ipv4Addr`][1.9fi].
2150 * [`Chain` implements `BufRead`][1.9ch].
2151 * [`HashMap`, `HashSet` and iterators are covariant][1.9hc].
2152
2153 Cargo
2154 -----
2155
2156 * [Cargo can now run concurrently][1.9cc].
2157 * [Top-level overrides allow specific revisions of crates to be
2158   overridden through the entire crate graph][1.9ct].  This is intended
2159   to make upgrades easier for large projects, by allowing crates to be
2160   forked temporarily until they've been upgraded and republished.
2161 * [Cargo exports a `CARGO_PKG_AUTHORS` environment variable][1.9cp].
2162 * [Cargo will pass the contents of the `RUSTFLAGS` variable to `rustc`
2163   on the commandline][1.9cf]. `rustc` arguments can also be specified
2164   in the `build.rustflags` configuration key.
2165
2166 Performance
2167 -----------
2168
2169 * [The time complexity of comparing variables for equivalence during type
2170   unification is reduced from _O_(_n_!) to _O_(_n_)][1.9tu]. This leads
2171   to major compilation time improvement in some scenarios.
2172 * [`ToString` is specialized for `str`, giving it the same performance
2173   as `to_owned`][1.9ts].
2174 * [Spawning processes with `Command::output` no longer creates extra
2175   threads][1.9sp].
2176 * [`#[derive(PartialEq)]` and `#[derive(PartialOrd)]` emit less code
2177   for C-like enums][1.9cl].
2178
2179 Misc
2180 ----
2181
2182 * [Passing the `--quiet` flag to a test runner will produce
2183   much-abbreviated output][1.9q].
2184 * The Rust Project now publishes std binaries for the
2185   `mips-unknown-linux-musl`, `mipsel-unknown-linux-musl`, and
2186   `i586-pc-windows-msvc` targets.
2187
2188 Compatibility Notes
2189 -------------------
2190
2191 * [`std::sync::Once` is poisoned if its initialization function
2192   fails][1.9o].
2193 * [It is illegal to define methods with the same name in overlapping
2194   inherent `impl` blocks][1.9sn].
2195 * [`fn` item types are zero sized, and each `fn` names a unique
2196   type][1.9fn]. This will break code that transmutes `fn`s, so calling
2197   `transmute` on a `fn` type will generate a warning for a few cycles,
2198   then will be converted to an error.
2199 * [Improvements to const evaluation may trigger new errors when integer
2200   literals are out of range][1.9ce].
2201
2202
2203 [1.9bf]: https://github.com/rust-lang/rust/pull/32695
2204 [1.9cc]: https://github.com/rust-lang/cargo/pull/2486
2205 [1.9ce]: https://github.com/rust-lang/rust/pull/30587
2206 [1.9cf]: https://github.com/rust-lang/cargo/pull/2241
2207 [1.9ch]: https://github.com/rust-lang/rust/pull/32541
2208 [1.9cl]: https://github.com/rust-lang/rust/pull/31977
2209 [1.9cp]: https://github.com/rust-lang/cargo/pull/2465
2210 [1.9ct]: https://github.com/rust-lang/cargo/pull/2385
2211 [1.9cu]: https://github.com/rust-lang/rust/pull/32652
2212 [1.9db]: https://github.com/rust-lang/rust/pull/32054
2213 [1.9fi]: https://github.com/rust-lang/rust/pull/32050
2214 [1.9fn]: https://github.com/rust-lang/rust/pull/31710
2215 [1.9fv]: https://github.com/rust-lang/rust/pull/31938
2216 [1.9hc]: https://github.com/rust-lang/rust/pull/32635
2217 [1.9o]: https://github.com/rust-lang/rust/pull/32325
2218 [1.9q]: https://github.com/rust-lang/rust/pull/31887
2219 [1.9sk]: https://github.com/rust-lang/rust/pull/31700
2220 [1.9sn]: https://github.com/rust-lang/rust/pull/31925
2221 [1.9sp]: https://github.com/rust-lang/rust/pull/31618
2222 [1.9ta]: https://github.com/rust-lang/rust/pull/32448
2223 [1.9ts]: https://github.com/rust-lang/rust/pull/32586
2224 [1.9tu]: https://github.com/rust-lang/rust/pull/32062
2225 [1.9ws]: https://github.com/rust-lang/rust/pull/29734
2226 [RFC 1270]: https://github.com/rust-lang/rfcs/blob/master/text/1270-deprecation.md
2227 [`<*const T>::as_ref`]: http://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.as_ref
2228 [`<*mut T>::as_mut`]: http://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.as_mut
2229 [`<*mut T>::as_ref`]: http://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.as_ref
2230 [`slice::copy_from_slice`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.copy_from_slice
2231 [`AsciiExt::make_ascii_lowercase`]: http://doc.rust-lang.org/nightly/std/ascii/trait.AsciiExt.html#tymethod.make_ascii_lowercase
2232 [`AsciiExt::make_ascii_uppercase`]: http://doc.rust-lang.org/nightly/std/ascii/trait.AsciiExt.html#tymethod.make_ascii_uppercase
2233 [`BTreeSet::get`]: http://doc.rust-lang.org/nightly/collections/btree/set/struct.BTreeSet.html#method.get
2234 [`BTreeSet::replace`]: http://doc.rust-lang.org/nightly/collections/btree/set/struct.BTreeSet.html#method.replace
2235 [`BTreeSet::take`]: http://doc.rust-lang.org/nightly/collections/btree/set/struct.BTreeSet.html#method.take
2236 [`CommandExt::exec`]: http://doc.rust-lang.org/nightly/std/os/unix/process/trait.CommandExt.html#tymethod.exec
2237 [`File::try_clone`]: http://doc.rust-lang.org/nightly/std/fs/struct.File.html#method.try_clone
2238 [`HashMap::hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashMap.html#method.hasher
2239 [`HashSet::get`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.get
2240 [`HashSet::hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.hasher
2241 [`HashSet::replace`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.replace
2242 [`HashSet::take`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.take
2243 [`JoinHandleExt::as_pthread_t`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/trait.JoinHandleExt.html#tymethod.as_pthread_t
2244 [`JoinHandleExt::into_pthread_t`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/trait.JoinHandleExt.html#tymethod.into_pthread_t
2245 [`JoinHandleExt`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/trait.JoinHandleExt.html
2246 [`OpenOptions::create_new`]: http://doc.rust-lang.org/nightly/std/fs/struct.OpenOptions.html#method.create_new
2247 [`OsStr::is_empty`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsStr.html#method.is_empty
2248 [`OsStr::len`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsStr.html#method.len
2249 [`OsString::capacity`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.capacity
2250 [`OsString::clear`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.clear
2251 [`OsString::reserve_exact`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.reserve_exact
2252 [`OsString::reserve`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.reserve
2253 [`OsString::with_capacity`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.with_capacity
2254 [`RawPthread`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/type.RawPthread.html
2255 [`SocketAddr::set_ip`]: http://doc.rust-lang.org/nightly/std/net/enum.SocketAddr.html#method.set_ip
2256 [`SocketAddr::set_port`]: http://doc.rust-lang.org/nightly/std/net/enum.SocketAddr.html#method.set_port
2257 [`SocketAddrV4::set_ip`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV4.html#method.set_ip
2258 [`SocketAddrV4::set_port`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV4.html#method.set_port
2259 [`SocketAddrV6::set_flowinfo`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_flowinfo
2260 [`SocketAddrV6::set_ip`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_ip
2261 [`SocketAddrV6::set_port`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_port
2262 [`SocketAddrV6::set_scope_id`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_scope_id
2263 [`TcpListener::only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.only_v6
2264 [`TcpListener::set_nonblocking`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_nonblocking
2265 [`TcpListener::set_only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_only_v6
2266 [`TcpListener::set_ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_ttl
2267 [`TcpListener::take_error`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.take_error
2268 [`TcpListener::ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.ttl
2269 [`TcpStream::nodelay`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.nodelay
2270 [`TcpStream::only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.only_v6
2271 [`TcpStream::set_nodelay`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_nodelay
2272 [`TcpStream::set_nonblocking`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_nonblocking
2273 [`TcpStream::set_only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_only_v6
2274 [`TcpStream::set_ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_ttl
2275 [`TcpStream::take_error`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.take_error
2276 [`TcpStream::ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.ttl
2277 [`UdpSocket::broadcast`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.broadcast
2278 [`UdpSocket::connect`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.connect
2279 [`UdpSocket::join_multicast_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.join_multicast_v4
2280 [`UdpSocket::join_multicast_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.join_multicast_v6
2281 [`UdpSocket::leave_multicast_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.leave_multicast_v4
2282 [`UdpSocket::leave_multicast_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.leave_multicast_v6
2283 [`UdpSocket::multicast_loop_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_loop_v4
2284 [`UdpSocket::multicast_loop_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_loop_v6
2285 [`UdpSocket::multicast_ttl_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_ttl_v4
2286 [`UdpSocket::multicast_ttl_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_ttl_v6
2287 [`UdpSocket::only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.only_v6
2288 [`UdpSocket::recv`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.recv
2289 [`UdpSocket::send`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.send
2290 [`UdpSocket::set_broadcast`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_broadcast
2291 [`UdpSocket::set_multicast_loop_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_loop_v4
2292 [`UdpSocket::set_multicast_loop_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_loop_v6
2293 [`UdpSocket::set_multicast_ttl_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_ttl_v4
2294 [`UdpSocket::set_multicast_ttl_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_ttl_v6
2295 [`UdpSocket::set_nonblocking`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_nonblocking
2296 [`UdpSocket::set_only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_only_v6
2297 [`UdpSocket::set_ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_ttl
2298 [`UdpSocket::take_error`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.take_error
2299 [`UdpSocket::ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.ttl
2300 [`char::DecodeUtf16Error::unpaired_surrogate`]: http://doc.rust-lang.org/nightly/std/char/struct.DecodeUtf16Error.html#method.unpaired_surrogate
2301 [`char::DecodeUtf16Error`]: http://doc.rust-lang.org/nightly/std/char/struct.DecodeUtf16Error.html
2302 [`char::DecodeUtf16`]: http://doc.rust-lang.org/nightly/std/char/struct.DecodeUtf16.html
2303 [`char::decode_utf16`]: http://doc.rust-lang.org/nightly/std/char/fn.decode_utf16.html
2304 [`ptr::read_volatile`]: http://doc.rust-lang.org/nightly/std/ptr/fn.read_volatile.html
2305 [`ptr::write_volatile`]: http://doc.rust-lang.org/nightly/std/ptr/fn.write_volatile.html
2306 [`std::os::unix::thread`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/index.html
2307 [`std::panic::AssertUnwindSafe`]: http://doc.rust-lang.org/nightly/std/panic/struct.AssertUnwindSafe.html
2308 [`std::panic::UnwindSafe`]: http://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html
2309 [`std::panic::catch_unwind`]: http://doc.rust-lang.org/nightly/std/panic/fn.catch_unwind.html
2310 [`std::panic::resume_unwind`]: http://doc.rust-lang.org/nightly/std/panic/fn.resume_unwind.html
2311 [`std::panic`]: http://doc.rust-lang.org/nightly/std/panic/index.html
2312 [`str::is_char_boundary`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.is_char_boundary
2313
2314
2315 Version 1.8.0 (2016-04-14)
2316 ==========================
2317
2318 Language
2319 --------
2320
2321 * Rust supports overloading of compound assignment statements like
2322   `+=` by implementing the [`AddAssign`], [`SubAssign`],
2323   [`MulAssign`], [`DivAssign`], [`RemAssign`], [`BitAndAssign`],
2324   [`BitOrAssign`], [`BitXorAssign`], [`ShlAssign`], or [`ShrAssign`]
2325   traits. [RFC 953].
2326 * Empty structs can be defined with braces, as in `struct Foo { }`, in
2327   addition to the non-braced form, `struct Foo;`. [RFC 218].
2328
2329 Libraries
2330 ---------
2331
2332 * Stabilized APIs:
2333   * [`str::encode_utf16`][] (renamed from `utf16_units`)
2334   * [`str::EncodeUtf16`][] (renamed from `Utf16Units`)
2335   * [`Ref::map`]
2336   * [`RefMut::map`]
2337   * [`ptr::drop_in_place`]
2338   * [`time::Instant`]
2339   * [`time::SystemTime`]
2340   * [`Instant::now`]
2341   * [`Instant::duration_since`][] (renamed from `duration_from_earlier`)
2342   * [`Instant::elapsed`]
2343   * [`SystemTime::now`]
2344   * [`SystemTime::duration_since`][] (renamed from `duration_from_earlier`)
2345   * [`SystemTime::elapsed`]
2346   * Various `Add`/`Sub` impls for `Time` and `SystemTime`
2347   * [`SystemTimeError`]
2348   * [`SystemTimeError::duration`]
2349   * Various impls for `SystemTimeError`
2350   * [`UNIX_EPOCH`]
2351   * [`AddAssign`], [`SubAssign`], [`MulAssign`], [`DivAssign`],
2352     [`RemAssign`], [`BitAndAssign`], [`BitOrAssign`],
2353     [`BitXorAssign`], [`ShlAssign`], [`ShrAssign`].
2354 * [The `write!` and `writeln!` macros correctly emit errors if any of
2355   their arguments can't be formatted][1.8w].
2356 * [Various I/O functions support large files on 32-bit Linux][1.8l].
2357 * [The Unix-specific `raw` modules, which contain a number of
2358   redefined C types are deprecated][1.8r], including `os::raw::unix`,
2359   `os::raw::macos`, and `os::raw::linux`. These modules defined types
2360   such as `ino_t` and `dev_t`. The inconsistency of these definitions
2361   across platforms was making it difficult to implement `std`
2362   correctly. Those that need these definitions should use the `libc`
2363   crate. [RFC 1415].
2364 * The Unix-specific `MetadataExt` traits, including
2365   `os::unix::fs::MetadataExt`, which expose values such as inode
2366   numbers [no longer return platform-specific types][1.8r], but
2367   instead return widened integers. [RFC 1415].
2368 * [`btree_set::{IntoIter, Iter, Range}` are covariant][1.8cv].
2369 * [Atomic loads and stores are not volatile][1.8a].
2370 * [All types in `sync::mpsc` implement `fmt::Debug`][1.8mp].
2371
2372 Performance
2373 -----------
2374
2375 * [Inlining hash functions lead to a 3% compile-time improvement in
2376   some workloads][1.8h].
2377 * When using jemalloc, its symbols are [unprefixed so that it
2378   overrides the libc malloc implementation][1.8h]. This means that for
2379   rustc, LLVM is now using jemalloc, which results in a 6%
2380   compile-time improvement on a specific workload.
2381 * [Avoid quadratic growth in function size due to cleanups][1.8cu].
2382
2383 Misc
2384 ----
2385
2386 * [32-bit MSVC builds finally implement unwinding][1.8ms].
2387   i686-pc-windows-msvc is now considered a tier-1 platform.
2388 * [The `--print targets` flag prints a list of supported targets][1.8t].
2389 * [The `--print cfg` flag prints the `cfg`s defined for the current
2390   target][1.8cf].
2391 * [`rustc` can be built with an new Cargo-based build system, written
2392   in Rust][1.8b].  It will eventually replace Rust's Makefile-based
2393   build system. To enable it configure with `configure --rustbuild`.
2394 * [Errors for non-exhaustive `match` patterns now list up to 3 missing
2395   variants while also indicating the total number of missing variants
2396   if more than 3][1.8m].
2397 * [Executable stacks are disabled on Linux and BSD][1.8nx].
2398 * The Rust Project now publishes binary releases of the standard
2399   library for a number of tier-2 targets:
2400   `armv7-unknown-linux-gnueabihf`, `powerpc-unknown-linux-gnu`,
2401   `powerpc64-unknown-linux-gnu`, `powerpc64le-unknown-linux-gnu`
2402   `x86_64-rumprun-netbsd`. These can be installed with
2403   tools such as [multirust][1.8mr].
2404
2405 Cargo
2406 -----
2407
2408 * [`cargo init` creates a new Cargo project in the current
2409   directory][1.8ci].  It is otherwise like `cargo new`.
2410 * [Cargo has configuration keys for `-v` and
2411   `--color`][1.8cc]. `verbose` and `color`, respectively, go in the
2412   `[term]` section of `.cargo/config`.
2413 * [Configuration keys that evaluate to strings or integers can be set
2414   via environment variables][1.8ce]. For example the `build.jobs` key
2415   can be set via `CARGO_BUILD_JOBS`. Environment variables take
2416   precedence over config files.
2417 * [Target-specific dependencies support Rust `cfg` syntax for
2418   describing targets][1.8cfg] so that dependencies for multiple
2419   targets can be specified together. [RFC 1361].
2420 * [The environment variables `CARGO_TARGET_ROOT`, `RUSTC`, and
2421   `RUSTDOC` take precedence over the `build.target-dir`,
2422   `build.rustc`, and `build.rustdoc` configuration values][1.8cv].
2423 * [The child process tree is killed on Windows when Cargo is
2424   killed][1.8ck].
2425 * [The `build.target` configuration value sets the target platform,
2426   like `--target`][1.8ct].
2427
2428 Compatibility Notes
2429 -------------------
2430
2431 * [Unstable compiler flags have been further restricted][1.8u]. Since
2432   1.0 `-Z` flags have been considered unstable, and other flags that
2433   were considered unstable additionally required passing `-Z
2434   unstable-options` to access. Unlike unstable language and library
2435   features though, these options have been accessible on the stable
2436   release channel. Going forward, *new unstable flags will not be
2437   available on the stable release channel*, and old unstable flags
2438   will warn about their usage. In the future, all unstable flags will
2439   be unavailable on the stable release channel.
2440 * [It is no longer possible to `match` on empty enum variants using
2441   the `Variant(..)` syntax][1.8v]. This has been a warning since 1.6.
2442 * The Unix-specific `MetadataExt` traits, including
2443   `os::unix::fs::MetadataExt`, which expose values such as inode
2444   numbers [no longer return platform-specific types][1.8r], but
2445   instead return widened integers. [RFC 1415].
2446 * [Modules sourced from the filesystem cannot appear within arbitrary
2447   blocks, but only within other modules][1.8mf].
2448 * [`--cfg` compiler flags are parsed strictly as identifiers][1.8c].
2449 * On Unix, [stack overflow triggers a runtime abort instead of a
2450   SIGSEGV][1.8so].
2451 * [`Command::spawn` and its equivalents return an error if any of
2452   its command-line arguments contain interior `NUL`s][1.8n].
2453 * [Tuple and unit enum variants from other crates are in the type
2454   namespace][1.8tn].
2455 * [On Windows `rustc` emits `.lib` files for the `staticlib` library
2456   type instead of `.a` files][1.8st]. Additionally, for the MSVC
2457   toolchain, `rustc` emits import libraries named `foo.dll.lib`
2458   instead of `foo.lib`.
2459
2460
2461 [1.8a]: https://github.com/rust-lang/rust/pull/30962
2462 [1.8b]: https://github.com/rust-lang/rust/pull/31123
2463 [1.8c]: https://github.com/rust-lang/rust/pull/31530
2464 [1.8cc]: https://github.com/rust-lang/cargo/pull/2397
2465 [1.8ce]: https://github.com/rust-lang/cargo/pull/2398
2466 [1.8cf]: https://github.com/rust-lang/rust/pull/31278
2467 [1.8cfg]: https://github.com/rust-lang/cargo/pull/2328
2468 [1.8ci]: https://github.com/rust-lang/cargo/pull/2081
2469 [1.8ck]: https://github.com/rust-lang/cargo/pull/2370
2470 [1.8ct]: https://github.com/rust-lang/cargo/pull/2335
2471 [1.8cu]: https://github.com/rust-lang/rust/pull/31390
2472 [1.8cv]: https://github.com/rust-lang/cargo/issues/2365
2473 [1.8cv]: https://github.com/rust-lang/rust/pull/30998
2474 [1.8h]: https://github.com/rust-lang/rust/pull/31460
2475 [1.8l]: https://github.com/rust-lang/rust/pull/31668
2476 [1.8m]: https://github.com/rust-lang/rust/pull/31020
2477 [1.8mf]: https://github.com/rust-lang/rust/pull/31534
2478 [1.8mp]: https://github.com/rust-lang/rust/pull/30894
2479 [1.8mr]: https://users.rust-lang.org/t/multirust-0-8-with-cross-std-installation/4901
2480 [1.8ms]: https://github.com/rust-lang/rust/pull/30448
2481 [1.8n]: https://github.com/rust-lang/rust/pull/31056
2482 [1.8nx]: https://github.com/rust-lang/rust/pull/30859
2483 [1.8r]: https://github.com/rust-lang/rust/pull/31551
2484 [1.8so]: https://github.com/rust-lang/rust/pull/31333
2485 [1.8st]: https://github.com/rust-lang/rust/pull/29520
2486 [1.8t]: https://github.com/rust-lang/rust/pull/31358
2487 [1.8tn]: https://github.com/rust-lang/rust/pull/30882
2488 [1.8u]: https://github.com/rust-lang/rust/pull/31793
2489 [1.8v]: https://github.com/rust-lang/rust/pull/31757
2490 [1.8w]: https://github.com/rust-lang/rust/pull/31904
2491 [RFC 1361]: https://github.com/rust-lang/rfcs/blob/master/text/1361-cargo-cfg-dependencies.md
2492 [RFC 1415]: https://github.com/rust-lang/rfcs/blob/master/text/1415-trim-std-os.md
2493 [RFC 218]: https://github.com/rust-lang/rfcs/blob/master/text/0218-empty-struct-with-braces.md
2494 [RFC 953]: https://github.com/rust-lang/rfcs/blob/master/text/0953-op-assign.md
2495 [`AddAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.AddAssign.html
2496 [`BitAndAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.BitAndAssign.html
2497 [`BitOrAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.BitOrAssign.html
2498 [`BitXorAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.BitXorAssign.html
2499 [`DivAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.DivAssign.html
2500 [`Instant::duration_since`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html#method.duration_since
2501 [`Instant::elapsed`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html#method.elapsed
2502 [`Instant::now`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html#method.now
2503 [`MulAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.MulAssign.html
2504 [`Ref::map`]: http://doc.rust-lang.org/nightly/std/cell/struct.Ref.html#method.map
2505 [`RefMut::map`]: http://doc.rust-lang.org/nightly/std/cell/struct.RefMut.html#method.map
2506 [`RemAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.RemAssign.html
2507 [`ShlAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.ShlAssign.html
2508 [`ShrAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.ShrAssign.html
2509 [`SubAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.SubAssign.html
2510 [`SystemTime::duration_since`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html#method.duration_since
2511 [`SystemTime::elapsed`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html#method.elapsed
2512 [`SystemTime::now`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html#method.now
2513 [`SystemTimeError::duration`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTimeError.html#method.duration
2514 [`SystemTimeError`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTimeError.html
2515 [`UNIX_EPOCH`]: http://doc.rust-lang.org/nightly/std/time/constant.UNIX_EPOCH.html
2516 [`ptr::drop_in_place`]: http://doc.rust-lang.org/nightly/std/ptr/fn.drop_in_place.html
2517 [`str::EncodeUtf16`]: http://doc.rust-lang.org/nightly/std/str/struct.EncodeUtf16.html
2518 [`str::encode_utf16`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.encode_utf16
2519 [`time::Instant`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html
2520 [`time::SystemTime`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html
2521
2522
2523 Version 1.7.0 (2016-03-03)
2524 ==========================
2525
2526 Libraries
2527 ---------
2528
2529 * Stabilized APIs
2530   * `Path`
2531     * [`Path::strip_prefix`][] (renamed from relative_from)
2532     * [`path::StripPrefixError`][] (new error type returned from strip_prefix)
2533   * `Ipv4Addr`
2534     * [`Ipv4Addr::is_loopback`]
2535     * [`Ipv4Addr::is_private`]
2536     * [`Ipv4Addr::is_link_local`]
2537     * [`Ipv4Addr::is_multicast`]
2538     * [`Ipv4Addr::is_broadcast`]
2539     * [`Ipv4Addr::is_documentation`]
2540   * `Ipv6Addr`
2541     * [`Ipv6Addr::is_unspecified`]
2542     * [`Ipv6Addr::is_loopback`]
2543     * [`Ipv6Addr::is_multicast`]
2544   * `Vec`
2545     * [`Vec::as_slice`]
2546     * [`Vec::as_mut_slice`]
2547   * `String`
2548     * [`String::as_str`]
2549     * [`String::as_mut_str`]
2550   * Slices
2551     * `<[T]>::`[`clone_from_slice`], which now requires the two slices to
2552     be the same length
2553     * `<[T]>::`[`sort_by_key`]
2554   * checked, saturated, and overflowing operations
2555     * [`i32::checked_rem`], [`i32::checked_neg`], [`i32::checked_shl`], [`i32::checked_shr`]
2556     * [`i32::saturating_mul`]
2557     * [`i32::overflowing_add`], [`i32::overflowing_sub`], [`i32::overflowing_mul`], [`i32::overflowing_div`]
2558     * [`i32::overflowing_rem`], [`i32::overflowing_neg`], [`i32::overflowing_shl`], [`i32::overflowing_shr`]
2559     * [`u32::checked_rem`], [`u32::checked_neg`], [`u32::checked_shl`], [`u32::checked_shl`]
2560     * [`u32::saturating_mul`]
2561     * [`u32::overflowing_add`], [`u32::overflowing_sub`], [`u32::overflowing_mul`], [`u32::overflowing_div`]
2562     * [`u32::overflowing_rem`], [`u32::overflowing_neg`], [`u32::overflowing_shl`], [`u32::overflowing_shr`]
2563     * and checked, saturated, and overflowing operations for other primitive types
2564   * FFI
2565     * [`ffi::IntoStringError`]
2566     * [`CString::into_string`]
2567     * [`CString::into_bytes`]
2568     * [`CString::into_bytes_with_nul`]
2569     * `From<CString> for Vec<u8>`
2570   * `IntoStringError`
2571     * [`IntoStringError::into_cstring`]
2572     * [`IntoStringError::utf8_error`]
2573     * `Error for IntoStringError`
2574   * Hashing
2575     * [`std::hash::BuildHasher`]
2576     * [`BuildHasher::Hasher`]
2577     * [`BuildHasher::build_hasher`]
2578     * [`std::hash::BuildHasherDefault`]
2579     * [`HashMap::with_hasher`]
2580     * [`HashMap::with_capacity_and_hasher`]
2581     * [`HashSet::with_hasher`]
2582     * [`HashSet::with_capacity_and_hasher`]
2583     * [`std::collections::hash_map::RandomState`]
2584     * [`RandomState::new`]
2585 * [Validating UTF-8 is faster by a factor of between 7 and 14x for
2586   ASCII input][1.7utf8]. This means that creating `String`s and `str`s
2587   from bytes is faster.
2588 * [The performance of `LineWriter` (and thus `io::stdout`) was
2589   improved by using `memchr` to search for newlines][1.7m].
2590 * [`f32::to_degrees` and `f32::to_radians` are stable][1.7f]. The
2591   `f64` variants were stabilized previously.
2592 * [`BTreeMap` was rewritten to use less memory and improve the performance
2593   of insertion and iteration, the latter by as much as 5x][1.7bm].
2594 * [`BTreeSet` and its iterators, `Iter`, `IntoIter`, and `Range` are
2595   covariant over their contained type][1.7bt].
2596 * [`LinkedList` and its iterators, `Iter` and `IntoIter` are covariant
2597   over their contained type][1.7ll].
2598 * [`str::replace` now accepts a `Pattern`][1.7rp], like other string
2599   searching methods.
2600 * [`Any` is implemented for unsized types][1.7a].
2601 * [`Hash` is implemented for `Duration`][1.7h].
2602
2603 Misc
2604 ----
2605
2606 * [When running tests with `--test`, rustdoc will pass `--cfg`
2607   arguments to the compiler][1.7dt].
2608 * [The compiler is built with RPATH information by default][1.7rpa].
2609   This means that it will be possible to run `rustc` when installed in
2610   unusual configurations without configuring the dynamic linker search
2611   path explicitly.
2612 * [`rustc` passes `--enable-new-dtags` to GNU ld][1.7dta]. This makes
2613   any RPATH entries (emitted with `-C rpath`) *not* take precedence
2614   over `LD_LIBRARY_PATH`.
2615
2616 Cargo
2617 -----
2618
2619 * [`cargo rustc` accepts a `--profile` flag that runs `rustc` under
2620   any of the compilation profiles, 'dev', 'bench', or 'test'][1.7cp].
2621 * [The `rerun-if-changed` build script directive no longer causes the
2622   build script to incorrectly run twice in certain scenarios][1.7rr].
2623
2624 Compatibility Notes
2625 -------------------
2626
2627 * Soundness fixes to the interactions between associated types and
2628   lifetimes, specified in [RFC 1214], [now generate errors][1.7sf] for
2629   code that violates the new rules. This is a significant change that
2630   is known to break existing code, so it has emitted warnings for the
2631   new error cases since 1.4 to give crate authors time to adapt. The
2632   details of what is changing are subtle; read the RFC for more.
2633 * [Several bugs in the compiler's visibility calculations were
2634   fixed][1.7v]. Since this was found to break significant amounts of
2635   code, the new errors will be emitted as warnings for several release
2636   cycles, under the `private_in_public` lint.
2637 * Defaulted type parameters were accidentally accepted in positions
2638   that were not intended. In this release, [defaulted type parameters
2639   appearing outside of type definitions will generate a
2640   warning][1.7d], which will become an error in future releases.
2641 * [Parsing "." as a float results in an error instead of 0][1.7p].
2642   That is, `".".parse::<f32>()` returns `Err`, not `Ok(0.0)`.
2643 * [Borrows of closure parameters may not outlive the closure][1.7bc].
2644
2645 [1.7a]: https://github.com/rust-lang/rust/pull/30928
2646 [1.7bc]: https://github.com/rust-lang/rust/pull/30341
2647 [1.7bm]: https://github.com/rust-lang/rust/pull/30426
2648 [1.7bt]: https://github.com/rust-lang/rust/pull/30998
2649 [1.7cp]: https://github.com/rust-lang/cargo/pull/2224
2650 [1.7d]: https://github.com/rust-lang/rust/pull/30724
2651 [1.7dt]: https://github.com/rust-lang/rust/pull/30372
2652 [1.7dta]: https://github.com/rust-lang/rust/pull/30394
2653 [1.7f]: https://github.com/rust-lang/rust/pull/30672
2654 [1.7h]: https://github.com/rust-lang/rust/pull/30818
2655 [1.7ll]: https://github.com/rust-lang/rust/pull/30663
2656 [1.7m]: https://github.com/rust-lang/rust/pull/30381
2657 [1.7p]: https://github.com/rust-lang/rust/pull/30681
2658 [1.7rp]: https://github.com/rust-lang/rust/pull/29498
2659 [1.7rpa]: https://github.com/rust-lang/rust/pull/30353
2660 [1.7rr]: https://github.com/rust-lang/cargo/pull/2279
2661 [1.7sf]: https://github.com/rust-lang/rust/pull/30389
2662 [1.7utf8]: https://github.com/rust-lang/rust/pull/30740
2663 [1.7v]: https://github.com/rust-lang/rust/pull/29973
2664 [RFC 1214]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
2665 [`BuildHasher::Hasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hasher.html
2666 [`BuildHasher::build_hasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.BuildHasher.html#tymethod.build_hasher
2667 [`CString::into_bytes_with_nul`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_bytes_with_nul
2668 [`CString::into_bytes`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_bytes
2669 [`CString::into_string`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_string
2670 [`HashMap::with_capacity_and_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashMap.html#method.with_capacity_and_hasher
2671 [`HashMap::with_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashMap.html#method.with_hasher
2672 [`HashSet::with_capacity_and_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.with_capacity_and_hasher
2673 [`HashSet::with_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.with_hasher
2674 [`IntoStringError::into_cstring`]: http://doc.rust-lang.org/nightly/std/ffi/struct.IntoStringError.html#method.into_cstring
2675 [`IntoStringError::utf8_error`]: http://doc.rust-lang.org/nightly/std/ffi/struct.IntoStringError.html#method.utf8_error
2676 [`Ipv4Addr::is_broadcast`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_broadcast
2677 [`Ipv4Addr::is_documentation`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_documentation
2678 [`Ipv4Addr::is_link_local`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_link_local
2679 [`Ipv4Addr::is_loopback`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_loopback
2680 [`Ipv4Addr::is_multicast`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_multicast
2681 [`Ipv4Addr::is_private`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_private
2682 [`Ipv6Addr::is_loopback`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_loopback
2683 [`Ipv6Addr::is_multicast`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_multicast
2684 [`Ipv6Addr::is_unspecified`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_unspecified
2685 [`Path::strip_prefix`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.strip_prefix
2686 [`RandomState::new`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.RandomState.html#method.new
2687 [`String::as_mut_str`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.as_mut_str
2688 [`String::as_str`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.as_str
2689 [`Vec::as_mut_slice`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.as_mut_slice
2690 [`Vec::as_slice`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.as_slice
2691 [`clone_from_slice`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.clone_from_slice
2692 [`ffi::IntoStringError`]: http://doc.rust-lang.org/nightly/std/ffi/struct.IntoStringError.html
2693 [`i32::checked_neg`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_neg
2694 [`i32::checked_rem`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_rem
2695 [`i32::checked_shl`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_shl
2696 [`i32::checked_shr`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_shr
2697 [`i32::overflowing_add`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_add
2698 [`i32::overflowing_div`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_div
2699 [`i32::overflowing_mul`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_mul
2700 [`i32::overflowing_neg`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_neg
2701 [`i32::overflowing_rem`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_rem
2702 [`i32::overflowing_shl`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_shl
2703 [`i32::overflowing_shr`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_shr
2704 [`i32::overflowing_sub`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_sub
2705 [`i32::saturating_mul`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.saturating_mul
2706 [`path::StripPrefixError`]: http://doc.rust-lang.org/nightly/std/path/struct.StripPrefixError.html
2707 [`sort_by_key`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.sort_by_key
2708 [`std::collections::hash_map::RandomState`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.RandomState.html
2709 [`std::hash::BuildHasherDefault`]: http://doc.rust-lang.org/nightly/std/hash/struct.BuildHasherDefault.html
2710 [`std::hash::BuildHasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.BuildHasher.html
2711 [`u32::checked_neg`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_neg
2712 [`u32::checked_rem`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_rem
2713 [`u32::checked_neg`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_neg
2714 [`u32::checked_shl`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_shl
2715 [`u32::overflowing_add`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_add
2716 [`u32::overflowing_div`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_div
2717 [`u32::overflowing_mul`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_mul
2718 [`u32::overflowing_neg`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_neg
2719 [`u32::overflowing_rem`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_rem
2720 [`u32::overflowing_shl`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_shl
2721 [`u32::overflowing_shr`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_shr
2722 [`u32::overflowing_sub`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_sub
2723 [`u32::saturating_mul`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.saturating_mul
2724
2725
2726 Version 1.6.0 (2016-01-21)
2727 ==========================
2728
2729 Language
2730 --------
2731
2732 * The `#![no_std]` attribute causes a crate to not be linked to the
2733   standard library, but only the [core library][1.6co], as described
2734   in [RFC 1184]. The core library defines common types and traits but
2735   has no platform dependencies whatsoever, and is the basis for Rust
2736   software in environments that cannot support a full port of the
2737   standard library, such as operating systems. Most of the core
2738   library is now stable.
2739
2740 Libraries
2741 ---------
2742
2743 * Stabilized APIs:
2744   [`Read::read_exact`],
2745   [`ErrorKind::UnexpectedEof`][] (renamed from `UnexpectedEOF`),
2746   [`fs::DirBuilder`], [`fs::DirBuilder::new`],
2747   [`fs::DirBuilder::recursive`], [`fs::DirBuilder::create`],
2748   [`os::unix::fs::DirBuilderExt`],
2749   [`os::unix::fs::DirBuilderExt::mode`], [`vec::Drain`],
2750   [`vec::Vec::drain`], [`string::Drain`], [`string::String::drain`],
2751   [`vec_deque::Drain`], [`vec_deque::VecDeque::drain`],
2752   [`collections::hash_map::Drain`],
2753   [`collections::hash_map::HashMap::drain`],
2754   [`collections::hash_set::Drain`],
2755   [`collections::hash_set::HashSet::drain`],
2756   [`collections::binary_heap::Drain`],
2757   [`collections::binary_heap::BinaryHeap::drain`],
2758   [`Vec::extend_from_slice`][] (renamed from `push_all`),
2759   [`Mutex::get_mut`], [`Mutex::into_inner`], [`RwLock::get_mut`],
2760   [`RwLock::into_inner`],
2761   [`Iterator::min_by_key`][] (renamed from `min_by`),
2762   [`Iterator::max_by_key`][] (renamed from `max_by`).
2763 * The [core library][1.6co] is stable, as are most of its APIs.
2764 * [The `assert_eq!` macro supports arguments that don't implement
2765   `Sized`][1.6ae], such as arrays. In this way it behaves more like
2766   `assert!`.
2767 * Several timer functions that take duration in milliseconds [are
2768   deprecated in favor of those that take `Duration`][1.6ms]. These
2769   include `Condvar::wait_timeout_ms`, `thread::sleep_ms`, and
2770   `thread::park_timeout_ms`.
2771 * The algorithm by which `Vec` reserves additional elements was
2772   [tweaked to not allocate excessive space][1.6a] while still growing
2773   exponentially.
2774 * `From` conversions are [implemented from integers to floats][1.6f]
2775   in cases where the conversion is lossless. Thus they are not
2776   implemented for 32-bit ints to `f32`, nor for 64-bit ints to `f32`
2777   or `f64`. They are also not implemented for `isize` and `usize`
2778   because the implementations would be platform-specific. `From` is
2779   also implemented from `f32` to `f64`.
2780 * `From<&Path>` and `From<PathBuf>` are implemented for `Cow<Path>`.
2781 * `From<T>` is implemented for `Box<T>`, `Rc<T>` and `Arc<T>`.
2782 * `IntoIterator` is implemented for `&PathBuf` and `&Path`.
2783 * [`BinaryHeap` was refactored][1.6bh] for modest performance
2784   improvements.
2785 * Sorting slices that are already sorted [is 50% faster in some
2786   cases][1.6s].
2787
2788 Cargo
2789 -----
2790
2791 * Cargo will look in `$CARGO_HOME/bin` for subcommands [by default][1.6c].
2792 * Cargo build scripts can specify their dependencies by emitting the
2793   [`rerun-if-changed`][1.6rr] key.
2794 * crates.io will reject publication of crates with dependencies that
2795   have a wildcard version constraint. Crates with wildcard
2796   dependencies were seen to cause a variety of problems, as described
2797   in [RFC 1241]. Since 1.5 publication of such crates has emitted a
2798   warning.
2799 * `cargo clean` [accepts a `--release` flag][1.6cc] to clean the
2800   release folder.  A variety of artifacts that Cargo failed to clean
2801   are now correctly deleted.
2802
2803 Misc
2804 ----
2805
2806 * The `unreachable_code` lint [warns when a function call's argument
2807   diverges][1.6dv].
2808 * The parser indicates [failures that may be caused by
2809   confusingly-similar Unicode characters][1.6uc]
2810 * Certain macro errors [are reported at definition time][1.6m], not
2811   expansion.
2812
2813 Compatibility Notes
2814 -------------------
2815
2816 * The compiler no longer makes use of the [`RUST_PATH`][1.6rp]
2817   environment variable when locating crates. This was a pre-cargo
2818   feature for integrating with the package manager that was
2819   accidentally never removed.
2820 * [A number of bugs were fixed in the privacy checker][1.6p] that
2821   could cause previously-accepted code to break.
2822 * [Modules and unit/tuple structs may not share the same name][1.6ts].
2823 * [Bugs in pattern matching unit structs were fixed][1.6us]. The tuple
2824   struct pattern syntax (`Foo(..)`) can no longer be used to match
2825   unit structs. This is a warning now, but will become an error in
2826   future releases. Patterns that share the same name as a const are
2827   now an error.
2828 * A bug was fixed that causes [rustc not to apply default type
2829   parameters][1.6xc] when resolving certain method implementations of
2830   traits defined in other crates.
2831
2832 [1.6a]: https://github.com/rust-lang/rust/pull/29454
2833 [1.6ae]: https://github.com/rust-lang/rust/pull/29770
2834 [1.6bh]: https://github.com/rust-lang/rust/pull/29811
2835 [1.6c]: https://github.com/rust-lang/cargo/pull/2192
2836 [1.6cc]: https://github.com/rust-lang/cargo/pull/2131
2837 [1.6co]: http://doc.rust-lang.org/beta/core/index.html
2838 [1.6dv]: https://github.com/rust-lang/rust/pull/30000
2839 [1.6f]: https://github.com/rust-lang/rust/pull/29129
2840 [1.6m]: https://github.com/rust-lang/rust/pull/29828
2841 [1.6ms]: https://github.com/rust-lang/rust/pull/29604
2842 [1.6p]: https://github.com/rust-lang/rust/pull/29726
2843 [1.6rp]: https://github.com/rust-lang/rust/pull/30034
2844 [1.6rr]: https://github.com/rust-lang/cargo/pull/2134
2845 [1.6s]: https://github.com/rust-lang/rust/pull/29675
2846 [1.6ts]: https://github.com/rust-lang/rust/issues/21546
2847 [1.6uc]: https://github.com/rust-lang/rust/pull/29837
2848 [1.6us]: https://github.com/rust-lang/rust/pull/29383
2849 [1.6xc]: https://github.com/rust-lang/rust/issues/30123
2850 [RFC 1184]: https://github.com/rust-lang/rfcs/blob/master/text/1184-stabilize-no_std.md
2851 [RFC 1241]: https://github.com/rust-lang/rfcs/blob/master/text/1241-no-wildcard-deps.md
2852 [`ErrorKind::UnexpectedEof`]: http://doc.rust-lang.org/nightly/std/io/enum.ErrorKind.html#variant.UnexpectedEof
2853 [`Iterator::max_by_key`]: http://doc.rust-lang.org/nightly/std/iter/trait.Iterator.html#method.max_by_key
2854 [`Iterator::min_by_key`]: http://doc.rust-lang.org/nightly/std/iter/trait.Iterator.html#method.min_by_key
2855 [`Mutex::get_mut`]: http://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html#method.get_mut
2856 [`Mutex::into_inner`]: http://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html#method.into_inner
2857 [`Read::read_exact`]: http://doc.rust-lang.org/nightly/std/io/trait.Read.html#method.read_exact
2858 [`RwLock::get_mut`]: http://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html#method.get_mut
2859 [`RwLock::into_inner`]: http://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html#method.into_inner
2860 [`Vec::extend_from_slice`]: http://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html#method.extend_from_slice
2861 [`collections::binary_heap::BinaryHeap::drain`]: http://doc.rust-lang.org/nightly/std/collections/binary_heap/struct.BinaryHeap.html#method.drain
2862 [`collections::binary_heap::Drain`]: http://doc.rust-lang.org/nightly/std/collections/binary_heap/struct.Drain.html
2863 [`collections::hash_map::Drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.Drain.html
2864 [`collections::hash_map::HashMap::drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.HashMap.html#method.drain
2865 [`collections::hash_set::Drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_set/struct.Drain.html
2866 [`collections::hash_set::HashSet::drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_set/struct.HashSet.html#method.drain
2867 [`fs::DirBuilder::create`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html#method.create
2868 [`fs::DirBuilder::new`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html#method.new
2869 [`fs::DirBuilder::recursive`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html#method.recursive
2870 [`fs::DirBuilder`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html
2871 [`os::unix::fs::DirBuilderExt::mode`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.DirBuilderExt.html#tymethod.mode
2872 [`os::unix::fs::DirBuilderExt`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.DirBuilderExt.html
2873 [`string::Drain`]: http://doc.rust-lang.org/nightly/std/string/struct.Drain.html
2874 [`string::String::drain`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.drain
2875 [`vec::Drain`]: http://doc.rust-lang.org/nightly/std/vec/struct.Drain.html
2876 [`vec::Vec::drain`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.drain
2877 [`vec_deque::Drain`]: http://doc.rust-lang.org/nightly/std/collections/vec_deque/struct.Drain.html
2878 [`vec_deque::VecDeque::drain`]: http://doc.rust-lang.org/nightly/std/collections/vec_deque/struct.VecDeque.html#method.drain
2879
2880
2881 Version 1.5.0 (2015-12-10)
2882 ==========================
2883
2884 * ~700 changes, numerous bugfixes
2885
2886 Highlights
2887 ----------
2888
2889 * Stabilized APIs:
2890   [`BinaryHeap::from`], [`BinaryHeap::into_sorted_vec`],
2891   [`BinaryHeap::into_vec`], [`Condvar::wait_timeout`],
2892   [`FileTypeExt::is_block_device`], [`FileTypeExt::is_char_device`],
2893   [`FileTypeExt::is_fifo`], [`FileTypeExt::is_socket`],
2894   [`FileTypeExt`], [`Formatter::alternate`], [`Formatter::fill`],
2895   [`Formatter::precision`], [`Formatter::sign_aware_zero_pad`],
2896   [`Formatter::sign_minus`], [`Formatter::sign_plus`],
2897   [`Formatter::width`], [`Iterator::cmp`], [`Iterator::eq`],
2898   [`Iterator::ge`], [`Iterator::gt`], [`Iterator::le`],
2899   [`Iterator::lt`], [`Iterator::ne`], [`Iterator::partial_cmp`],
2900   [`Path::canonicalize`], [`Path::exists`], [`Path::is_dir`],
2901   [`Path::is_file`], [`Path::metadata`], [`Path::read_dir`],
2902   [`Path::read_link`], [`Path::symlink_metadata`],
2903   [`Utf8Error::valid_up_to`], [`Vec::resize`],
2904   [`VecDeque::as_mut_slices`], [`VecDeque::as_slices`],
2905   [`VecDeque::insert`], [`VecDeque::shrink_to_fit`],
2906   [`VecDeque::swap_remove_back`], [`VecDeque::swap_remove_front`],
2907   [`slice::split_first_mut`], [`slice::split_first`],
2908   [`slice::split_last_mut`], [`slice::split_last`],
2909   [`char::from_u32_unchecked`], [`fs::canonicalize`],
2910   [`str::MatchIndices`], [`str::RMatchIndices`],
2911   [`str::match_indices`], [`str::rmatch_indices`],
2912   [`str::slice_mut_unchecked`], [`string::ParseError`].
2913 * Rust applications hosted on crates.io can be installed locally to
2914   `~/.cargo/bin` with the [`cargo install`] command. Among other
2915   things this makes it easier to augment Cargo with new subcommands:
2916   when a binary named e.g. `cargo-foo` is found in `$PATH` it can be
2917   invoked as `cargo foo`.
2918 * Crates with wildcard (`*`) dependencies will [emit warnings when
2919   published][1.5w]. In 1.6 it will no longer be possible to publish
2920   crates with wildcard dependencies.
2921
2922 Breaking Changes
2923 ----------------
2924
2925 * The rules determining when a particular lifetime must outlive
2926   a particular value (known as '[dropck]') have been [modified
2927   to not rely on parametricity][1.5p].
2928 * [Implementations of `AsRef` and `AsMut` were added to `Box`, `Rc`,
2929   and `Arc`][1.5a]. Because these smart pointer types implement
2930   `Deref`, this causes breakage in cases where the interior type
2931   contains methods of the same name.
2932 * [Correct a bug in Rc/Arc][1.5c] that caused [dropck] to be unaware
2933   that they could drop their content. Soundness fix.
2934 * All method invocations are [properly checked][1.5wf1] for
2935   [well-formedness][1.5wf2]. Soundness fix.
2936 * Traits whose supertraits contain `Self` are [not object
2937   safe][1.5o]. Soundness fix.
2938 * Target specifications support a [`no_default_libraries`][1.5nd]
2939   setting that controls whether `-nodefaultlibs` is passed to the
2940   linker, and in turn the `is_like_windows` setting no longer affects
2941   the `-nodefaultlibs` flag.
2942 * `#[derive(Show)]`, long-deprecated, [has been removed][1.5ds].
2943 * The `#[inline]` and `#[repr]` attributes [can only appear
2944   in valid locations][1.5at].
2945 * Native libraries linked from the local crate are [passed to
2946   the linker before native libraries from upstream crates][1.5nl].
2947 * Two rarely-used attributes, `#[no_debug]` and
2948   `#[omit_gdb_pretty_printer_section]` [are feature gated][1.5fg].
2949 * Negation of unsigned integers, which has been a warning for
2950   several releases, [is now behind a feature gate and will
2951   generate errors][1.5nu].
2952 * The parser accidentally accepted visibility modifiers on
2953   enum variants, a bug [which has been fixed][1.5ev].
2954 * [A bug was fixed that allowed `use` statements to import unstable
2955   features][1.5use].
2956
2957 Language
2958 --------
2959
2960 * When evaluating expressions at compile-time that are not
2961   compile-time constants (const-evaluating expressions in non-const
2962   contexts), incorrect code such as overlong bitshifts and arithmetic
2963   overflow will [generate a warning instead of an error][1.5ce],
2964   delaying the error until runtime. This will allow the
2965   const-evaluator to be expanded in the future backwards-compatibly.
2966 * The `improper_ctypes` lint [no longer warns about using `isize` and
2967   `usize` in FFI][1.5ict].
2968
2969 Libraries
2970 ---------
2971
2972 * `Arc<T>` and `Rc<T>` are [covariant with respect to `T` instead of
2973   invariant][1.5c].
2974 * `Default` is [implemented for mutable slices][1.5d].
2975 * `FromStr` is [implemented for `SockAddrV4` and `SockAddrV6`][1.5s].
2976 * There are now `From` conversions [between floating point
2977   types][1.5f] where the conversions are lossless.
2978 * Thera are now `From` conversions [between integer types][1.5i] where
2979   the conversions are lossless.
2980 * [`fs::Metadata` implements `Clone`][1.5fs].
2981 * The `parse` method [accepts a leading "+" when parsing
2982   integers][1.5pi].
2983 * [`AsMut` is implemented for `Vec`][1.5am].
2984 * The `clone_from` implementations for `String` and `BinaryHeap` [have
2985   been optimized][1.5cf] and no longer rely on the default impl.
2986 * The `extern "Rust"`, `extern "C"`, `unsafe extern "Rust"` and
2987   `unsafe extern "C"` function types now [implement `Clone`,
2988   `PartialEq`, `Eq`, `PartialOrd`, `Ord`, `Hash`, `fmt::Pointer`, and
2989   `fmt::Debug` for up to 12 arguments][1.5fp].
2990 * [Dropping `Vec`s is much faster in unoptimized builds when the
2991   element types don't implement `Drop`][1.5dv].
2992 * A bug that caused in incorrect behavior when [combining `VecDeque`
2993   with zero-sized types][1.5vdz] was resolved.
2994 * [`PartialOrd` for slices is faster][1.5po].
2995
2996 Miscellaneous
2997 -------------
2998
2999 * [Crate metadata size was reduced by 20%][1.5md].
3000 * [Improvements to code generation reduced the size of libcore by 3.3
3001   MB and rustc's memory usage by 18MB][1.5m].
3002 * [Improvements to deref translation increased performance in
3003   unoptimized builds][1.5dr].
3004 * Various errors in trait resolution [are deduplicated to only be
3005   reported once][1.5te].
3006 * Rust has preliminary [support for rumprun kernels][1.5rr].
3007 * Rust has preliminary [support for NetBSD on amd64][1.5na].
3008
3009 [1.5use]: https://github.com/rust-lang/rust/pull/28364
3010 [1.5po]: https://github.com/rust-lang/rust/pull/28436
3011 [1.5ev]: https://github.com/rust-lang/rust/pull/28442
3012 [1.5nu]: https://github.com/rust-lang/rust/pull/28468
3013 [1.5dr]: https://github.com/rust-lang/rust/pull/28491
3014 [1.5vdz]: https://github.com/rust-lang/rust/pull/28494
3015 [1.5md]: https://github.com/rust-lang/rust/pull/28521
3016 [1.5fg]: https://github.com/rust-lang/rust/pull/28522
3017 [1.5dv]: https://github.com/rust-lang/rust/pull/28531
3018 [1.5na]: https://github.com/rust-lang/rust/pull/28543
3019 [1.5fp]: https://github.com/rust-lang/rust/pull/28560
3020 [1.5rr]: https://github.com/rust-lang/rust/pull/28593
3021 [1.5cf]: https://github.com/rust-lang/rust/pull/28602
3022 [1.5nl]: https://github.com/rust-lang/rust/pull/28605
3023 [1.5te]: https://github.com/rust-lang/rust/pull/28645
3024 [1.5at]: https://github.com/rust-lang/rust/pull/28650
3025 [1.5am]: https://github.com/rust-lang/rust/pull/28663
3026 [1.5m]: https://github.com/rust-lang/rust/pull/28778
3027 [1.5ict]: https://github.com/rust-lang/rust/pull/28779
3028 [1.5a]: https://github.com/rust-lang/rust/pull/28811
3029 [1.5pi]: https://github.com/rust-lang/rust/pull/28826
3030 [1.5ce]: https://github.com/rust-lang/rfcs/blob/master/text/1229-compile-time-asserts.md
3031 [1.5p]: https://github.com/rust-lang/rfcs/blob/master/text/1238-nonparametric-dropck.md
3032 [1.5i]: https://github.com/rust-lang/rust/pull/28921
3033 [1.5fs]: https://github.com/rust-lang/rust/pull/29021
3034 [1.5f]: https://github.com/rust-lang/rust/pull/29129
3035 [1.5ds]: https://github.com/rust-lang/rust/pull/29148
3036 [1.5s]: https://github.com/rust-lang/rust/pull/29190
3037 [1.5d]: https://github.com/rust-lang/rust/pull/29245
3038 [1.5o]: https://github.com/rust-lang/rust/pull/29259
3039 [1.5nd]: https://github.com/rust-lang/rust/pull/28578
3040 [1.5wf2]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
3041 [1.5wf1]: https://github.com/rust-lang/rust/pull/28669
3042 [dropck]: https://doc.rust-lang.org/nightly/nomicon/dropck.html
3043 [1.5c]: https://github.com/rust-lang/rust/pull/29110
3044 [1.5w]: https://github.com/rust-lang/rfcs/blob/master/text/1241-no-wildcard-deps.md
3045 [`cargo install`]: https://github.com/rust-lang/rfcs/blob/master/text/1200-cargo-install.md
3046 [`BinaryHeap::from`]: http://doc.rust-lang.org/nightly/std/convert/trait.From.html#method.from
3047 [`BinaryHeap::into_sorted_vec`]: http://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html#method.into_sorted_vec
3048 [`BinaryHeap::into_vec`]: http://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html#method.into_vec
3049 [`Condvar::wait_timeout`]: http://doc.rust-lang.org/nightly/std/sync/struct.Condvar.html#method.wait_timeout
3050 [`FileTypeExt::is_block_device`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_block_device
3051 [`FileTypeExt::is_char_device`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_char_device
3052 [`FileTypeExt::is_fifo`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_fifo
3053 [`FileTypeExt::is_socket`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_socket
3054 [`FileTypeExt`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html
3055 [`Formatter::alternate`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.alternate
3056 [`Formatter::fill`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.fill
3057 [`Formatter::precision`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.precision
3058 [`Formatter::sign_aware_zero_pad`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.sign_aware_zero_pad
3059 [`Formatter::sign_minus`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.sign_minus
3060 [`Formatter::sign_plus`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.sign_plus
3061 [`Formatter::width`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.width
3062 [`Iterator::cmp`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.cmp
3063 [`Iterator::eq`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.eq
3064 [`Iterator::ge`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.ge
3065 [`Iterator::gt`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.gt
3066 [`Iterator::le`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.le
3067 [`Iterator::lt`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.lt
3068 [`Iterator::ne`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.ne
3069 [`Iterator::partial_cmp`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.partial_cmp
3070 [`Path::canonicalize`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.canonicalize
3071 [`Path::exists`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.exists
3072 [`Path::is_dir`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.is_dir
3073 [`Path::is_file`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.is_file
3074 [`Path::metadata`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.metadata
3075 [`Path::read_dir`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.read_dir
3076 [`Path::read_link`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.read_link
3077 [`Path::symlink_metadata`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.symlink_metadata
3078 [`Utf8Error::valid_up_to`]: http://doc.rust-lang.org/nightly/core/str/struct.Utf8Error.html#method.valid_up_to
3079 [`Vec::resize`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.resize
3080 [`VecDeque::as_mut_slices`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.as_mut_slices
3081 [`VecDeque::as_slices`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.as_slices
3082 [`VecDeque::insert`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.insert
3083 [`VecDeque::shrink_to_fit`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.shrink_to_fit
3084 [`VecDeque::swap_remove_back`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.swap_remove_back
3085 [`VecDeque::swap_remove_front`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.swap_remove_front
3086 [`slice::split_first_mut`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_first_mut
3087 [`slice::split_first`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_first
3088 [`slice::split_last_mut`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_last_mut
3089 [`slice::split_last`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_last
3090 [`char::from_u32_unchecked`]: http://doc.rust-lang.org/nightly/std/char/fn.from_u32_unchecked.html
3091 [`fs::canonicalize`]: http://doc.rust-lang.org/nightly/std/fs/fn.canonicalize.html
3092 [`str::MatchIndices`]: http://doc.rust-lang.org/nightly/std/str/struct.MatchIndices.html
3093 [`str::RMatchIndices`]: http://doc.rust-lang.org/nightly/std/str/struct.RMatchIndices.html
3094 [`str::match_indices`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.match_indices
3095 [`str::rmatch_indices`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.rmatch_indices
3096 [`str::slice_mut_unchecked`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.slice_mut_unchecked
3097 [`string::ParseError`]: http://doc.rust-lang.org/nightly/std/string/enum.ParseError.html
3098
3099 Version 1.4.0 (2015-10-29)
3100 ==========================
3101
3102 * ~1200 changes, numerous bugfixes
3103
3104 Highlights
3105 ----------
3106
3107 * Windows builds targeting the 64-bit MSVC ABI and linker (instead of
3108   GNU) are now supported and recommended for use.
3109
3110 Breaking Changes
3111 ----------------
3112
3113 * [Several changes have been made to fix type soundness and improve
3114   the behavior of associated types][sound]. See [RFC 1214]. Although
3115   we have mostly introduced these changes as warnings this release, to
3116   become errors next release, there are still some scenarios that will
3117   see immediate breakage.
3118 * [The `str::lines` and `BufRead::lines` iterators treat `\r\n` as
3119   line breaks in addition to `\n`][crlf].
3120 * [Loans of `'static` lifetime extend to the end of a function][stat].
3121 * [`str::parse` no longer introduces avoidable rounding error when
3122   parsing floating point numbers. Together with earlier changes to
3123   float formatting/output, "round trips" like f.to_string().parse()
3124   now preserve the value of f exactly. Additionally, leading plus
3125   signs are now accepted][fp3].
3126
3127
3128 Language
3129 --------
3130
3131 * `use` statements that import multiple items [can now rename
3132   them][i], as in `use foo::{bar as kitten, baz as puppy}`.
3133 * [Binops work correctly on fat pointers][binfat].
3134 * `pub extern crate`, which does not behave as expected, [issues a
3135   warning][pec] until a better solution is found.
3136
3137 Libraries
3138 ---------
3139
3140 * [Many APIs were stabilized][stab]: `<Box<str>>::into_string`,
3141   [`Arc::downgrade`], [`Arc::get_mut`], [`Arc::make_mut`],
3142   [`Arc::try_unwrap`], [`Box::from_raw`], [`Box::into_raw`], [`CStr::to_str`],
3143   [`CStr::to_string_lossy`], [`CString::from_raw`], [`CString::into_raw`],
3144   [`IntoRawFd::into_raw_fd`], [`IntoRawFd`],
3145   `IntoRawHandle::into_raw_handle`, `IntoRawHandle`,
3146   `IntoRawSocket::into_raw_socket`, `IntoRawSocket`, [`Rc::downgrade`],
3147   [`Rc::get_mut`], [`Rc::make_mut`], [`Rc::try_unwrap`], [`Result::expect`],
3148   [`String::into_boxed_str`], [`TcpStream::read_timeout`],
3149   [`TcpStream::set_read_timeout`], [`TcpStream::set_write_timeout`],
3150   [`TcpStream::write_timeout`], [`UdpSocket::read_timeout`],
3151   [`UdpSocket::set_read_timeout`], [`UdpSocket::set_write_timeout`],
3152   [`UdpSocket::write_timeout`], `Vec::append`, `Vec::split_off`,
3153   [`VecDeque::append`], [`VecDeque::retain`], [`VecDeque::split_off`],
3154   [`rc::Weak::upgrade`], [`rc::Weak`], [`slice::Iter::as_slice`],
3155   [`slice::IterMut::into_slice`], [`str::CharIndices::as_str`],
3156   [`str::Chars::as_str`], [`str::split_at_mut`], [`str::split_at`],
3157   [`sync::Weak::upgrade`], [`sync::Weak`], [`thread::park_timeout`],
3158   [`thread::sleep`].
3159 * [Some APIs were deprecated][dep]: `BTreeMap::with_b`,
3160   `BTreeSet::with_b`, `Option::as_mut_slice`, `Option::as_slice`,
3161   `Result::as_mut_slice`, `Result::as_slice`, `f32::from_str_radix`,
3162   `f64::from_str_radix`.
3163 * [Reverse-searching strings is faster with the 'two-way'
3164   algorithm][s].
3165 * [`std::io::copy` allows `?Sized` arguments][cc].
3166 * The `Windows`, `Chunks`, and `ChunksMut` iterators over slices all
3167   [override `count`, `nth` and `last` with an O(1)
3168   implementation][it].
3169 * [`Default` is implemented for arrays up to `[T; 32]`][d].
3170 * [`IntoRawFd` has been added to the Unix-specific prelude,
3171   `IntoRawSocket` and `IntoRawHandle` to the Windows-specific
3172   prelude][pr].
3173 * [`Extend<String>` and `FromIterator<String` are both implemented for
3174   `String`][es].
3175 * [`IntoIterator` is implemented for references to `Option` and
3176   `Result`][into2].
3177 * [`HashMap` and `HashSet` implement `Extend<&T>` where `T:
3178   Copy`][ext] as part of [RFC 839]. This will cause type inferance
3179   breakage in rare situations.
3180 * [`BinaryHeap` implements `Debug`][bh2].
3181 * [`Borrow` and `BorrowMut` are implemented for fixed-size
3182   arrays][bm].
3183 * [`extern fn`s with the "Rust" and "C" ABIs implement common
3184   traits including `Eq`, `Ord`, `Debug`, `Hash`][fp].
3185 * [String comparison is faster][faststr].
3186 * `&mut T` where `T: std::fmt::Write` [also implements
3187   `std::fmt::Write`][mutw].
3188 * [A stable regression in `VecDeque::push_back` and other
3189   capicity-altering methods that caused panics for zero-sized types
3190   was fixed][vd].
3191 * [Function pointers implement traits for up to 12 parameters][fp2].
3192
3193 Miscellaneous
3194 -------------
3195
3196 * The compiler [no longer uses the 'morestack' feature to prevent
3197   stack overflow][mm]. Instead it uses guard pages and stack
3198   probes (though stack probes are not yet implemented on any platform
3199   but Windows).
3200 * [The compiler matches traits faster when projections are involved][p].
3201 * The 'improper_ctypes' lint [no longer warns about use of `isize` and
3202   `usize`][ffi].
3203 * [Cargo now displays useful information about what its doing during
3204   `cargo update`][cu].
3205
3206 [`Arc::downgrade`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.downgrade
3207 [`Arc::make_mut`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.make_mut
3208 [`Arc::get_mut`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.get_mut
3209 [`Arc::try_unwrap`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.try_unwrap
3210 [`Box::from_raw`]: http://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html#method.from_raw
3211 [`Box::into_raw`]: http://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html#method.into_raw
3212 [`CStr::to_str`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html#method.to_str
3213 [`CStr::to_string_lossy`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html#method.to_string_lossy
3214 [`CString::from_raw`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.from_raw
3215 [`CString::into_raw`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_raw
3216 [`IntoRawFd::into_raw_fd`]: http://doc.rust-lang.org/nightly/std/os/unix/io/trait.IntoRawFd.html#tymethod.into_raw_fd
3217 [`IntoRawFd`]: http://doc.rust-lang.org/nightly/std/os/unix/io/trait.IntoRawFd.html
3218 [`Rc::downgrade`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.downgrade
3219 [`Rc::get_mut`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.get_mut
3220 [`Rc::make_mut`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.make_mut
3221 [`Rc::try_unwrap`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.try_unwrap
3222 [`Result::expect`]: http://doc.rust-lang.org/nightly/core/result/enum.Result.html#method.expect
3223 [`String::into_boxed_str`]: http://doc.rust-lang.org/nightly/collections/string/struct.String.html#method.into_boxed_str
3224 [`TcpStream::read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.read_timeout
3225 [`TcpStream::set_read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_read_timeout
3226 [`TcpStream::write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.write_timeout
3227 [`TcpStream::set_write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_write_timeout
3228 [`UdpSocket::read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.read_timeout
3229 [`UdpSocket::set_read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_read_timeout
3230 [`UdpSocket::write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.write_timeout
3231 [`UdpSocket::set_write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_write_timeout
3232 [`VecDeque::append`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.append
3233 [`VecDeque::retain`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.retain
3234 [`VecDeque::split_off`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.split_off
3235 [`rc::Weak::upgrade`]: http://doc.rust-lang.org/nightly/std/rc/struct.Weak.html#method.upgrade
3236 [`rc::Weak`]: http://doc.rust-lang.org/nightly/std/rc/struct.Weak.html
3237 [`slice::Iter::as_slice`]: http://doc.rust-lang.org/nightly/std/slice/struct.Iter.html#method.as_slice
3238 [`slice::IterMut::into_slice`]: http://doc.rust-lang.org/nightly/std/slice/struct.IterMut.html#method.into_slice
3239 [`str::CharIndices::as_str`]: http://doc.rust-lang.org/nightly/std/str/struct.CharIndices.html#method.as_str
3240 [`str::Chars::as_str`]: http://doc.rust-lang.org/nightly/std/str/struct.Chars.html#method.as_str
3241 [`str::split_at_mut`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_at_mut
3242 [`str::split_at`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_at
3243 [`sync::Weak::upgrade`]: http://doc.rust-lang.org/nightly/std/sync/struct.Weak.html#method.upgrade
3244 [`sync::Weak`]: http://doc.rust-lang.org/nightly/std/sync/struct.Weak.html
3245 [`thread::park_timeout`]: http://doc.rust-lang.org/nightly/std/thread/fn.park_timeout.html
3246 [`thread::sleep`]: http://doc.rust-lang.org/nightly/std/thread/fn.sleep.html
3247 [bh2]: https://github.com/rust-lang/rust/pull/28156
3248 [binfat]: https://github.com/rust-lang/rust/pull/28270
3249 [bm]: https://github.com/rust-lang/rust/pull/28197
3250 [cc]: https://github.com/rust-lang/rust/pull/27531
3251 [crlf]: https://github.com/rust-lang/rust/pull/28034
3252 [cu]: https://github.com/rust-lang/cargo/pull/1931
3253 [d]: https://github.com/rust-lang/rust/pull/27825
3254 [dep]: https://github.com/rust-lang/rust/pull/28339
3255 [es]: https://github.com/rust-lang/rust/pull/27956
3256 [ext]: https://github.com/rust-lang/rust/pull/28094
3257 [faststr]: https://github.com/rust-lang/rust/pull/28338
3258 [ffi]: https://github.com/rust-lang/rust/pull/28779
3259 [fp]: https://github.com/rust-lang/rust/pull/28268
3260 [fp2]: https://github.com/rust-lang/rust/pull/28560
3261 [fp3]: https://github.com/rust-lang/rust/pull/27307
3262 [i]: https://github.com/rust-lang/rust/pull/27451
3263 [into2]: https://github.com/rust-lang/rust/pull/28039
3264 [it]: https://github.com/rust-lang/rust/pull/27652
3265 [mm]: https://github.com/rust-lang/rust/pull/27338
3266 [mutw]: https://github.com/rust-lang/rust/pull/28368
3267 [sound]: https://github.com/rust-lang/rust/pull/27641
3268 [p]: https://github.com/rust-lang/rust/pull/27866
3269 [pec]: https://github.com/rust-lang/rust/pull/28486
3270 [pr]: https://github.com/rust-lang/rust/pull/27896
3271 [RFC 839]: https://github.com/rust-lang/rfcs/blob/master/text/0839-embrace-extend-extinguish.md
3272 [RFC 1214]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
3273 [s]: https://github.com/rust-lang/rust/pull/27474
3274 [stab]: https://github.com/rust-lang/rust/pull/28339
3275 [stat]: https://github.com/rust-lang/rust/pull/28321
3276 [vd]: https://github.com/rust-lang/rust/pull/28494
3277
3278 Version 1.3.0 (2015-09-17)
3279 ==============================
3280
3281 * ~900 changes, numerous bugfixes
3282
3283 Highlights
3284 ----------
3285
3286 * The [new object lifetime defaults][nold] have been [turned
3287   on][nold2] after a cycle of warnings about the change. Now types
3288   like `&'a Box<Trait>` (or `&'a Rc<Trait>`, etc) will change from
3289   being interpreted as `&'a Box<Trait+'a>` to `&'a
3290   Box<Trait+'static>`.
3291 * [The Rustonomicon][nom] is a new book in the official documentation
3292   that dives into writing unsafe Rust.
3293 * The [`Duration`] API, [has been stabilized][ds]. This basic unit of
3294   timekeeping is employed by other std APIs, as well as out-of-tree
3295   time crates.
3296
3297 Breaking Changes
3298 ----------------
3299
3300 * The [new object lifetime defaults][nold] have been [turned
3301   on][nold2] after a cycle of warnings about the change.
3302 * There is a known [regression][lr] in how object lifetime elision is
3303   interpreted, the proper solution for which is undetermined.
3304 * The `#[prelude_import]` attribute, an internal implementation
3305   detail, was accidentally stabilized previously. [It has been put
3306   behind the `prelude_import` feature gate][pi]. This change is
3307   believed to break no existing code.
3308 * The behavior of [`size_of_val`][dst1] and [`align_of_val`][dst2] is
3309   [more sane for dynamically sized types][dst3]. Code that relied on
3310   the previous behavior is thought to be broken.
3311 * The `dropck` rules, which checks that destructors can't access
3312   destroyed values, [have been updated][dropck] to match the
3313   [RFC][dropckrfc]. This fixes some soundness holes, and as such will
3314   cause some previously-compiling code to no longer build.
3315
3316 Language
3317 --------
3318
3319 * The [new object lifetime defaults][nold] have been [turned
3320   on][nold2] after a cycle of warnings about the change.
3321 * Semicolons may [now follow types and paths in
3322   macros](https://github.com/rust-lang/rust/pull/27000).
3323 * The behavior of [`size_of_val`][dst1] and [`align_of_val`][dst2] is
3324   [more sane for dynamically sized types][dst3]. Code that relied on
3325   the previous behavior is not known to exist, and suspected to be
3326   broken.
3327 * `'static` variables [may now be recursive][st].
3328 * `ref` bindings choose between [`Deref`] and [`DerefMut`]
3329   implementations correctly.
3330 * The `dropck` rules, which checks that destructors can't access
3331   destroyed values, [have been updated][dropck] to match the
3332   [RFC][dropckrfc].
3333
3334 Libraries
3335 ---------
3336
3337 * The [`Duration`] API, [has been stabilized][ds], as well as the
3338   `std::time` module, which presently contains only `Duration`.
3339 * `Box<str>` and `Box<[T]>` both implement `Clone`.
3340 * The owned C string, [`CString`], implements [`Borrow`] and the
3341   borrowed C string, [`CStr`], implements [`ToOwned`]. The two of
3342   these allow C strings to be borrowed and cloned in generic code.
3343 * [`CStr`] implements [`Debug`].
3344 * [`AtomicPtr`] implements [`Debug`].
3345 * [`Error`] trait objects [can be downcast to their concrete types][e]
3346   in many common configurations, using the [`is`], [`downcast`],
3347   [`downcast_ref`] and [`downcast_mut`] methods, similarly to the
3348   [`Any`] trait.
3349 * Searching for substrings now [employs the two-way algorithm][search]
3350   instead of doing a naive search. This gives major speedups to a
3351   number of methods, including [`contains`][sc], [`find`][sf],
3352   [`rfind`][srf], [`split`][ss]. [`starts_with`][ssw] and
3353   [`ends_with`][sew] are also faster.
3354 * The performance of `PartialEq` for slices is [much faster][ps].
3355 * The [`Hash`] trait offers the default method, [`hash_slice`], which
3356   is overridden and optimized by the implementations for scalars.
3357 * The [`Hasher`] trait now has a number of specialized `write_*`
3358   methods for primitive types, for efficiency.
3359 * The I/O-specific error type, [`std::io::Error`][ie], gained a set of
3360   methods for accessing the 'inner error', if any: [`get_ref`][iegr],
3361   [`get_mut`][iegm], [`into_inner`][ieii]. As well, the implementation
3362   of [`std::error::Error::cause`][iec] also delegates to the inner
3363   error.
3364 * [`process::Child`][pc] gained the [`id`] method, which returns a
3365   `u32` representing the platform-specific process identifier.
3366 * The [`connect`] method on slices is deprecated, replaced by the new
3367   [`join`] method (note that both of these are on the *unstable*
3368   [`SliceConcatExt`] trait, but through the magic of the prelude are
3369   available to stable code anyway).
3370 * The [`Div`] operator is implemented for [`Wrapping`] types.
3371 * [`DerefMut` is implemented for `String`][dms].
3372 * Performance of SipHash (the default hasher for `HashMap`) is
3373   [better for long data][sh].
3374 * [`AtomicPtr`] implements [`Send`].
3375 * The [`read_to_end`] implementations for [`Stdin`] and [`File`]
3376   are now [specialized to use uninitalized buffers for increased
3377   performance][rte].
3378 * Lifetime parameters of foreign functions [are now resolved
3379   properly][f].
3380
3381 Misc
3382 ----
3383
3384 * Rust can now, with some coercion, [produce programs that run on
3385   Windows XP][xp], though XP is not considered a supported platform.
3386 * Porting Rust on Windows from the GNU toolchain to MSVC continues
3387   ([1][win1], [2][win2], [3][win3], [4][win4]). It is still not
3388   recommended for use in 1.3, though should be fully-functional
3389   in the [64-bit 1.4 beta][b14].
3390 * On Fedora-based systems installation will [properly configure the
3391   dynamic linker][fl].
3392 * The compiler gained many new extended error descriptions, which can
3393   be accessed with the `--explain` flag.
3394 * The `dropck` pass, which checks that destructors can't access
3395   destroyed values, [has been rewritten][dropck]. This fixes some
3396   soundness holes, and as such will cause some previously-compiling
3397   code to no longer build.
3398 * `rustc` now uses [LLVM to write archive files where possible][ar].
3399   Eventually this will eliminate the compiler's dependency on the ar
3400   utility.
3401 * Rust has [preliminary support for i686 FreeBSD][fb] (it has long
3402   supported FreeBSD on x86_64).
3403 * The [`unused_mut`][lum], [`unconditional_recursion`][lur],
3404   [`improper_ctypes`][lic], and [`negate_unsigned`][lnu] lints are
3405   more strict.
3406 * If landing pads are disabled (with `-Z no-landing-pads`), [`panic!`
3407   will kill the process instead of leaking][nlp].
3408
3409 [`Any`]: http://doc.rust-lang.org/nightly/std/any/trait.Any.html
3410 [`AtomicPtr`]: http://doc.rust-lang.org/nightly/std/sync/atomic/struct.AtomicPtr.html
3411 [`Borrow`]: http://doc.rust-lang.org/nightly/std/borrow/trait.Borrow.html
3412 [`CStr`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html
3413 [`CString`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html
3414 [`Debug`]: http://doc.rust-lang.org/nightly/std/fmt/trait.Debug.html
3415 [`DerefMut`]: http://doc.rust-lang.org/nightly/std/ops/trait.DerefMut.html
3416 [`Deref`]: http://doc.rust-lang.org/nightly/std/ops/trait.Deref.html
3417 [`Div`]: http://doc.rust-lang.org/nightly/std/ops/trait.Div.html
3418 [`Duration`]: http://doc.rust-lang.org/nightly/std/time/struct.Duration.html
3419 [`Error`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html
3420 [`File`]: http://doc.rust-lang.org/nightly/std/fs/struct.File.html
3421 [`Hash`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html
3422 [`Hasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hasher.html
3423 [`Send`]: http://doc.rust-lang.org/nightly/std/marker/trait.Send.html
3424 [`SliceConcatExt`]: http://doc.rust-lang.org/nightly/std/slice/trait.SliceConcatExt.html
3425 [`Stdin`]: http://doc.rust-lang.org/nightly/std/io/struct.Stdin.html
3426 [`ToOwned`]: http://doc.rust-lang.org/nightly/std/borrow/trait.ToOwned.html
3427 [`Wrapping`]: http://doc.rust-lang.org/nightly/std/num/struct.Wrapping.html
3428 [`connect`]: http://doc.rust-lang.org/nightly/std/slice/trait.SliceConcatExt.html#method.connect
3429 [`downcast_mut`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.downcast_mut
3430 [`downcast_ref`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.downcast_ref
3431 [`downcast`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.downcast
3432 [`hash_slice`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html#method.hash_slice
3433 [`id`]: http://doc.rust-lang.org/nightly/std/process/struct.Child.html#method.id
3434 [`is`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.is
3435 [`join`]: http://doc.rust-lang.org/nightly/std/slice/trait.SliceConcatExt.html#method.join
3436 [`read_to_end`]: http://doc.rust-lang.org/nightly/std/io/trait.Read.html#method.read_to_end
3437 [ar]: https://github.com/rust-lang/rust/pull/26926
3438 [b14]: https://static.rust-lang.org/dist/rust-beta-x86_64-pc-windows-msvc.msi
3439 [dms]: https://github.com/rust-lang/rust/pull/26241
3440 [dropck]: https://github.com/rust-lang/rust/pull/27261
3441 [dropckrfc]: https://github.com/rust-lang/rfcs/blob/master/text/0769-sound-generic-drop.md
3442 [ds]: https://github.com/rust-lang/rust/pull/26818
3443 [dst1]: http://doc.rust-lang.org/nightly/std/mem/fn.size_of_val.html
3444 [dst2]: http://doc.rust-lang.org/nightly/std/mem/fn.align_of_val.html
3445 [dst3]: https://github.com/rust-lang/rust/pull/27351
3446 [e]: https://github.com/rust-lang/rust/pull/24793
3447 [f]: https://github.com/rust-lang/rust/pull/26588
3448 [fb]: https://github.com/rust-lang/rust/pull/26959
3449 [fl]: https://github.com/rust-lang/rust-installer/pull/41
3450 [hs]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html#method.hash_slice
3451 [ie]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html
3452 [iec]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.cause
3453 [iegm]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.get_mut
3454 [iegr]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.get_ref
3455 [ieii]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.into_inner
3456 [lic]: https://github.com/rust-lang/rust/pull/26583
3457 [lnu]: https://github.com/rust-lang/rust/pull/27026
3458 [lr]: https://github.com/rust-lang/rust/issues/27248
3459 [lum]: https://github.com/rust-lang/rust/pull/26378
3460 [lur]: https://github.com/rust-lang/rust/pull/26783
3461 [nlp]: https://github.com/rust-lang/rust/pull/27176
3462 [nold2]: https://github.com/rust-lang/rust/pull/27045
3463 [nold]: https://github.com/rust-lang/rfcs/blob/master/text/1156-adjust-default-object-bounds.md
3464 [nom]: http://doc.rust-lang.org/nightly/nomicon/
3465 [pc]: http://doc.rust-lang.org/nightly/std/process/struct.Child.html
3466 [pi]: https://github.com/rust-lang/rust/pull/26699
3467 [ps]: https://github.com/rust-lang/rust/pull/26884
3468 [rte]: https://github.com/rust-lang/rust/pull/26950
3469 [sc]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.contains
3470 [search]: https://github.com/rust-lang/rust/pull/26327
3471 [sew]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.ends_with
3472 [sf]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.find
3473 [sh]: https://github.com/rust-lang/rust/pull/27280
3474 [srf]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.rfind
3475 [ss]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split
3476 [ssw]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.starts_with
3477 [st]: https://github.com/rust-lang/rust/pull/26630
3478 [win1]: https://github.com/rust-lang/rust/pull/26569
3479 [win2]: https://github.com/rust-lang/rust/pull/26741
3480 [win3]: https://github.com/rust-lang/rust/pull/26741
3481 [win4]: https://github.com/rust-lang/rust/pull/27210
3482 [xp]: https://github.com/rust-lang/rust/pull/26569
3483
3484 Version 1.2.0 (2015-08-07)
3485 ==========================
3486
3487 * ~1200 changes, numerous bugfixes
3488
3489 Highlights
3490 ----------
3491
3492 * [Dynamically-sized-type coercions][dst] allow smart pointer types
3493   like `Rc` to contain types without a fixed size, arrays and trait
3494   objects, finally enabling use of `Rc<[T]>` and completing the
3495   implementation of DST.
3496 * [Parallel codegen][parcodegen] is now working again, which can
3497   substantially speed up large builds in debug mode; It also gets
3498   another ~33% speedup when bootstrapping on a 4 core machine (using 8
3499   jobs). It's not enabled by default, but will be "in the near
3500   future". It can be activated with the `-C codegen-units=N` flag to
3501   `rustc`.
3502 * This is the first release with [experimental support for linking
3503   with the MSVC linker and lib C on Windows (instead of using the GNU
3504   variants via MinGW)][win]. It is yet recommended only for the most
3505   intrepid Rusticians.
3506 * Benchmark compilations are showing a 30% improvement in
3507   bootstrapping over 1.1.
3508
3509 Breaking Changes
3510 ----------------
3511
3512 * The [`to_uppercase`] and [`to_lowercase`] methods on `char` now do
3513   unicode case mapping, which is a previously-planned change in
3514   behavior and considered a bugfix.
3515 * [`mem::align_of`] now specifies [the *minimum alignment* for
3516   T][align], which is usually the alignment programs are interested
3517   in, and the same value reported by clang's
3518   `alignof`. [`mem::min_align_of`] is deprecated. This is not known to
3519   break real code.
3520 * [The `#[packed]` attribute is no longer silently accepted by the
3521   compiler][packed]. This attribute did nothing and code that
3522   mentioned it likely did not work as intended.
3523 * Associated type defaults are [now behind the
3524   `associated_type_defaults` feature gate][ad]. In 1.1 associated type
3525   defaults *did not work*, but could be mentioned syntactically. As
3526   such this breakage has minimal impact.
3527
3528 Language
3529 --------
3530
3531 * Patterns with `ref mut` now correctly invoke [`DerefMut`] when
3532   matching against dereferencable values.
3533
3534 Libraries
3535 ---------
3536
3537 * The [`Extend`] trait, which grows a collection from an iterator, is
3538   implemented over iterators of references, for `String`, `Vec`,
3539   `LinkedList`, `VecDeque`, `EnumSet`, `BinaryHeap`, `VecMap`,
3540   `BTreeSet` and `BTreeMap`. [RFC][extend-rfc].
3541 * The [`iter::once`] function returns an iterator that yields a single
3542   element, and [`iter::empty`] returns an iterator that yields no
3543   elements.
3544 * The [`matches`] and [`rmatches`] methods on `str` return iterators
3545   over substring matches.
3546 * [`Cell`] and [`RefCell`] both implement `Eq`.
3547 * A number of methods for wrapping arithmetic are added to the
3548   integral types, [`wrapping_div`], [`wrapping_rem`],
3549   [`wrapping_neg`], [`wrapping_shl`], [`wrapping_shr`]. These are in
3550   addition to the existing [`wrapping_add`], [`wrapping_sub`], and
3551   [`wrapping_mul`] methods, and alternatives to the [`Wrapping`]
3552   type.. It is illegal for the default arithmetic operations in Rust
3553   to overflow; the desire to wrap must be explicit.
3554 * The `{:#?}` formatting specifier [displays the alternate,
3555   pretty-printed][debugfmt] form of the `Debug` formatter. This
3556   feature was actually introduced prior to 1.0 with little
3557   fanfare.
3558 * [`fmt::Formatter`] implements [`fmt::Write`], a `fmt`-specific trait
3559   for writing data to formatted strings, similar to [`io::Write`].
3560 * [`fmt::Formatter`] adds 'debug builder' methods, [`debug_struct`],
3561   [`debug_tuple`], [`debug_list`], [`debug_set`], [`debug_map`]. These
3562   are used by code generators to emit implementations of [`Debug`].
3563 * `str` has new [`to_uppercase`][strup] and [`to_lowercase`][strlow]
3564   methods that convert case, following Unicode case mapping.
3565 * It is now easier to handle poisoned locks. The [`PoisonError`]
3566   type, returned by failing lock operations, exposes `into_inner`,
3567   `get_ref`, and `get_mut`, which all give access to the inner lock
3568   guard, and allow the poisoned lock to continue to operate. The
3569   `is_poisoned` method of [`RwLock`] and [`Mutex`] can poll for a
3570   poisoned lock without attempting to take the lock.
3571 * On Unix the [`FromRawFd`] trait is implemented for [`Stdio`], and
3572   [`AsRawFd`] for [`ChildStdin`], [`ChildStdout`], [`ChildStderr`].
3573   On Windows the `FromRawHandle` trait is implemented for `Stdio`,
3574   and `AsRawHandle` for `ChildStdin`, `ChildStdout`,
3575   `ChildStderr`.
3576 * [`io::ErrorKind`] has a new variant, `InvalidData`, which indicates
3577   malformed input.
3578
3579 Misc
3580 ----
3581
3582 * `rustc` employs smarter heuristics for guessing at [typos].
3583 * `rustc` emits more efficient code for [no-op conversions between
3584   unsafe pointers][nop].
3585 * Fat pointers are now [passed in pairs of immediate arguments][fat],
3586   resulting in faster compile times and smaller code.
3587
3588 [`Extend`]: https://doc.rust-lang.org/nightly/std/iter/trait.Extend.html
3589 [extend-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0839-embrace-extend-extinguish.md
3590 [`iter::once`]: https://doc.rust-lang.org/nightly/std/iter/fn.once.html
3591 [`iter::empty`]: https://doc.rust-lang.org/nightly/std/iter/fn.empty.html
3592 [`matches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.matches
3593 [`rmatches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.rmatches
3594 [`Cell`]: https://doc.rust-lang.org/nightly/std/cell/struct.Cell.html
3595 [`RefCell`]: https://doc.rust-lang.org/nightly/std/cell/struct.RefCell.html
3596 [`wrapping_add`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_add
3597 [`wrapping_sub`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_sub
3598 [`wrapping_mul`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_mul
3599 [`wrapping_div`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_div
3600 [`wrapping_rem`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_rem
3601 [`wrapping_neg`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_neg
3602 [`wrapping_shl`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_shl
3603 [`wrapping_shr`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_shr
3604 [`Wrapping`]: https://doc.rust-lang.org/nightly/std/num/struct.Wrapping.html
3605 [`fmt::Formatter`]: https://doc.rust-lang.org/nightly/std/fmt/struct.Formatter.html
3606 [`fmt::Write`]: https://doc.rust-lang.org/nightly/std/fmt/trait.Write.html
3607 [`io::Write`]: https://doc.rust-lang.org/nightly/std/io/trait.Write.html
3608 [`debug_struct`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_struct
3609 [`debug_tuple`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_tuple
3610 [`debug_list`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_list
3611 [`debug_set`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_set
3612 [`debug_map`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_map
3613 [`Debug`]: https://doc.rust-lang.org/nightly/std/fmt/trait.Debug.html
3614 [strup]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.to_uppercase
3615 [strlow]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.to_lowercase
3616 [`to_uppercase`]: https://doc.rust-lang.org/nightly/std/primitive.char.html#method.to_uppercase
3617 [`to_lowercase`]: https://doc.rust-lang.org/nightly/std/primitive.char.html#method.to_lowercase
3618 [`PoisonError`]: https://doc.rust-lang.org/nightly/std/sync/struct.PoisonError.html
3619 [`RwLock`]: https://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html
3620 [`Mutex`]: https://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html
3621 [`FromRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.FromRawFd.html
3622 [`AsRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.AsRawFd.html
3623 [`Stdio`]: https://doc.rust-lang.org/nightly/std/process/struct.Stdio.html
3624 [`ChildStdin`]: https://doc.rust-lang.org/nightly/std/process/struct.ChildStdin.html
3625 [`ChildStdout`]: https://doc.rust-lang.org/nightly/std/process/struct.ChildStdout.html
3626 [`ChildStderr`]: https://doc.rust-lang.org/nightly/std/process/struct.ChildStderr.html
3627 [`io::ErrorKind`]: https://doc.rust-lang.org/nightly/std/io/enum.ErrorKind.html
3628 [debugfmt]: https://www.reddit.com/r/rust/comments/3ceaui/psa_produces_prettyprinted_debug_output/
3629 [`DerefMut`]: https://doc.rust-lang.org/nightly/std/ops/trait.DerefMut.html
3630 [`mem::align_of`]: https://doc.rust-lang.org/nightly/std/mem/fn.align_of.html
3631 [align]: https://github.com/rust-lang/rust/pull/25646
3632 [`mem::min_align_of`]: https://doc.rust-lang.org/nightly/std/mem/fn.min_align_of.html
3633 [typos]: https://github.com/rust-lang/rust/pull/26087
3634 [nop]: https://github.com/rust-lang/rust/pull/26336
3635 [fat]: https://github.com/rust-lang/rust/pull/26411
3636 [dst]: https://github.com/rust-lang/rfcs/blob/master/text/0982-dst-coercion.md
3637 [parcodegen]: https://github.com/rust-lang/rust/pull/26018
3638 [packed]: https://github.com/rust-lang/rust/pull/25541
3639 [ad]: https://github.com/rust-lang/rust/pull/27382
3640 [win]: https://github.com/rust-lang/rust/pull/25350
3641
3642 Version 1.1.0 (2015-06-25)
3643 =========================
3644
3645 * ~850 changes, numerous bugfixes
3646
3647 Highlights
3648 ----------
3649
3650 * The [`std::fs` module has been expanded][fs] to expand the set of
3651   functionality exposed:
3652   * `DirEntry` now supports optimizations like `file_type` and `metadata` which
3653     don't incur a syscall on some platforms.
3654   * A `symlink_metadata` function has been added.
3655   * The `fs::Metadata` structure now lowers to its OS counterpart, providing
3656     access to all underlying information.
3657 * The compiler now contains extended explanations of many errors. When an error
3658   with an explanation occurs the compiler suggests using the `--explain` flag
3659   to read the explanation. Error explanations are also [available online][err-index].
3660 * Thanks to multiple [improvements][sk] to [type checking][pre], as
3661   well as other work, the time to bootstrap the compiler decreased by
3662   32%.
3663
3664 Libraries
3665 ---------
3666
3667 * The [`str::split_whitespace`] method splits a string on unicode
3668   whitespace boundaries.
3669 * On both Windows and Unix, new extension traits provide conversion of
3670   I/O types to and from the underlying system handles. On Unix, these
3671   traits are [`FromRawFd`] and [`AsRawFd`], on Windows `FromRawHandle`
3672   and `AsRawHandle`. These are implemented for `File`, `TcpStream`,
3673   `TcpListener`, and `UpdSocket`. Further implementations for
3674   `std::process` will be stabilized later.
3675 * On Unix, [`std::os::unix::symlink`] creates symlinks. On
3676   Windows, symlinks can be created with
3677   `std::os::windows::symlink_dir` and
3678   `std::os::windows::symlink_file`.
3679 * The `mpsc::Receiver` type can now be converted into an iterator with
3680   `into_iter` on the [`IntoIterator`] trait.
3681 * `Ipv4Addr` can be created from `u32` with the `From<u32>`
3682   implementation of the [`From`] trait.
3683 * The `Debug` implementation for `RangeFull` [creates output that is
3684   more consistent with other implementations][rf].
3685 * [`Debug` is implemented for `File`][file].
3686 * The `Default` implementation for `Arc` [no longer requires `Sync +
3687   Send`][arc].
3688 * [The `Iterator` methods `count`, `nth`, and `last` have been
3689   overridden for slices to have O(1) performance instead of O(n)][si].
3690 * Incorrect handling of paths on Windows has been improved in both the
3691   compiler and the standard library.
3692 * [`AtomicPtr` gained a `Default` implementation][ap].
3693 * In accordance with Rust's policy on arithmetic overflow `abs` now
3694   [panics on overflow when debug assertions are enabled][abs].
3695 * The [`Cloned`] iterator, which was accidentally left unstable for
3696   1.0 [has been stabilized][c].
3697 * The [`Incoming`] iterator, which iterates over incoming TCP
3698   connections, and which was accidentally unnamable in 1.0, [is now
3699   properly exported][inc].
3700 * [`BinaryHeap`] no longer corrupts itself [when functions called by
3701   `sift_up` or `sift_down` panic][bh].
3702 * The [`split_off`] method of `LinkedList` [no longer corrupts
3703   the list in certain scenarios][ll].
3704
3705 Misc
3706 ----
3707
3708 * Type checking performance [has improved notably][sk] with
3709   [multiple improvements][pre].
3710 * The compiler [suggests code changes][ch] for more errors.
3711 * rustc and it's build system have experimental support for [building
3712   toolchains against MUSL][m] instead of glibc on Linux.
3713 * The compiler defines the `target_env` cfg value, which is used for
3714   distinguishing toolchains that are otherwise for the same
3715   platform. Presently this is set to `gnu` for common GNU Linux
3716   targets and for MinGW targets, and `musl` for MUSL Linux targets.
3717 * The [`cargo rustc`][crc] command invokes a build with custom flags
3718   to rustc.
3719 * [Android executables are always position independent][pie].
3720 * [The `drop_with_repr_extern` lint warns about mixing `repr(C)`
3721   with `Drop`][drop].
3722
3723 [`str::split_whitespace`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_whitespace
3724 [`FromRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.FromRawFd.html
3725 [`AsRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.AsRawFd.html
3726 [`std::os::unix::symlink`]: https://doc.rust-lang.org/nightly/std/os/unix/fs/fn.symlink.html
3727 [`IntoIterator`]: https://doc.rust-lang.org/nightly/std/iter/trait.IntoIterator.html
3728 [`From`]: https://doc.rust-lang.org/nightly/std/convert/trait.From.html
3729 [rf]: https://github.com/rust-lang/rust/pull/24491
3730 [err-index]: https://doc.rust-lang.org/error-index.html
3731 [sk]: https://github.com/rust-lang/rust/pull/24615
3732 [pre]: https://github.com/rust-lang/rust/pull/25323
3733 [file]: https://github.com/rust-lang/rust/pull/24598
3734 [ch]: https://github.com/rust-lang/rust/pull/24683
3735 [arc]: https://github.com/rust-lang/rust/pull/24695
3736 [si]: https://github.com/rust-lang/rust/pull/24701
3737 [ap]: https://github.com/rust-lang/rust/pull/24834
3738 [m]: https://github.com/rust-lang/rust/pull/24777
3739 [fs]: https://github.com/rust-lang/rfcs/blob/master/text/1044-io-fs-2.1.md
3740 [crc]: https://github.com/rust-lang/cargo/pull/1568
3741 [pie]: https://github.com/rust-lang/rust/pull/24953
3742 [abs]: https://github.com/rust-lang/rust/pull/25441
3743 [c]: https://github.com/rust-lang/rust/pull/25496
3744 [`Cloned`]: https://doc.rust-lang.org/nightly/std/iter/struct.Cloned.html
3745 [`Incoming`]: https://doc.rust-lang.org/nightly/std/net/struct.Incoming.html
3746 [inc]: https://github.com/rust-lang/rust/pull/25522
3747 [bh]: https://github.com/rust-lang/rust/pull/25856
3748 [`BinaryHeap`]: https://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html
3749 [ll]: https://github.com/rust-lang/rust/pull/26022
3750 [`split_off`]: https://doc.rust-lang.org/nightly/collections/linked_list/struct.LinkedList.html#method.split_off
3751 [drop]: https://github.com/rust-lang/rust/pull/24935
3752
3753 Version 1.0.0 (2015-05-15)
3754 ========================
3755
3756 * ~1500 changes, numerous bugfixes
3757
3758 Highlights
3759 ----------
3760
3761 * The vast majority of the standard library is now `#[stable]`. It is
3762   no longer possible to use unstable features with a stable build of
3763   the compiler.
3764 * Many popular crates on [crates.io] now work on the stable release
3765   channel.
3766 * Arithmetic on basic integer types now [checks for overflow in debug
3767   builds][overflow].
3768
3769 Language
3770 --------
3771
3772 * Several [restrictions have been added to trait coherence][coh] in
3773   order to make it easier for upstream authors to change traits
3774   without breaking downstream code.
3775 * Digits of binary and octal literals are [lexed more eagerly][lex] to
3776   improve error messages and macro behavior. For example, `0b1234` is
3777   now lexed as `0b1234` instead of two tokens, `0b1` and `234`.
3778 * Trait bounds [are always invariant][inv], eliminating the need for
3779   the `PhantomFn` and `MarkerTrait` lang items, which have been
3780   removed.
3781 * ["-" is no longer a valid character in crate names][cr], the `extern crate
3782   "foo" as bar` syntax has been replaced with `extern crate foo as
3783   bar`, and Cargo now automatically translates "-" in *package* names
3784   to underscore for the crate name.
3785 * [Lifetime shadowing is an error][lt].
3786 * [`Send` no longer implies `'static`][send-rfc].
3787 * [UFCS now supports trait-less associated paths][moar-ufcs] like
3788   `MyType::default()`.
3789 * Primitive types [now have inherent methods][prim-inherent],
3790   obviating the need for extension traits like `SliceExt`.
3791 * Methods with `Self: Sized` in their `where` clause are [considered
3792   object-safe][self-sized], allowing many extension traits like
3793   `IteratorExt` to be merged into the traits they extended.
3794 * You can now [refer to associated types][assoc-where] whose
3795   corresponding trait bounds appear only in a `where` clause.
3796 * The final bits of [OIBIT landed][oibit-final], meaning that traits
3797   like `Send` and `Sync` are now library-defined.
3798 * A [Reflect trait][reflect] was introduced, which means that
3799   downcasting via the `Any` trait is effectively limited to concrete
3800   types. This helps retain the potentially-important "parametricity"
3801   property: generic code cannot behave differently for different type
3802   arguments except in minor ways.
3803 * The `unsafe_destructor` feature is now deprecated in favor of the
3804   [new `dropck`][dropck]. This change is a major reduction in unsafe
3805   code.
3806
3807 Libraries
3808 ---------
3809
3810 * The `thread_local` module [has been renamed to `std::thread`][th].
3811 * The methods of `IteratorExt` [have been moved to the `Iterator`
3812   trait itself][ie].
3813 * Several traits that implement Rust's conventions for type
3814   conversions, `AsMut`, `AsRef`, `From`, and `Into` have been
3815   [centralized in the `std::convert` module][con].
3816 * The `FromError` trait [was removed in favor of `From`][fe].
3817 * The basic sleep function [has moved to
3818   `std::thread::sleep_ms`][slp].
3819 * The `splitn` function now takes an `n` parameter that represents the
3820   number of items yielded by the returned iterator [instead of the
3821   number of 'splits'][spl].
3822 * [On Unix, all file descriptors are `CLOEXEC` by default][clo].
3823 * [Derived implementations of `PartialOrd` now order enums according
3824   to their explicitly-assigned discriminants][po].
3825 * [Methods for searching strings are generic over `Pattern`s][pat],
3826   implemented presently by `&char`, `&str`, `FnMut(char) -> bool` and
3827   some others.
3828 * [In method resolution, object methods are resolved before inherent
3829   methods][meth].
3830 * [`String::from_str` has been deprecated in favor of the `From` impl,
3831   `String::from`][sf].
3832 * [`io::Error` implements `Sync`][ios].
3833 * [The `words` method on `&str` has been replaced with
3834   `split_whitespace`][sw], to avoid answering the tricky question, 'what is
3835   a word?'
3836 * The new path and IO modules are complete and `#[stable]`. This
3837   was the major library focus for this cycle.
3838 * The path API was [revised][path-normalize] to normalize `.`,
3839   adjusting the tradeoffs in favor of the most common usage.
3840 * A large number of remaining APIs in `std` were also stabilized
3841   during this cycle; about 75% of the non-deprecated API surface
3842   is now stable.
3843 * The new [string pattern API][string-pattern] landed, which makes
3844   the string slice API much more internally consistent and flexible.
3845 * A new set of [generic conversion traits][conversion] replaced
3846   many existing ad hoc traits.
3847 * Generic numeric traits were [completely removed][num-traits]. This
3848   was made possible thanks to inherent methods for primitive types,
3849   and the removal gives maximal flexibility for designing a numeric
3850   hierarchy in the future.
3851 * The `Fn` traits are now related via [inheritance][fn-inherit]
3852   and provide ergonomic [blanket implementations][fn-blanket].
3853 * The `Index` and `IndexMut` traits were changed to
3854   [take the index by value][index-value], enabling code like
3855   `hash_map["string"]` to work.
3856 * `Copy` now [inherits][copy-clone] from `Clone`, meaning that all
3857   `Copy` data is known to be `Clone` as well.
3858
3859 Misc
3860 ----
3861
3862 * Many errors now have extended explanations that can be accessed with
3863   the `--explain` flag to `rustc`.
3864 * Many new examples have been added to the standard library
3865   documentation.
3866 * rustdoc has received a number of improvements focused on completion
3867   and polish.
3868 * Metadata was tuned, shrinking binaries [by 27%][metadata-shrink].
3869 * Much headway was made on ecosystem-wide CI, making it possible
3870   to [compare builds for breakage][ci-compare].
3871
3872
3873 [crates.io]: http://crates.io
3874 [clo]: https://github.com/rust-lang/rust/pull/24034
3875 [coh]: https://github.com/rust-lang/rfcs/blob/master/text/1023-rebalancing-coherence.md
3876 [con]: https://github.com/rust-lang/rust/pull/23875
3877 [cr]: https://github.com/rust-lang/rust/pull/23419
3878 [fe]: https://github.com/rust-lang/rust/pull/23879
3879 [ie]: https://github.com/rust-lang/rust/pull/23300
3880 [inv]: https://github.com/rust-lang/rust/pull/23938
3881 [ios]: https://github.com/rust-lang/rust/pull/24133
3882 [lex]: https://github.com/rust-lang/rfcs/blob/master/text/0879-small-base-lexing.md
3883 [lt]: https://github.com/rust-lang/rust/pull/24057
3884 [meth]: https://github.com/rust-lang/rust/pull/24056
3885 [pat]: https://github.com/rust-lang/rfcs/blob/master/text/0528-string-patterns.md
3886 [po]: https://github.com/rust-lang/rust/pull/24270
3887 [sf]: https://github.com/rust-lang/rust/pull/24517
3888 [slp]: https://github.com/rust-lang/rust/pull/23949
3889 [spl]: https://github.com/rust-lang/rfcs/blob/master/text/0979-align-splitn-with-other-languages.md
3890 [sw]: https://github.com/rust-lang/rfcs/blob/master/text/1054-str-words.md
3891 [th]: https://github.com/rust-lang/rfcs/blob/master/text/0909-move-thread-local-to-std-thread.md
3892 [send-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0458-send-improvements.md
3893 [moar-ufcs]: https://github.com/rust-lang/rust/pull/22172
3894 [prim-inherent]: https://github.com/rust-lang/rust/pull/23104
3895 [overflow]: https://github.com/rust-lang/rfcs/blob/master/text/0560-integer-overflow.md
3896 [metadata-shrink]: https://github.com/rust-lang/rust/pull/22971
3897 [self-sized]: https://github.com/rust-lang/rust/pull/22301
3898 [assoc-where]: https://github.com/rust-lang/rust/pull/22512
3899 [string-pattern]: https://github.com/rust-lang/rust/pull/22466
3900 [oibit-final]: https://github.com/rust-lang/rust/pull/21689
3901 [reflect]: https://github.com/rust-lang/rust/pull/23712
3902 [conversion]: https://github.com/rust-lang/rfcs/pull/529
3903 [num-traits]: https://github.com/rust-lang/rust/pull/23549
3904 [index-value]: https://github.com/rust-lang/rust/pull/23601
3905 [dropck]: https://github.com/rust-lang/rfcs/pull/769
3906 [ci-compare]: https://gist.github.com/brson/a30a77836fbec057cbee
3907 [fn-inherit]: https://github.com/rust-lang/rust/pull/23282
3908 [fn-blanket]: https://github.com/rust-lang/rust/pull/23895
3909 [copy-clone]: https://github.com/rust-lang/rust/pull/23860
3910 [path-normalize]: https://github.com/rust-lang/rust/pull/23229
3911
3912
3913 Version 1.0.0-alpha.2 (2015-02-20)
3914 =====================================
3915
3916 * ~1300 changes, numerous bugfixes
3917
3918 * Highlights
3919
3920     * The various I/O modules were [overhauled][io-rfc] to reduce
3921       unnecessary abstractions and provide better interoperation with
3922       the underlying platform. The old `io` module remains temporarily
3923       at `std::old_io`.
3924     * The standard library now [participates in feature gating][feat],
3925       so use of unstable libraries now requires a `#![feature(...)]`
3926       attribute. The impact of this change is [described on the
3927       forum][feat-forum]. [RFC][feat-rfc].
3928
3929 * Language
3930
3931     * `for` loops [now operate on the `IntoIterator` trait][into],
3932       which eliminates the need to call `.iter()`, etc. to iterate
3933       over collections. There are some new subtleties to remember
3934       though regarding what sort of iterators various types yield, in
3935       particular that `for foo in bar { }` yields values from a move
3936       iterator, destroying the original collection. [RFC][into-rfc].
3937     * Objects now have [default lifetime bounds][obj], so you don't
3938       have to write `Box<Trait+'static>` when you don't care about
3939       storing references. [RFC][obj-rfc].
3940     * In types that implement `Drop`, [lifetimes must outlive the
3941       value][drop]. This will soon make it possible to safely
3942       implement `Drop` for types where `#[unsafe_destructor]` is now
3943       required. Read the [gorgeous RFC][drop-rfc] for details.
3944     * The fully qualified <T as Trait>::X syntax lets you set the Self
3945       type for a trait method or associated type. [RFC][ufcs-rfc].
3946     * References to types that implement `Deref<U>` now [automatically
3947       coerce to references][deref] to the dereferenced type `U`,
3948       e.g. `&T where T: Deref<U>` automatically coerces to `&U`. This
3949       should eliminate many unsightly uses of `&*`, as when converting
3950       from references to vectors into references to
3951       slices. [RFC][deref-rfc].
3952     * The explicit [closure kind syntax][close] (`|&:|`, `|&mut:|`,
3953       `|:|`) is obsolete and closure kind is inferred from context.
3954     * [`Self` is a keyword][Self].
3955
3956 * Libraries
3957
3958     * The `Show` and `String` formatting traits [have been
3959       renamed][fmt] to `Debug` and `Display` to more clearly reflect
3960       their related purposes. Automatically getting a string
3961       conversion to use with `format!("{:?}", something_to_debug)` is
3962       now written `#[derive(Debug)]`.
3963     * Abstract [OS-specific string types][osstr], `std::ff::{OsString,
3964       OsStr}`, provide strings in platform-specific encodings for easier
3965       interop with system APIs. [RFC][osstr-rfc].
3966     * The `boxed::into_raw` and `Box::from_raw` functions [convert
3967       between `Box<T>` and `*mut T`][boxraw], a common pattern for
3968       creating raw pointers.
3969
3970 * Tooling
3971
3972     * Certain long error messages of the form 'expected foo found bar'
3973       are now [split neatly across multiple
3974       lines][multiline]. Examples in the PR.
3975     * On Unix Rust can be [uninstalled][un] by running
3976       `/usr/local/lib/rustlib/uninstall.sh`.
3977     * The `#[rustc_on_unimplemented]` attribute, requiring the
3978       'on_unimplemented' feature, lets rustc [display custom error
3979       messages when a trait is expected to be implemented for a type
3980       but is not][onun].
3981
3982 * Misc
3983
3984     * Rust is tested against a [LALR grammar][lalr], which parses
3985       almost all the Rust files that rustc does.
3986
3987 [boxraw]: https://github.com/rust-lang/rust/pull/21318
3988 [close]: https://github.com/rust-lang/rust/pull/21843
3989 [deref]: https://github.com/rust-lang/rust/pull/21351
3990 [deref-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0241-deref-conversions.md
3991 [drop]: https://github.com/rust-lang/rust/pull/21972
3992 [drop-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0769-sound-generic-drop.md
3993 [feat]: https://github.com/rust-lang/rust/pull/21248
3994 [feat-forum]: https://users.rust-lang.org/t/psa-important-info-about-rustcs-new-feature-staging/82/5
3995 [feat-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0507-release-channels.md
3996 [fmt]: https://github.com/rust-lang/rust/pull/21457
3997 [into]: https://github.com/rust-lang/rust/pull/20790
3998 [into-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0235-collections-conventions.md#intoiterator-and-iterable
3999 [io-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0517-io-os-reform.md
4000 [lalr]: https://github.com/rust-lang/rust/pull/21452
4001 [multiline]: https://github.com/rust-lang/rust/pull/19870
4002 [obj]: https://github.com/rust-lang/rust/pull/22230
4003 [obj-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0599-default-object-bound.md
4004 [onun]: https://github.com/rust-lang/rust/pull/20889
4005 [osstr]: https://github.com/rust-lang/rust/pull/21488
4006 [osstr-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0517-io-os-reform.md
4007 [Self]: https://github.com/rust-lang/rust/pull/22158
4008 [ufcs-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0132-ufcs.md
4009 [un]: https://github.com/rust-lang/rust/pull/22256
4010
4011
4012 Version 1.0.0-alpha (2015-01-09)
4013 ==================================
4014
4015   * ~2400 changes, numerous bugfixes
4016
4017   * Highlights
4018
4019     * The language itself is considered feature complete for 1.0,
4020       though there will be many usability improvements and bugfixes
4021       before the final release.
4022     * Nearly 50% of the public API surface of the standard library has
4023       been declared 'stable'. Those interfaces are unlikely to change
4024       before 1.0.
4025     * The long-running debate over integer types has been
4026       [settled][ints]: Rust will ship with types named `isize` and
4027       `usize`, rather than `int` and `uint`, for pointer-sized
4028       integers. Guidelines will be rolled out during the alpha cycle.
4029     * Most crates that are not `std` have been moved out of the Rust
4030       distribution into the Cargo ecosystem so they can evolve
4031       separately and don't need to be stabilized as quickly, including
4032       'time', 'getopts', 'num', 'regex', and 'term'.
4033     * Documentation continues to be expanded with more API coverage, more
4034       examples, and more in-depth explanations. The guides have been
4035       consolidated into [The Rust Programming Language][trpl].
4036     * "[Rust By Example][rbe]" is now maintained by the Rust team.
4037     * All official Rust binary installers now come with [Cargo], the
4038       Rust package manager.
4039
4040 * Language
4041
4042     * Closures have been [completely redesigned][unboxed] to be
4043       implemented in terms of traits, can now be used as generic type
4044       bounds and thus monomorphized and inlined, or via an opaque
4045       pointer (boxed) as in the old system. The new system is often
4046       referred to as 'unboxed' closures.
4047     * Traits now support [associated types][assoc], allowing families
4048       of related types to be defined together and used generically in
4049       powerful ways.
4050     * Enum variants are [namespaced by their type names][enum].
4051     * [`where` clauses][where] provide a more versatile and attractive
4052       syntax for specifying generic bounds, though the previous syntax
4053       remains valid.
4054     * Rust again picks a [fallback][fb] (either i32 or f64) for uninferred
4055       numeric types.
4056     * Rust [no longer has a runtime][rt] of any description, and only
4057       supports OS threads, not green threads.
4058     * At long last, Rust has been overhauled for 'dynamically-sized
4059       types' ([DST]), which integrates 'fat pointers' (object types,
4060       arrays, and `str`) more deeply into the type system, making it
4061       more consistent.
4062     * Rust now has a general [range syntax][range], `i..j`, `i..`, and
4063       `..j` that produce range types and which, when combined with the
4064       `Index` operator and multidispatch, leads to a convenient slice
4065       notation, `[i..j]`.
4066     * The new range syntax revealed an ambiguity in the fixed-length
4067       array syntax, so now fixed length arrays [are written `[T;
4068       N]`][arrays].
4069     * The `Copy` trait is no longer implemented automatically. Unsafe
4070       pointers no longer implement `Sync` and `Send` so types
4071       containing them don't automatically either. `Sync` and `Send`
4072       are now 'unsafe traits' so one can "forcibly" implement them via
4073       `unsafe impl` if a type confirms to the requirements for them
4074       even though the internals do not (e.g. structs containing unsafe
4075       pointers like `Arc`). These changes are intended to prevent some
4076       footguns and are collectively known as [opt-in built-in
4077       traits][oibit] (though `Sync` and `Send` will soon become pure
4078       library types unknown to the compiler).
4079     * Operator traits now take their operands [by value][ops], and
4080       comparison traits can use multidispatch to compare one type
4081       against multiple other types, allowing e.g. `String` to be
4082       compared with `&str`.
4083     * `if let` and `while let` are no longer feature-gated.
4084     * Rust has adopted a more [uniform syntax for escaping unicode
4085       characters][unicode].
4086     * `macro_rules!` [has been declared stable][mac]. Though it is a
4087       flawed system it is sufficiently popular that it must be usable
4088       for 1.0. Effort has gone into [future-proofing][mac-future] it
4089       in ways that will allow other macro systems to be developed in
4090       parallel, and won't otherwise impact the evolution of the
4091       language.
4092     * The prelude has been [pared back significantly][prelude] such
4093       that it is the minimum necessary to support the most pervasive
4094       code patterns, and through [generalized where clauses][where]
4095       many of the prelude extension traits have been consolidated.
4096     * Rust's rudimentary reflection [has been removed][refl], as it
4097       incurred too much code generation for little benefit.
4098     * [Struct variants][structvars] are no longer feature-gated.
4099     * Trait bounds can be [polymorphic over lifetimes][hrtb]. Also
4100       known as 'higher-ranked trait bounds', this crucially allows
4101       unboxed closures to work.
4102     * Macros invocations surrounded by parens or square brackets and
4103       not terminated by a semicolon are [parsed as
4104       expressions][macros], which makes expressions like `vec![1i32,
4105       2, 3].len()` work as expected.
4106     * Trait objects now implement their traits automatically, and
4107       traits that can be coerced to objects now must be [object
4108       safe][objsafe].
4109     * Automatically deriving traits is now done with `#[derive(...)]`
4110       not `#[deriving(...)]` for [consistency with other naming
4111       conventions][derive].
4112     * Importing the containing module or enum at the same time as
4113       items or variants they contain is [now done with `self` instead
4114       of `mod`][self], as in use `foo::{self, bar}`
4115     * Glob imports are no longer feature-gated.
4116     * The `box` operator and `box` patterns have been feature-gated
4117       pending a redesign. For now unique boxes should be allocated
4118       like other containers, with `Box::new`.
4119
4120 * Libraries
4121
4122     * A [series][coll1] of [efforts][coll2] to establish
4123       [conventions][coll3] for collections types has resulted in API
4124       improvements throughout the standard library.
4125     * New [APIs for error handling][err] provide ergonomic interop
4126       between error types, and [new conventions][err-conv] describe
4127       more clearly the recommended error handling strategies in Rust.
4128     * The `fail!` macro has been renamed to [`panic!`][panic] so that
4129       it is easier to discuss failure in the context of error handling
4130       without making clarifications as to whether you are referring to
4131       the 'fail' macro or failure more generally.
4132     * On Linux, `OsRng` prefers the new, more reliable `getrandom`
4133       syscall when available.
4134     * The 'serialize' crate has been renamed 'rustc-serialize' and
4135       moved out of the distribution to Cargo. Although it is widely
4136       used now, it is expected to be superseded in the near future.
4137     * The `Show` formatter, typically implemented with
4138       `#[derive(Show)]` is [now requested with the `{:?}`
4139       specifier][show] and is intended for use by all types, for uses
4140       such as `println!` debugging. The new `String` formatter must be
4141       implemented by hand, uses the `{}` specifier, and is intended
4142       for full-fidelity conversions of things that can logically be
4143       represented as strings.
4144
4145 * Tooling
4146
4147     * [Flexible target specification][flex] allows rustc's code
4148       generation to be configured to support otherwise-unsupported
4149       platforms.
4150     * Rust comes with rust-gdb and rust-lldb scripts that launch their
4151       respective debuggers with Rust-appropriate pretty-printing.
4152     * The Windows installation of Rust is distributed with the
4153       MinGW components currently required to link binaries on that
4154       platform.
4155
4156 * Misc
4157
4158     * Nullable enum optimizations have been extended to more types so
4159       that e.g. `Option<Vec<T>>` and `Option<String>` take up no more
4160       space than the inner types themselves.
4161     * Work has begun on supporting AArch64.
4162
4163 [Cargo]: https://crates.io
4164 [unboxed]: http://smallcultfollowing.com/babysteps/blog/2014/11/26/purging-proc/
4165 [enum]: https://github.com/rust-lang/rfcs/blob/master/text/0390-enum-namespacing.md
4166 [flex]: https://github.com/rust-lang/rfcs/blob/master/text/0131-target-specification.md
4167 [err]: https://github.com/rust-lang/rfcs/blob/master/text/0201-error-chaining.md
4168 [err-conv]: https://github.com/rust-lang/rfcs/blob/master/text/0236-error-conventions.md
4169 [rt]: https://github.com/rust-lang/rfcs/blob/master/text/0230-remove-runtime.md
4170 [mac]: https://github.com/rust-lang/rfcs/blob/master/text/0453-macro-reform.md
4171 [mac-future]: https://github.com/rust-lang/rfcs/pull/550
4172 [DST]: http://smallcultfollowing.com/babysteps/blog/2014/01/05/dst-take-5/
4173 [coll1]: https://github.com/rust-lang/rfcs/blob/master/text/0235-collections-conventions.md
4174 [coll2]: https://github.com/rust-lang/rfcs/blob/master/text/0509-collections-reform-part-2.md
4175 [coll3]: https://github.com/rust-lang/rfcs/blob/master/text/0216-collection-views.md
4176 [ops]: https://github.com/rust-lang/rfcs/blob/master/text/0439-cmp-ops-reform.md
4177 [prelude]: https://github.com/rust-lang/rfcs/blob/master/text/0503-prelude-stabilization.md
4178 [where]: https://github.com/rust-lang/rfcs/blob/master/text/0135-where.md
4179 [refl]: https://github.com/rust-lang/rfcs/blob/master/text/0379-remove-reflection.md
4180 [panic]: https://github.com/rust-lang/rfcs/blob/master/text/0221-panic.md
4181 [structvars]: https://github.com/rust-lang/rfcs/blob/master/text/0418-struct-variants.md
4182 [hrtb]: https://github.com/rust-lang/rfcs/blob/master/text/0387-higher-ranked-trait-bounds.md
4183 [unicode]: https://github.com/rust-lang/rfcs/blob/master/text/0446-es6-unicode-escapes.md
4184 [oibit]: https://github.com/rust-lang/rfcs/blob/master/text/0019-opt-in-builtin-traits.md
4185 [macros]: https://github.com/rust-lang/rfcs/blob/master/text/0378-expr-macros.md
4186 [range]: https://github.com/rust-lang/rfcs/blob/master/text/0439-cmp-ops-reform.md#indexing-and-slicing
4187 [arrays]: https://github.com/rust-lang/rfcs/blob/master/text/0520-new-array-repeat-syntax.md
4188 [show]: https://github.com/rust-lang/rfcs/blob/master/text/0504-show-stabilization.md
4189 [derive]: https://github.com/rust-lang/rfcs/blob/master/text/0534-deriving2derive.md
4190 [self]: https://github.com/rust-lang/rfcs/blob/master/text/0532-self-in-use.md
4191 [fb]: https://github.com/rust-lang/rfcs/blob/master/text/0212-restore-int-fallback.md
4192 [objsafe]: https://github.com/rust-lang/rfcs/blob/master/text/0255-object-safety.md
4193 [assoc]: https://github.com/rust-lang/rfcs/blob/master/text/0195-associated-items.md
4194 [ints]: https://github.com/rust-lang/rfcs/pull/544#issuecomment-68760871
4195 [trpl]: https://doc.rust-lang.org/book/index.html
4196 [rbe]: http://rustbyexample.com/
4197
4198
4199 Version 0.12.0 (2014-10-09)
4200 =============================
4201
4202   * ~1900 changes, numerous bugfixes
4203
4204   * Highlights
4205
4206     * The introductory documentation (now called The Rust Guide) has
4207       been completely rewritten, as have a number of supplementary
4208       guides.
4209     * Rust's package manager, Cargo, continues to improve and is
4210       sometimes considered to be quite awesome.
4211     * Many API's in `std` have been reviewed and updated for
4212       consistency with the in-development Rust coding
4213       guidelines. The standard library documentation tracks
4214       stabilization progress.
4215     * Minor libraries have been moved out-of-tree to the rust-lang org
4216       on GitHub: uuid, semver, glob, num, hexfloat, fourcc. They can
4217       be installed with Cargo.
4218     * Lifetime elision allows lifetime annotations to be left off of
4219       function declarations in many common scenarios.
4220     * Rust now works on 64-bit Windows.
4221
4222   * Language
4223     * Indexing can be overloaded with the `Index` and `IndexMut`
4224       traits.
4225     * The `if let` construct takes a branch only if the `let` pattern
4226       matches, currently behind the 'if_let' feature gate.
4227     * 'where clauses', a more flexible syntax for specifying trait
4228       bounds that is more aesthetic, have been added for traits and
4229       free functions. Where clauses will in the future make it
4230       possible to constrain associated types, which would be
4231       impossible with the existing syntax.
4232     * A new slicing syntax (e.g. `[0..4]`) has been introduced behind
4233       the 'slicing_syntax' feature gate, and can be overloaded with
4234       the `Slice` or `SliceMut` traits.
4235     * The syntax for matching of sub-slices has been changed to use a
4236       postfix `..` instead of prefix (.e.g. `[a, b, c..]`), for
4237       consistency with other uses of `..` and to future-proof
4238       potential additional uses of the syntax.
4239     * The syntax for matching inclusive ranges in patterns has changed
4240       from `0..3` to `0...4` to be consistent with the exclusive range
4241       syntax for slicing.
4242     * Matching of sub-slices in non-tail positions (e.g.  `[a.., b,
4243       c]`) has been put behind the 'advanced_slice_patterns' feature
4244       gate and may be removed in the future.
4245     * Components of tuples and tuple structs can be extracted using
4246       the `value.0` syntax, currently behind the `tuple_indexing`
4247       feature gate.
4248     * The `#[crate_id]` attribute is no longer supported; versioning
4249       is handled by the package manager.
4250     * Renaming crate imports are now written `extern crate foo as bar`
4251       instead of `extern crate bar = foo`.
4252     * Renaming use statements are now written `use foo as bar` instead
4253       of `use bar = foo`.
4254     * `let` and `match` bindings and argument names in macros are now
4255       hygienic.
4256     * The new, more efficient, closure types ('unboxed closures') have
4257       been added under a feature gate, 'unboxed_closures'. These will
4258       soon replace the existing closure types, once higher-ranked
4259       trait lifetimes are added to the language.
4260     * `move` has been added as a keyword, for indicating closures
4261       that capture by value.
4262     * Mutation and assignment is no longer allowed in pattern guards.
4263     * Generic structs and enums can now have trait bounds.
4264     * The `Share` trait is now called `Sync` to free up the term
4265       'shared' to refer to 'shared reference' (the default reference
4266       type.
4267     * Dynamically-sized types have been mostly implemented,
4268       unifying the behavior of fat-pointer types with the rest of the
4269       type system.
4270     * As part of dynamically-sized types, the `Sized` trait has been
4271       introduced, which qualifying types implement by default, and
4272       which type parameters expect by default. To specify that a type
4273       parameter does not need to be sized, write `<Sized? T>`. Most
4274       types are `Sized`, notable exceptions being unsized arrays
4275       (`[T]`) and trait types.
4276     * Closures can return `!`, as in `|| -> !` or `proc() -> !`.
4277     * Lifetime bounds can now be applied to type parameters and object
4278       types.
4279     * The old, reference counted GC type, `Gc<T>` which was once
4280       denoted by the `@` sigil, has finally been removed. GC will be
4281       revisited in the future.
4282
4283   * Libraries
4284     * Library documentation has been improved for a number of modules.
4285     * Bit-vectors, collections::bitv has been modernized.
4286     * The url crate is deprecated in favor of
4287       http://github.com/servo/rust-url, which can be installed with
4288       Cargo.
4289     * Most I/O stream types can be cloned and subsequently closed from
4290       a different thread.
4291     * A `std::time::Duration` type has been added for use in I/O
4292       methods that rely on timers, as well as in the 'time' crate's
4293       `Timespec` arithmetic.
4294     * The runtime I/O abstraction layer that enabled the green thread
4295       scheduler to do non-thread-blocking I/O has been removed, along
4296       with the libuv-based implementation employed by the green thread
4297       scheduler. This will greatly simplify the future I/O work.
4298     * `collections::btree` has been rewritten to have a more
4299       idiomatic and efficient design.
4300
4301   * Tooling
4302     * rustdoc output now indicates the stability levels of API's.
4303     * The `--crate-name` flag can specify the name of the crate
4304       being compiled, like `#[crate_name]`.
4305     * The `-C metadata` specifies additional metadata to hash into
4306       symbol names, and `-C extra-filename` specifies additional
4307       information to put into the output filename, for use by the
4308       package manager for versioning.
4309     * debug info generation has continued to improve and should be
4310       more reliable under both gdb and lldb.
4311     * rustc has experimental support for compiling in parallel
4312       using the `-C codegen-units` flag.
4313     * rustc no longer encodes rpath information into binaries by
4314       default.
4315
4316   * Misc
4317     * Stack usage has been optimized with LLVM lifetime annotations.
4318     * Official Rust binaries on Linux are more compatible with older
4319       kernels and distributions, built on CentOS 5.10.
4320
4321
4322 Version 0.11.0 (2014-07-02)
4323 ==========================
4324
4325   * ~1700 changes, numerous bugfixes
4326
4327   * Language
4328     * ~[T] has been removed from the language. This type is superseded by
4329       the Vec<T> type.
4330     * ~str has been removed from the language. This type is superseded by
4331       the String type.
4332     * ~T has been removed from the language. This type is superseded by the
4333       Box<T> type.
4334     * @T has been removed from the language. This type is superseded by the
4335       standard library's std::gc::Gc<T> type.
4336     * Struct fields are now all private by default.
4337     * Vector indices and shift amounts are both required to be a `uint`
4338       instead of any integral type.
4339     * Byte character, byte string, and raw byte string literals are now all
4340       supported by prefixing the normal literal with a `b`.
4341     * Multiple ABIs are no longer allowed in an ABI string
4342     * The syntax for lifetimes on closures/procedures has been tweaked
4343       slightly: `<'a>|A, B|: 'b + K -> T`
4344     * Floating point modulus has been removed from the language; however it
4345       is still provided by a library implementation.
4346     * Private enum variants are now disallowed.
4347     * The `priv` keyword has been removed from the language.
4348     * A closure can no longer be invoked through a &-pointer.
4349     * The `use foo, bar, baz;` syntax has been removed from the language.
4350     * The transmute intrinsic no longer works on type parameters.
4351     * Statics now allow blocks/items in their definition.
4352     * Trait bounds are separated from objects with + instead of : now.
4353     * Objects can no longer be read while they are mutably borrowed.
4354     * The address of a static is now marked as insignificant unless the
4355       #[inline(never)] attribute is placed it.
4356     * The #[unsafe_destructor] attribute is now behind a feature gate.
4357     * Struct literals are no longer allowed in ambiguous positions such as
4358       if, while, match, and for..in.
4359     * Declaration of lang items and intrinsics are now feature-gated by
4360       default.
4361     * Integral literals no longer default to `int`, and floating point
4362       literals no longer default to `f64`. Literals must be suffixed with an
4363       appropriate type if inference cannot determine the type of the
4364       literal.
4365     * The Box<T> type is no longer implicitly borrowed to &mut T.
4366     * Procedures are now required to not capture borrowed references.
4367
4368   * Libraries
4369     * The standard library is now a "facade" over a number of underlying
4370       libraries. This means that development on the standard library should
4371       be speeder due to smaller crates, as well as a clearer line between
4372       all dependencies.
4373     * A new library, libcore, lives under the standard library's facade
4374       which is Rust's "0-assumption" library, suitable for embedded and
4375       kernel development for example.
4376     * A regex crate has been added to the standard distribution. This crate
4377       includes statically compiled regular expressions.
4378     * The unwrap/unwrap_err methods on Result require a Show bound for
4379       better error messages.
4380     * The return types of the std::comm primitives have been centralized
4381       around the Result type.
4382     * A number of I/O primitives have gained the ability to time out their
4383       operations.
4384     * A number of I/O primitives have gained the ability to close their
4385       reading/writing halves to cancel pending operations.
4386     * Reverse iterator methods have been removed in favor of `rev()` on
4387       their forward-iteration counterparts.
4388     * A bitflags! macro has been added to enable easy interop with C and
4389       management of bit flags.
4390     * A debug_assert! macro is now provided which is disabled when
4391       `--cfg ndebug` is passed to the compiler.
4392     * A graphviz crate has been added for creating .dot files.
4393     * The std::cast module has been migrated into std::mem.
4394     * The std::local_data api has been migrated from freestanding functions
4395       to being based on methods.
4396     * The Pod trait has been renamed to Copy.
4397     * jemalloc has been added as the default allocator for types.
4398     * The API for allocating memory has been changed to use proper alignment
4399       and sized deallocation
4400     * Connecting a TcpStream or binding a TcpListener is now based on a
4401       string address and a u16 port. This allows connecting to a hostname as
4402       opposed to an IP.
4403     * The Reader trait now contains a core method, read_at_least(), which
4404       correctly handles many repeated 0-length reads.
4405     * The process-spawning API is now centered around a builder-style
4406       Command struct.
4407     * The :? printing qualifier has been moved from the standard library to
4408       an external libdebug crate.
4409     * Eq/Ord have been renamed to PartialEq/PartialOrd. TotalEq/TotalOrd
4410       have been renamed to Eq/Ord.
4411     * The select/plural methods have been removed from format!. The escapes
4412       for { and } have also changed from \{ and \} to {{ and }},
4413       respectively.
4414     * The TaskBuilder API has been re-worked to be a true builder, and
4415       extension traits for spawning native/green tasks have been added.
4416
4417   * Tooling
4418     * All breaking changes to the language or libraries now have their
4419       commit message annotated with `[breaking-change]` to allow for easy
4420       discovery of breaking changes.
4421     * The compiler will now try to suggest how to annotate lifetimes if a
4422       lifetime-related error occurs.
4423     * Debug info continues to be improved greatly with general bug fixes and
4424       better support for situations like link time optimization (LTO).
4425     * Usage of syntax extensions when cross-compiling has been fixed.
4426     * Functionality equivalent to GCC & Clang's -ffunction-sections,
4427       -fdata-sections and --gc-sections has been enabled by default
4428     * The compiler is now stricter about where it will load module files
4429       from when a module is declared via `mod foo;`.
4430     * The #[phase(syntax)] attribute has been renamed to #[phase(plugin)].
4431       Syntax extensions are now discovered via a "plugin registrar" type
4432       which will be extended in the future to other various plugins.
4433     * Lints have been restructured to allow for dynamically loadable lints.
4434     * A number of rustdoc improvements:
4435       * The HTML output has been visually redesigned.
4436       * Markdown is now powered by hoedown instead of sundown.
4437       * Searching heuristics have been greatly improved.
4438       * The search index has been reduced in size by a great amount.
4439       * Cross-crate documentation via `pub use` has been greatly improved.
4440       * Primitive types are now hyperlinked and documented.
4441     * Documentation has been moved from static.rust-lang.org/doc to
4442       doc.rust-lang.org
4443     * A new sandbox, play.rust-lang.org, is available for running and
4444       sharing rust code examples on-line.
4445     * Unused attributes are now more robustly warned about.
4446     * The dead_code lint now warns about unused struct fields.
4447     * Cross-compiling to iOS is now supported.
4448     * Cross-compiling to mipsel is now supported.
4449     * Stability attributes are now inherited by default and no longer apply
4450       to intra-crate usage, only inter-crate usage.
4451     * Error message related to non-exhaustive match expressions have been
4452       greatly improved.
4453
4454
4455 Version 0.10 (2014-04-03)
4456 =========================
4457
4458   * ~1500 changes, numerous bugfixes
4459
4460   * Language
4461     * A new RFC process is now in place for modifying the language.
4462     * Patterns with `@`-pointers have been removed from the language.
4463     * Patterns with unique vectors (`~[T]`) have been removed from the
4464       language.
4465     * Patterns with unique strings (`~str`) have been removed from the
4466       language.
4467     * `@str` has been removed from the language.
4468     * `@[T]` has been removed from the language.
4469     * `@self` has been removed from the language.
4470     * `@Trait` has been removed from the language.
4471     * Headers on `~` allocations which contain `@` boxes inside the type for
4472       reference counting have been removed.
4473     * The semantics around the lifetimes of temporary expressions have changed,
4474       see #3511 and #11585 for more information.
4475     * Cross-crate syntax extensions are now possible, but feature gated. See
4476       #11151 for more information. This includes both `macro_rules!` macros as
4477       well as syntax extensions such as `format!`.
4478     * New lint modes have been added, and older ones have been turned on to be
4479       warn-by-default.
4480       * Unnecessary parentheses
4481       * Uppercase statics
4482       * Camel Case types
4483       * Uppercase variables
4484       * Publicly visible private types
4485       * `#[deriving]` with raw pointers
4486     * Unsafe functions can no longer be coerced to closures.
4487     * Various obscure macros such as `log_syntax!` are now behind feature gates.
4488     * The `#[simd]` attribute is now behind a feature gate.
4489     * Visibility is no longer allowed on `extern crate` statements, and
4490       unnecessary visibility (`priv`) is no longer allowed on `use` statements.
4491     * Trailing commas are now allowed in argument lists and tuple patterns.
4492     * The `do` keyword has been removed, it is now a reserved keyword.
4493     * Default type parameters have been implemented, but are feature gated.
4494     * Borrowed variables through captures in closures are now considered soundly.
4495     * `extern mod` is now `extern crate`
4496     * The `Freeze` trait has been removed.
4497     * The `Share` trait has been added for types that can be shared among
4498       threads.
4499     * Labels in macros are now hygienic.
4500     * Expression/statement macro invocations can be delimited with `{}` now.
4501     * Treatment of types allowed in `static mut` locations has been tweaked.
4502     * The `*` and `.` operators are now overloadable through the `Deref` and
4503       `DerefMut` traits.
4504     * `~Trait` and `proc` no longer have `Send` bounds by default.
4505     * Partial type hints are now supported with the `_` type marker.
4506     * An `Unsafe` type was introduced for interior mutability. It is now
4507       considered undefined to transmute from `&T` to `&mut T` without using the
4508       `Unsafe` type.
4509     * The #[linkage] attribute was implemented for extern statics/functions.
4510     * The inner attribute syntax has changed from `#[foo];` to `#![foo]`.
4511     * `Pod` was renamed to `Copy`.
4512
4513   * Libraries
4514     * The `libextra` library has been removed. It has now been decomposed into
4515       component libraries with smaller and more focused nuggets of
4516       functionality. The full list of libraries can be found on the
4517       documentation index page.
4518     * std: `std::condition` has been removed. All I/O errors are now propagated
4519       through the `Result` type. In order to assist with error handling, a
4520       `try!` macro for unwrapping errors with an early return and a lint for
4521       unused results has been added. See #12039 for more information.
4522     * std: The `vec` module has been renamed to `slice`.
4523     * std: A new vector type, `Vec<T>`, has been added in preparation for DST.
4524       This will become the only growable vector in the future.
4525     * std: `std::io` now has more public-reexports. Types such as `BufferedReader`
4526       are now found at `std::io::BufferedReader` instead of
4527       `std::io::buffered::BufferedReader`.
4528     * std: `print` and `println` are no longer in the prelude, the `print!` and
4529       `println!` macros are intended to be used instead.
4530     * std: `Rc` now has a `Weak` pointer for breaking cycles, and it no longer
4531       attempts to statically prevent cycles.
4532     * std: The standard distribution is adopting the policy of pushing failure
4533       to the user rather than failing in libraries. Many functions (such as
4534       `slice::last()`) now return `Option<T>` instead of `T` + failing.
4535     * std: `fmt::Default` has been renamed to `fmt::Show`, and it now has a new
4536       deriving mode: `#[deriving(Show)]`.
4537     * std: `ToStr` is now implemented for all types implementing `Show`.
4538     * std: The formatting trait methods now take `&self` instead of `&T`
4539     * std: The `invert()` method on iterators has been renamed to `rev()`
4540     * std: `std::num` has seen a reduction in the genericity of its traits,
4541       consolidating functionality into a few core traits.
4542     * std: Backtraces are now printed on task failure if the environment
4543       variable `RUST_BACKTRACE` is present.
4544     * std: Naming conventions for iterators have been standardized. More details
4545       can be found on the wiki's style guide.
4546     * std: `eof()` has been removed from the `Reader` trait. Specific types may
4547       still implement the function.
4548     * std: Networking types are now cloneable to allow simultaneous reads/writes.
4549     * std: `assert_approx_eq!` has been removed
4550     * std: The `e` and `E` formatting specifiers for floats have been added to
4551       print them in exponential notation.
4552     * std: The `Times` trait has been removed
4553     * std: Indications of variance and opting out of builtin bounds is done
4554       through marker types in `std::kinds::marker` now
4555     * std: `hash` has been rewritten, `IterBytes` has been removed, and
4556       `#[deriving(Hash)]` is now possible.
4557     * std: `SharedChan` has been removed, `Sender` is now cloneable.
4558     * std: `Chan` and `Port` were renamed to `Sender` and `Receiver`.
4559     * std: `Chan::new` is now `channel()`.
4560     * std: A new synchronous channel type has been implemented.
4561     * std: A `select!` macro is now provided for selecting over `Receiver`s.
4562     * std: `hashmap` and `trie` have been moved to `libcollections`
4563     * std: `run` has been rolled into `io::process`
4564     * std: `assert_eq!` now uses `{}` instead of `{:?}`
4565     * std: The equality and comparison traits have seen some reorganization.
4566     * std: `rand` has moved to `librand`.
4567     * std: `to_{lower,upper}case` has been implemented for `char`.
4568     * std: Logging has been moved to `liblog`.
4569     * collections: `HashMap` has been rewritten for higher performance and less
4570       memory usage.
4571     * native: The default runtime is now `libnative`. If `libgreen` is desired,
4572       it can be booted manually. The runtime guide has more information and
4573       examples.
4574     * native: All I/O functionality except signals has been implemented.
4575     * green: Task spawning with `libgreen` has been optimized with stack caching
4576       and various trimming of code.
4577     * green: Tasks spawned by `libgreen` now have an unmapped guard page.
4578     * sync: The `extra::sync` module has been updated to modern rust (and moved
4579       to the `sync` library), tweaking and improving various interfaces while
4580       dropping redundant functionality.
4581     * sync: A new `Barrier` type has been added to the `sync` library.
4582     * sync: An efficient mutex for native and green tasks has been implemented.
4583     * serialize: The `base64` module has seen some improvement. It treats
4584       newlines better, has non-string error values, and has seen general
4585       cleanup.
4586     * fourcc: A `fourcc!` macro was introduced
4587     * hexfloat: A `hexfloat!` macro was implemented for specifying floats via a
4588       hexadecimal literal.
4589
4590   * Tooling
4591     * `rustpkg` has been deprecated and removed from the main repository. Its
4592       replacement, `cargo`, is under development.
4593     * Nightly builds of rust are now available
4594     * The memory usage of rustc has been improved many times throughout this
4595       release cycle.
4596     * The build process supports disabling rpath support for the rustc binary
4597       itself.
4598     * Code generation has improved in some cases, giving more information to the
4599       LLVM optimization passes to enable more extensive optimizations.
4600     * Debuginfo compatibility with lldb on OSX has been restored.
4601     * The master branch is now gated on an android bot, making building for
4602       android much more reliable.
4603     * Output flags have been centralized into one `--emit` flag.
4604     * Crate type flags have been centralized into one `--crate-type` flag.
4605     * Codegen flags have been consolidated behind a `-C` flag.
4606     * Linking against outdated crates now has improved error messages.
4607     * Error messages with lifetimes will often suggest how to annotate the
4608       function to fix the error.
4609     * Many more types are documented in the standard library, and new guides
4610       were written.
4611     * Many `rustdoc` improvements:
4612       * code blocks are syntax highlighted.
4613       * render standalone markdown files.
4614       * the --test flag tests all code blocks by default.
4615       * exported macros are displayed.
4616       * reexported types have their documentation inlined at the location of the
4617         first reexport.
4618       * search works across crates that have been rendered to the same output
4619         directory.
4620
4621
4622 Version 0.9 (2014-01-09)
4623 ==========================
4624
4625    * ~1800 changes, numerous bugfixes
4626
4627    * Language
4628       * The `float` type has been removed. Use `f32` or `f64` instead.
4629       * A new facility for enabling experimental features (feature gating) has
4630         been added, using the crate-level `#[feature(foo)]` attribute.
4631       * Managed boxes (@) are now behind a feature gate
4632         (`#[feature(managed_boxes)]`) in preparation for future removal. Use the
4633         standard library's `Gc` or `Rc` types instead.
4634       * `@mut` has been removed. Use `std::cell::{Cell, RefCell}` instead.
4635       * Jumping back to the top of a loop is now done with `continue` instead of
4636         `loop`.
4637       * Strings can no longer be mutated through index assignment.
4638       * Raw strings can be created via the basic `r"foo"` syntax or with matched
4639         hash delimiters, as in `r###"foo"###`.
4640       * `~fn` is now written `proc (args) -> retval { ... }` and may only be
4641         called once.
4642       * The `&fn` type is now written `|args| -> ret` to match the literal form.
4643       * `@fn`s have been removed.
4644       * `do` only works with procs in order to make it obvious what the cost
4645         of `do` is.
4646       * Single-element tuple-like structs can no longer be dereferenced to
4647         obtain the inner value. A more comprehensive solution for overloading
4648         the dereference operator will be provided in the future.
4649       * The `#[link(...)]` attribute has been replaced with
4650         `#[crate_id = "name#vers"]`.
4651       * Empty `impl`s must be terminated with empty braces and may not be
4652         terminated with a semicolon.
4653       * Keywords are no longer allowed as lifetime names; the `self` lifetime
4654         no longer has any special meaning.
4655       * The old `fmt!` string formatting macro has been removed.
4656       * `printf!` and `printfln!` (old-style formatting) removed in favor of
4657         `print!` and `println!`.
4658       * `mut` works in patterns now, as in `let (mut x, y) = (1, 2);`.
4659       * The `extern mod foo (name = "bar")` syntax has been removed. Use
4660         `extern mod foo = "bar"` instead.
4661       * New reserved keywords: `alignof`, `offsetof`, `sizeof`.
4662       * Macros can have attributes.
4663       * Macros can expand to items with attributes.
4664       * Macros can expand to multiple items.
4665       * The `asm!` macro is feature-gated (`#[feature(asm)]`).
4666       * Comments may be nested.
4667       * Values automatically coerce to trait objects they implement, without
4668         an explicit `as`.
4669       * Enum discriminants are no longer an entire word but as small as needed to
4670         contain all the variants. The `repr` attribute can be used to override
4671         the discriminant size, as in `#[repr(int)]` for integer-sized, and
4672         `#[repr(C)]` to match C enums.
4673       * Non-string literals are not allowed in attributes (they never worked).
4674       * The FFI now supports variadic functions.
4675       * Octal numeric literals, as in `0o7777`.
4676       * The `concat!` syntax extension performs compile-time string concatenation.
4677       * The `#[fixed_stack_segment]` and `#[rust_stack]` attributes have been
4678         removed as Rust no longer uses segmented stacks.
4679       * Non-ascii identifiers are feature-gated (`#[feature(non_ascii_idents)]`).
4680       * Ignoring all fields of an enum variant or tuple-struct is done with `..`,
4681         not `*`; ignoring remaining fields of a struct is also done with `..`,
4682         not `_`; ignoring a slice of a vector is done with `..`, not `.._`.
4683       * `rustc` supports the "win64" calling convention via `extern "win64"`.
4684       * `rustc` supports the "system" calling convention, which defaults to the
4685         preferred convention for the target platform, "stdcall" on 32-bit Windows,
4686         "C" elsewhere.
4687       * The `type_overflow` lint (default: warn) checks literals for overflow.
4688       * The `unsafe_block` lint (default: allow) checks for usage of `unsafe`.
4689       * The `attribute_usage` lint (default: warn) warns about unknown
4690         attributes.
4691       * The `unknown_features` lint (default: warn) warns about unknown
4692         feature gates.
4693       * The `dead_code` lint (default: warn) checks for dead code.
4694       * Rust libraries can be linked statically to one another
4695       * `#[link_args]` is behind the `link_args` feature gate.
4696       * Native libraries are now linked with `#[link(name = "foo")]`
4697       * Native libraries can be statically linked to a rust crate
4698         (`#[link(name = "foo", kind = "static")]`).
4699       * Native OS X frameworks are now officially supported
4700         (`#[link(name = "foo", kind = "framework")]`).
4701       * The `#[thread_local]` attribute creates thread-local (not task-local)
4702         variables. Currently behind the `thread_local` feature gate.
4703       * The `return` keyword may be used in closures.
4704       * Types that can be copied via a memcpy implement the `Pod` kind.
4705       * The `cfg` attribute can now be used on struct fields and enum variants.
4706
4707    * Libraries
4708       * std: The `option` and `result` API's have been overhauled to make them
4709         simpler, more consistent, and more composable.
4710       * std: The entire `std::io` module has been replaced with one that is
4711         more comprehensive and that properly interfaces with the underlying
4712         scheduler. File, TCP, UDP, Unix sockets, pipes, and timers are all
4713         implemented.
4714       * std: `io::util` contains a number of useful implementations of
4715         `Reader` and `Writer`, including `NullReader`, `NullWriter`,
4716         `ZeroReader`, `TeeReader`.
4717       * std: The reference counted pointer type `extra::rc` moved into std.
4718       * std: The `Gc` type in the `gc` module will replace `@` (it is currently
4719         just a wrapper around it).
4720       * std: The `Either` type has been removed.
4721       * std: `fmt::Default` can be implemented for any type to provide default
4722         formatting to the `format!` macro, as in `format!("{}", myfoo)`.
4723       * std: The `rand` API continues to be tweaked.
4724       * std: The `rust_begin_unwind` function, useful for inserting breakpoints
4725         on failure in gdb, is now named `rust_fail`.
4726       * std: The `each_key` and `each_value` methods on `HashMap` have been
4727         replaced by the `keys` and `values` iterators.
4728       * std: Functions dealing with type size and alignment have moved from the
4729         `sys` module to the `mem` module.
4730       * std: The `path` module was written and API changed.
4731       * std: `str::from_utf8` has been changed to cast instead of allocate.
4732       * std: `starts_with` and `ends_with` methods added to vectors via the
4733         `ImmutableEqVector` trait, which is in the prelude.
4734       * std: Vectors can be indexed with the `get_opt` method, which returns `None`
4735         if the index is out of bounds.
4736       * std: Task failure no longer propagates between tasks, as the model was
4737         complex, expensive, and incompatible with thread-based tasks.
4738       * std: The `Any` type can be used for dynamic typing.
4739       * std: `~Any` can be passed to the `fail!` macro and retrieved via
4740         `task::try`.
4741       * std: Methods that produce iterators generally do not have an `_iter`
4742         suffix now.
4743       * std: `cell::Cell` and `cell::RefCell` can be used to introduce mutability
4744         roots (mutable fields, etc.). Use instead of e.g. `@mut`.
4745       * std: `util::ignore` renamed to `prelude::drop`.
4746       * std: Slices have `sort` and `sort_by` methods via the `MutableVector`
4747         trait.
4748       * std: `vec::raw` has seen a lot of cleanup and API changes.
4749       * std: The standard library no longer includes any C++ code, and very
4750         minimal C, eliminating the dependency on libstdc++.
4751       * std: Runtime scheduling and I/O functionality has been factored out into
4752         extensible interfaces and is now implemented by two different crates:
4753         libnative, for native threading and I/O; and libgreen, for green threading
4754         and I/O. This paves the way for using the standard library in more limited
4755         embedded environments.
4756       * std: The `comm` module has been rewritten to be much faster, have a
4757         simpler, more consistent API, and to work for both native and green
4758         threading.
4759       * std: All libuv dependencies have been moved into the rustuv crate.
4760       * native: New implementations of runtime scheduling on top of OS threads.
4761       * native: New native implementations of TCP, UDP, file I/O, process spawning,
4762         and other I/O.
4763       * green: The green thread scheduler and message passing types are almost
4764         entirely lock-free.
4765       * extra: The `flatpipes` module had bitrotted and was removed.
4766       * extra: All crypto functions have been removed and Rust now has a policy of
4767         not reimplementing crypto in the standard library. In the future crypto
4768         will be provided by external crates with bindings to established libraries.
4769       * extra: `c_vec` has been modernized.
4770       * extra: The `sort` module has been removed. Use the `sort` method on
4771         mutable slices.
4772
4773    * Tooling
4774       * The `rust` and `rusti` commands have been removed, due to lack of
4775         maintenance.
4776       * `rustdoc` was completely rewritten.
4777       * `rustdoc` can test code examples in documentation.
4778       * `rustpkg` can test packages with the argument, 'test'.
4779       * `rustpkg` supports arbitrary dependencies, including C libraries.
4780       * `rustc`'s support for generating debug info is improved again.
4781       * `rustc` has better error reporting for unbalanced delimiters.
4782       * `rustc`'s JIT support was removed due to bitrot.
4783       * Executables and static libraries can be built with LTO (-Z lto)
4784       * `rustc` adds a `--dep-info` flag for communicating dependencies to
4785         build tools.
4786
4787
4788 Version 0.8 (2013-09-26)
4789 ============================
4790
4791    * ~2200 changes, numerous bugfixes
4792
4793    * Language
4794       * The `for` loop syntax has changed to work with the `Iterator` trait.
4795       * At long last, unwinding works on Windows.
4796       * Default methods are ready for use.
4797       * Many trait inheritance bugs fixed.
4798       * Owned and borrowed trait objects work more reliably.
4799       * `copy` is no longer a keyword. It has been replaced by the `Clone` trait.
4800       * rustc can omit emission of code for the `debug!` macro if it is passed
4801         `--cfg ndebug`
4802       * mod.rs is now "blessed". When loading `mod foo;`, rustc will now look
4803         for foo.rs, then foo/mod.rs, and will generate an error when both are
4804         present.
4805       * Strings no longer contain trailing nulls. The new `std::c_str` module
4806         provides new mechanisms for converting to C strings.
4807       * The type of foreign functions is now `extern "C" fn` instead of `*u8'.
4808       * The FFI has been overhauled such that foreign functions are called directly,
4809         instead of through a stack-switching wrapper.
4810       * Calling a foreign function must be done through a Rust function with the
4811         `#[fixed_stack_segment]` attribute.
4812       * The `externfn!` macro can be used to declare both a foreign function and
4813         a `#[fixed_stack_segment]` wrapper at once.
4814       * `pub` and `priv` modifiers on `extern` blocks are no longer parsed.
4815       * `unsafe` is no longer allowed on extern fns - they are all unsafe.
4816       * `priv` is disallowed everywhere except for struct fields and enum variants.
4817       * `&T` (besides `&'static T`) is no longer allowed in `@T`.
4818       * `ref` bindings in irrefutable patterns work correctly now.
4819       * `char` is now prevented from containing invalid code points.
4820       * Casting to `bool` is no longer allowed.
4821       * `\0` is now accepted as an escape in chars and strings.
4822       * `yield` is a reserved keyword.
4823       * `typeof` is a reserved keyword.
4824       * Crates may be imported by URL with `extern mod foo = "url";`.
4825       * Explicit enum discriminants may be given as uints as in `enum E { V = 0u }`
4826       * Static vectors can be initialized with repeating elements,
4827         e.g. `static foo: [u8, .. 100]: [0, .. 100];`.
4828       * Static structs can be initialized with functional record update,
4829         e.g. `static foo: Foo = Foo { a: 5, .. bar };`.
4830       * `cfg!` can be used to conditionally execute code based on the crate
4831         configuration, similarly to `#[cfg(...)]`.
4832       * The `unnecessary_qualification` lint detects unneeded module
4833         prefixes (default: allow).
4834       * Arithmetic operations have been implemented on the SIMD types in
4835         `std::unstable::simd`.
4836       * Exchange allocation headers were removed, reducing memory usage.
4837       * `format!` implements a completely new, extensible, and higher-performance
4838         string formatting system. It will replace `fmt!`.
4839       * `print!` and `println!` write formatted strings (using the `format!`
4840         extension) to stdout.
4841       * `write!` and `writeln!` write formatted strings (using the `format!`
4842         extension) to the new Writers in `std::rt::io`.
4843       * The library section in which a function or static is placed may
4844         be specified with `#[link_section = "..."]`.
4845       * The `proto!` syntax extension for defining bounded message protocols
4846         was removed.
4847       * `macro_rules!` is hygienic for `let` declarations.
4848       * The `#[export_name]` attribute specifies the name of a symbol.
4849       * `unreachable!` can be used to indicate unreachable code, and fails
4850         if executed.
4851
4852    * Libraries
4853       * std: Transitioned to the new runtime, written in Rust.
4854       * std: Added an experimental I/O library, `rt::io`, based on the new
4855         runtime.
4856       * std: A new generic `range` function was added to the prelude, replacing
4857         `uint::range` and friends.
4858       * std: `range_rev` no longer exists. Since range is an iterator it can be
4859         reversed with `range(lo, hi).invert()`.
4860       * std: The `chain` method on option renamed to `and_then`; `unwrap_or_default`
4861         renamed to `unwrap_or`.
4862       * std: The `iterator` module was renamed to `iter`.
4863       * std: Integral types now support the `checked_add`, `checked_sub`, and
4864         `checked_mul` operations for detecting overflow.
4865       * std: Many methods in `str`, `vec`, `option, `result` were renamed for
4866         consistency.
4867       * std: Methods are standardizing on conventions for casting methods:
4868         `to_foo` for copying, `into_foo` for moving, `as_foo` for temporary
4869         and cheap casts.
4870       * std: The `CString` type in `c_str` provides new ways to convert to and
4871         from C strings.
4872       * std: `DoubleEndedIterator` can yield elements in two directions.
4873       * std: The `mut_split` method on vectors partitions an `&mut [T]` into
4874         two splices.
4875       * std: `str::from_bytes` renamed to `str::from_utf8`.
4876       * std: `pop_opt` and `shift_opt` methods added to vectors.
4877       * std: The task-local data interface no longer uses @, and keys are
4878         no longer function pointers.
4879       * std: The `swap_unwrap` method of `Option` renamed to `take_unwrap`.
4880       * std: Added `SharedPort` to `comm`.
4881       * std: `Eq` has a default method for `ne`; only `eq` is required
4882         in implementations.
4883       * std: `Ord` has default methods for `le`, `gt` and `ge`; only `lt`
4884         is required in implementations.
4885       * std: `is_utf8` performance is improved, impacting many string functions.
4886       * std: `os::MemoryMap` provides cross-platform mmap.
4887       * std: `ptr::offset` is now unsafe, but also more optimized. Offsets that
4888         are not 'in-bounds' are considered undefined.
4889       * std: Many freestanding functions in `vec` removed in favor of methods.
4890       * std: Many freestanding functions on scalar types removed in favor of
4891         methods.
4892       * std: Many options to task builders were removed since they don't make
4893         sense in the new scheduler design.
4894       * std: More containers implement `FromIterator` so can be created by the
4895         `collect` method.
4896       * std: More complete atomic types in `unstable::atomics`.
4897       * std: `comm::PortSet` removed.
4898       * std: Mutating methods in the `Set` and `Map` traits have been moved into
4899         the `MutableSet` and `MutableMap` traits. `Container::is_empty`,
4900         `Map::contains_key`, `MutableMap::insert`, and `MutableMap::remove` have
4901         default implementations.
4902       * std: Various `from_str` functions were removed in favor of a generic
4903         `from_str` which is available in the prelude.
4904       * std: `util::unreachable` removed in favor of the `unreachable!` macro.
4905       * extra: `dlist`, the doubly-linked list was modernized.
4906       * extra: Added a `hex` module with `ToHex` and `FromHex` traits.
4907       * extra: Added `glob` module, replacing `std::os::glob`.
4908       * extra: `rope` was removed.
4909       * extra: `deque` was renamed to `ringbuf`. `RingBuf` implements `Deque`.
4910       * extra: `net`, and `timer` were removed. The experimental replacements
4911         are `std::rt::io::net` and `std::rt::io::timer`.
4912       * extra: Iterators implemented for `SmallIntMap`.
4913       * extra: Iterators implemented for `Bitv` and `BitvSet`.
4914       * extra: `SmallIntSet` removed. Use `BitvSet`.
4915       * extra: Performance of JSON parsing greatly improved.
4916       * extra: `semver` updated to SemVer 2.0.0.
4917       * extra: `term` handles more terminals correctly.
4918       * extra: `dbg` module removed.
4919       * extra: `par` module removed.
4920       * extra: `future` was cleaned up, with some method renames.
4921       * extra: Most free functions in `getopts` were converted to methods.
4922
4923    * Other
4924       * rustc's debug info generation (`-Z debug-info`) is greatly improved.
4925       * rustc accepts `--target-cpu` to compile to a specific CPU architecture,
4926         similarly to gcc's `--march` flag.
4927       * rustc's performance compiling small crates is much better.
4928       * rustpkg has received many improvements.
4929       * rustpkg supports git tags as package IDs.
4930       * rustpkg builds into target-specific directories so it can be used for
4931         cross-compiling.
4932       * The number of concurrent test tasks is controlled by the environment
4933         variable RUST_TEST_TASKS.
4934       * The test harness can now report metrics for benchmarks.
4935       * All tools have man pages.
4936       * Programs compiled with `--test` now support the `-h` and `--help` flags.
4937       * The runtime uses jemalloc for allocations.
4938       * Segmented stacks are temporarily disabled as part of the transition to
4939         the new runtime. Stack overflows are possible!
4940       * A new documentation backend, rustdoc_ng, is available for use. It is
4941         still invoked through the normal `rustdoc` command.
4942
4943
4944 Version 0.7 (2013-07-03)
4945 =======================
4946
4947    * ~2000 changes, numerous bugfixes
4948
4949    * Language
4950       * `impl`s no longer accept a visibility qualifier. Put them on methods
4951         instead.
4952       * The borrow checker has been rewritten with flow-sensitivity, fixing
4953         many bugs and inconveniences.
4954       * The `self` parameter no longer implicitly means `&'self self`,
4955         and can be explicitly marked with a lifetime.
4956       * Overloadable compound operators (`+=`, etc.) have been temporarily
4957         removed due to bugs.
4958       * The `for` loop protocol now requires `for`-iterators to return `bool`
4959         so they compose better.
4960       * The `Durable` trait is replaced with the `'static` bounds.
4961       * Trait default methods work more often.
4962       * Structs with the `#[packed]` attribute have byte alignment and
4963         no padding between fields.
4964       * Type parameters bound by `Copy` must now be copied explicitly with
4965         the `copy` keyword.
4966       * It is now illegal to move out of a dereferenced unsafe pointer.
4967       * `Option<~T>` is now represented as a nullable pointer.
4968       * `@mut` does dynamic borrow checks correctly.
4969       * The `main` function is only detected at the topmost level of the crate.
4970         The `#[main]` attribute is still valid anywhere.
4971       * Struct fields may no longer be mutable. Use inherited mutability.
4972       * The `#[no_send]` attribute makes a type that would otherwise be
4973         `Send`, not.
4974       * The `#[no_freeze]` attribute makes a type that would otherwise be
4975         `Freeze`, not.
4976       * Unbounded recursion will abort the process after reaching the limit
4977         specified by the `RUST_MAX_STACK` environment variable (default: 1GB).
4978       * The `vecs_implicitly_copyable` lint mode has been removed. Vectors
4979         are never implicitly copyable.
4980       * `#[static_assert]` makes compile-time assertions about static bools.
4981       * At long last, 'argument modes' no longer exist.
4982       * The rarely used `use mod` statement no longer exists.
4983
4984    * Syntax extensions
4985       * `fail!` and `assert!` accept `~str`, `&'static str` or `fmt!`-style
4986         argument list.
4987       * `Encodable`, `Decodable`, `Ord`, `TotalOrd`, `TotalEq`, `DeepClone`,
4988         `Rand`, `Zero` and `ToStr` can all be automatically derived with
4989         `#[deriving(...)]`.
4990       * The `bytes!` macro returns a vector of bytes for string, u8, char,
4991         and unsuffixed integer literals.
4992
4993    * Libraries
4994       * The `core` crate was renamed to `std`.
4995       * The `std` crate was renamed to `extra`.
4996       * More and improved documentation.
4997       * std: `iterator` module for external iterator objects.
4998       * Many old-style (internal, higher-order function) iterators replaced by
4999         implementations of `Iterator`.
5000       * std: Many old internal vector and string iterators,
5001         incl. `any`, `all`. removed.
5002       * std: The `finalize` method of `Drop` renamed to `drop`.
5003       * std: The `drop` method now takes `&mut self` instead of `&self`.
5004       * std: The prelude no longer reexports any modules, only types and traits.
5005       * std: Prelude additions: `print`, `println`, `FromStr`, `ApproxEq`, `Equiv`,
5006         `Iterator`, `IteratorUtil`, many numeric traits, many tuple traits.
5007       * std: New numeric traits: `Fractional`, `Real`, `RealExt`, `Integer`, `Ratio`,
5008         `Algebraic`, `Trigonometric`, `Exponential`, `Primitive`.
5009       * std: Tuple traits and accessors defined for up to 12-tuples, e.g.
5010         `(0, 1, 2).n2()` or `(0, 1, 2).n2_ref()`.
5011       * std: Many types implement `Clone`.
5012       * std: `path` type renamed to `Path`.
5013       * std: `mut` module and `Mut` type removed.
5014       * std: Many standalone functions removed in favor of methods and iterators
5015         in `vec`, `str`. In the future methods will also work as functions.
5016       * std: `reinterpret_cast` removed. Use `transmute`.
5017       * std: ascii string handling in `std::ascii`.
5018       * std: `Rand` is implemented for ~/@.
5019       * std: `run` module for spawning processes overhauled.
5020       * std: Various atomic types added to `unstable::atomic`.
5021       * std: Various types implement `Zero`.
5022       * std: `LinearMap` and `LinearSet` renamed to `HashMap` and `HashSet`.
5023       * std: Borrowed pointer functions moved from `ptr` to `borrow`.
5024       * std: Added `os::mkdir_recursive`.
5025       * std: Added `os::glob` function performs filesystems globs.
5026       * std: `FuzzyEq` renamed to `ApproxEq`.
5027       * std: `Map` now defines `pop` and `swap` methods.
5028       * std: `Cell` constructors converted to static methods.
5029       * extra: `rc` module adds the reference counted pointers, `Rc` and `RcMut`.
5030       * extra: `flate` module moved from `std` to `extra`.
5031       * extra: `fileinput` module for iterating over a series of files.
5032       * extra: `Complex` number type and `complex` module.
5033       * extra: `Rational` number type and `rational` module.
5034       * extra: `BigInt`, `BigUint` implement numeric and comparison traits.
5035       * extra: `term` uses terminfo now, is more correct.
5036       * extra: `arc` functions converted to methods.
5037       * extra: Implementation of fixed output size variations of SHA-2.
5038
5039    * Tooling
5040       * `unused_variable`  lint mode for unused variables (default: warn).
5041       * `unused_unsafe` lint mode for detecting unnecessary `unsafe` blocks
5042         (default: warn).
5043       * `unused_mut` lint mode for identifying unused `mut` qualifiers
5044         (default: warn).
5045       * `dead_assignment` lint mode for unread variables (default: warn).
5046       * `unnecessary_allocation` lint mode detects some heap allocations that are
5047         immediately borrowed so could be written without allocating (default: warn).
5048       * `missing_doc` lint mode (default: allow).
5049       * `unreachable_code` lint mode (default: warn).
5050       * The `rusti` command has been rewritten and a number of bugs addressed.
5051       * rustc outputs in color on more terminals.
5052       * rustc accepts a `--link-args` flag to pass arguments to the linker.
5053       * rustc accepts a `-Z print-link-args` flag for debugging linkage.
5054       * Compiling with `-g` will make the binary record information about
5055         dynamic borrowcheck failures for debugging.
5056       * rustdoc has a nicer stylesheet.
5057       * Various improvements to rustdoc.
5058       * Improvements to rustpkg (see the detailed release notes).
5059
5060
5061 Version 0.6 (2013-04-03)
5062 ========================
5063
5064    * ~2100 changes, numerous bugfixes
5065
5066    * Syntax changes
5067       * The self type parameter in traits is now spelled `Self`
5068       * The `self` parameter in trait and impl methods must now be explicitly
5069         named (for example: `fn f(&self) { }`). Implicit self is deprecated.
5070       * Static methods no longer require the `static` keyword and instead
5071         are distinguished by the lack of a `self` parameter
5072       * Replaced the `Durable` trait with the `'static` lifetime
5073       * The old closure type syntax with the trailing sigil has been
5074         removed in favor of the more consistent leading sigil
5075       * `super` is a keyword, and may be prefixed to paths
5076       * Trait bounds are separated with `+` instead of whitespace
5077       * Traits are implemented with `impl Trait for Type`
5078         instead of `impl Type: Trait`
5079       * Lifetime syntax is now `&'l foo` instead of `&l/foo`
5080       * The `export` keyword has finally been removed
5081       * The `move` keyword has been removed (see "Semantic changes")
5082       * The interior mutability qualifier on vectors, `[mut T]`, has been
5083         removed. Use `&mut [T]`, etc.
5084       * `mut` is no longer valid in `~mut T`. Use inherited mutability
5085       * `fail` is no longer a keyword. Use `fail!()`
5086       * `assert` is no longer a keyword. Use `assert!()`
5087       * `log` is no longer a keyword. use `debug!`, etc.
5088       * 1-tuples may be represented as `(T,)`
5089       * Struct fields may no longer be `mut`. Use inherited mutability,
5090         `@mut T`, `core::mut` or `core::cell`
5091       * `extern mod { ... }` is no longer valid syntax for foreign
5092         function modules. Use extern blocks: `extern { ... }`
5093       * Newtype enums removed. Use tuple-structs.
5094       * Trait implementations no longer support visibility modifiers
5095       * Pattern matching over vectors improved and expanded
5096       * `const` renamed to `static` to correspond to lifetime name,
5097         and make room for future `static mut` unsafe mutable globals.
5098       * Replaced `#[deriving_eq]` with `#[deriving(Eq)]`, etc.
5099       * `Clone` implementations can be automatically generated with
5100         `#[deriving(Clone)]`
5101       * Casts to traits must use a pointer sigil, e.g. `@foo as @Bar`
5102         instead of `foo as Bar`.
5103       * Fixed length vector types are now written as `[int, .. 3]`
5104         instead of `[int * 3]`.
5105       * Fixed length vector types can express the length as a constant
5106         expression. (ex: `[int, .. GL_BUFFER_SIZE - 2]`)
5107
5108    * Semantic changes
5109       * Types with owned pointers or custom destructors move by default,
5110         eliminating the `move` keyword
5111       * All foreign functions are considered unsafe
5112       * &mut is now unaliasable
5113       * Writes to borrowed @mut pointers are prevented dynamically
5114       * () has size 0
5115       * The name of the main function can be customized using #[main]
5116       * The default type of an inferred closure is &fn instead of @fn
5117       * `use` statements may no longer be "chained" - they cannot import
5118         identifiers imported by previous `use` statements
5119       * `use` statements are crate relative, importing from the "top"
5120         of the crate by default. Paths may be prefixed with `super::`
5121         or `self::` to change the search behavior.
5122       * Method visibility is inherited from the implementation declaration
5123       * Structural records have been removed
5124       * Many more types can be used in static items, including enums
5125         'static-lifetime pointers and vectors
5126       * Pattern matching over vectors improved and expanded
5127       * Typechecking of closure types has been overhauled to
5128         improve inference and eliminate unsoundness
5129       * Macros leave scope at the end of modules, unless that module is
5130         tagged with #[macro_escape]
5131
5132    * Libraries
5133       * Added big integers to `std::bigint`
5134       * Removed `core::oldcomm` module
5135       * Added pipe-based `core::comm` module
5136       * Numeric traits have been reorganized under `core::num`
5137       * `vec::slice` finally returns a slice
5138       * `debug!` and friends don't require a format string, e.g. `debug!(Foo)`
5139       * Containers reorganized around traits in `core::container`
5140       * `core::dvec` removed, `~[T]` is a drop-in replacement
5141       * `core::send_map` renamed to `core::hashmap`
5142       * `std::map` removed; replaced with `core::hashmap`
5143       * `std::treemap` reimplemented as an owned balanced tree
5144       * `std::deque` and `std::smallintmap` reimplemented as owned containers
5145       * `core::trie` added as a fast ordered map for integer keys
5146       * Set types added to `core::hashmap`, `core::trie` and `std::treemap`
5147       * `Ord` split into `Ord` and `TotalOrd`. `Ord` is still used to
5148         overload the comparison operators, whereas `TotalOrd` is used
5149         by certain container types
5150
5151    * Other
5152       * Replaced the 'cargo' package manager with 'rustpkg'
5153       * Added all-purpose 'rust' tool
5154       * `rustc --test` now supports benchmarks with the `#[bench]` attribute
5155       * rustc now *attempts* to offer spelling suggestions
5156       * Improved support for ARM and Android
5157       * Preliminary MIPS backend
5158       * Improved foreign function ABI implementation for x86, x86_64
5159       * Various memory usage improvements
5160       * Rust code may be embedded in foreign code under limited circumstances
5161       * Inline assembler supported by new asm!() syntax extension.
5162
5163
5164 Version 0.5 (2012-12-21)
5165 ===========================
5166
5167    * ~900 changes, numerous bugfixes
5168
5169    * Syntax changes
5170       * Removed `<-` move operator
5171       * Completed the transition from the `#fmt` extension syntax to `fmt!`
5172       * Removed old fixed length vector syntax - `[T]/N`
5173       * New token-based quasi-quoters, `quote_tokens!`, `quote_expr!`, etc.
5174       * Macros may now expand to items and statements
5175       * `a.b()` is always parsed as a method call, never as a field projection
5176       * `Eq` and `IterBytes` implementations can be automatically generated
5177         with `#[deriving_eq]` and `#[deriving_iter_bytes]` respectively
5178       * Removed the special crate language for `.rc` files
5179       * Function arguments may consist of any irrefutable pattern
5180
5181    * Semantic changes
5182       * `&` and `~` pointers may point to objects
5183       * Tuple structs - `struct Foo(Bar, Baz)`. Will replace newtype enums.
5184       * Enum variants may be structs
5185       * Destructors can be added to all nominal types with the Drop trait
5186       * Structs and nullary enum variants may be constants
5187       * Values that cannot be implicitly copied are now automatically moved
5188         without writing `move` explicitly
5189       * `&T` may now be coerced to `*T`
5190       * Coercions happen in `let` statements as well as function calls
5191       * `use` statements now take crate-relative paths
5192       * The module and type namespaces have been merged so that static
5193         method names can be resolved under the trait in which they are
5194         declared
5195
5196    * Improved support for language features
5197       * Trait inheritance works in many scenarios
5198       * More support for explicit self arguments in methods - `self`, `&self`
5199         `@self`, and `~self` all generally work as expected
5200       * Static methods work in more situations
5201       * Experimental: Traits may declare default methods for the implementations
5202         to use
5203
5204    * Libraries
5205       * New condition handling system in `core::condition`
5206       * Timsort added to `std::sort`
5207       * New priority queue, `std::priority_queue`
5208       * Pipes for serializable types, `std::flatpipes'
5209       * Serialization overhauled to be trait-based
5210       * Expanded `getopts` definitions
5211       * Moved futures to `std`
5212       * More functions are pure now
5213       * `core::comm` renamed to `oldcomm`. Still deprecated
5214       * `rustdoc` and `cargo` are libraries now
5215
5216    * Misc
5217       * Added a preliminary REPL, `rusti`
5218       * License changed from MIT to dual MIT/APL2
5219
5220
5221 Version 0.4 (2012-10-15)
5222 ==========================
5223
5224    * ~2000 changes, numerous bugfixes
5225
5226    * Syntax
5227       * All keywords are now strict and may not be used as identifiers anywhere
5228       * Keyword removal: 'again', 'import', 'check', 'new', 'owned', 'send',
5229         'of', 'with', 'to', 'class'.
5230       * Classes are replaced with simpler structs
5231       * Explicit method self types
5232       * `ret` became `return` and `alt` became `match`
5233       * `import` is now `use`; `use is now `extern mod`
5234       * `extern mod { ... }` is now `extern { ... }`
5235       * `use mod` is the recommended way to import modules
5236       * `pub` and `priv` replace deprecated export lists
5237       * The syntax of `match` pattern arms now uses fat arrow (=>)
5238       * `main` no longer accepts an args vector; use `os::args` instead
5239
5240    * Semantics
5241       * Trait implementations are now coherent, ala Haskell typeclasses
5242       * Trait methods may be static
5243       * Argument modes are deprecated
5244       * Borrowed pointers are much more mature and recommended for use
5245       * Strings and vectors in the static region are stored in constant memory
5246       * Typestate was removed
5247       * Resolution rewritten to be more reliable
5248       * Support for 'dual-mode' data structures (freezing and thawing)
5249
5250    * Libraries
5251       * Most binary operators can now be overloaded via the traits in
5252         `core::ops'
5253       * `std::net::url` for representing URLs
5254       * Sendable hash maps in `core::send_map`
5255       * `core::task' gained a (currently unsafe) task-local storage API
5256
5257    * Concurrency
5258       * An efficient new intertask communication primitive called the pipe,
5259         along with a number of higher-level channel types, in `core::pipes`
5260       * `std::arc`, an atomically reference counted, immutable, shared memory
5261         type
5262       * `std::sync`, various exotic synchronization tools based on arcs and pipes
5263       * Futures are now based on pipes and sendable
5264       * More robust linked task failure
5265       * Improved task builder API
5266
5267    * Other
5268       * Improved error reporting
5269       * Preliminary JIT support
5270       * Preliminary work on precise GC
5271       * Extensive architectural improvements to rustc
5272       * Begun a transition away from buggy C++-based reflection (shape) code to
5273         Rust-based (visitor) code
5274       * All hash functions and tables converted to secure, randomized SipHash
5275
5276
5277 Version 0.3  (2012-07-12)
5278 ========================
5279
5280    * ~1900 changes, numerous bugfixes
5281
5282    * New coding conveniences
5283       * Integer-literal suffix inference
5284       * Per-item control over warnings, errors
5285       * #[cfg(windows)] and #[cfg(unix)] attributes
5286       * Documentation comments
5287       * More compact closure syntax
5288       * 'do' expressions for treating higher-order functions as
5289         control structures
5290       * *-patterns (wildcard extended to all constructor fields)
5291
5292    * Semantic cleanup
5293       * Name resolution pass and exhaustiveness checker rewritten
5294       * Region pointers and borrow checking supersede alias
5295         analysis
5296       * Init-ness checking is now provided by a region-based liveness
5297         pass instead of the typestate pass; same for last-use analysis
5298       * Extensive work on region pointers
5299
5300    * Experimental new language features
5301       * Slices and fixed-size, interior-allocated vectors
5302       * #!-comments for lang versioning, shell execution
5303       * Destructors and iface implementation for classes;
5304         type-parameterized classes and class methods
5305       * 'const' type kind for types that can be used to implement
5306         shared-memory concurrency patterns
5307
5308    * Type reflection
5309
5310    * Removal of various obsolete features
5311       * Keywords: 'be', 'prove', 'syntax', 'note', 'mutable', 'bind',
5312                  'crust', 'native' (now 'extern'), 'cont' (now 'again')
5313
5314       * Constructs: do-while loops ('do' repurposed), fn binding,
5315                     resources (replaced by destructors)
5316
5317    * Compiler reorganization
5318       * Syntax-layer of compiler split into separate crate
5319       * Clang (from LLVM project) integrated into build
5320       * Typechecker split into sub-modules
5321
5322    * New library code
5323       * New time functions
5324       * Extension methods for many built-in types
5325       * Arc: atomic-refcount read-only / exclusive-use shared cells
5326       * Par: parallel map and search routines
5327       * Extensive work on libuv interface
5328       * Much vector code moved to libraries
5329       * Syntax extensions: #line, #col, #file, #mod, #stringify,
5330         #include, #include_str, #include_bin
5331
5332    * Tool improvements
5333       * Cargo automatically resolves dependencies
5334
5335
5336 Version 0.2  (2012-03-29)
5337 =========================
5338
5339    * >1500 changes, numerous bugfixes
5340
5341    * New docs and doc tooling
5342
5343    * New port: FreeBSD x86_64
5344
5345    * Compilation model enhancements
5346       * Generics now specialized, multiply instantiated
5347       * Functions now inlined across separate crates
5348
5349    * Scheduling, stack and threading fixes
5350       * Noticeably improved message-passing performance
5351       * Explicit schedulers
5352       * Callbacks from C
5353       * Helgrind clean
5354
5355    * Experimental new language features
5356       * Operator overloading
5357       * Region pointers
5358       * Classes
5359
5360    * Various language extensions
5361       * C-callback function types: 'crust fn ...'
5362       * Infinite-loop construct: 'loop { ... }'
5363       * Shorten 'mutable' to 'mut'
5364       * Required mutable-local qualifier: 'let mut ...'
5365       * Basic glob-exporting: 'export foo::*;'
5366       * Alt now exhaustive, 'alt check' for runtime-checked
5367       * Block-function form of 'for' loop, with 'break' and 'ret'.
5368
5369    * New library code
5370       * AST quasi-quote syntax extension
5371       * Revived libuv interface
5372       * New modules: core::{future, iter}, std::arena
5373       * Merged per-platform std::{os*, fs*} to core::{libc, os}
5374       * Extensive cleanup, regularization in libstd, libcore
5375
5376
5377 Version 0.1  (2012-01-20)
5378 ===============================
5379
5380    * Most language features work, including:
5381       * Unique pointers, unique closures, move semantics
5382       * Interface-constrained generics
5383       * Static interface dispatch
5384       * Stack growth
5385       * Multithread task scheduling
5386       * Typestate predicates
5387       * Failure unwinding, destructors
5388       * Pattern matching and destructuring assignment
5389       * Lightweight block-lambda syntax
5390       * Preliminary macro-by-example
5391
5392    * Compiler works with the following configurations:
5393       * Linux: x86 and x86_64 hosts and targets
5394       * macOS: x86 and x86_64 hosts and targets
5395       * Windows: x86 hosts and targets
5396
5397    * Cross compilation / multi-target configuration supported.
5398
5399    * Preliminary API-documentation and package-management tools included.
5400
5401 Known issues:
5402
5403    * Documentation is incomplete.
5404
5405    * Performance is below intended target.
5406
5407    * Standard library APIs are subject to extensive change, reorganization.
5408
5409    * Language-level versioning is not yet operational - future code will
5410      break unexpectedly.