]> git.lizzy.rs Git - rust.git/blob - RELEASES.md
List Clippy as a subtree, instead of a submodule
[rust.git] / RELEASES.md
1 Version 1.43.0 (2020-04-23)
2 ==========================
3
4 Language
5 --------
6 - [Fixed using binary operations with `&{number}` (e.g. `&1.0`) not having
7   the type inferred correctly.][68129]
8 - [Attributes such as `#[cfg()]` can now be used on `if` expressions.][69201]
9
10 **Syntax only changes**
11 - [Allow `type Foo: Ord` syntactically.][69361]
12 - [Fuse associated and extern items up to defaultness.][69194]
13 - [Syntactically allow `self` in all `fn` contexts.][68764]
14 - [Merge `fn` syntax + cleanup item parsing.][68728]
15 - [`item` macro fragments can be interpolated into `trait`s, `impl`s, and `extern` blocks.][69366]
16   For example, you may now write:
17   ```rust 
18   macro_rules! mac_trait {
19       ($i:item) => {
20           trait T { $i }
21       }
22   }
23   mac_trait! {
24       fn foo() {}
25   }
26   ```
27
28 These are still rejected *semantically*, so you will likely receive an error but
29 these changes can be seen and parsed by macros and
30 conditional compilation.
31
32
33 Compiler
34 --------
35 - [You can now pass multiple lint flags to rustc to override the previous
36   flags.][67885] For example; `rustc -D unused -A unused-variables` denies
37   everything in the `unused` lint group except `unused-variables` which
38   is explicitly allowed. However, passing `rustc -A unused-variables -D unused` denies
39   everything in the `unused` lint group **including** `unused-variables` since
40   the allow flag is specified before the deny flag (and therefore overridden).
41 - [rustc will now prefer your system MinGW libraries over its bundled libraries
42   if they are available on `windows-gnu`.][67429]
43 - [rustc now buffers errors/warnings printed in JSON.][69227]
44
45 Libraries
46 ---------
47 - [`Arc<[T; N]>`, `Box<[T; N]>`, and `Rc<[T; N]>`, now implement
48   `TryFrom<Arc<[T]>>`,`TryFrom<Box<[T]>>`, and `TryFrom<Rc<[T]>>`
49   respectively.][69538] **Note** These conversions are only available when `N`
50   is `0..=32`.
51 - [You can now use associated constants on floats and integers directly, rather
52   than having to import the module.][68952] e.g. You can now write `u32::MAX` or
53   `f32::NAN` with no imports.
54 - [`u8::is_ascii` is now `const`.][68984]
55 - [`String` now implements `AsMut<str>`.][68742]
56 - [Added the `primitive` module to `std` and `core`.][67637] This module
57   reexports Rust's primitive types. This is mainly useful in macros
58   where you want avoid these types being shadowed.
59 - [Relaxed some of the trait bounds on `HashMap` and `HashSet`.][67642]
60 - [`string::FromUtf8Error` now implements `Clone + Eq`.][68738]
61
62 Stabilized APIs
63 ---------------
64 - [`Once::is_completed`]
65 - [`f32::LOG10_2`]
66 - [`f32::LOG2_10`]
67 - [`f64::LOG10_2`]
68 - [`f64::LOG2_10`]
69 - [`iter::once_with`]
70
71 Cargo
72 -----
73 - [You can now set config `[profile]`s in your `.cargo/config`, or through
74   your environment.][cargo/7823]
75 - [Cargo will now set `CARGO_BIN_EXE_<name>` pointing to a binary's
76   executable path when running integration tests or benchmarks.][cargo/7697]
77   `<name>` is the name of your binary as-is e.g. If you wanted the executable
78   path for a binary named `my-program`you would use `env!("CARGO_BIN_EXE_my-program")`.
79
80 Misc
81 ----
82 - [Certain checks in the `const_err` lint were deemed unrelated to const
83   evaluation][69185], and have been moved to the `unconditional_panic` and
84   `arithmetic_overflow` lints.
85   
86 Compatibility Notes
87 -------------------
88
89 - [Having trailing syntax in the `assert!` macro is now a hard error.][69548] This
90   has been a warning since 1.36.0.
91 - [Fixed `Self` not having the correctly inferred type.][69340] This incorrectly
92   led to some instances being accepted, and now correctly emits a hard error.
93
94 [69340]: https://github.com/rust-lang/rust/pull/69340
95
96 Internal Only
97 -------------
98 These changes provide no direct user facing benefits, but represent significant
99 improvements to the internals and overall performance of `rustc` and
100 related tools.
101
102 - [All components are now built with `opt-level=3` instead of `2`.][67878]
103 - [Improved how rustc generates drop code.][67332]
104 - [Improved performance from `#[inline]`-ing certain hot functions.][69256]
105 - [traits: preallocate 2 Vecs of known initial size][69022]
106 - [Avoid exponential behaviour when relating types][68772]
107 - [Skip `Drop` terminators for enum variants without drop glue][68943]
108 - [Improve performance of coherence checks][68966]
109 - [Deduplicate types in the generator witness][68672]
110 - [Invert control in struct_lint_level.][68725]
111
112 [67332]: https://github.com/rust-lang/rust/pull/67332/
113 [67429]: https://github.com/rust-lang/rust/pull/67429/
114 [67637]: https://github.com/rust-lang/rust/pull/67637/
115 [67642]: https://github.com/rust-lang/rust/pull/67642/
116 [67878]: https://github.com/rust-lang/rust/pull/67878/
117 [67885]: https://github.com/rust-lang/rust/pull/67885/
118 [68129]: https://github.com/rust-lang/rust/pull/68129/
119 [68672]: https://github.com/rust-lang/rust/pull/68672/
120 [68725]: https://github.com/rust-lang/rust/pull/68725/
121 [68728]: https://github.com/rust-lang/rust/pull/68728/
122 [68738]: https://github.com/rust-lang/rust/pull/68738/
123 [68742]: https://github.com/rust-lang/rust/pull/68742/
124 [68764]: https://github.com/rust-lang/rust/pull/68764/
125 [68772]: https://github.com/rust-lang/rust/pull/68772/
126 [68943]: https://github.com/rust-lang/rust/pull/68943/
127 [68952]: https://github.com/rust-lang/rust/pull/68952/
128 [68966]: https://github.com/rust-lang/rust/pull/68966/
129 [68984]: https://github.com/rust-lang/rust/pull/68984/
130 [69022]: https://github.com/rust-lang/rust/pull/69022/
131 [69185]: https://github.com/rust-lang/rust/pull/69185/
132 [69194]: https://github.com/rust-lang/rust/pull/69194/
133 [69201]: https://github.com/rust-lang/rust/pull/69201/
134 [69227]: https://github.com/rust-lang/rust/pull/69227/
135 [69548]: https://github.com/rust-lang/rust/pull/69548/
136 [69256]: https://github.com/rust-lang/rust/pull/69256/
137 [69361]: https://github.com/rust-lang/rust/pull/69361/
138 [69366]: https://github.com/rust-lang/rust/pull/69366/
139 [69538]: https://github.com/rust-lang/rust/pull/69538/
140 [cargo/7823]: https://github.com/rust-lang/cargo/pull/7823
141 [cargo/7697]: https://github.com/rust-lang/cargo/pull/7697
142 [`Once::is_completed`]: https://doc.rust-lang.org/std/sync/struct.Once.html#method.is_completed
143 [`f32::LOG10_2`]: https://doc.rust-lang.org/std/f32/consts/constant.LOG10_2.html
144 [`f32::LOG2_10`]: https://doc.rust-lang.org/std/f32/consts/constant.LOG2_10.html
145 [`f64::LOG10_2`]: https://doc.rust-lang.org/std/f64/consts/constant.LOG10_2.html
146 [`f64::LOG2_10`]: https://doc.rust-lang.org/std/f64/consts/constant.LOG2_10.html
147 [`iter::once_with`]: https://doc.rust-lang.org/std/iter/fn.once_with.html
148
149
150 Version 1.42.0 (2020-03-12)
151 ==========================
152
153 Language
154 --------
155 - [You can now use the slice pattern syntax with subslices.][67712] e.g.
156   ```rust
157   fn foo(words: &[&str]) {
158       match words {
159           ["Hello", "World", "!", ..] => println!("Hello World!"),
160           ["Foo", "Bar", ..] => println!("Baz"),
161           rest => println!("{:?}", rest),
162       }
163   }
164   ```
165 - [You can now use `#[repr(transparent)]` on univariant `enum`s.][68122] Meaning
166   that you can create an enum that has the exact layout and ABI of the type
167   it contains.
168 - [There are some *syntax-only* changes:][67131]
169    - `default` is syntactically allowed before items in `trait` definitions.
170    - Items in `impl`s (i.e. `const`s, `type`s, and `fn`s) may syntactically
171      leave out their bodies in favor of `;`.
172    - Bounds on associated types in `impl`s are now syntactically allowed
173      (e.g. `type Foo: Ord;`).
174    - `...` (the C-variadic type) may occur syntactically directly as the type of
175       any function parameter.
176   
177   These are still rejected *semantically*, so you will likely receive an error
178   but these changes can be seen and parsed by procedural macros and
179   conditional compilation.
180
181 Compiler
182 --------
183 - [Added tier 2\* support for `armv7a-none-eabi`.][68253]
184 - [Added tier 2 support for `riscv64gc-unknown-linux-gnu`.][68339]
185 - [`Option::{expect,unwrap}` and
186    `Result::{expect, expect_err, unwrap, unwrap_err}` now produce panic messages
187    pointing to the location where they were called, rather than
188    `core`'s internals. ][67887]
189
190 \* Refer to Rust's [platform support page][forge-platform-support] for more
191 information on Rust's tiered platform support.
192
193 Libraries
194 ---------
195 - [`iter::Empty<T>` now implements `Send` and `Sync` for any `T`.][68348]
196 - [`Pin::{map_unchecked, map_unchecked_mut}` no longer require the return type
197    to implement `Sized`.][67935]
198 - [`io::Cursor` now derives `PartialEq` and `Eq`.][67233]
199 - [`Layout::new` is now `const`.][66254]
200 - [Added Standard Library support for `riscv64gc-unknown-linux-gnu`.][66899]
201
202
203 Stabilized APIs
204 ---------------
205 - [`CondVar::wait_while`]
206 - [`CondVar::wait_timeout_while`]
207 - [`DebugMap::key`]
208 - [`DebugMap::value`]
209 - [`ManuallyDrop::take`]
210 - [`matches!`]
211 - [`ptr::slice_from_raw_parts_mut`]
212 - [`ptr::slice_from_raw_parts`]
213
214 Cargo
215 -----
216 - [You no longer need to include `extern crate proc_macro;` to be able to
217   `use proc_macro;` in the `2018` edition.][cargo/7700]
218
219 Compatibility Notes
220 -------------------
221 - [`Error::description` has been deprecated, and its use will now produce a
222   warning.][66919] It's recommended to use `Display`/`to_string` instead.
223
224 [68253]: https://github.com/rust-lang/rust/pull/68253/
225 [68348]: https://github.com/rust-lang/rust/pull/68348/
226 [67935]: https://github.com/rust-lang/rust/pull/67935/
227 [68339]: https://github.com/rust-lang/rust/pull/68339/
228 [68122]: https://github.com/rust-lang/rust/pull/68122/
229 [67712]: https://github.com/rust-lang/rust/pull/67712/
230 [67887]: https://github.com/rust-lang/rust/pull/67887/
231 [67131]: https://github.com/rust-lang/rust/pull/67131/
232 [67233]: https://github.com/rust-lang/rust/pull/67233/
233 [66899]: https://github.com/rust-lang/rust/pull/66899/
234 [66919]: https://github.com/rust-lang/rust/pull/66919/
235 [66254]: https://github.com/rust-lang/rust/pull/66254/
236 [cargo/7700]: https://github.com/rust-lang/cargo/pull/7700
237 [`DebugMap::key`]: https://doc.rust-lang.org/stable/std/fmt/struct.DebugMap.html#method.key
238 [`DebugMap::value`]: https://doc.rust-lang.org/stable/std/fmt/struct.DebugMap.html#method.value
239 [`ManuallyDrop::take`]: https://doc.rust-lang.org/stable/std/mem/struct.ManuallyDrop.html#method.take
240 [`matches!`]: https://doc.rust-lang.org/stable/std/macro.matches.html
241 [`ptr::slice_from_raw_parts_mut`]: https://doc.rust-lang.org/stable/std/ptr/fn.slice_from_raw_parts_mut.html
242 [`ptr::slice_from_raw_parts`]: https://doc.rust-lang.org/stable/std/ptr/fn.slice_from_raw_parts.html
243 [`CondVar::wait_while`]: https://doc.rust-lang.org/stable/std/sync/struct.Condvar.html#method.wait_while
244 [`CondVar::wait_timeout_while`]: https://doc.rust-lang.org/stable/std/sync/struct.Condvar.html#method.wait_timeout_while
245
246
247 Version 1.41.1 (2020-02-27)
248 ===========================
249
250 * [Always check types of static items][69145]
251 * [Always check lifetime bounds of `Copy` impls][69145]
252 * [Fix miscompilation in callers of `Layout::repeat`][69225]
253
254 [69225]: https://github.com/rust-lang/rust/issues/69225
255 [69145]: https://github.com/rust-lang/rust/pull/69145
256
257
258 Version 1.41.0 (2020-01-30)
259 ===========================
260
261 Language
262 --------
263
264 - [You can now pass type parameters to foreign items when implementing
265   traits.][65879] E.g. You can now write `impl<T> From<Foo> for Vec<T> {}`.
266 - [You can now arbitrarily nest receiver types in the `self` position.][64325] E.g. you can
267   now write `fn foo(self: Box<Box<Self>>) {}`. Previously only `Self`, `&Self`,
268   `&mut Self`, `Arc<Self>`, `Rc<Self>`, and `Box<Self>` were allowed.
269 - [You can now use any valid identifier in a `format_args` macro.][66847]
270   Previously identifiers starting with an underscore were not allowed.
271 - [Visibility modifiers (e.g. `pub`) are now syntactically allowed on trait items and
272   enum variants.][66183] These are still rejected semantically, but
273   can be seen and parsed by procedural macros and conditional compilation.
274
275 Compiler
276 --------
277
278 - [Rustc will now warn if you have unused loop `'label`s.][66325]
279 - [Removed support for the `i686-unknown-dragonfly` target.][67255]
280 - [Added tier 3 support\* for the `riscv64gc-unknown-linux-gnu` target.][66661]
281 - [You can now pass an arguments file passing the `@path` syntax
282   to rustc.][66172] Note that the format differs somewhat from what is
283   found in other tooling; please see [the documentation][argfile-docs] for
284   more information.
285 - [You can now provide `--extern` flag without a path, indicating that it is
286   available from the search path or specified with an `-L` flag.][64882]
287
288 \* Refer to Rust's [platform support page][forge-platform-support] for more
289 information on Rust's tiered platform support.
290
291 [argfile-docs]: https://doc.rust-lang.org/nightly/rustc/command-line-arguments.html#path-load-command-line-flags-from-a-path
292
293 Libraries
294 ---------
295
296 - [The `core::panic` module is now stable.][66771] It was already stable
297   through `std`.
298 - [`NonZero*` numerics now implement `From<NonZero*>` if it's a smaller integer
299   width.][66277] E.g. `NonZeroU16` now implements `From<NonZeroU8>`.
300 - [`MaybeUninit<T>` now implements `fmt::Debug`.][65013]
301
302 Stabilized APIs
303 ---------------
304
305 - [`Result::map_or`]
306 - [`Result::map_or_else`]
307 - [`std::rc::Weak::weak_count`]
308 - [`std::rc::Weak::strong_count`]
309 - [`std::sync::Weak::weak_count`]
310 - [`std::sync::Weak::strong_count`]
311
312 Cargo
313 -----
314
315 - [Cargo will now document all the private items for binary crates
316   by default.][cargo/7593]
317 - [`cargo-install` will now reinstall the package if it detects that it is out
318   of date.][cargo/7560]
319 - [Cargo.lock now uses a more git friendly format that should help to reduce
320   merge conflicts.][cargo/7579]
321 - [You can now override specific dependencies's build settings][cargo/7591] E.g.
322   `[profile.dev.package.image] opt-level = 2` sets the `image` crate's
323   optimisation level to `2` for debug builds. You can also use
324   `[profile.<profile>.build-override]` to override build scripts and
325   their dependencies.
326
327 Misc
328 ----
329
330 - [You can now specify `edition` in documentation code blocks to compile the block
331   for that edition.][66238] E.g. `edition2018` tells rustdoc that the code sample
332   should be compiled the 2018 edition of Rust.
333 - [You can now provide custom themes to rustdoc with `--theme`, and check the
334   current theme with `--check-theme`.][54733]
335 - [You can use `#[cfg(doc)]` to compile an item when building documentation.][61351]
336
337 Compatibility Notes
338 -------------------
339
340 - [As previously announced 1.41.0 will be the last tier 1 release for 32-bit
341   Apple targets.][apple-32bit-drop] This means that the source code is still
342   available to build, but the targets are no longer being tested and release
343   binaries for those platforms will no longer be distributed by the Rust project.
344   Please refer to the linked blog post for more information.
345
346 [54733]: https://github.com/rust-lang/rust/pull/54733/
347 [61351]: https://github.com/rust-lang/rust/pull/61351/
348 [67255]: https://github.com/rust-lang/rust/pull/67255/
349 [66661]: https://github.com/rust-lang/rust/pull/66661/
350 [66771]: https://github.com/rust-lang/rust/pull/66771/
351 [66847]: https://github.com/rust-lang/rust/pull/66847/
352 [66238]: https://github.com/rust-lang/rust/pull/66238/
353 [66277]: https://github.com/rust-lang/rust/pull/66277/
354 [66325]: https://github.com/rust-lang/rust/pull/66325/
355 [66172]: https://github.com/rust-lang/rust/pull/66172/
356 [66183]: https://github.com/rust-lang/rust/pull/66183/
357 [65879]: https://github.com/rust-lang/rust/pull/65879/
358 [65013]: https://github.com/rust-lang/rust/pull/65013/
359 [64882]: https://github.com/rust-lang/rust/pull/64882/
360 [64325]: https://github.com/rust-lang/rust/pull/64325/
361 [cargo/7560]: https://github.com/rust-lang/cargo/pull/7560/
362 [cargo/7579]: https://github.com/rust-lang/cargo/pull/7579/
363 [cargo/7591]: https://github.com/rust-lang/cargo/pull/7591/
364 [cargo/7593]: https://github.com/rust-lang/cargo/pull/7593/
365 [`Result::map_or_else`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.map_or_else
366 [`Result::map_or`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.map_or
367 [`std::rc::Weak::weak_count`]: https://doc.rust-lang.org/std/rc/struct.Weak.html#method.weak_count
368 [`std::rc::Weak::strong_count`]: https://doc.rust-lang.org/std/rc/struct.Weak.html#method.strong_count
369 [`std::sync::Weak::weak_count`]: https://doc.rust-lang.org/std/sync/struct.Weak.html#method.weak_count
370 [`std::sync::Weak::strong_count`]: https://doc.rust-lang.org/std/sync/struct.Weak.html#method.strong_count
371 [apple-32bit-drop]: https://blog.rust-lang.org/2020/01/03/reducing-support-for-32-bit-apple-targets.html
372
373 Version 1.40.0 (2019-12-19)
374 ===========================
375
376 Language
377 --------
378 - [You can now use tuple `struct`s and tuple `enum` variant's constructors in
379   `const` contexts.][65188] e.g.
380
381   ```rust
382   pub struct Point(i32, i32);
383
384   const ORIGIN: Point = {
385       let constructor = Point;
386
387       constructor(0, 0)
388   };
389   ```
390
391 - [You can now mark `struct`s, `enum`s, and `enum` variants with the `#[non_exhaustive]` attribute to
392   indicate that there may be variants or fields added in the future.][64639]
393   For example this requires adding a wild-card branch (`_ => {}`) to any match
394   statements on a non-exhaustive `enum`. [(RFC 2008)]
395 - [You can now use function-like procedural macros in `extern` blocks and in
396   type positions.][63931] e.g. `type Generated = macro!();`
397 - [Function-like and attribute procedural macros can now emit
398   `macro_rules!` items, so you can now have your macros generate macros.][64035]
399 - [The `meta` pattern matcher in `macro_rules!` now correctly matches the modern
400   attribute syntax.][63674] For example `(#[$m:meta])` now matches `#[attr]`,
401   `#[attr{tokens}]`, `#[attr[tokens]]`, and `#[attr(tokens)]`.
402
403 Compiler
404 --------
405 - [Added tier 3 support\* for the
406   `thumbv7neon-unknown-linux-musleabihf` target.][66103]
407 - [Added tier 3 support for the
408   `aarch64-unknown-none-softfloat` target.][64589]
409 - [Added tier 3 support for the `mips64-unknown-linux-muslabi64`, and
410   `mips64el-unknown-linux-muslabi64` targets.][65843]
411
412 \* Refer to Rust's [platform support page][forge-platform-support] for more
413   information on Rust's tiered platform support.
414
415 Libraries
416 ---------
417 - [The `is_power_of_two` method on unsigned numeric types is now a `const` function.][65092]
418
419 Stabilized APIs
420 ---------------
421 - [`BTreeMap::get_key_value`]
422 - [`HashMap::get_key_value`]
423 - [`Option::as_deref_mut`]
424 - [`Option::as_deref`]
425 - [`Option::flatten`]
426 - [`UdpSocket::peer_addr`]
427 - [`f32::to_be_bytes`]
428 - [`f32::to_le_bytes`]
429 - [`f32::to_ne_bytes`]
430 - [`f64::to_be_bytes`]
431 - [`f64::to_le_bytes`]
432 - [`f64::to_ne_bytes`]
433 - [`f32::from_be_bytes`]
434 - [`f32::from_le_bytes`]
435 - [`f32::from_ne_bytes`]
436 - [`f64::from_be_bytes`]
437 - [`f64::from_le_bytes`]
438 - [`f64::from_ne_bytes`]
439 - [`mem::take`]
440 - [`slice::repeat`]
441 - [`todo!`]
442
443 Cargo
444 -----
445 - [Cargo will now always display warnings, rather than only on
446   fresh builds.][cargo/7450]
447 - [Feature flags (except `--all-features`) passed to a virtual workspace will
448   now produce an error.][cargo/7507] Previously these flags were ignored.
449 - [You can now publish `dev-dependencies` without including
450   a `version`.][cargo/7333]
451
452 Misc
453 ----
454 - [You can now specify the `#[cfg(doctest)]` attribute to include an item only
455   when running documentation tests with `rustdoc`.][63803]
456
457 Compatibility Notes
458 -------------------
459 - [As previously announced, any previous NLL warnings in the 2015 edition are
460   now hard errors.][64221]
461 - [The `include!` macro will now warn if it failed to include the
462   entire file.][64284] The `include!` macro unintentionally only includes the
463   first _expression_ in a file, and this can be unintuitive. This will become
464   either a hard error in a future release, or the behavior may be fixed to include all expressions as expected.
465 - [Using `#[inline]` on function prototypes and consts now emits a warning under
466   `unused_attribute` lint.][65294] Using `#[inline]` anywhere else inside traits
467   or `extern` blocks now correctly emits a hard error.
468   
469 [65294]: https://github.com/rust-lang/rust/pull/65294/
470 [66103]: https://github.com/rust-lang/rust/pull/66103/
471 [65843]: https://github.com/rust-lang/rust/pull/65843/
472 [65188]: https://github.com/rust-lang/rust/pull/65188/
473 [65092]: https://github.com/rust-lang/rust/pull/65092/
474 [64589]: https://github.com/rust-lang/rust/pull/64589/
475 [64639]: https://github.com/rust-lang/rust/pull/64639/
476 [64221]: https://github.com/rust-lang/rust/pull/64221/
477 [64284]: https://github.com/rust-lang/rust/pull/64284/
478 [63931]: https://github.com/rust-lang/rust/pull/63931/
479 [64035]: https://github.com/rust-lang/rust/pull/64035/
480 [63674]: https://github.com/rust-lang/rust/pull/63674/
481 [63803]: https://github.com/rust-lang/rust/pull/63803/
482 [cargo/7450]: https://github.com/rust-lang/cargo/pull/7450/
483 [cargo/7507]: https://github.com/rust-lang/cargo/pull/7507/
484 [cargo/7525]: https://github.com/rust-lang/cargo/pull/7525/
485 [cargo/7333]: https://github.com/rust-lang/cargo/pull/7333/
486 [(rfc 2008)]: https://rust-lang.github.io/rfcs/2008-non-exhaustive.html
487 [`f32::to_be_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_be_bytes
488 [`f32::to_le_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_le_bytes
489 [`f32::to_ne_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_ne_bytes
490 [`f64::to_be_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_be_bytes
491 [`f64::to_le_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_le_bytes
492 [`f64::to_ne_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_ne_bytes
493 [`f32::from_be_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.from_be_bytes
494 [`f32::from_le_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.from_le_bytes
495 [`f32::from_ne_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.from_ne_bytes
496 [`f64::from_be_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.from_be_bytes
497 [`f64::from_le_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.from_le_bytes
498 [`f64::from_ne_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.from_ne_bytes
499 [`option::flatten`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.flatten
500 [`option::as_deref`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.as_deref
501 [`option::as_deref_mut`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.as_deref_mut
502 [`hashmap::get_key_value`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.get_key_value
503 [`btreemap::get_key_value`]: https://doc.rust-lang.org/std/collections/struct.BTreeMap.html#method.get_key_value
504 [`slice::repeat`]: https://doc.rust-lang.org/std/primitive.slice.html#method.repeat
505 [`mem::take`]: https://doc.rust-lang.org/std/mem/fn.take.html
506 [`udpsocket::peer_addr`]: https://doc.rust-lang.org/std/net/struct.UdpSocket.html#method.peer_addr
507 [`todo!`]: https://doc.rust-lang.org/std/macro.todo.html
508
509
510 Version 1.39.0 (2019-11-07)
511 ===========================
512
513 Language
514 --------
515 - [You can now create `async` functions and blocks with `async fn`, `async move {}`, and
516   `async {}` respectively, and you can now call `.await` on async expressions.][63209]
517 - [You can now use certain attributes on function, closure, and function pointer
518   parameters.][64010] These attributes include `cfg`, `cfg_attr`, `allow`, `warn`,
519   `deny`, `forbid` as well as inert helper attributes used by procedural macro
520   attributes applied to items. e.g.
521   ```rust
522   fn len(
523       #[cfg(windows)] slice: &[u16],
524       #[cfg(not(windows))] slice: &[u8],
525   ) -> usize {
526       slice.len()
527   }
528   ```
529 - [You can now take shared references to bind-by-move patterns in the `if` guards
530   of `match` arms.][63118] e.g.
531   ```rust
532   fn main() {
533       let array: Box<[u8; 4]> = Box::new([1, 2, 3, 4]);
534
535       match array {
536           nums
537   //      ---- `nums` is bound by move.
538               if nums.iter().sum::<u8>() == 10
539   //                 ^------ `.iter()` implicitly takes a reference to `nums`.
540           => {
541               drop(nums);
542   //          ----------- Legal as `nums` was bound by move and so we have ownership.
543           }
544           _ => unreachable!(),
545       }
546   }
547   ```
548
549
550
551 Compiler
552 --------
553 - [Added tier 3\* support for the `i686-unknown-uefi` target.][64334]
554 - [Added tier 3 support for the `sparc64-unknown-openbsd` target.][63595]
555 - [rustc will now trim code snippets in diagnostics to fit in your terminal.][63402]
556   **Note** Cargo currently doesn't use this feature. Refer to
557   [cargo#7315][cargo/7315] to track this feature's progress.
558 - [You can now pass `--show-output` argument to test binaries to print the
559   output of successful tests.][62600]
560
561
562 \* Refer to Rust's [platform support page][forge-platform-support] for more
563 information on Rust's tiered platform support.
564
565 Libraries
566 ---------
567 - [`Vec::new` and `String::new` are now `const` functions.][64028]
568 - [`LinkedList::new` is now a `const` function.][63684]
569 - [`str::len`, `[T]::len` and `str::as_bytes` are now `const` functions.][63770]
570 - [The `abs`, `wrapping_abs`, and `overflowing_abs` numeric functions are
571   now `const`.][63786]
572
573 Stabilized APIs
574 ---------------
575 - [`Pin::into_inner`]
576 - [`Instant::checked_duration_since`]
577 - [`Instant::saturating_duration_since`]
578
579 Cargo
580 -----
581 - [You can now publish git dependencies if supplied with a `version`.][cargo/7237]
582 - [The `--all` flag has been renamed to `--workspace`.][cargo/7241] Using
583   `--all` is now deprecated.
584
585 Misc
586 ----
587 - [You can now pass `-Clinker` to rustdoc to control the linker used
588   for compiling doctests.][63834]
589
590 Compatibility Notes
591 -------------------
592 - [Code that was previously accepted by the old borrow checker, but rejected by
593   the NLL borrow checker is now a hard error in Rust 2018.][63565] This was
594   previously a warning, and will also become a hard error in the Rust 2015
595   edition in the 1.40.0 release.
596 - [`rustdoc` now requires `rustc` to be installed and in the same directory to
597   run tests.][63827] This should improve performance when running a large
598   amount of doctests.
599 - [The `try!` macro will now issue a deprecation warning.][62672] It is
600   recommended to use the `?` operator instead.
601 - [`asinh(-0.0)` now correctly returns `-0.0`.][63698] Previously this
602   returned `0.0`.
603
604 [62600]: https://github.com/rust-lang/rust/pull/62600/
605 [62672]: https://github.com/rust-lang/rust/pull/62672/
606 [63118]: https://github.com/rust-lang/rust/pull/63118/
607 [63209]: https://github.com/rust-lang/rust/pull/63209/
608 [63402]: https://github.com/rust-lang/rust/pull/63402/
609 [63565]: https://github.com/rust-lang/rust/pull/63565/
610 [63595]: https://github.com/rust-lang/rust/pull/63595/
611 [63684]: https://github.com/rust-lang/rust/pull/63684/
612 [63698]: https://github.com/rust-lang/rust/pull/63698/
613 [63770]: https://github.com/rust-lang/rust/pull/63770/
614 [63786]: https://github.com/rust-lang/rust/pull/63786/
615 [63827]: https://github.com/rust-lang/rust/pull/63827/
616 [63834]: https://github.com/rust-lang/rust/pull/63834/
617 [63927]: https://github.com/rust-lang/rust/pull/63927/
618 [63933]: https://github.com/rust-lang/rust/pull/63933/
619 [63934]: https://github.com/rust-lang/rust/pull/63934/
620 [63938]: https://github.com/rust-lang/rust/pull/63938/
621 [63940]: https://github.com/rust-lang/rust/pull/63940/
622 [63941]: https://github.com/rust-lang/rust/pull/63941/
623 [63945]: https://github.com/rust-lang/rust/pull/63945/
624 [64010]: https://github.com/rust-lang/rust/pull/64010/
625 [64028]: https://github.com/rust-lang/rust/pull/64028/
626 [64334]: https://github.com/rust-lang/rust/pull/64334/
627 [cargo/7237]: https://github.com/rust-lang/cargo/pull/7237/
628 [cargo/7241]: https://github.com/rust-lang/cargo/pull/7241/
629 [cargo/7315]: https://github.com/rust-lang/cargo/pull/7315/
630 [`Pin::into_inner`]: https://doc.rust-lang.org/std/pin/struct.Pin.html#method.into_inner
631 [`Instant::checked_duration_since`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.checked_duration_since
632 [`Instant::saturating_duration_since`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.saturating_duration_since
633
634 Version 1.38.0 (2019-09-26)
635 ==========================
636
637 Language
638 --------
639 - [The `#[global_allocator]` attribute can now be used in submodules.][62735]
640 - [The `#[deprecated]` attribute can now be used on macros.][62042]
641
642 Compiler
643 --------
644 - [Added pipelined compilation support to `rustc`.][62766] This will
645   improve compilation times in some cases. For further information please refer
646   to the [_"Evaluating pipelined rustc compilation"_][pipeline-internals] thread.
647 - [Added tier 3\* support for the `aarch64-uwp-windows-msvc`, `i686-uwp-windows-gnu`,
648   `i686-uwp-windows-msvc`, `x86_64-uwp-windows-gnu`, and
649   `x86_64-uwp-windows-msvc` targets.][60260]
650 - [Added tier 3 support for the `armv7-unknown-linux-gnueabi` and
651   `armv7-unknown-linux-musleabi` targets.][63107]
652 - [Added tier 3 support for the `hexagon-unknown-linux-musl` target.][62814]
653 - [Added tier 3 support for the `riscv32i-unknown-none-elf` target.][62784]
654
655 \* Refer to Rust's [platform support page][forge-platform-support] for more
656 information on Rust's tiered platform support.
657
658 Libraries
659 ---------
660 - [`ascii::EscapeDefault` now implements `Clone` and `Display`.][63421]
661 - [Derive macros for prelude traits (e.g. `Clone`, `Debug`, `Hash`) are now
662   available at the same path as the trait.][63056] (e.g. The `Clone` derive macro
663   is available at `std::clone::Clone`). This also makes all built-in macros
664   available in `std`/`core` root. e.g. `std::include_bytes!`.
665 - [`str::Chars` now implements `Debug`.][63000]
666 - [`slice::{concat, connect, join}` now accepts `&[T]` in addition to `&T`.][62528]
667 - [`*const T` and `*mut T` now implement `marker::Unpin`.][62583]
668 - [`Arc<[T]>` and `Rc<[T]>` now implement `FromIterator<T>`.][61953]
669 - [Added euclidean remainder and division operations (`div_euclid`,
670   `rem_euclid`) to all numeric primitives.][61884] Additionally `checked`,
671   `overflowing`, and `wrapping` versions are available for all
672   integer primitives.
673 - [`thread::AccessError` now implements `Clone`, `Copy`, `Eq`, `Error`, and
674   `PartialEq`.][61491]
675 - [`iter::{StepBy, Peekable, Take}` now implement `DoubleEndedIterator`.][61457]
676
677 Stabilized APIs
678 ---------------
679 - [`<*const T>::cast`]
680 - [`<*mut T>::cast`]
681 - [`Duration::as_secs_f32`]
682 - [`Duration::as_secs_f64`]
683 - [`Duration::div_f32`]
684 - [`Duration::div_f64`]
685 - [`Duration::from_secs_f32`]
686 - [`Duration::from_secs_f64`]
687 - [`Duration::mul_f32`]
688 - [`Duration::mul_f64`]
689 - [`any::type_name`]
690
691 Cargo
692 -----
693 - [Added pipelined compilation support to `cargo`.][cargo/7143]
694 - [You can now pass the `--features` option multiple times to enable
695   multiple features.][cargo/7084]
696
697 Misc
698 ----
699 - [`rustc` will now warn about some incorrect uses of
700   `mem::{uninitialized, zeroed}` that are known to cause undefined behaviour.][63346]
701
702 Compatibility Notes
703 -------------------
704 - The [`x86_64-unknown-uefi` platform can not be built][62785] with rustc
705   1.38.0.
706 - The [`armv7-unknown-linux-gnueabihf` platform is known to have
707   issues][62896] with certain crates such as libc.
708
709 [60260]: https://github.com/rust-lang/rust/pull/60260/
710 [61457]: https://github.com/rust-lang/rust/pull/61457/
711 [61491]: https://github.com/rust-lang/rust/pull/61491/
712 [61884]: https://github.com/rust-lang/rust/pull/61884/
713 [61953]: https://github.com/rust-lang/rust/pull/61953/
714 [62042]: https://github.com/rust-lang/rust/pull/62042/
715 [62528]: https://github.com/rust-lang/rust/pull/62528/
716 [62583]: https://github.com/rust-lang/rust/pull/62583/
717 [62735]: https://github.com/rust-lang/rust/pull/62735/
718 [62766]: https://github.com/rust-lang/rust/pull/62766/
719 [62784]: https://github.com/rust-lang/rust/pull/62784/
720 [62785]: https://github.com/rust-lang/rust/issues/62785/
721 [62814]: https://github.com/rust-lang/rust/pull/62814/
722 [62896]: https://github.com/rust-lang/rust/issues/62896/
723 [63000]: https://github.com/rust-lang/rust/pull/63000/
724 [63056]: https://github.com/rust-lang/rust/pull/63056/
725 [63107]: https://github.com/rust-lang/rust/pull/63107/
726 [63346]: https://github.com/rust-lang/rust/pull/63346/
727 [63421]: https://github.com/rust-lang/rust/pull/63421/
728 [cargo/7084]: https://github.com/rust-lang/cargo/pull/7084/
729 [cargo/7143]: https://github.com/rust-lang/cargo/pull/7143/
730 [`<*const T>::cast`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.cast
731 [`<*mut T>::cast`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.cast
732 [`Duration::as_secs_f32`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_secs_f32
733 [`Duration::as_secs_f64`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_secs_f64
734 [`Duration::div_f32`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.div_f32
735 [`Duration::div_f64`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.div_f64
736 [`Duration::from_secs_f32`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.from_secs_f32
737 [`Duration::from_secs_f64`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.from_secs_f64
738 [`Duration::mul_f32`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.mul_f32
739 [`Duration::mul_f64`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.mul_f64
740 [`any::type_name`]: https://doc.rust-lang.org/std/any/fn.type_name.html
741 [forge-platform-support]: https://forge.rust-lang.org/platform-support.html
742 [pipeline-internals]: https://internals.rust-lang.org/t/evaluating-pipelined-rustc-compilation/10199
743
744 Version 1.37.0 (2019-08-15)
745 ==========================
746
747 Language
748 --------
749 - `#[must_use]` will now warn if the type is contained in a [tuple][61100],
750   [`Box`][62228], or an [array][62235] and unused.
751 - [You can now use the `cfg` and `cfg_attr` attributes on
752   generic parameters.][61547]
753 - [You can now use enum variants through type alias.][61682] e.g. You can
754   write the following:
755   ```rust
756   type MyOption = Option<u8>;
757
758   fn increment_or_zero(x: MyOption) -> u8 {
759       match x {
760           MyOption::Some(y) => y + 1,
761           MyOption::None => 0,
762       }
763   }
764   ```
765 - [You can now use `_` as an identifier for consts.][61347] e.g. You can write
766   `const _: u32 = 5;`.
767 - [You can now use `#[repr(align(X)]` on enums.][61229]
768 - [The  `?` Kleene macro operator is now available in the
769   2015 edition.][60932]
770
771 Compiler
772 --------
773 - [You can now enable Profile-Guided Optimization with the `-C profile-generate`
774   and `-C profile-use` flags.][61268] For more information on how to use profile
775   guided optimization, please refer to the [rustc book][rustc-book-pgo].
776 - [The `rust-lldb` wrapper script should now work again.][61827]
777
778 Libraries
779 ---------
780 - [`mem::MaybeUninit<T>` is now ABI-compatible with `T`.][61802]
781
782 Stabilized APIs
783 ---------------
784 - [`BufReader::buffer`]
785 - [`BufWriter::buffer`]
786 - [`Cell::from_mut`]
787 - [`Cell<[T]>::as_slice_of_cells`][`Cell<slice>::as_slice_of_cells`]
788 - [`DoubleEndedIterator::nth_back`]
789 - [`Option::xor`]
790 - [`Wrapping::reverse_bits`]
791 - [`i128::reverse_bits`]
792 - [`i16::reverse_bits`]
793 - [`i32::reverse_bits`]
794 - [`i64::reverse_bits`]
795 - [`i8::reverse_bits`]
796 - [`isize::reverse_bits`]
797 - [`slice::copy_within`]
798 - [`u128::reverse_bits`]
799 - [`u16::reverse_bits`]
800 - [`u32::reverse_bits`]
801 - [`u64::reverse_bits`]
802 - [`u8::reverse_bits`]
803 - [`usize::reverse_bits`]
804
805 Cargo
806 -----
807 - [`Cargo.lock` files are now included by default when publishing executable crates
808   with executables.][cargo/7026]
809 - [You can now specify `default-run="foo"` in `[package]` to specify the
810   default executable to use for `cargo run`.][cargo/7056]
811
812 Misc
813 ----
814
815 Compatibility Notes
816 -------------------
817 - [Using `...` for inclusive range patterns will now warn by default.][61342]
818   Please transition your code to using the `..=` syntax for inclusive
819   ranges instead.
820 - [Using a trait object without the `dyn` will now warn by default.][61203]
821   Please transition your code to use `dyn Trait` for trait objects instead.
822
823 [62228]: https://github.com/rust-lang/rust/pull/62228/
824 [62235]: https://github.com/rust-lang/rust/pull/62235/
825 [61802]: https://github.com/rust-lang/rust/pull/61802/
826 [61827]: https://github.com/rust-lang/rust/pull/61827/
827 [61547]: https://github.com/rust-lang/rust/pull/61547/
828 [61682]: https://github.com/rust-lang/rust/pull/61682/
829 [61268]: https://github.com/rust-lang/rust/pull/61268/
830 [61342]: https://github.com/rust-lang/rust/pull/61342/
831 [61347]: https://github.com/rust-lang/rust/pull/61347/
832 [61100]: https://github.com/rust-lang/rust/pull/61100/
833 [61203]: https://github.com/rust-lang/rust/pull/61203/
834 [61229]: https://github.com/rust-lang/rust/pull/61229/
835 [60932]: https://github.com/rust-lang/rust/pull/60932/
836 [cargo/7026]: https://github.com/rust-lang/cargo/pull/7026/
837 [cargo/7056]: https://github.com/rust-lang/cargo/pull/7056/
838 [`BufReader::buffer`]: https://doc.rust-lang.org/std/io/struct.BufReader.html#method.buffer
839 [`BufWriter::buffer`]: https://doc.rust-lang.org/std/io/struct.BufWriter.html#method.buffer
840 [`Cell::from_mut`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.from_mut
841 [`Cell<slice>::as_slice_of_cells`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.as_slice_of_cells
842 [`DoubleEndedIterator::nth_back`]: https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html#method.nth_back
843 [`Option::xor`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.xor
844 [`RefCell::try_borrow_unguarded`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.try_borrow_unguarded
845 [`Wrapping::reverse_bits`]: https://doc.rust-lang.org/std/num/struct.Wrapping.html#method.reverse_bits
846 [`i128::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i128.html#method.reverse_bits
847 [`i16::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i16.html#method.reverse_bits
848 [`i32::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i32.html#method.reverse_bits
849 [`i64::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i64.html#method.reverse_bits
850 [`i8::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i8.html#method.reverse_bits
851 [`isize::reverse_bits`]: https://doc.rust-lang.org/std/primitive.isize.html#method.reverse_bits
852 [`slice::copy_within`]: https://doc.rust-lang.org/std/primitive.slice.html#method.copy_within
853 [`u128::reverse_bits`]: https://doc.rust-lang.org/std/primitive.u128.html#method.reverse_bits
854 [`u16::reverse_bits`]: https://doc.rust-lang.org/std/primitive.u16.html#method.reverse_bits
855 [`u32::reverse_bits`]: https://doc.rust-lang.org/std/primitive.u32.html#method.reverse_bits
856 [`u64::reverse_bits`]: https://doc.rust-lang.org/std/primitive.u64.html#method.reverse_bits
857 [`u8::reverse_bits`]: https://doc.rust-lang.org/std/primitive.u8.html#method.reverse_bits
858 [`usize::reverse_bits`]: https://doc.rust-lang.org/std/primitive.usize.html#method.reverse_bits
859 [rustc-book-pgo]: https://doc.rust-lang.org/rustc/profile-guided-optimization.html
860
861
862 Version 1.36.0 (2019-07-04)
863 ==========================
864
865 Language
866 --------
867 - [Non-Lexical Lifetimes are now enabled on the 2015 edition.][59114]
868 - [The order of traits in trait objects no longer affects the semantics of that
869   object.][59445] e.g. `dyn Send + fmt::Debug` is now equivalent to
870   `dyn fmt::Debug + Send`, where this was previously not the case.
871
872 Libraries
873 ---------
874 - [`HashMap`'s implementation has been replaced with `hashbrown::HashMap` implementation.][58623]
875 - [`TryFromSliceError` now implements `From<Infallible>`.][60318]
876 - [`mem::needs_drop` is now available as a const fn.][60364]
877 - [`alloc::Layout::from_size_align_unchecked` is now available as a const fn.][60370]
878 - [`String` now implements `BorrowMut<str>`.][60404]
879 - [`io::Cursor` now implements `Default`.][60234]
880 - [Both `NonNull::{dangling, cast}` are now const fns.][60244]
881 - [The `alloc` crate is now stable.][59675] `alloc` allows you to use a subset
882   of `std` (e.g. `Vec`, `Box`, `Arc`) in `#![no_std]` environments if the
883   environment has access to heap memory allocation.
884 - [`String` now implements `From<&String>`.][59825]
885 - [You can now pass multiple arguments to the `dbg!` macro.][59826] `dbg!` will
886   return a tuple of each argument when there is multiple arguments.
887 - [`Result::{is_err, is_ok}` are now `#[must_use]` and will produce a warning if
888   not used.][59648]
889
890 Stabilized APIs
891 ---------------
892 - [`VecDeque::rotate_left`]
893 - [`VecDeque::rotate_right`]
894 - [`Iterator::copied`]
895 - [`io::IoSlice`]
896 - [`io::IoSliceMut`]
897 - [`Read::read_vectored`]
898 - [`Write::write_vectored`]
899 - [`str::as_mut_ptr`]
900 - [`mem::MaybeUninit`]
901 - [`pointer::align_offset`]
902 - [`future::Future`]
903 - [`task::Context`]
904 - [`task::RawWaker`]
905 - [`task::RawWakerVTable`]
906 - [`task::Waker`]
907 - [`task::Poll`]
908
909 Cargo
910 -----
911 - [Cargo will now produce an error if you attempt to use the name of a required dependency as a feature.][cargo/6860]
912 - [You can now pass the `--offline` flag to run cargo without accessing the network.][cargo/6934]
913
914 You can find further change's in [Cargo's 1.36.0 release notes][cargo-1-36-0].
915
916 Clippy
917 ------
918 There have been numerous additions and fixes to clippy, see [Clippy's 1.36.0 release notes][clippy-1-36-0] for more details.
919
920 Misc
921 ----
922
923 Compatibility Notes
924 -------------------
925 - With the stabilisation of `mem::MaybeUninit`, `mem::uninitialized` use is no
926   longer recommended, and will be deprecated in 1.39.0.
927
928 [60318]: https://github.com/rust-lang/rust/pull/60318/
929 [60364]: https://github.com/rust-lang/rust/pull/60364/
930 [60370]: https://github.com/rust-lang/rust/pull/60370/
931 [60404]: https://github.com/rust-lang/rust/pull/60404/
932 [60234]: https://github.com/rust-lang/rust/pull/60234/
933 [60244]: https://github.com/rust-lang/rust/pull/60244/
934 [58623]: https://github.com/rust-lang/rust/pull/58623/
935 [59648]: https://github.com/rust-lang/rust/pull/59648/
936 [59675]: https://github.com/rust-lang/rust/pull/59675/
937 [59825]: https://github.com/rust-lang/rust/pull/59825/
938 [59826]: https://github.com/rust-lang/rust/pull/59826/
939 [59445]: https://github.com/rust-lang/rust/pull/59445/
940 [59114]: https://github.com/rust-lang/rust/pull/59114/
941 [cargo/6860]: https://github.com/rust-lang/cargo/pull/6860/
942 [cargo/6934]: https://github.com/rust-lang/cargo/pull/6934/
943 [`VecDeque::rotate_left`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.rotate_left
944 [`VecDeque::rotate_right`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.rotate_right
945 [`Iterator::copied`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#tymethod.copied
946 [`io::IoSlice`]: https://doc.rust-lang.org/std/io/struct.IoSlice.html
947 [`io::IoSliceMut`]: https://doc.rust-lang.org/std/io/struct.IoSliceMut.html
948 [`Read::read_vectored`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_vectored
949 [`Write::write_vectored`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_vectored
950 [`str::as_mut_ptr`]: https://doc.rust-lang.org/std/primitive.str.html#method.as_mut_ptr
951 [`mem::MaybeUninit`]: https://doc.rust-lang.org/std/mem/union.MaybeUninit.html
952 [`pointer::align_offset`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.align_offset
953 [`future::Future`]: https://doc.rust-lang.org/std/future/trait.Future.html
954 [`task::Context`]: https://doc.rust-lang.org/beta/std/task/struct.Context.html
955 [`task::RawWaker`]: https://doc.rust-lang.org/beta/std/task/struct.RawWaker.html
956 [`task::RawWakerVTable`]: https://doc.rust-lang.org/beta/std/task/struct.RawWakerVTable.html
957 [`task::Waker`]: https://doc.rust-lang.org/beta/std/task/struct.Waker.html
958 [`task::Poll`]: https://doc.rust-lang.org/beta/std/task/enum.Poll.html
959 [clippy-1-36-0]: https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-136
960 [cargo-1-36-0]: https://github.com/rust-lang/cargo/blob/master/CHANGELOG.md#cargo-136-2019-07-04
961
962
963 Version 1.35.0 (2019-05-23)
964 ==========================
965
966 Language
967 --------
968 - [`FnOnce`, `FnMut`, and the `Fn` traits are now implemented for `Box<FnOnce>`,
969   `Box<FnMut>`, and `Box<Fn>` respectively.][59500]
970 - [You can now coerce closures into unsafe function pointers.][59580] e.g.
971   ```rust
972   unsafe fn call_unsafe(func: unsafe fn()) {
973       func()
974   }
975
976   pub fn main() {
977       unsafe { call_unsafe(|| {}); }
978   }
979   ```
980
981
982 Compiler
983 --------
984 - [Added the `armv6-unknown-freebsd-gnueabihf` and
985   `armv7-unknown-freebsd-gnueabihf` targets.][58080]
986 - [Added the `wasm32-unknown-wasi` target.][59464]
987
988
989 Libraries
990 ---------
991 - [`Thread` will now show its ID in `Debug` output.][59460]
992 - [`StdinLock`, `StdoutLock`, and `StderrLock` now implement `AsRawFd`.][59512]
993 - [`alloc::System` now implements `Default`.][59451]
994 - [Expanded `Debug` output (`{:#?}`) for structs now has a trailing comma on the
995   last field.][59076]
996 - [`char::{ToLowercase, ToUppercase}` now
997   implement `ExactSizeIterator`.][58778]
998 - [All `NonZero` numeric types now implement `FromStr`.][58717]
999 - [Removed the `Read` trait bounds
1000   on the `BufReader::{get_ref, get_mut, into_inner}` methods.][58423]
1001 - [You can now call the `dbg!` macro without any parameters to print the file
1002   and line where it is called.][57847]
1003 - [In place ASCII case conversions are now up to 4× faster.][59283]
1004   e.g. `str::make_ascii_lowercase`
1005 - [`hash_map::{OccupiedEntry, VacantEntry}` now implement `Sync`
1006   and `Send`.][58369]
1007
1008 Stabilized APIs
1009 ---------------
1010 - [`f32::copysign`]
1011 - [`f64::copysign`]
1012 - [`RefCell::replace_with`]
1013 - [`RefCell::map_split`]
1014 - [`ptr::hash`]
1015 - [`Range::contains`]
1016 - [`RangeFrom::contains`]
1017 - [`RangeTo::contains`]
1018 - [`RangeInclusive::contains`]
1019 - [`RangeToInclusive::contains`]
1020 - [`Option::copied`]
1021
1022 Cargo
1023 -----
1024 - [You can now set `cargo:rustc-cdylib-link-arg` at build time to pass custom
1025   linker arguments when building a `cdylib`.][cargo/6298] Its usage is highly
1026   platform specific.
1027
1028 Misc
1029 ----
1030 - [The Rust toolchain is now available natively for musl based distros.][58575]
1031
1032 [59460]: https://github.com/rust-lang/rust/pull/59460/
1033 [59464]: https://github.com/rust-lang/rust/pull/59464/
1034 [59500]: https://github.com/rust-lang/rust/pull/59500/
1035 [59512]: https://github.com/rust-lang/rust/pull/59512/
1036 [59580]: https://github.com/rust-lang/rust/pull/59580/
1037 [59283]: https://github.com/rust-lang/rust/pull/59283/
1038 [59451]: https://github.com/rust-lang/rust/pull/59451/
1039 [59076]: https://github.com/rust-lang/rust/pull/59076/
1040 [58778]: https://github.com/rust-lang/rust/pull/58778/
1041 [58717]: https://github.com/rust-lang/rust/pull/58717/
1042 [58369]: https://github.com/rust-lang/rust/pull/58369/
1043 [58423]: https://github.com/rust-lang/rust/pull/58423/
1044 [58080]: https://github.com/rust-lang/rust/pull/58080/
1045 [57847]: https://github.com/rust-lang/rust/pull/57847/
1046 [58575]: https://github.com/rust-lang/rust/pull/58575
1047 [cargo/6298]: https://github.com/rust-lang/cargo/pull/6298/
1048 [`f32::copysign`]: https://doc.rust-lang.org/stable/std/primitive.f32.html#method.copysign
1049 [`f64::copysign`]: https://doc.rust-lang.org/stable/std/primitive.f64.html#method.copysign
1050 [`RefCell::replace_with`]: https://doc.rust-lang.org/stable/std/cell/struct.RefCell.html#method.replace_with
1051 [`RefCell::map_split`]: https://doc.rust-lang.org/stable/std/cell/struct.RefCell.html#method.map_split
1052 [`ptr::hash`]: https://doc.rust-lang.org/stable/std/ptr/fn.hash.html
1053 [`Range::contains`]: https://doc.rust-lang.org/std/ops/struct.Range.html#method.contains
1054 [`RangeFrom::contains`]: https://doc.rust-lang.org/std/ops/struct.RangeFrom.html#method.contains
1055 [`RangeTo::contains`]: https://doc.rust-lang.org/std/ops/struct.RangeTo.html#method.contains
1056 [`RangeInclusive::contains`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html#method.contains
1057 [`RangeToInclusive::contains`]: https://doc.rust-lang.org/std/ops/struct.RangeToInclusive.html#method.contains
1058 [`Option::copied`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.copied
1059
1060 Version 1.34.2 (2019-05-14)
1061 ===========================
1062
1063 * [Destabilize the `Error::type_id` function due to a security
1064    vulnerability][60785] ([CVE-2019-12083])
1065
1066 [60785]: https://github.com/rust-lang/rust/pull/60785
1067 [CVE-2019-12083]: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-12083
1068
1069 Version 1.34.1 (2019-04-25)
1070 ===========================
1071
1072 * [Fix false positives for the `redundant_closure` Clippy lint][clippy/3821]
1073 * [Fix false positives for the `missing_const_for_fn` Clippy lint][clippy/3844]
1074 * [Fix Clippy panic when checking some macros][clippy/3805]
1075
1076 [clippy/3821]: https://github.com/rust-lang/rust-clippy/pull/3821
1077 [clippy/3844]: https://github.com/rust-lang/rust-clippy/pull/3844
1078 [clippy/3805]: https://github.com/rust-lang/rust-clippy/pull/3805
1079
1080 Version 1.34.0 (2019-04-11)
1081 ==========================
1082
1083 Language
1084 --------
1085 - [You can now use `#[deprecated = "reason"]`][58166] as a shorthand for
1086   `#[deprecated(note = "reason")]`. This was previously allowed by mistake
1087   but had no effect.
1088 - [You can now accept token streams in `#[attr()]`,`#[attr[]]`, and
1089   `#[attr{}]` procedural macros.][57367]
1090 - [You can now write `extern crate self as foo;`][57407] to import your
1091   crate's root into the extern prelude.
1092
1093
1094 Compiler
1095 --------
1096 - [You can now target `riscv64imac-unknown-none-elf` and
1097   `riscv64gc-unknown-none-elf`.][58406]
1098 - [You can now enable linker plugin LTO optimisations with
1099   `-C linker-plugin-lto`.][58057] This allows rustc to compile your Rust code
1100   into LLVM bitcode allowing LLVM to perform LTO optimisations across C/C++ FFI
1101   boundaries.
1102 - [You can now target `powerpc64-unknown-freebsd`.][57809]
1103
1104
1105 Libraries
1106 ---------
1107 - [The trait bounds have been removed on some of `HashMap<K, V, S>`'s and
1108   `HashSet<T, S>`'s basic methods.][58370] Most notably you no longer require
1109   the `Hash` trait to create an iterator.
1110 - [The `Ord` trait bounds have been removed on some of `BinaryHeap<T>`'s basic
1111   methods.][58421] Most notably you no longer require the `Ord` trait to create
1112   an iterator.
1113 - [The methods `overflowing_neg` and `wrapping_neg` are now `const` functions
1114   for all numeric types.][58044]
1115 - [Indexing a `str` is now generic over all types that
1116   implement `SliceIndex<str>`.][57604]
1117 - [`str::trim`, `str::trim_matches`, `str::trim_{start, end}`, and
1118   `str::trim_{start, end}_matches` are now `#[must_use]`][57106] and will
1119   produce a warning if their returning type is unused.
1120 - [The methods `checked_pow`, `saturating_pow`, `wrapping_pow`, and
1121   `overflowing_pow` are now available for all numeric types.][57873] These are
1122   equivalent to methods such as `wrapping_add` for the `pow` operation.
1123
1124
1125 Stabilized APIs
1126 ---------------
1127
1128 #### std & core
1129 * [`Any::type_id`]
1130 * [`Error::type_id`]
1131 * [`atomic::AtomicI16`]
1132 * [`atomic::AtomicI32`]
1133 * [`atomic::AtomicI64`]
1134 * [`atomic::AtomicI8`]
1135 * [`atomic::AtomicU16`]
1136 * [`atomic::AtomicU32`]
1137 * [`atomic::AtomicU64`]
1138 * [`atomic::AtomicU8`]
1139 * [`convert::Infallible`]
1140 * [`convert::TryFrom`]
1141 * [`convert::TryInto`]
1142 * [`iter::from_fn`]
1143 * [`iter::successors`]
1144 * [`num::NonZeroI128`]
1145 * [`num::NonZeroI16`]
1146 * [`num::NonZeroI32`]
1147 * [`num::NonZeroI64`]
1148 * [`num::NonZeroI8`]
1149 * [`num::NonZeroIsize`]
1150 * [`slice::sort_by_cached_key`]
1151 * [`str::escape_debug`]
1152 * [`str::escape_default`]
1153 * [`str::escape_unicode`]
1154 * [`str::split_ascii_whitespace`]
1155
1156 #### std
1157 * [`Instant::checked_add`]
1158 * [`Instant::checked_sub`]
1159 * [`SystemTime::checked_add`]
1160 * [`SystemTime::checked_sub`]
1161
1162 Cargo
1163 -----
1164 - [You can now use alternative registries to crates.io.][cargo/6654]
1165
1166 Misc
1167 ----
1168 - [You can now use the `?` operator in your documentation tests without manually
1169   adding `fn main() -> Result<(), _> {}`.][56470]
1170
1171 Compatibility Notes
1172 -------------------
1173 - [`Command::before_exec` is being replaced by the unsafe method
1174   `Command::pre_exec`][58059] and will be deprecated with Rust 1.37.0.
1175 - [Use of `ATOMIC_{BOOL, ISIZE, USIZE}_INIT` is now deprecated][57425] as you
1176   can now use `const` functions in `static` variables.
1177
1178 [58370]: https://github.com/rust-lang/rust/pull/58370/
1179 [58406]: https://github.com/rust-lang/rust/pull/58406/
1180 [58421]: https://github.com/rust-lang/rust/pull/58421/
1181 [58166]: https://github.com/rust-lang/rust/pull/58166/
1182 [58044]: https://github.com/rust-lang/rust/pull/58044/
1183 [58057]: https://github.com/rust-lang/rust/pull/58057/
1184 [58059]: https://github.com/rust-lang/rust/pull/58059/
1185 [57809]: https://github.com/rust-lang/rust/pull/57809/
1186 [57873]: https://github.com/rust-lang/rust/pull/57873/
1187 [57604]: https://github.com/rust-lang/rust/pull/57604/
1188 [57367]: https://github.com/rust-lang/rust/pull/57367/
1189 [57407]: https://github.com/rust-lang/rust/pull/57407/
1190 [57425]: https://github.com/rust-lang/rust/pull/57425/
1191 [57106]: https://github.com/rust-lang/rust/pull/57106/
1192 [56470]: https://github.com/rust-lang/rust/pull/56470/
1193 [cargo/6654]: https://github.com/rust-lang/cargo/pull/6654/
1194 [`Any::type_id`]: https://doc.rust-lang.org/std/any/trait.Any.html#tymethod.type_id
1195 [`Error::type_id`]: https://doc.rust-lang.org/std/error/trait.Error.html#method.type_id
1196 [`atomic::AtomicI16`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicI16.html
1197 [`atomic::AtomicI32`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicI32.html
1198 [`atomic::AtomicI64`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicI64.html
1199 [`atomic::AtomicI8`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicI8.html
1200 [`atomic::AtomicU16`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU16.html
1201 [`atomic::AtomicU32`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU32.html
1202 [`atomic::AtomicU64`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU64.html
1203 [`atomic::AtomicU8`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU8.html
1204 [`convert::Infallible`]: https://doc.rust-lang.org/std/convert/enum.Infallible.html
1205 [`convert::TryFrom`]: https://doc.rust-lang.org/std/convert/trait.TryFrom.html
1206 [`convert::TryInto`]: https://doc.rust-lang.org/std/convert/trait.TryInto.html
1207 [`iter::from_fn`]: https://doc.rust-lang.org/std/iter/fn.from_fn.html
1208 [`iter::successors`]: https://doc.rust-lang.org/std/iter/fn.successors.html
1209 [`num::NonZeroI128`]: https://doc.rust-lang.org/std/num/struct.NonZeroI128.html
1210 [`num::NonZeroI16`]: https://doc.rust-lang.org/std/num/struct.NonZeroI16.html
1211 [`num::NonZeroI32`]: https://doc.rust-lang.org/std/num/struct.NonZeroI32.html
1212 [`num::NonZeroI64`]: https://doc.rust-lang.org/std/num/struct.NonZeroI64.html
1213 [`num::NonZeroI8`]: https://doc.rust-lang.org/std/num/struct.NonZeroI8.html
1214 [`num::NonZeroIsize`]: https://doc.rust-lang.org/std/num/struct.NonZeroIsize.html
1215 [`slice::sort_by_cached_key`]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_by_cached_key
1216 [`str::escape_debug`]: https://doc.rust-lang.org/std/primitive.str.html#method.escape_debug
1217 [`str::escape_default`]: https://doc.rust-lang.org/std/primitive.str.html#method.escape_default
1218 [`str::escape_unicode`]: https://doc.rust-lang.org/std/primitive.str.html#method.escape_unicode
1219 [`str::split_ascii_whitespace`]: https://doc.rust-lang.org/std/primitive.str.html#method.split_ascii_whitespace
1220 [`Instant::checked_add`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.checked_add
1221 [`Instant::checked_sub`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.checked_sub
1222 [`SystemTime::checked_add`]: https://doc.rust-lang.org/std/time/struct.SystemTime.html#method.checked_add
1223 [`SystemTime::checked_sub`]: https://doc.rust-lang.org/std/time/struct.SystemTime.html#method.checked_sub
1224
1225
1226 Version 1.33.0 (2019-02-28)
1227 ==========================
1228
1229 Language
1230 --------
1231 - [You can now use the `cfg(target_vendor)` attribute.][57465] E.g.
1232   `#[cfg(target_vendor="apple")] fn main() { println!("Hello Apple!"); }`
1233 - [Integer patterns such as in a match expression can now be exhaustive.][56362]
1234   E.g. You can have match statement on a `u8` that covers `0..=255` and
1235   you would no longer be required to have a `_ => unreachable!()` case.
1236 - [You can now have multiple patterns in `if let` and `while let`
1237   expressions.][57532] You can do this with the same syntax as a `match`
1238   expression. E.g.
1239   ```rust
1240   enum Creature {
1241       Crab(String),
1242       Lobster(String),
1243       Person(String),
1244   }
1245
1246   fn main() {
1247       let state = Creature::Crab("Ferris");
1248
1249       if let Creature::Crab(name) | Creature::Person(name) = state {
1250           println!("This creature's name is: {}", name);
1251       }
1252   }
1253   ```
1254 - [You can now have irrefutable `if let` and `while let` patterns.][57535] Using
1255   this feature will by default produce a warning as this behaviour can be
1256   unintuitive. E.g. `if let _ = 5 {}`
1257 - [You can now use `let` bindings, assignments, expression statements,
1258   and irrefutable pattern destructuring in const functions.][57175]
1259 - [You can now call unsafe const functions.][57067] E.g.
1260   ```rust
1261   const unsafe fn foo() -> i32 { 5 }
1262   const fn bar() -> i32 {
1263       unsafe { foo() }
1264   }
1265   ```
1266 - [You can now specify multiple attributes in a `cfg_attr` attribute.][57332]
1267   E.g. `#[cfg_attr(all(), must_use, optimize)]`
1268 - [You can now specify a specific alignment with the `#[repr(packed)]`
1269   attribute.][57049] E.g. `#[repr(packed(2))] struct Foo(i16, i32);` is a struct
1270   with an alignment of 2 bytes and a size of 6 bytes.
1271 - [You can now import an item from a module as an `_`.][56303] This allows you to
1272   import a trait's impls, and not have the name in the namespace. E.g.
1273   ```rust
1274   use std::io::Read as _;
1275
1276   // Allowed as there is only one `Read` in the module.
1277   pub trait Read {}
1278   ```
1279 - [You may now use `Rc`, `Arc`, and `Pin` as method receivers][56805].
1280
1281 Compiler
1282 --------
1283 - [You can now set a linker flavor for `rustc` with the `-Clinker-flavor`
1284   command line argument.][56351]
1285 - [The minimum required LLVM version has been bumped to 6.0.][56642]
1286 - [Added support for the PowerPC64 architecture on FreeBSD.][57615]
1287 - [The `x86_64-fortanix-unknown-sgx` target support has been upgraded to
1288   tier 2 support.][57130] Visit the [platform support][platform-support] page for
1289   information on Rust's platform support.
1290 - [Added support for the `thumbv7neon-linux-androideabi` and
1291   `thumbv7neon-unknown-linux-gnueabihf` targets.][56947]
1292 - [Added support for the `x86_64-unknown-uefi` target.][56769]
1293
1294 Libraries
1295 ---------
1296 - [The methods `overflowing_{add, sub, mul, shl, shr}` are now `const`
1297   functions for all numeric types.][57566]
1298 - [The methods `rotate_left`, `rotate_right`, and `wrapping_{add, sub, mul, shl, shr}`
1299   are now `const` functions for all numeric types.][57105]
1300 - [The methods `is_positive` and `is_negative` are now `const` functions for
1301   all signed numeric types.][57105]
1302 - [The `get` method for all `NonZero` types is now `const`.][57167]
1303 - [The methods `count_ones`, `count_zeros`, `leading_zeros`, `trailing_zeros`,
1304   `swap_bytes`, `from_be`, `from_le`, `to_be`, `to_le` are now `const` for all
1305   numeric types.][57234]
1306 - [`Ipv4Addr::new` is now a `const` function][57234]
1307
1308 Stabilized APIs
1309 ---------------
1310 - [`unix::FileExt::read_exact_at`]
1311 - [`unix::FileExt::write_all_at`]
1312 - [`Option::transpose`]
1313 - [`Result::transpose`]
1314 - [`convert::identity`]
1315 - [`pin::Pin`]
1316 - [`marker::Unpin`]
1317 - [`marker::PhantomPinned`]
1318 - [`Vec::resize_with`]
1319 - [`VecDeque::resize_with`]
1320 - [`Duration::as_millis`]
1321 - [`Duration::as_micros`]
1322 - [`Duration::as_nanos`]
1323
1324
1325 Cargo
1326 -----
1327 - [You can now publish crates that require a feature flag to compile with
1328   `cargo publish --features` or `cargo publish --all-features`.][cargo/6453]
1329 - [Cargo should now rebuild a crate if a file was modified during the initial
1330   build.][cargo/6484]
1331
1332 Compatibility Notes
1333 -------------------
1334 - The methods `str::{trim_left, trim_right, trim_left_matches, trim_right_matches}`
1335   are now deprecated in the standard library, and their usage will now produce a warning.
1336   Please use the `str::{trim_start, trim_end, trim_start_matches, trim_end_matches}`
1337   methods instead.
1338 - The `Error::cause` method has been deprecated in favor of `Error::source` which supports
1339   downcasting.
1340 - [Libtest no longer creates a new thread for each test when
1341   `--test-threads=1`.  It also runs the tests in deterministic order][56243]
1342
1343 [55982]: https://github.com/rust-lang/rust/pull/55982/
1344 [56243]: https://github.com/rust-lang/rust/pull/56243
1345 [56303]: https://github.com/rust-lang/rust/pull/56303/
1346 [56351]: https://github.com/rust-lang/rust/pull/56351/
1347 [56362]: https://github.com/rust-lang/rust/pull/56362
1348 [56642]: https://github.com/rust-lang/rust/pull/56642/
1349 [56769]: https://github.com/rust-lang/rust/pull/56769/
1350 [56805]: https://github.com/rust-lang/rust/pull/56805
1351 [56947]: https://github.com/rust-lang/rust/pull/56947/
1352 [57049]: https://github.com/rust-lang/rust/pull/57049/
1353 [57067]: https://github.com/rust-lang/rust/pull/57067/
1354 [57105]: https://github.com/rust-lang/rust/pull/57105
1355 [57130]: https://github.com/rust-lang/rust/pull/57130/
1356 [57167]: https://github.com/rust-lang/rust/pull/57167/
1357 [57175]: https://github.com/rust-lang/rust/pull/57175/
1358 [57234]: https://github.com/rust-lang/rust/pull/57234/
1359 [57332]: https://github.com/rust-lang/rust/pull/57332/
1360 [57465]: https://github.com/rust-lang/rust/pull/57465/
1361 [57532]: https://github.com/rust-lang/rust/pull/57532/
1362 [57535]: https://github.com/rust-lang/rust/pull/57535/
1363 [57566]: https://github.com/rust-lang/rust/pull/57566/
1364 [57615]: https://github.com/rust-lang/rust/pull/57615/
1365 [cargo/6453]: https://github.com/rust-lang/cargo/pull/6453/
1366 [cargo/6484]: https://github.com/rust-lang/cargo/pull/6484/
1367 [`unix::FileExt::read_exact_at`]: https://doc.rust-lang.org/std/os/unix/fs/trait.FileExt.html#method.read_exact_at
1368 [`unix::FileExt::write_all_at`]: https://doc.rust-lang.org/std/os/unix/fs/trait.FileExt.html#method.write_all_at
1369 [`Option::transpose`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.transpose
1370 [`Result::transpose`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.transpose
1371 [`convert::identity`]: https://doc.rust-lang.org/std/convert/fn.identity.html
1372 [`pin::Pin`]: https://doc.rust-lang.org/std/pin/struct.Pin.html
1373 [`marker::Unpin`]: https://doc.rust-lang.org/stable/std/marker/trait.Unpin.html
1374 [`marker::PhantomPinned`]: https://doc.rust-lang.org/nightly/std/marker/struct.PhantomPinned.html
1375 [`Vec::resize_with`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.resize_with
1376 [`VecDeque::resize_with`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.resize_with
1377 [`Duration::as_millis`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_millis
1378 [`Duration::as_micros`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_micros
1379 [`Duration::as_nanos`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_nanos
1380 [platform-support]: https://forge.rust-lang.org/platform-support.html
1381
1382 Version 1.32.0 (2019-01-17)
1383 ==========================
1384
1385 Language
1386 --------
1387 #### 2018 edition
1388 - [You can now use the `?` operator in macro definitions.][56245] The `?`
1389   operator allows you to specify zero or one repetitions similar to the `*` and
1390   `+` operators.
1391 - [Module paths with no leading keyword like `super`, `self`, or `crate`, will
1392   now always resolve to the item (`enum`, `struct`, etc.) available in the
1393   module if present, before resolving to a external crate or an item the prelude.][56759]
1394   E.g.
1395   ```rust
1396   enum Color { Red, Green, Blue }
1397
1398   use Color::*;
1399   ```
1400
1401 #### All editions
1402 - [You can now match against `PhantomData<T>` types.][55837]
1403 - [You can now match against literals in macros with the `literal`
1404   specifier.][56072] This will match against a literal of any type.
1405   E.g. `1`, `'A'`, `"Hello World"`
1406 - [Self can now be used as a constructor and pattern for unit and tuple structs.][56365] E.g.
1407   ```rust
1408   struct Point(i32, i32);
1409
1410   impl Point {
1411       pub fn new(x: i32, y: i32) -> Self {
1412           Self(x, y)
1413       }
1414
1415       pub fn is_origin(&self) -> bool {
1416           match self {
1417               Self(0, 0) => true,
1418               _ => false,
1419           }
1420       }
1421   }
1422   ```
1423 - [Self can also now be used in type definitions.][56366] E.g.
1424   ```rust
1425   enum List<T>
1426   where
1427       Self: PartialOrd<Self> // can write `Self` instead of `List<T>`
1428   {
1429       Nil,
1430       Cons(T, Box<Self>) // likewise here
1431   }
1432   ```
1433 - [You can now mark traits with `#[must_use]`.][55663] This provides a warning if
1434   a `impl Trait` or `dyn Trait` is returned and unused in the program.
1435
1436 Compiler
1437 --------
1438 - [The default allocator has changed from jemalloc to the default allocator on
1439   your system.][55238] The compiler itself on Linux & macOS will still use
1440   jemalloc, but programs compiled with it will use the system allocator.
1441 - [Added the `aarch64-pc-windows-msvc` target.][55702]
1442
1443 Libraries
1444 ---------
1445 - [`PathBuf` now implements `FromStr`.][55148]
1446 - [`Box<[T]>` now implements `FromIterator<T>`.][55843]
1447 - [The `dbg!` macro has been stabilized.][56395] This macro enables you to
1448   easily debug expressions in your rust program. E.g.
1449   ```rust
1450   let a = 2;
1451   let b = dbg!(a * 2) + 1;
1452   //      ^-- prints: [src/main.rs:4] a * 2 = 4
1453   assert_eq!(b, 5);
1454   ```
1455
1456 The following APIs are now `const` functions and can be used in a
1457 `const` context.
1458
1459 - [`Cell::as_ptr`]
1460 - [`UnsafeCell::get`]
1461 - [`char::is_ascii`]
1462 - [`iter::empty`]
1463 - [`ManuallyDrop::new`]
1464 - [`ManuallyDrop::into_inner`]
1465 - [`RangeInclusive::start`]
1466 - [`RangeInclusive::end`]
1467 - [`NonNull::as_ptr`]
1468 - [`slice::as_ptr`]
1469 - [`str::as_ptr`]
1470 - [`Duration::as_secs`]
1471 - [`Duration::subsec_millis`]
1472 - [`Duration::subsec_micros`]
1473 - [`Duration::subsec_nanos`]
1474 - [`CStr::as_ptr`]
1475 - [`Ipv4Addr::is_unspecified`]
1476 - [`Ipv6Addr::new`]
1477 - [`Ipv6Addr::octets`]
1478
1479 Stabilized APIs
1480 ---------------
1481 - [`i8::to_be_bytes`]
1482 - [`i8::to_le_bytes`]
1483 - [`i8::to_ne_bytes`]
1484 - [`i8::from_be_bytes`]
1485 - [`i8::from_le_bytes`]
1486 - [`i8::from_ne_bytes`]
1487 - [`i16::to_be_bytes`]
1488 - [`i16::to_le_bytes`]
1489 - [`i16::to_ne_bytes`]
1490 - [`i16::from_be_bytes`]
1491 - [`i16::from_le_bytes`]
1492 - [`i16::from_ne_bytes`]
1493 - [`i32::to_be_bytes`]
1494 - [`i32::to_le_bytes`]
1495 - [`i32::to_ne_bytes`]
1496 - [`i32::from_be_bytes`]
1497 - [`i32::from_le_bytes`]
1498 - [`i32::from_ne_bytes`]
1499 - [`i64::to_be_bytes`]
1500 - [`i64::to_le_bytes`]
1501 - [`i64::to_ne_bytes`]
1502 - [`i64::from_be_bytes`]
1503 - [`i64::from_le_bytes`]
1504 - [`i64::from_ne_bytes`]
1505 - [`i128::to_be_bytes`]
1506 - [`i128::to_le_bytes`]
1507 - [`i128::to_ne_bytes`]
1508 - [`i128::from_be_bytes`]
1509 - [`i128::from_le_bytes`]
1510 - [`i128::from_ne_bytes`]
1511 - [`isize::to_be_bytes`]
1512 - [`isize::to_le_bytes`]
1513 - [`isize::to_ne_bytes`]
1514 - [`isize::from_be_bytes`]
1515 - [`isize::from_le_bytes`]
1516 - [`isize::from_ne_bytes`]
1517 - [`u8::to_be_bytes`]
1518 - [`u8::to_le_bytes`]
1519 - [`u8::to_ne_bytes`]
1520 - [`u8::from_be_bytes`]
1521 - [`u8::from_le_bytes`]
1522 - [`u8::from_ne_bytes`]
1523 - [`u16::to_be_bytes`]
1524 - [`u16::to_le_bytes`]
1525 - [`u16::to_ne_bytes`]
1526 - [`u16::from_be_bytes`]
1527 - [`u16::from_le_bytes`]
1528 - [`u16::from_ne_bytes`]
1529 - [`u32::to_be_bytes`]
1530 - [`u32::to_le_bytes`]
1531 - [`u32::to_ne_bytes`]
1532 - [`u32::from_be_bytes`]
1533 - [`u32::from_le_bytes`]
1534 - [`u32::from_ne_bytes`]
1535 - [`u64::to_be_bytes`]
1536 - [`u64::to_le_bytes`]
1537 - [`u64::to_ne_bytes`]
1538 - [`u64::from_be_bytes`]
1539 - [`u64::from_le_bytes`]
1540 - [`u64::from_ne_bytes`]
1541 - [`u128::to_be_bytes`]
1542 - [`u128::to_le_bytes`]
1543 - [`u128::to_ne_bytes`]
1544 - [`u128::from_be_bytes`]
1545 - [`u128::from_le_bytes`]
1546 - [`u128::from_ne_bytes`]
1547 - [`usize::to_be_bytes`]
1548 - [`usize::to_le_bytes`]
1549 - [`usize::to_ne_bytes`]
1550 - [`usize::from_be_bytes`]
1551 - [`usize::from_le_bytes`]
1552 - [`usize::from_ne_bytes`]
1553
1554 Cargo
1555 -----
1556 - [You can now run `cargo c` as an alias for `cargo check`.][cargo/6218]
1557 - [Usernames are now allowed in alt registry URLs.][cargo/6242]
1558
1559 Misc
1560 ----
1561 - [`libproc_macro` has been added to the `rust-src` distribution.][55280]
1562
1563 Compatibility Notes
1564 -------------------
1565 - [The argument types for AVX's
1566   `_mm256_stream_si256`, `_mm256_stream_pd`, `_mm256_stream_ps`][55610] have
1567   been changed from `*const` to `*mut` as the previous implementation
1568   was unsound.
1569
1570
1571 [55148]: https://github.com/rust-lang/rust/pull/55148/
1572 [55238]: https://github.com/rust-lang/rust/pull/55238/
1573 [55280]: https://github.com/rust-lang/rust/pull/55280/
1574 [55610]: https://github.com/rust-lang/rust/pull/55610/
1575 [55663]: https://github.com/rust-lang/rust/pull/55663/
1576 [55702]: https://github.com/rust-lang/rust/pull/55702/
1577 [55837]: https://github.com/rust-lang/rust/pull/55837/
1578 [55843]: https://github.com/rust-lang/rust/pull/55843/
1579 [56072]: https://github.com/rust-lang/rust/pull/56072/
1580 [56245]: https://github.com/rust-lang/rust/pull/56245/
1581 [56365]: https://github.com/rust-lang/rust/pull/56365/
1582 [56366]: https://github.com/rust-lang/rust/pull/56366/
1583 [56395]: https://github.com/rust-lang/rust/pull/56395/
1584 [56759]: https://github.com/rust-lang/rust/pull/56759/
1585 [cargo/6218]: https://github.com/rust-lang/cargo/pull/6218/
1586 [cargo/6242]: https://github.com/rust-lang/cargo/pull/6242/
1587 [`CStr::as_ptr`]: https://doc.rust-lang.org/std/ffi/struct.CStr.html#method.as_ptr
1588 [`Cell::as_ptr`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.as_ptr
1589 [`Duration::as_secs`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_secs
1590 [`Duration::subsec_micros`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_micros
1591 [`Duration::subsec_millis`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_millis
1592 [`Duration::subsec_nanos`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_nanos
1593 [`Ipv4Addr::is_unspecified`]: https://doc.rust-lang.org/std/net/struct.Ipv4Addr.html#method.is_unspecified
1594 [`Ipv6Addr::new`]: https://doc.rust-lang.org/std/net/struct.Ipv6Addr.html#method.new
1595 [`Ipv6Addr::octets`]: https://doc.rust-lang.org/std/net/struct.Ipv6Addr.html#method.octets
1596 [`ManuallyDrop::into_inner`]: https://doc.rust-lang.org/std/mem/struct.ManuallyDrop.html#method.into_inner
1597 [`ManuallyDrop::new`]: https://doc.rust-lang.org/std/mem/struct.ManuallyDrop.html#method.new
1598 [`NonNull::as_ptr`]: https://doc.rust-lang.org/std/ptr/struct.NonNull.html#method.as_ptr
1599 [`RangeInclusive::end`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html#method.end
1600 [`RangeInclusive::start`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html#method.start
1601 [`UnsafeCell::get`]: https://doc.rust-lang.org/std/cell/struct.UnsafeCell.html#method.get
1602 [`slice::as_ptr`]: https://doc.rust-lang.org/std/primitive.slice.html#method.as_ptr
1603 [`char::is_ascii`]: https://doc.rust-lang.org/std/primitive.char.html#method.is_ascii
1604 [`i128::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.from_be_bytes
1605 [`i128::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.from_le_bytes
1606 [`i128::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.from_ne_bytes
1607 [`i128::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.to_be_bytes
1608 [`i128::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.to_le_bytes
1609 [`i128::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.to_ne_bytes
1610 [`i16::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_be_bytes
1611 [`i16::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_le_bytes
1612 [`i16::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_ne_bytes
1613 [`i16::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.to_be_bytes
1614 [`i16::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.to_le_bytes
1615 [`i16::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.to_ne_bytes
1616 [`i32::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.from_be_bytes
1617 [`i32::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.from_le_bytes
1618 [`i32::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.from_ne_bytes
1619 [`i32::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.to_be_bytes
1620 [`i32::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.to_le_bytes
1621 [`i32::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.to_ne_bytes
1622 [`i64::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.from_be_bytes
1623 [`i64::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.from_le_bytes
1624 [`i64::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.from_ne_bytes
1625 [`i64::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.to_be_bytes
1626 [`i64::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.to_le_bytes
1627 [`i64::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.to_ne_bytes
1628 [`i8::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.from_be_bytes
1629 [`i8::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.from_le_bytes
1630 [`i8::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.from_ne_bytes
1631 [`i8::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.to_be_bytes
1632 [`i8::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.to_le_bytes
1633 [`i8::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.to_ne_bytes
1634 [`isize::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.from_be_bytes
1635 [`isize::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.from_le_bytes
1636 [`isize::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.from_ne_bytes
1637 [`isize::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.to_be_bytes
1638 [`isize::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.to_le_bytes
1639 [`isize::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.to_ne_bytes
1640 [`iter::empty`]: https://doc.rust-lang.org/std/iter/fn.empty.html
1641 [`str::as_ptr`]: https://doc.rust-lang.org/std/primitive.str.html#method.as_ptr
1642 [`u128::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.from_be_bytes
1643 [`u128::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.from_le_bytes
1644 [`u128::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.from_ne_bytes
1645 [`u128::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.to_be_bytes
1646 [`u128::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.to_le_bytes
1647 [`u128::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.to_ne_bytes
1648 [`u16::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.from_be_bytes
1649 [`u16::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.from_le_bytes
1650 [`u16::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.from_ne_bytes
1651 [`u16::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.to_be_bytes
1652 [`u16::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.to_le_bytes
1653 [`u16::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.to_ne_bytes
1654 [`u32::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.from_be_bytes
1655 [`u32::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.from_le_bytes
1656 [`u32::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.from_ne_bytes
1657 [`u32::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.to_be_bytes
1658 [`u32::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.to_le_bytes
1659 [`u32::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.to_ne_bytes
1660 [`u64::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.from_be_bytes
1661 [`u64::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.from_le_bytes
1662 [`u64::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.from_ne_bytes
1663 [`u64::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.to_be_bytes
1664 [`u64::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.to_le_bytes
1665 [`u64::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.to_ne_bytes
1666 [`u8::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.from_be_bytes
1667 [`u8::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.from_le_bytes
1668 [`u8::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.from_ne_bytes
1669 [`u8::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.to_be_bytes
1670 [`u8::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.to_le_bytes
1671 [`u8::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.to_ne_bytes
1672 [`usize::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.from_be_bytes
1673 [`usize::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.from_le_bytes
1674 [`usize::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.from_ne_bytes
1675 [`usize::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.to_be_bytes
1676 [`usize::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.to_le_bytes
1677 [`usize::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.to_ne_bytes
1678
1679
1680 Version 1.31.1 (2018-12-20)
1681 ===========================
1682
1683 - [Fix Rust failing to build on `powerpc-unknown-netbsd`][56562]
1684 - [Fix broken go-to-definition in RLS][rls/1171]
1685 - [Fix infinite loop on hover in RLS][rls/1170]
1686
1687 [56562]: https://github.com/rust-lang/rust/pull/56562
1688 [rls/1171]: https://github.com/rust-lang/rls/issues/1171
1689 [rls/1170]: https://github.com/rust-lang/rls/pull/1170
1690
1691 Version 1.31.0 (2018-12-06)
1692 ==========================
1693
1694 Language
1695 --------
1696 - 🎉 [This version marks the release of the 2018 edition of Rust.][54057] 🎉
1697 - [New lifetime elision rules now allow for eliding lifetimes in functions and
1698   impl headers.][54778] E.g. `impl<'a> Reader for BufReader<'a> {}` can now be
1699   `impl Reader for BufReader<'_> {}`. Lifetimes are still required to be defined
1700   in structs.
1701 - [You can now define and use `const` functions.][54835] These are currently
1702   a strict minimal subset of the [const fn RFC][RFC-911]. Refer to the
1703   [language reference][const-reference] for what exactly is available.
1704 - [You can now use tool lints, which allow you to scope lints from external
1705   tools using attributes.][54870] E.g. `#[allow(clippy::filter_map)]`.
1706 - [`#[no_mangle]` and `#[export_name]` attributes can now be located anywhere in
1707   a crate, not just in exported functions.][54451]
1708 - [You can now use parentheses in pattern matches.][54497]
1709
1710 Compiler
1711 --------
1712 - [Updated musl to 1.1.20][54430]
1713
1714 Libraries
1715 ---------
1716 - [You can now convert `num::NonZero*` types to their raw equivalents using the
1717   `From` trait.][54240] E.g. `u8` now implements `From<NonZeroU8>`.
1718 - [You can now convert a `&Option<T>` into `Option<&T>` and `&mut Option<T>`
1719   into `Option<&mut T>` using the `From` trait.][53218]
1720 - [You can now multiply (`*`) a `time::Duration` by a `u32`.][52813]
1721
1722
1723 Stabilized APIs
1724 ---------------
1725 - [`slice::align_to`]
1726 - [`slice::align_to_mut`]
1727 - [`slice::chunks_exact`]
1728 - [`slice::chunks_exact_mut`]
1729 - [`slice::rchunks`]
1730 - [`slice::rchunks_mut`]
1731 - [`slice::rchunks_exact`]
1732 - [`slice::rchunks_exact_mut`]
1733 - [`Option::replace`]
1734
1735 Cargo
1736 -----
1737 - [Cargo will now download crates in parallel using HTTP/2.][cargo/6005]
1738 - [You can now rename packages in your Cargo.toml][cargo/6319] We have a guide
1739   on [how to use the `package` key in your dependencies.][cargo-rename-reference]
1740
1741 [52813]: https://github.com/rust-lang/rust/pull/52813/
1742 [53218]: https://github.com/rust-lang/rust/pull/53218/
1743 [53555]: https://github.com/rust-lang/rust/issues/53555/
1744 [54057]: https://github.com/rust-lang/rust/pull/54057/
1745 [54240]: https://github.com/rust-lang/rust/pull/54240/
1746 [54430]: https://github.com/rust-lang/rust/pull/54430/
1747 [54451]: https://github.com/rust-lang/rust/pull/54451/
1748 [54497]: https://github.com/rust-lang/rust/pull/54497/
1749 [54778]: https://github.com/rust-lang/rust/pull/54778/
1750 [54835]: https://github.com/rust-lang/rust/pull/54835/
1751 [54870]: https://github.com/rust-lang/rust/pull/54870/
1752 [RFC-911]: https://github.com/rust-lang/rfcs/pull/911
1753 [`Option::replace`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.replace
1754 [`slice::align_to_mut`]: https://doc.rust-lang.org/std/primitive.slice.html#method.align_to_mut
1755 [`slice::align_to`]: https://doc.rust-lang.org/std/primitive.slice.html#method.align_to
1756 [`slice::chunks_exact_mut`]: https://doc.rust-lang.org/std/primitive.slice.html#method.chunks_exact_mut
1757 [`slice::chunks_exact`]: https://doc.rust-lang.org/std/primitive.slice.html#method.chunks_exact
1758 [`slice::rchunks_exact_mut`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rchunks_mut
1759 [`slice::rchunks_exact`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rchunks_exact
1760 [`slice::rchunks_mut`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rchunks_mut
1761 [`slice::rchunks`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rchunks
1762 [cargo/6005]: https://github.com/rust-lang/cargo/pull/6005/
1763 [cargo/6319]: https://github.com/rust-lang/cargo/pull/6319/
1764 [cargo-rename-reference]: https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#renaming-dependencies-in-cargotoml
1765 [const-reference]: https://doc.rust-lang.org/reference/items/functions.html#const-functions
1766
1767 Version 1.30.1 (2018-11-08)
1768 ===========================
1769
1770 - [Fixed overflow ICE in rustdoc][54199]
1771 - [Cap Cargo progress bar width at 60 in MSYS terminals][cargo/6122]
1772
1773 [54199]: https://github.com/rust-lang/rust/pull/54199
1774 [cargo/6122]: https://github.com/rust-lang/cargo/pull/6122
1775
1776 Version 1.30.0 (2018-10-25)
1777 ==========================
1778
1779 Language
1780 --------
1781 - [Procedural macros are now available.][52081] These kinds of macros allow for
1782   more powerful code generation. There is a [new chapter available][proc-macros]
1783   in the Rust Programming Language book that goes further in depth.
1784 - [You can now use keywords as identifiers using the raw identifiers
1785   syntax (`r#`),][53236] e.g. `let r#for = true;`
1786 - [Using anonymous parameters in traits is now deprecated with a warning and
1787   will be a hard error in the 2018 edition.][53272]
1788 - [You can now use `crate` in paths.][54404] This allows you to refer to the
1789   crate root in the path, e.g. `use crate::foo;` refers to `foo` in `src/lib.rs`.
1790 - [Using a external crate no longer requires being prefixed with `::`.][54404]
1791   Previously, using a external crate in a module without a use statement
1792   required `let json = ::serde_json::from_str(foo);` but can now be written
1793   as `let json = serde_json::from_str(foo);`.
1794 - [You can now apply the `#[used]` attribute to static items to prevent the
1795   compiler from optimising them away, even if they appear to be unused,][51363]
1796   e.g. `#[used] static FOO: u32 = 1;`
1797 - [You can now import and reexport macros from other crates with the `use`
1798   syntax.][50911] Macros exported with `#[macro_export]` are now placed into
1799   the root module of the crate. If your macro relies on calling other local
1800   macros, it is recommended to export with the
1801   `#[macro_export(local_inner_macros)]` attribute so users won't have to import
1802   those macros.
1803 - [You can now catch visibility keywords (e.g. `pub`, `pub(crate)`) in macros
1804   using the `vis` specifier.][53370]
1805 - [Non-macro attributes now allow all forms of literals, not just
1806   strings.][53044] Previously, you would write `#[attr("true")]`, and you can now
1807   write `#[attr(true)]`.
1808 - [You can now specify a function to handle a panic in the Rust runtime with the
1809   `#[panic_handler]` attribute.][51366]
1810
1811 Compiler
1812 --------
1813 - [Added the `riscv32imc-unknown-none-elf` target.][53822]
1814 - [Added the `aarch64-unknown-netbsd` target][53165]
1815
1816 Libraries
1817 ---------
1818 - [`ManuallyDrop` now allows the inner type to be unsized.][53033]
1819
1820 Stabilized APIs
1821 ---------------
1822 - [`Ipv4Addr::BROADCAST`]
1823 - [`Ipv4Addr::LOCALHOST`]
1824 - [`Ipv4Addr::UNSPECIFIED`]
1825 - [`Ipv6Addr::LOCALHOST`]
1826 - [`Ipv6Addr::UNSPECIFIED`]
1827 - [`Iterator::find_map`]
1828
1829   The following methods are replacement methods for `trim_left`, `trim_right`,
1830   `trim_left_matches`, and `trim_right_matches`, which will be deprecated
1831   in 1.33.0:
1832 - [`str::trim_end_matches`]
1833 - [`str::trim_end`]
1834 - [`str::trim_start_matches`]
1835 - [`str::trim_start`]
1836
1837 Cargo
1838 ----
1839 - [`cargo run` doesn't require specifying a package in workspaces.][cargo/5877]
1840 - [`cargo doc` now supports `--message-format=json`.][cargo/5878] This is
1841   equivalent to calling `rustdoc --error-format=json`.
1842 - [Cargo will now provide a progress bar for builds.][cargo/5995]
1843
1844 Misc
1845 ----
1846 - [`rustdoc` allows you to specify what edition to treat your code as with the
1847   `--edition` option.][54057]
1848 - [`rustdoc` now has the `--color` (specify whether to output color) and
1849   `--error-format` (specify error format, e.g. `json`) options.][53003]
1850 - [We now distribute a `rust-gdbgui` script that invokes `gdbgui` with Rust
1851   debug symbols.][53774]
1852 - [Attributes from Rust tools such as `rustfmt` or `clippy` are now
1853   available,][53459] e.g. `#[rustfmt::skip]` will skip formatting the next item.
1854
1855 [50911]: https://github.com/rust-lang/rust/pull/50911/
1856 [51363]: https://github.com/rust-lang/rust/pull/51363/
1857 [51366]: https://github.com/rust-lang/rust/pull/51366/
1858 [52081]: https://github.com/rust-lang/rust/pull/52081/
1859 [53003]: https://github.com/rust-lang/rust/pull/53003/
1860 [53033]: https://github.com/rust-lang/rust/pull/53033/
1861 [53044]: https://github.com/rust-lang/rust/pull/53044/
1862 [53165]: https://github.com/rust-lang/rust/pull/53165/
1863 [53213]: https://github.com/rust-lang/rust/pull/53213/
1864 [53236]: https://github.com/rust-lang/rust/pull/53236/
1865 [53272]: https://github.com/rust-lang/rust/pull/53272/
1866 [53370]: https://github.com/rust-lang/rust/pull/53370/
1867 [53459]: https://github.com/rust-lang/rust/pull/53459/
1868 [53774]: https://github.com/rust-lang/rust/pull/53774/
1869 [53822]: https://github.com/rust-lang/rust/pull/53822/
1870 [54057]: https://github.com/rust-lang/rust/pull/54057/
1871 [54146]: https://github.com/rust-lang/rust/pull/54146/
1872 [54404]: https://github.com/rust-lang/rust/pull/54404/
1873 [cargo/5877]: https://github.com/rust-lang/cargo/pull/5877/
1874 [cargo/5878]: https://github.com/rust-lang/cargo/pull/5878/
1875 [cargo/5995]: https://github.com/rust-lang/cargo/pull/5995/
1876 [proc-macros]: https://doc.rust-lang.org/nightly/book/2018-edition/ch19-06-macros.html
1877
1878 [`Ipv4Addr::BROADCAST`]: https://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#associatedconstant.BROADCAST
1879 [`Ipv4Addr::LOCALHOST`]: https://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#associatedconstant.LOCALHOST
1880 [`Ipv4Addr::UNSPECIFIED`]: https://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#associatedconstant.UNSPECIFIED
1881 [`Ipv6Addr::LOCALHOST`]: https://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#associatedconstant.LOCALHOST
1882 [`Ipv6Addr::UNSPECIFIED`]: https://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#associatedconstant.UNSPECIFIED
1883 [`Iterator::find_map`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.find_map
1884 [`str::trim_end_matches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.trim_end_matches
1885 [`str::trim_end`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.trim_end
1886 [`str::trim_start_matches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.trim_start_matches
1887 [`str::trim_start`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.trim_start
1888
1889
1890 Version 1.29.2 (2018-10-11)
1891 ===========================
1892
1893 - [Workaround for an aliasing-related LLVM bug, which caused miscompilation.][54639]
1894 - The `rls-preview` component on the windows-gnu targets has been restored.
1895
1896 [54639]: https://github.com/rust-lang/rust/pull/54639
1897
1898
1899 Version 1.29.1 (2018-09-25)
1900 ===========================
1901
1902 Security Notes
1903 --------------
1904
1905 - The standard library's `str::repeat` function contained an out of bounds write
1906   caused by an integer overflow. This has been fixed by deterministically
1907   panicking when an overflow happens.
1908
1909   Thank you to Scott McMurray for responsibly disclosing this vulnerability to
1910   us.
1911
1912
1913 Version 1.29.0 (2018-09-13)
1914 ==========================
1915
1916 Compiler
1917 --------
1918 - [Bumped minimum LLVM version to 5.0.][51899]
1919 - [Added `powerpc64le-unknown-linux-musl` target.][51619]
1920 - [Added `aarch64-unknown-hermit` and `x86_64-unknown-hermit` targets.][52861]
1921
1922 Libraries
1923 ---------
1924 - [`Once::call_once` no longer requires `Once` to be `'static`.][52239]
1925 - [`BuildHasherDefault` now implements `PartialEq` and `Eq`.][52402]
1926 - [`Box<CStr>`, `Box<OsStr>`, and `Box<Path>` now implement `Clone`.][51912]
1927 - [Implemented `PartialEq<&str>` for `OsString` and `PartialEq<OsString>`
1928   for `&str`.][51178]
1929 - [`Cell<T>` now allows `T` to be unsized.][50494]
1930 - [`SocketAddr` is now stable on Redox.][52656]
1931
1932 Stabilized APIs
1933 ---------------
1934 - [`Arc::downcast`]
1935 - [`Iterator::flatten`]
1936 - [`Rc::downcast`]
1937
1938 Cargo
1939 -----
1940 - [Cargo can silently fix some bad lockfiles.][cargo/5831] You can use
1941   `--locked` to disable this behavior.
1942 - [`cargo-install` will now allow you to cross compile an install
1943   using `--target`.][cargo/5614]
1944 - [Added the `cargo-fix` subcommand to automatically move project code from
1945   2015 edition to 2018.][cargo/5723]
1946 - [`cargo doc` can now optionally document private types using the
1947   `--document-private-items` flag.][cargo/5543]
1948
1949 Misc
1950 ----
1951 - [`rustdoc` now has the `--cap-lints` option which demotes all lints above
1952   the specified level to that level.][52354] For example `--cap-lints warn`
1953   will demote `deny` and `forbid` lints to `warn`.
1954 - [`rustc` and `rustdoc` will now have the exit code of `1` if compilation
1955   fails and `101` if there is a panic.][52197]
1956 - [A preview of clippy has been made available through rustup.][51122]
1957   You can install the preview with `rustup component add clippy-preview`.
1958
1959 Compatibility Notes
1960 -------------------
1961 - [`str::{slice_unchecked, slice_unchecked_mut}` are now deprecated.][51807]
1962   Use `str::get_unchecked(begin..end)` instead.
1963 - [`std::env::home_dir` is now deprecated for its unintuitive behavior.][51656]
1964   Consider using the `home_dir` function from
1965   https://crates.io/crates/dirs instead.
1966 - [`rustc` will no longer silently ignore invalid data in target spec.][52330]
1967 - [`cfg` attributes and `--cfg` command line flags are now more
1968   strictly validated.][53893]
1969
1970 [53893]: https://github.com/rust-lang/rust/pull/53893/
1971 [52861]: https://github.com/rust-lang/rust/pull/52861/
1972 [52656]: https://github.com/rust-lang/rust/pull/52656/
1973 [52239]: https://github.com/rust-lang/rust/pull/52239/
1974 [52330]: https://github.com/rust-lang/rust/pull/52330/
1975 [52354]: https://github.com/rust-lang/rust/pull/52354/
1976 [52402]: https://github.com/rust-lang/rust/pull/52402/
1977 [52103]: https://github.com/rust-lang/rust/pull/52103/
1978 [52197]: https://github.com/rust-lang/rust/pull/52197/
1979 [51807]: https://github.com/rust-lang/rust/pull/51807/
1980 [51899]: https://github.com/rust-lang/rust/pull/51899/
1981 [51912]: https://github.com/rust-lang/rust/pull/51912/
1982 [51511]: https://github.com/rust-lang/rust/pull/51511/
1983 [51619]: https://github.com/rust-lang/rust/pull/51619/
1984 [51656]: https://github.com/rust-lang/rust/pull/51656/
1985 [51178]: https://github.com/rust-lang/rust/pull/51178/
1986 [51122]: https://github.com/rust-lang/rust/pull/51122
1987 [50494]: https://github.com/rust-lang/rust/pull/50494/
1988 [cargo/5543]: https://github.com/rust-lang/cargo/pull/5543
1989 [cargo/5614]: https://github.com/rust-lang/cargo/pull/5614/
1990 [cargo/5723]: https://github.com/rust-lang/cargo/pull/5723/
1991 [cargo/5831]: https://github.com/rust-lang/cargo/pull/5831/
1992 [`Arc::downcast`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.downcast
1993 [`Iterator::flatten`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.flatten
1994 [`Rc::downcast`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.downcast
1995
1996
1997 Version 1.28.0 (2018-08-02)
1998 ===========================
1999
2000 Language
2001 --------
2002 - [The `#[repr(transparent)]` attribute is now stable.][51562] This attribute
2003   allows a Rust newtype wrapper (`struct NewType<T>(T);`) to be represented as
2004   the inner type across Foreign Function Interface (FFI) boundaries.
2005 - [The keywords `pure`, `sizeof`, `alignof`, and `offsetof` have been unreserved
2006   and can now be used as identifiers.][51196]
2007 - [The `GlobalAlloc` trait and `#[global_allocator]` attribute are now
2008   stable.][51241] This will allow users to specify a global allocator for
2009   their program.
2010 - [Unit test functions marked with the `#[test]` attribute can now return
2011   `Result<(), E: Debug>` in addition to `()`.][51298]
2012 - [The `lifetime` specifier for `macro_rules!` is now stable.][50385] This
2013   allows macros to easily target lifetimes.
2014
2015 Compiler
2016 --------
2017 - [The `s` and `z` optimisation levels are now stable.][50265] These optimisations
2018   prioritise making smaller binary sizes. `z` is the same as `s` with the
2019   exception that it does not vectorise loops, which typically results in an even
2020   smaller binary.
2021 - [The short error format is now stable.][49546] Specified with
2022   `--error-format=short` this option will provide a more compressed output of
2023   rust error messages.
2024 - [Added a lint warning when you have duplicated `macro_export`s.][50143]
2025 - [Reduced the number of allocations in the macro parser.][50855] This can
2026   improve compile times of macro heavy crates on average by 5%.
2027
2028 Libraries
2029 ---------
2030 - [Implemented `Default` for `&mut str`.][51306]
2031 - [Implemented `From<bool>` for all integer and unsigned number types.][50554]
2032 - [Implemented `Extend` for `()`.][50234]
2033 - [The `Debug` implementation of `time::Duration` should now be more easily
2034   human readable.][50364] Previously a `Duration` of one second would printed as
2035   `Duration { secs: 1, nanos: 0 }` and will now be printed as `1s`.
2036 - [Implemented `From<&String>` for `Cow<str>`, `From<&Vec<T>>` for `Cow<[T]>`,
2037   `From<Cow<CStr>>` for `CString`, `From<CString>, From<CStr>, From<&CString>`
2038   for `Cow<CStr>`, `From<OsString>, From<OsStr>, From<&OsString>` for
2039   `Cow<OsStr>`, `From<&PathBuf>` for `Cow<Path>`, and `From<Cow<Path>>`
2040   for `PathBuf`.][50170]
2041 - [Implemented `Shl` and `Shr` for `Wrapping<u128>`
2042   and `Wrapping<i128>`.][50465]
2043 - [`DirEntry::metadata` now uses `fstatat` instead of `lstat` when
2044   possible.][51050] This can provide up to a 40% speed increase.
2045 - [Improved error messages when using `format!`.][50610]
2046
2047 Stabilized APIs
2048 ---------------
2049 - [`Iterator::step_by`]
2050 - [`Path::ancestors`]
2051 - [`SystemTime::UNIX_EPOCH`]
2052 - [`alloc::GlobalAlloc`]
2053 - [`alloc::Layout`]
2054 - [`alloc::LayoutErr`]
2055 - [`alloc::System`]
2056 - [`alloc::alloc`]
2057 - [`alloc::alloc_zeroed`]
2058 - [`alloc::dealloc`]
2059 - [`alloc::realloc`]
2060 - [`alloc::handle_alloc_error`]
2061 - [`btree_map::Entry::or_default`]
2062 - [`fmt::Alignment`]
2063 - [`hash_map::Entry::or_default`]
2064 - [`iter::repeat_with`]
2065 - [`num::NonZeroUsize`]
2066 - [`num::NonZeroU128`]
2067 - [`num::NonZeroU16`]
2068 - [`num::NonZeroU32`]
2069 - [`num::NonZeroU64`]
2070 - [`num::NonZeroU8`]
2071 - [`ops::RangeBounds`]
2072 - [`slice::SliceIndex`]
2073 - [`slice::from_mut`]
2074 - [`slice::from_ref`]
2075 - [`{Any + Send + Sync}::downcast_mut`]
2076 - [`{Any + Send + Sync}::downcast_ref`]
2077 - [`{Any + Send + Sync}::is`]
2078
2079 Cargo
2080 -----
2081 - [Cargo will now no longer allow you to publish crates with build scripts that
2082   modify the `src` directory.][cargo/5584] The `src` directory in a crate should be
2083   considered to be immutable.
2084
2085 Misc
2086 ----
2087 - [The `suggestion_applicability` field in `rustc`'s json output is now
2088   stable.][50486] This will allow dev tools to check whether a code suggestion
2089   would apply to them.
2090
2091 Compatibility Notes
2092 -------------------
2093 - [Rust will consider trait objects with duplicated constraints to be the same
2094   type as without the duplicated constraint.][51276] For example the below code will
2095   now fail to compile.
2096   ```rust
2097   trait Trait {}
2098
2099   impl Trait + Send {
2100       fn test(&self) { println!("one"); } //~ ERROR duplicate definitions with name `test`
2101   }
2102
2103   impl Trait + Send + Send {
2104       fn test(&self) { println!("two"); }
2105   }
2106   ```
2107
2108 [49546]: https://github.com/rust-lang/rust/pull/49546/
2109 [50143]: https://github.com/rust-lang/rust/pull/50143/
2110 [50170]: https://github.com/rust-lang/rust/pull/50170/
2111 [50234]: https://github.com/rust-lang/rust/pull/50234/
2112 [50265]: https://github.com/rust-lang/rust/pull/50265/
2113 [50364]: https://github.com/rust-lang/rust/pull/50364/
2114 [50385]: https://github.com/rust-lang/rust/pull/50385/
2115 [50465]: https://github.com/rust-lang/rust/pull/50465/
2116 [50486]: https://github.com/rust-lang/rust/pull/50486/
2117 [50554]: https://github.com/rust-lang/rust/pull/50554/
2118 [50610]: https://github.com/rust-lang/rust/pull/50610/
2119 [50855]: https://github.com/rust-lang/rust/pull/50855/
2120 [51050]: https://github.com/rust-lang/rust/pull/51050/
2121 [51196]: https://github.com/rust-lang/rust/pull/51196/
2122 [51200]: https://github.com/rust-lang/rust/pull/51200/
2123 [51241]: https://github.com/rust-lang/rust/pull/51241/
2124 [51276]: https://github.com/rust-lang/rust/pull/51276/
2125 [51298]: https://github.com/rust-lang/rust/pull/51298/
2126 [51306]: https://github.com/rust-lang/rust/pull/51306/
2127 [51562]: https://github.com/rust-lang/rust/pull/51562/
2128 [cargo/5584]: https://github.com/rust-lang/cargo/pull/5584/
2129 [`Iterator::step_by`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.step_by
2130 [`Path::ancestors`]: https://doc.rust-lang.org/std/path/struct.Path.html#method.ancestors
2131 [`SystemTime::UNIX_EPOCH`]: https://doc.rust-lang.org/std/time/struct.SystemTime.html#associatedconstant.UNIX_EPOCH
2132 [`alloc::GlobalAlloc`]: https://doc.rust-lang.org/std/alloc/trait.GlobalAlloc.html
2133 [`alloc::Layout`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html
2134 [`alloc::LayoutErr`]: https://doc.rust-lang.org/std/alloc/struct.LayoutErr.html
2135 [`alloc::System`]: https://doc.rust-lang.org/std/alloc/struct.System.html
2136 [`alloc::alloc`]: https://doc.rust-lang.org/std/alloc/fn.alloc.html
2137 [`alloc::alloc_zeroed`]: https://doc.rust-lang.org/std/alloc/fn.alloc_zeroed.html
2138 [`alloc::dealloc`]: https://doc.rust-lang.org/std/alloc/fn.dealloc.html
2139 [`alloc::realloc`]: https://doc.rust-lang.org/std/alloc/fn.realloc.html
2140 [`alloc::handle_alloc_error`]: https://doc.rust-lang.org/std/alloc/fn.handle_alloc_error.html
2141 [`btree_map::Entry::or_default`]: https://doc.rust-lang.org/std/collections/btree_map/enum.Entry.html#method.or_default
2142 [`fmt::Alignment`]: https://doc.rust-lang.org/std/fmt/enum.Alignment.html
2143 [`hash_map::Entry::or_default`]: https://doc.rust-lang.org/std/collections/hash_map/enum.Entry.html#method.or_default
2144 [`iter::repeat_with`]: https://doc.rust-lang.org/std/iter/fn.repeat_with.html
2145 [`num::NonZeroUsize`]: https://doc.rust-lang.org/std/num/struct.NonZeroUsize.html
2146 [`num::NonZeroU128`]: https://doc.rust-lang.org/std/num/struct.NonZeroU128.html
2147 [`num::NonZeroU16`]: https://doc.rust-lang.org/std/num/struct.NonZeroU16.html
2148 [`num::NonZeroU32`]: https://doc.rust-lang.org/std/num/struct.NonZeroU32.html
2149 [`num::NonZeroU64`]: https://doc.rust-lang.org/std/num/struct.NonZeroU64.html
2150 [`num::NonZeroU8`]: https://doc.rust-lang.org/std/num/struct.NonZeroU8.html
2151 [`ops::RangeBounds`]: https://doc.rust-lang.org/std/ops/trait.RangeBounds.html
2152 [`slice::SliceIndex`]: https://doc.rust-lang.org/std/slice/trait.SliceIndex.html
2153 [`slice::from_mut`]: https://doc.rust-lang.org/std/slice/fn.from_mut.html
2154 [`slice::from_ref`]: https://doc.rust-lang.org/std/slice/fn.from_ref.html
2155 [`{Any + Send + Sync}::downcast_mut`]: https://doc.rust-lang.org/std/any/trait.Any.html#method.downcast_mut-2
2156 [`{Any + Send + Sync}::downcast_ref`]: https://doc.rust-lang.org/std/any/trait.Any.html#method.downcast_ref-2
2157 [`{Any + Send + Sync}::is`]: https://doc.rust-lang.org/std/any/trait.Any.html#method.is-2
2158
2159 Version 1.27.2 (2018-07-20)
2160 ===========================
2161
2162 Compatibility Notes
2163 -------------------
2164
2165 - The borrow checker was fixed to avoid potential unsoundness when using
2166   match ergonomics: [#52213][52213].
2167
2168 [52213]: https://github.com/rust-lang/rust/issues/52213
2169
2170 Version 1.27.1 (2018-07-10)
2171 ===========================
2172
2173 Security Notes
2174 --------------
2175
2176 - rustdoc would execute plugins in the /tmp/rustdoc/plugins directory
2177   when running, which enabled executing code as some other user on a
2178   given machine. This release fixes that vulnerability; you can read
2179   more about this on the [blog][rustdoc-sec]. The associated CVE is [CVE-2018-1000622].
2180
2181   Thank you to Red Hat for responsibly disclosing this vulnerability to us.
2182
2183 Compatibility Notes
2184 -------------------
2185
2186 - The borrow checker was fixed to avoid an additional potential unsoundness when using
2187   match ergonomics: [#51415][51415], [#49534][49534].
2188
2189 [51415]: https://github.com/rust-lang/rust/issues/51415
2190 [49534]: https://github.com/rust-lang/rust/issues/49534
2191 [rustdoc-sec]: https://blog.rust-lang.org/2018/07/06/security-advisory-for-rustdoc.html
2192 [CVE-2018-1000622]: https://cve.mitre.org/cgi-bin/cvename.cgi?name=%20CVE-2018-1000622
2193
2194 Version 1.27.0 (2018-06-21)
2195 ==========================
2196
2197 Language
2198 --------
2199 - [Removed 'proc' from the reserved keywords list.][49699] This allows `proc` to
2200   be used as an identifier.
2201 - [The dyn syntax is now available.][49968] This syntax is equivalent to the
2202   bare `Trait` syntax, and should make it clearer when being used in tandem with
2203   `impl Trait` because it is equivalent to the following syntax:
2204   `&Trait == &dyn Trait`, `&mut Trait == &mut dyn Trait`, and
2205   `Box<Trait> == Box<dyn Trait>`.
2206 - [Attributes on generic parameters such as types and lifetimes are
2207   now stable.][48851] e.g.
2208   `fn foo<#[lifetime_attr] 'a, #[type_attr] T: 'a>() {}`
2209 - [The `#[must_use]` attribute can now also be used on functions as well as
2210   types.][48925] It provides a lint that by default warns users when the
2211   value returned by a function has not been used.
2212
2213 Compiler
2214 --------
2215 - [Added the `armv5te-unknown-linux-musleabi` target.][50423]
2216
2217 Libraries
2218 ---------
2219 - [SIMD (Single Instruction Multiple Data) on x86/x86_64 is now stable.][49664]
2220   This includes [`arch::x86`] & [`arch::x86_64`] modules which contain
2221   SIMD intrinsics, a new macro called `is_x86_feature_detected!`, the
2222   `#[target_feature(enable="")]` attribute, and adding `target_feature = ""` to
2223   the `cfg` attribute.
2224 - [A lot of methods for `[u8]`, `f32`, and `f64` previously only available in
2225   std are now available in core.][49896]
2226 - [The generic `Rhs` type parameter on `ops::{Shl, ShlAssign, Shr}` now defaults
2227   to `Self`.][49630]
2228 - [`std::str::replace` now has the `#[must_use]` attribute][50177] to clarify
2229   that the operation isn't done in place.
2230 - [`Clone::clone`, `Iterator::collect`, and `ToOwned::to_owned` now have
2231   the `#[must_use]` attribute][49533] to warn about unused potentially
2232   expensive allocations.
2233
2234 Stabilized APIs
2235 ---------------
2236 - [`DoubleEndedIterator::rfind`]
2237 - [`DoubleEndedIterator::rfold`]
2238 - [`DoubleEndedIterator::try_rfold`]
2239 - [`Duration::from_micros`]
2240 - [`Duration::from_nanos`]
2241 - [`Duration::subsec_micros`]
2242 - [`Duration::subsec_millis`]
2243 - [`HashMap::remove_entry`]
2244 - [`Iterator::try_fold`]
2245 - [`Iterator::try_for_each`]
2246 - [`NonNull::cast`]
2247 - [`Option::filter`]
2248 - [`String::replace_range`]
2249 - [`Take::set_limit`]
2250 - [`hint::unreachable_unchecked`]
2251 - [`os::unix::process::parent_id`]
2252 - [`ptr::swap_nonoverlapping`]
2253 - [`slice::rsplit_mut`]
2254 - [`slice::rsplit`]
2255 - [`slice::swap_with_slice`]
2256
2257 Cargo
2258 -----
2259 - [`cargo-metadata` now includes `authors`, `categories`, `keywords`,
2260   `readme`, and `repository` fields.][cargo/5386]
2261 - [`cargo-metadata` now includes a package's `metadata` table.][cargo/5360]
2262 - [Added the `--target-dir` optional argument.][cargo/5393] This allows you to specify
2263   a different directory than `target` for placing compilation artifacts.
2264 - [Cargo will be adding automatic target inference for binaries, benchmarks,
2265   examples, and tests in the Rust 2018 edition.][cargo/5335] If your project specifies
2266   specific targets, e.g. using `[[bin]]`, and have other binaries in locations
2267   where cargo would infer a binary, Cargo will produce a warning. You can
2268   disable this feature ahead of time by setting any of the following to false:
2269   `autobins`, `autobenches`, `autoexamples`, `autotests`.
2270 - [Cargo will now cache compiler information.][cargo/5359] This can be disabled by
2271   setting `CARGO_CACHE_RUSTC_INFO=0` in your environment.
2272
2273 Misc
2274 ----
2275 - [Added “The Rustc book” into the official documentation.][49707]
2276   [“The Rustc book”] documents and teaches how to use the rustc compiler.
2277 - [All books available on `doc.rust-lang.org` are now searchable.][49623]
2278
2279 Compatibility Notes
2280 -------------------
2281 - [Calling a `CharExt` or `StrExt` method directly on core will no longer
2282   work.][49896] e.g. `::core::prelude::v1::StrExt::is_empty("")` will not
2283   compile, `"".is_empty()` will still compile.
2284 - [`Debug` output on `atomic::{AtomicBool, AtomicIsize, AtomicPtr, AtomicUsize}`
2285   will only print the inner type.][48553] E.g.
2286   `print!("{:?}", AtomicBool::new(true))` will print `true`,
2287   not `AtomicBool(true)`.
2288 - [The maximum number for `repr(align(N))` is now 2²⁹.][50378] Previously you
2289   could enter higher numbers but they were not supported by LLVM. Up to 512MB
2290   alignment should cover all use cases.
2291 - The `.description()` method on the `std::error::Error` trait
2292   [has been soft-deprecated][50163]. It is no longer required to implement it.
2293
2294 [48553]: https://github.com/rust-lang/rust/pull/48553/
2295 [48851]: https://github.com/rust-lang/rust/pull/48851/
2296 [48925]: https://github.com/rust-lang/rust/pull/48925/
2297 [49533]: https://github.com/rust-lang/rust/pull/49533/
2298 [49623]: https://github.com/rust-lang/rust/pull/49623/
2299 [49630]: https://github.com/rust-lang/rust/pull/49630/
2300 [49664]: https://github.com/rust-lang/rust/pull/49664/
2301 [49699]: https://github.com/rust-lang/rust/pull/49699/
2302 [49707]: https://github.com/rust-lang/rust/pull/49707/
2303 [49719]: https://github.com/rust-lang/rust/pull/49719/
2304 [49896]: https://github.com/rust-lang/rust/pull/49896/
2305 [49968]: https://github.com/rust-lang/rust/pull/49968/
2306 [50163]: https://github.com/rust-lang/rust/pull/50163
2307 [50177]: https://github.com/rust-lang/rust/pull/50177/
2308 [50378]: https://github.com/rust-lang/rust/pull/50378/
2309 [50398]: https://github.com/rust-lang/rust/pull/50398/
2310 [50423]: https://github.com/rust-lang/rust/pull/50423/
2311 [cargo/5203]: https://github.com/rust-lang/cargo/pull/5203/
2312 [cargo/5335]: https://github.com/rust-lang/cargo/pull/5335/
2313 [cargo/5359]: https://github.com/rust-lang/cargo/pull/5359/
2314 [cargo/5360]: https://github.com/rust-lang/cargo/pull/5360/
2315 [cargo/5386]: https://github.com/rust-lang/cargo/pull/5386/
2316 [cargo/5393]: https://github.com/rust-lang/cargo/pull/5393/
2317 [`DoubleEndedIterator::rfind`]: https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html#method.rfind
2318 [`DoubleEndedIterator::rfold`]: https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html#method.rfold
2319 [`DoubleEndedIterator::try_rfold`]: https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html#method.try_rfold
2320 [`Duration::from_micros`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.from_micros
2321 [`Duration::from_nanos`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.from_nanos
2322 [`Duration::subsec_micros`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_micros
2323 [`Duration::subsec_millis`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_millis
2324 [`HashMap::remove_entry`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.remove_entry
2325 [`Iterator::try_fold`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.try_fold
2326 [`Iterator::try_for_each`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.try_for_each
2327 [`NonNull::cast`]: https://doc.rust-lang.org/std/ptr/struct.NonNull.html#method.cast
2328 [`Option::filter`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.filter
2329 [`String::replace_range`]: https://doc.rust-lang.org/std/string/struct.String.html#method.replace_range
2330 [`Take::set_limit`]: https://doc.rust-lang.org/std/io/struct.Take.html#method.set_limit
2331 [`hint::unreachable_unchecked`]: https://doc.rust-lang.org/std/hint/fn.unreachable_unchecked.html
2332 [`os::unix::process::parent_id`]: https://doc.rust-lang.org/std/os/unix/process/fn.parent_id.html
2333 [`process::id`]: https://doc.rust-lang.org/std/process/fn.id.html
2334 [`ptr::swap_nonoverlapping`]: https://doc.rust-lang.org/std/ptr/fn.swap_nonoverlapping.html
2335 [`slice::rsplit_mut`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rsplit_mut
2336 [`slice::rsplit`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rsplit
2337 [`slice::swap_with_slice`]: https://doc.rust-lang.org/std/primitive.slice.html#method.swap_with_slice
2338 [`arch::x86_64`]: https://doc.rust-lang.org/std/arch/x86_64/index.html
2339 [`arch::x86`]: https://doc.rust-lang.org/std/arch/x86/index.html
2340 [“The Rustc book”]: https://doc.rust-lang.org/rustc
2341
2342
2343 Version 1.26.2 (2018-06-05)
2344 ==========================
2345
2346 Compatibility Notes
2347 -------------------
2348
2349 - [The borrow checker was fixed to avoid unsoundness when using match ergonomics.][51117]
2350
2351 [51117]: https://github.com/rust-lang/rust/issues/51117
2352
2353
2354 Version 1.26.1 (2018-05-29)
2355 ==========================
2356
2357 Tools
2358 -----
2359
2360 - [RLS now works on Windows.][50646]
2361 - [Rustfmt stopped badly formatting text in some cases.][rustfmt/2695]
2362
2363
2364 Compatibility Notes
2365 --------
2366
2367 - [`fn main() -> impl Trait` no longer works for non-Termination
2368   trait.][50656]
2369   This reverts an accidental stabilization.
2370 - [`NaN > NaN` no longer returns true in const-fn contexts.][50812]
2371 - [Prohibit using turbofish for `impl Trait` in method arguments.][50950]
2372
2373 [50646]: https://github.com/rust-lang/rust/issues/50646
2374 [50656]: https://github.com/rust-lang/rust/pull/50656
2375 [50812]: https://github.com/rust-lang/rust/pull/50812
2376 [50950]: https://github.com/rust-lang/rust/issues/50950
2377 [rustfmt/2695]: https://github.com/rust-lang-nursery/rustfmt/issues/2695
2378
2379 Version 1.26.0 (2018-05-10)
2380 ==========================
2381
2382 Language
2383 --------
2384 - [Closures now implement `Copy` and/or `Clone` if all captured variables
2385   implement either or both traits.][49299]
2386 - [The inclusive range syntax e.g. `for x in 0..=10` is now stable.][47813]
2387 - [The `'_` lifetime is now stable. The underscore lifetime can be used anywhere a
2388   lifetime can be elided.][49458]
2389 - [`impl Trait` is now stable allowing you to have abstract types in returns
2390    or in function parameters.][49255] E.g. `fn foo() -> impl Iterator<Item=u8>` or
2391   `fn open(path: impl AsRef<Path>)`.
2392 - [Pattern matching will now automatically apply dereferences.][49394]
2393 - [128-bit integers in the form of `u128` and `i128` are now stable.][49101]
2394 - [`main` can now return `Result<(), E: Debug>`][49162] in addition to `()`.
2395 - [A lot of operations are now available in a const context.][46882] E.g. You
2396   can now index into constant arrays, reference and dereference into constants,
2397   and use tuple struct constructors.
2398 - [Fixed entry slice patterns are now stable.][48516] E.g.
2399   ```rust
2400   let points = [1, 2, 3, 4];
2401   match points {
2402       [1, 2, 3, 4] => println!("All points were sequential."),
2403       _ => println!("Not all points were sequential."),
2404   }
2405   ```
2406
2407
2408 Compiler
2409 --------
2410 - [LLD is now used as the default linker for `wasm32-unknown-unknown`.][48125]
2411 - [Fixed exponential projection complexity on nested types.][48296]
2412   This can provide up to a ~12% reduction in compile times for certain crates.
2413 - [Added the `--remap-path-prefix` option to rustc.][48359] Allowing you
2414   to remap path prefixes outputted by the compiler.
2415 - [Added `powerpc-unknown-netbsd` target.][48281]
2416
2417 Libraries
2418 ---------
2419 - [Implemented `From<u16> for usize` & `From<{u8, i16}> for isize`.][49305]
2420 - [Added hexadecimal formatting for integers with fmt::Debug][48978]
2421   e.g. `assert!(format!("{:02x?}", b"Foo\0") == "[46, 6f, 6f, 00]")`
2422 - [Implemented `Default, Hash` for `cmp::Reverse`.][48628]
2423 - [Optimized `str::repeat` being 8x faster in large cases.][48657]
2424 - [`ascii::escape_default` is now available in libcore.][48735]
2425 - [Trailing commas are now supported in std and core macros.][48056]
2426 - [Implemented `Copy, Clone` for `cmp::Reverse`][47379]
2427 - [Implemented `Clone` for `char::{ToLowercase, ToUppercase}`.][48629]
2428
2429 Stabilized APIs
2430 ---------------
2431 - [`*const T::add`]
2432 - [`*const T::copy_to_nonoverlapping`]
2433 - [`*const T::copy_to`]
2434 - [`*const T::read_unaligned`]
2435 - [`*const T::read_volatile`]
2436 - [`*const T::read`]
2437 - [`*const T::sub`]
2438 - [`*const T::wrapping_add`]
2439 - [`*const T::wrapping_sub`]
2440 - [`*mut T::add`]
2441 - [`*mut T::copy_to_nonoverlapping`]
2442 - [`*mut T::copy_to`]
2443 - [`*mut T::read_unaligned`]
2444 - [`*mut T::read_volatile`]
2445 - [`*mut T::read`]
2446 - [`*mut T::replace`]
2447 - [`*mut T::sub`]
2448 - [`*mut T::swap`]
2449 - [`*mut T::wrapping_add`]
2450 - [`*mut T::wrapping_sub`]
2451 - [`*mut T::write_bytes`]
2452 - [`*mut T::write_unaligned`]
2453 - [`*mut T::write_volatile`]
2454 - [`*mut T::write`]
2455 - [`Box::leak`]
2456 - [`FromUtf8Error::as_bytes`]
2457 - [`LocalKey::try_with`]
2458 - [`Option::cloned`]
2459 - [`btree_map::Entry::and_modify`]
2460 - [`fs::read_to_string`]
2461 - [`fs::read`]
2462 - [`fs::write`]
2463 - [`hash_map::Entry::and_modify`]
2464 - [`iter::FusedIterator`]
2465 - [`ops::RangeInclusive`]
2466 - [`ops::RangeToInclusive`]
2467 - [`process::id`]
2468 - [`slice::rotate_left`]
2469 - [`slice::rotate_right`]
2470 - [`String::retain`]
2471
2472
2473 Cargo
2474 -----
2475 - [Cargo will now output path to custom commands when `-v` is
2476   passed with `--list`][cargo/5041]
2477 - [The Cargo binary version is now the same as the Rust version][cargo/5083]
2478
2479 Misc
2480 ----
2481 - [The second edition of "The Rust Programming Language" book is now recommended
2482   over the first.][48404]
2483
2484 Compatibility Notes
2485 -------------------
2486
2487 - [aliasing a `Fn` trait as `dyn` no longer works.][48481] E.g. the following
2488   syntax is now invalid.
2489   ```
2490   use std::ops::Fn as dyn;
2491   fn g(_: Box<dyn(std::fmt::Debug)>) {}
2492   ```
2493 - [The result of dereferences are no longer promoted to `'static`.][47408]
2494   e.g.
2495   ```rust
2496   fn main() {
2497       const PAIR: &(i32, i32) = &(0, 1);
2498       let _reversed_pair: &'static _ = &(PAIR.1, PAIR.0); // Doesn't work
2499   }
2500   ```
2501 - [Deprecate `AsciiExt` trait in favor of inherent methods.][49109]
2502 - [`".e0"` will now no longer parse as `0.0` and will instead cause
2503   an error.][48235]
2504 - [Removed hoedown from rustdoc.][48274]
2505 - [Bounds on higher-kinded lifetimes a hard error.][48326]
2506
2507 [46882]: https://github.com/rust-lang/rust/pull/46882
2508 [47379]: https://github.com/rust-lang/rust/pull/47379
2509 [47408]: https://github.com/rust-lang/rust/pull/47408
2510 [47813]: https://github.com/rust-lang/rust/pull/47813
2511 [48056]: https://github.com/rust-lang/rust/pull/48056
2512 [48125]: https://github.com/rust-lang/rust/pull/48125
2513 [48166]: https://github.com/rust-lang/rust/pull/48166
2514 [48235]: https://github.com/rust-lang/rust/pull/48235
2515 [48274]: https://github.com/rust-lang/rust/pull/48274
2516 [48281]: https://github.com/rust-lang/rust/pull/48281
2517 [48296]: https://github.com/rust-lang/rust/pull/48296
2518 [48326]: https://github.com/rust-lang/rust/pull/48326
2519 [48359]: https://github.com/rust-lang/rust/pull/48359
2520 [48404]: https://github.com/rust-lang/rust/pull/48404
2521 [48481]: https://github.com/rust-lang/rust/pull/48481
2522 [48516]: https://github.com/rust-lang/rust/pull/48516
2523 [48628]: https://github.com/rust-lang/rust/pull/48628
2524 [48629]: https://github.com/rust-lang/rust/pull/48629
2525 [48657]: https://github.com/rust-lang/rust/pull/48657
2526 [48735]: https://github.com/rust-lang/rust/pull/48735
2527 [48978]: https://github.com/rust-lang/rust/pull/48978
2528 [49101]: https://github.com/rust-lang/rust/pull/49101
2529 [49109]: https://github.com/rust-lang/rust/pull/49109
2530 [49121]: https://github.com/rust-lang/rust/pull/49121
2531 [49162]: https://github.com/rust-lang/rust/pull/49162
2532 [49184]: https://github.com/rust-lang/rust/pull/49184
2533 [49234]: https://github.com/rust-lang/rust/pull/49234
2534 [49255]: https://github.com/rust-lang/rust/pull/49255
2535 [49299]: https://github.com/rust-lang/rust/pull/49299
2536 [49305]: https://github.com/rust-lang/rust/pull/49305
2537 [49394]: https://github.com/rust-lang/rust/pull/49394
2538 [49458]: https://github.com/rust-lang/rust/pull/49458
2539 [`*const T::add`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.add
2540 [`*const T::copy_to_nonoverlapping`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.copy_to_nonoverlapping
2541 [`*const T::copy_to`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.copy_to
2542 [`*const T::read_unaligned`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read_unaligned
2543 [`*const T::read_volatile`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read_volatile
2544 [`*const T::read`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read
2545 [`*const T::sub`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.sub
2546 [`*const T::wrapping_add`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_add
2547 [`*const T::wrapping_sub`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_sub
2548 [`*mut T::add`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.add-1
2549 [`*mut T::copy_to_nonoverlapping`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.copy_to_nonoverlapping-1
2550 [`*mut T::copy_to`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.copy_to-1
2551 [`*mut T::read_unaligned`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read_unaligned-1
2552 [`*mut T::read_volatile`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read_volatile-1
2553 [`*mut T::read`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read-1
2554 [`*mut T::replace`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.replace
2555 [`*mut T::sub`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.sub-1
2556 [`*mut T::swap`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.swap
2557 [`*mut T::wrapping_add`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_add-1
2558 [`*mut T::wrapping_sub`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_sub-1
2559 [`*mut T::write_bytes`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write_bytes
2560 [`*mut T::write_unaligned`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write_unaligned
2561 [`*mut T::write_volatile`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write_volatile
2562 [`*mut T::write`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write
2563 [`Box::leak`]: https://doc.rust-lang.org/std/boxed/struct.Box.html#method.leak
2564 [`FromUtf8Error::as_bytes`]: https://doc.rust-lang.org/std/string/struct.FromUtf8Error.html#method.as_bytes
2565 [`LocalKey::try_with`]: https://doc.rust-lang.org/std/thread/struct.LocalKey.html#method.try_with
2566 [`Option::cloned`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.cloned
2567 [`btree_map::Entry::and_modify`]: https://doc.rust-lang.org/std/collections/btree_map/enum.Entry.html#method.and_modify
2568 [`fs::read_to_string`]: https://doc.rust-lang.org/std/fs/fn.read_to_string.html
2569 [`fs::read`]: https://doc.rust-lang.org/std/fs/fn.read.html
2570 [`fs::write`]: https://doc.rust-lang.org/std/fs/fn.write.html
2571 [`hash_map::Entry::and_modify`]: https://doc.rust-lang.org/std/collections/hash_map/enum.Entry.html#method.and_modify
2572 [`iter::FusedIterator`]: https://doc.rust-lang.org/std/iter/trait.FusedIterator.html
2573 [`ops::RangeInclusive`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html
2574 [`ops::RangeToInclusive`]: https://doc.rust-lang.org/std/ops/struct.RangeToInclusive.html
2575 [`process::id`]: https://doc.rust-lang.org/std/process/fn.id.html
2576 [`slice::rotate_left`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rotate_left
2577 [`slice::rotate_right`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rotate_right
2578 [`String::retain`]: https://doc.rust-lang.org/std/string/struct.String.html#method.retain
2579 [cargo/5041]: https://github.com/rust-lang/cargo/pull/5041
2580 [cargo/5083]: https://github.com/rust-lang/cargo/pull/5083
2581
2582
2583 Version 1.25.0 (2018-03-29)
2584 ==========================
2585
2586 Language
2587 --------
2588 - [The `#[repr(align(x))]` attribute is now stable.][47006] [RFC 1358]
2589 - [You can now use nested groups of imports.][47948]
2590   e.g. `use std::{fs::File, io::Read, path::{Path, PathBuf}};`
2591 - [You can now have `|` at the start of a match arm.][47947] e.g.
2592 ```rust
2593 enum Foo { A, B, C }
2594
2595 fn main() {
2596     let x = Foo::A;
2597     match x {
2598         | Foo::A
2599         | Foo::B => println!("AB"),
2600         | Foo::C => println!("C"),
2601     }
2602 }
2603 ```
2604
2605 Compiler
2606 --------
2607 - [Upgraded to LLVM 6.][47828]
2608 - [Added `-C lto=val` option.][47521]
2609 - [Added `i586-unknown-linux-musl` target][47282]
2610
2611 Libraries
2612 ---------
2613 - [Impl Send for `process::Command` on Unix.][47760]
2614 - [Impl PartialEq and Eq for `ParseCharError`.][47790]
2615 - [`UnsafeCell::into_inner` is now safe.][47204]
2616 - [Implement libstd for CloudABI.][47268]
2617 - [`Float::{from_bits, to_bits}` is now available in libcore.][46931]
2618 - [Implement `AsRef<Path>` for Component][46985]
2619 - [Implemented `Write` for `Cursor<&mut Vec<u8>>`][46830]
2620 - [Moved `Duration` to libcore.][46666]
2621
2622 Stabilized APIs
2623 ---------------
2624 - [`Location::column`]
2625 - [`ptr::NonNull`]
2626
2627 The following functions can now be used in a constant expression.
2628 eg. `static MINUTE: Duration = Duration::from_secs(60);`
2629 - [`Duration::new`][47300]
2630 - [`Duration::from_secs`][47300]
2631 - [`Duration::from_millis`][47300]
2632
2633 Cargo
2634 -----
2635 - [`cargo new` no longer removes `rust` or `rs` prefixs/suffixs.][cargo/5013]
2636 - [`cargo new` now defaults to creating a binary crate, instead of a
2637   library crate.][cargo/5029]
2638
2639 Misc
2640 ----
2641 - [Rust by example is now shipped with new releases][46196]
2642
2643 Compatibility Notes
2644 -------------------
2645 - [Deprecated `net::lookup_host`.][47510]
2646 - [`rustdoc` has switched to pulldown as the default markdown renderer.][47398]
2647 - The borrow checker was sometimes incorrectly permitting overlapping borrows
2648   around indexing operations (see [#47349][47349]). This has been fixed (which also
2649   enabled some correct code that used to cause errors (e.g. [#33903][33903] and [#46095][46095]).
2650 - [Removed deprecated unstable attribute `#[simd]`.][47251]
2651
2652 [33903]: https://github.com/rust-lang/rust/pull/33903
2653 [47947]: https://github.com/rust-lang/rust/pull/47947
2654 [47948]: https://github.com/rust-lang/rust/pull/47948
2655 [47760]: https://github.com/rust-lang/rust/pull/47760
2656 [47790]: https://github.com/rust-lang/rust/pull/47790
2657 [47828]: https://github.com/rust-lang/rust/pull/47828
2658 [47398]: https://github.com/rust-lang/rust/pull/47398
2659 [47510]: https://github.com/rust-lang/rust/pull/47510
2660 [47521]: https://github.com/rust-lang/rust/pull/47521
2661 [47204]: https://github.com/rust-lang/rust/pull/47204
2662 [47251]: https://github.com/rust-lang/rust/pull/47251
2663 [47268]: https://github.com/rust-lang/rust/pull/47268
2664 [47282]: https://github.com/rust-lang/rust/pull/47282
2665 [47300]: https://github.com/rust-lang/rust/pull/47300
2666 [47349]: https://github.com/rust-lang/rust/pull/47349
2667 [46931]: https://github.com/rust-lang/rust/pull/46931
2668 [46985]: https://github.com/rust-lang/rust/pull/46985
2669 [47006]: https://github.com/rust-lang/rust/pull/47006
2670 [46830]: https://github.com/rust-lang/rust/pull/46830
2671 [46095]: https://github.com/rust-lang/rust/pull/46095
2672 [46666]: https://github.com/rust-lang/rust/pull/46666
2673 [46196]: https://github.com/rust-lang/rust/pull/46196
2674 [cargo/5013]: https://github.com/rust-lang/cargo/pull/5013
2675 [cargo/5029]: https://github.com/rust-lang/cargo/pull/5029
2676 [RFC 1358]: https://github.com/rust-lang/rfcs/pull/1358
2677 [`Location::column`]: https://doc.rust-lang.org/std/panic/struct.Location.html#method.column
2678 [`ptr::NonNull`]: https://doc.rust-lang.org/std/ptr/struct.NonNull.html
2679
2680
2681 Version 1.24.1 (2018-03-01)
2682 ==========================
2683
2684  - [Do not abort when unwinding through FFI][48251]
2685  - [Emit UTF-16 files for linker arguments on Windows][48318]
2686  - [Make the error index generator work again][48308]
2687  - [Cargo will warn on Windows 7 if an update is needed][cargo/5069].
2688
2689 [48251]: https://github.com/rust-lang/rust/issues/48251
2690 [48308]: https://github.com/rust-lang/rust/issues/48308
2691 [48318]: https://github.com/rust-lang/rust/issues/48318
2692 [cargo/5069]: https://github.com/rust-lang/cargo/pull/5069
2693
2694
2695 Version 1.24.0 (2018-02-15)
2696 ==========================
2697
2698 Language
2699 --------
2700 - [External `sysv64` ffi is now available.][46528]
2701   eg. `extern "sysv64" fn foo () {}`
2702
2703 Compiler
2704 --------
2705 - [rustc now uses 16 codegen units by default for release builds.][46910]
2706   For the fastest builds, utilize `codegen-units=1`.
2707 - [Added `armv4t-unknown-linux-gnueabi` target.][47018]
2708 - [Add `aarch64-unknown-openbsd` support][46760]
2709
2710 Libraries
2711 ---------
2712 - [`str::find::<char>` now uses memchr.][46735] This should lead to a 10x
2713   improvement in performance in the majority of cases.
2714 - [`OsStr`'s `Debug` implementation is now lossless and consistent
2715   with Windows.][46798]
2716 - [`time::{SystemTime, Instant}` now implement `Hash`.][46828]
2717 - [impl `From<bool>` for `AtomicBool`][46293]
2718 - [impl `From<{CString, &CStr}>` for `{Arc<CStr>, Rc<CStr>}`][45990]
2719 - [impl `From<{OsString, &OsStr}>` for `{Arc<OsStr>, Rc<OsStr>}`][45990]
2720 - [impl `From<{PathBuf, &Path}>` for `{Arc<Path>, Rc<Path>}`][45990]
2721 - [float::from_bits now just uses transmute.][46012] This provides
2722   some optimisations from LLVM.
2723 - [Copied `AsciiExt` methods onto `char`][46077]
2724 - [Remove `T: Sized` requirement on `ptr::is_null()`][46094]
2725 - [impl `From<RecvError>` for `{TryRecvError, RecvTimeoutError}`][45506]
2726 - [Optimised `f32::{min, max}` to generate more efficient x86 assembly][47080]
2727 - [`[u8]::contains` now uses memchr which provides a 3x speed improvement][46713]
2728
2729 Stabilized APIs
2730 ---------------
2731 - [`RefCell::replace`]
2732 - [`RefCell::swap`]
2733 - [`atomic::spin_loop_hint`]
2734
2735 The following functions can now be used in a constant expression.
2736 eg. `let buffer: [u8; size_of::<usize>()];`, `static COUNTER: AtomicUsize = AtomicUsize::new(1);`
2737
2738 - [`AtomicBool::new`][46287]
2739 - [`AtomicUsize::new`][46287]
2740 - [`AtomicIsize::new`][46287]
2741 - [`AtomicPtr::new`][46287]
2742 - [`Cell::new`][46287]
2743 - [`{integer}::min_value`][46287]
2744 - [`{integer}::max_value`][46287]
2745 - [`mem::size_of`][46287]
2746 - [`mem::align_of`][46287]
2747 - [`ptr::null`][46287]
2748 - [`ptr::null_mut`][46287]
2749 - [`RefCell::new`][46287]
2750 - [`UnsafeCell::new`][46287]
2751
2752 Cargo
2753 -----
2754 - [Added a `workspace.default-members` config that
2755   overrides implied `--all` in virtual workspaces.][cargo/4743]
2756 - [Enable incremental by default on development builds.][cargo/4817] Also added
2757   configuration keys to `Cargo.toml` and `.cargo/config` to disable on a
2758   per-project or global basis respectively.
2759
2760 Misc
2761 ----
2762
2763 Compatibility Notes
2764 -------------------
2765 - [Floating point types `Debug` impl now always prints a decimal point.][46831]
2766 - [`Ipv6Addr` now rejects superfluous `::`'s in IPv6 addresses][46671] This is
2767   in accordance with IETF RFC 4291 §2.2.
2768 - [Unwinding will no longer go past FFI boundaries, and will instead abort.][46833]
2769 - [`Formatter::flags` method is now deprecated.][46284] The `sign_plus`,
2770   `sign_minus`, `alternate`, and `sign_aware_zero_pad` should be used instead.
2771 - [Leading zeros in tuple struct members is now an error][47084]
2772 - [`column!()` macro is one-based instead of zero-based][46977]
2773 - [`fmt::Arguments` can no longer be shared across threads][45198]
2774 - [Access to `#[repr(packed)]` struct fields is now unsafe][44884]
2775 - [Cargo sets a different working directory for the compiler][cargo/4788]
2776
2777 [44884]: https://github.com/rust-lang/rust/pull/44884
2778 [45198]: https://github.com/rust-lang/rust/pull/45198
2779 [45506]: https://github.com/rust-lang/rust/pull/45506
2780 [45904]: https://github.com/rust-lang/rust/pull/45904
2781 [45990]: https://github.com/rust-lang/rust/pull/45990
2782 [46012]: https://github.com/rust-lang/rust/pull/46012
2783 [46077]: https://github.com/rust-lang/rust/pull/46077
2784 [46094]: https://github.com/rust-lang/rust/pull/46094
2785 [46284]: https://github.com/rust-lang/rust/pull/46284
2786 [46287]: https://github.com/rust-lang/rust/pull/46287
2787 [46293]: https://github.com/rust-lang/rust/pull/46293
2788 [46528]: https://github.com/rust-lang/rust/pull/46528
2789 [46671]: https://github.com/rust-lang/rust/pull/46671
2790 [46713]: https://github.com/rust-lang/rust/pull/46713
2791 [46735]: https://github.com/rust-lang/rust/pull/46735
2792 [46749]: https://github.com/rust-lang/rust/pull/46749
2793 [46760]: https://github.com/rust-lang/rust/pull/46760
2794 [46798]: https://github.com/rust-lang/rust/pull/46798
2795 [46828]: https://github.com/rust-lang/rust/pull/46828
2796 [46831]: https://github.com/rust-lang/rust/pull/46831
2797 [46833]: https://github.com/rust-lang/rust/pull/46833
2798 [46910]: https://github.com/rust-lang/rust/pull/46910
2799 [46977]: https://github.com/rust-lang/rust/pull/46977
2800 [47018]: https://github.com/rust-lang/rust/pull/47018
2801 [47080]: https://github.com/rust-lang/rust/pull/47080
2802 [47084]: https://github.com/rust-lang/rust/pull/47084
2803 [cargo/4743]: https://github.com/rust-lang/cargo/pull/4743
2804 [cargo/4788]: https://github.com/rust-lang/cargo/pull/4788
2805 [cargo/4817]: https://github.com/rust-lang/cargo/pull/4817
2806 [`RefCell::replace`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.replace
2807 [`RefCell::swap`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.swap
2808 [`atomic::spin_loop_hint`]: https://doc.rust-lang.org/std/sync/atomic/fn.spin_loop_hint.html
2809
2810
2811 Version 1.23.0 (2018-01-04)
2812 ==========================
2813
2814 Language
2815 --------
2816 - [Arbitrary `auto` traits are now permitted in trait objects.][45772]
2817 - [rustc now uses subtyping on the left hand side of binary operations.][45435]
2818   Which should fix some confusing errors in some operations.
2819
2820 Compiler
2821 --------
2822 - [Enabled `TrapUnreachable` in LLVM which should mitigate the impact of
2823   undefined behavior.][45920]
2824 - [rustc now suggests renaming import if names clash.][45660]
2825 - [Display errors/warnings correctly when there are zero-width or
2826   wide characters.][45711]
2827 - [rustc now avoids unnecessary copies of arguments that are
2828   simple bindings][45380] This should improve memory usage on average by 5-10%.
2829 - [Updated musl used to build musl rustc to 1.1.17][45393]
2830
2831 Libraries
2832 ---------
2833 - [Allow a trailing comma in `assert_eq/ne` macro][45887]
2834 - [Implement Hash for raw pointers to unsized types][45483]
2835 - [impl `From<*mut T>` for `AtomicPtr<T>`][45610]
2836 - [impl `From<usize/isize>` for `AtomicUsize/AtomicIsize`.][45610]
2837 - [Removed the `T: Sync` requirement for `RwLock<T>: Send`][45267]
2838 - [Removed `T: Sized` requirement for `{<*const T>, <*mut T>}::as_ref`
2839   and `<*mut T>::as_mut`][44932]
2840 - [Optimized `Thread::{park, unpark}` implementation][45524]
2841 - [Improved `SliceExt::binary_search` performance.][45333]
2842 - [impl `FromIterator<()>` for `()`][45379]
2843 - [Copied `AsciiExt` trait methods to primitive types.][44042] Use of `AsciiExt`
2844   is now deprecated.
2845
2846 Stabilized APIs
2847 ---------------
2848
2849 Cargo
2850 -----
2851 - [Cargo now supports uninstallation of multiple packages][cargo/4561]
2852   eg. `cargo uninstall foo bar` uninstalls `foo` and `bar`.
2853 - [Added unit test checking to `cargo check`][cargo/4592]
2854 - [Cargo now lets you install a specific version
2855   using `cargo install --version`][cargo/4637]
2856
2857 Misc
2858 ----
2859 - [Releases now ship with the Cargo book documentation.][45692]
2860 - [rustdoc now prints rendering warnings on every run.][45324]
2861
2862 Compatibility Notes
2863 -------------------
2864 - [Changes have been made to type equality to make it more correct,
2865   in rare cases this could break some code.][45853] [Tracking issue for
2866   further information][45852]
2867 - [`char::escape_debug` now uses Unicode 10 over 9.][45571]
2868 - [Upgraded Android SDK to 27, and NDK to r15c.][45580] This drops support for
2869   Android 9, the minimum supported version is Android 14.
2870 - [Bumped the minimum LLVM to 3.9][45326]
2871
2872 [44042]: https://github.com/rust-lang/rust/pull/44042
2873 [44932]: https://github.com/rust-lang/rust/pull/44932
2874 [45267]: https://github.com/rust-lang/rust/pull/45267
2875 [45324]: https://github.com/rust-lang/rust/pull/45324
2876 [45326]: https://github.com/rust-lang/rust/pull/45326
2877 [45333]: https://github.com/rust-lang/rust/pull/45333
2878 [45379]: https://github.com/rust-lang/rust/pull/45379
2879 [45380]: https://github.com/rust-lang/rust/pull/45380
2880 [45393]: https://github.com/rust-lang/rust/pull/45393
2881 [45435]: https://github.com/rust-lang/rust/pull/45435
2882 [45483]: https://github.com/rust-lang/rust/pull/45483
2883 [45524]: https://github.com/rust-lang/rust/pull/45524
2884 [45571]: https://github.com/rust-lang/rust/pull/45571
2885 [45580]: https://github.com/rust-lang/rust/pull/45580
2886 [45610]: https://github.com/rust-lang/rust/pull/45610
2887 [45660]: https://github.com/rust-lang/rust/pull/45660
2888 [45692]: https://github.com/rust-lang/rust/pull/45692
2889 [45711]: https://github.com/rust-lang/rust/pull/45711
2890 [45772]: https://github.com/rust-lang/rust/pull/45772
2891 [45852]: https://github.com/rust-lang/rust/issues/45852
2892 [45853]: https://github.com/rust-lang/rust/pull/45853
2893 [45887]: https://github.com/rust-lang/rust/pull/45887
2894 [45920]: https://github.com/rust-lang/rust/pull/45920
2895 [cargo/4561]: https://github.com/rust-lang/cargo/pull/4561
2896 [cargo/4592]: https://github.com/rust-lang/cargo/pull/4592
2897 [cargo/4637]: https://github.com/rust-lang/cargo/pull/4637
2898
2899
2900 Version 1.22.1 (2017-11-22)
2901 ==========================
2902
2903 - [Update Cargo to fix an issue with macOS 10.13 "High Sierra"][46183]
2904
2905 [46183]: https://github.com/rust-lang/rust/pull/46183
2906
2907 Version 1.22.0 (2017-11-22)
2908 ==========================
2909
2910 Language
2911 --------
2912 - [`non_snake_case` lint now allows extern no-mangle functions][44966]
2913 - [Now accepts underscores in unicode escapes][43716]
2914 - [`T op= &T` now works for numeric types.][44287] eg. `let mut x = 2; x += &8;`
2915 - [types that impl `Drop` are now allowed in `const` and `static` types][44456]
2916
2917 Compiler
2918 --------
2919 - [rustc now defaults to having 16 codegen units at debug on supported platforms.][45064]
2920 - [rustc will no longer inline in codegen units when compiling for debug][45075]
2921   This should decrease compile times for debug builds.
2922 - [strict memory alignment now enabled on ARMv6][45094]
2923 - [Remove support for the PNaCl target `le32-unknown-nacl`][45041]
2924
2925 Libraries
2926 ---------
2927 - [Allow atomic operations up to 32 bits
2928   on `armv5te_unknown_linux_gnueabi`][44978]
2929 - [`Box<Error>` now impls `From<Cow<str>>`][44466]
2930 - [`std::mem::Discriminant` is now guaranteed to be `Send + Sync`][45095]
2931 - [`fs::copy` now returns the length of the main stream on NTFS.][44895]
2932 - [Properly detect overflow in `Instant += Duration`.][44220]
2933 - [impl `Hasher` for `{&mut Hasher, Box<Hasher>}`][44015]
2934 - [impl `fmt::Debug` for `SplitWhitespace`.][44303]
2935 - [`Option<T>` now impls `Try`][42526] This allows for using `?` with `Option` types.
2936
2937 Stabilized APIs
2938 ---------------
2939
2940 Cargo
2941 -----
2942 - [Cargo will now build multi file examples in subdirectories of the `examples`
2943   folder that have a `main.rs` file.][cargo/4496]
2944 - [Changed `[root]` to `[package]` in `Cargo.lock`][cargo/4571] Packages with
2945   the old format will continue to work and can be updated with `cargo update`.
2946 - [Now supports vendoring git repositories][cargo/3992]
2947
2948 Misc
2949 ----
2950 - [`libbacktrace` is now available on Apple platforms.][44251]
2951 - [Stabilised the `compile_fail` attribute for code fences in doc-comments.][43949]
2952   This now lets you specify that a given code example will fail to compile.
2953
2954 Compatibility Notes
2955 -------------------
2956 - [The minimum Android version that rustc can build for has been bumped
2957   to `4.0` from `2.3`][45656]
2958 - [Allowing `T op= &T` for numeric types has broken some type
2959   inference cases][45480]
2960
2961
2962 [42526]: https://github.com/rust-lang/rust/pull/42526
2963 [43017]: https://github.com/rust-lang/rust/pull/43017
2964 [43716]: https://github.com/rust-lang/rust/pull/43716
2965 [43949]: https://github.com/rust-lang/rust/pull/43949
2966 [44015]: https://github.com/rust-lang/rust/pull/44015
2967 [44220]: https://github.com/rust-lang/rust/pull/44220
2968 [44251]: https://github.com/rust-lang/rust/pull/44251
2969 [44287]: https://github.com/rust-lang/rust/pull/44287
2970 [44303]: https://github.com/rust-lang/rust/pull/44303
2971 [44456]: https://github.com/rust-lang/rust/pull/44456
2972 [44466]: https://github.com/rust-lang/rust/pull/44466
2973 [44895]: https://github.com/rust-lang/rust/pull/44895
2974 [44966]: https://github.com/rust-lang/rust/pull/44966
2975 [44978]: https://github.com/rust-lang/rust/pull/44978
2976 [45041]: https://github.com/rust-lang/rust/pull/45041
2977 [45064]: https://github.com/rust-lang/rust/pull/45064
2978 [45075]: https://github.com/rust-lang/rust/pull/45075
2979 [45094]: https://github.com/rust-lang/rust/pull/45094
2980 [45095]: https://github.com/rust-lang/rust/pull/45095
2981 [45480]: https://github.com/rust-lang/rust/issues/45480
2982 [45656]: https://github.com/rust-lang/rust/pull/45656
2983 [cargo/3992]: https://github.com/rust-lang/cargo/pull/3992
2984 [cargo/4496]: https://github.com/rust-lang/cargo/pull/4496
2985 [cargo/4571]: https://github.com/rust-lang/cargo/pull/4571
2986
2987
2988
2989
2990
2991
2992 Version 1.21.0 (2017-10-12)
2993 ==========================
2994
2995 Language
2996 --------
2997 - [You can now use static references for literals.][43838]
2998   Example:
2999   ```rust
3000   fn main() {
3001       let x: &'static u32 = &0;
3002   }
3003   ```
3004 - [Relaxed path syntax. Optional `::` before `<` is now allowed in all contexts.][43540]
3005   Example:
3006   ```rust
3007   my_macro!(Vec<i32>::new); // Always worked
3008   my_macro!(Vec::<i32>::new); // Now works
3009   ```
3010
3011 Compiler
3012 --------
3013 - [Upgraded jemalloc to 4.5.0][43911]
3014 - [Enabled unwinding panics on Redox][43917]
3015 - [Now runs LLVM in parallel during translation phase.][43506]
3016   This should reduce peak memory usage.
3017
3018 Libraries
3019 ---------
3020 - [Generate builtin impls for `Clone` for all arrays and tuples that
3021   are `T: Clone`][43690]
3022 - [`Stdin`, `Stdout`, and `Stderr` now implement `AsRawFd`.][43459]
3023 - [`Rc` and `Arc` now implement `From<&[T]> where T: Clone`, `From<str>`,
3024   `From<String>`, `From<Box<T>> where T: ?Sized`, and `From<Vec<T>>`.][42565]
3025
3026 Stabilized APIs
3027 ---------------
3028
3029 [`std::mem::discriminant`]
3030
3031 Cargo
3032 -----
3033 - [You can now call `cargo install` with multiple package names][cargo/4216]
3034 - [Cargo commands inside a virtual workspace will now implicitly
3035   pass `--all`][cargo/4335]
3036 - [Added a `[patch]` section to `Cargo.toml` to handle
3037   prepublication dependencies][cargo/4123] [RFC 1969]
3038 - [`include` & `exclude` fields in `Cargo.toml` now accept gitignore
3039   like patterns][cargo/4270]
3040 - [Added the `--all-targets` option][cargo/4400]
3041 - [Using required dependencies as a feature is now deprecated and emits
3042   a warning][cargo/4364]
3043
3044
3045 Misc
3046 ----
3047 - [Cargo docs are moving][43916]
3048   to [doc.rust-lang.org/cargo](https://doc.rust-lang.org/cargo)
3049 - [The rustdoc book is now available][43863]
3050   at [doc.rust-lang.org/rustdoc](https://doc.rust-lang.org/rustdoc)
3051 - [Added a preview of RLS has been made available through rustup][44204]
3052   Install with `rustup component add rls-preview`
3053 - [`std::os` documentation for Unix, Linux, and Windows now appears on doc.rust-lang.org][43348]
3054   Previously only showed `std::os::unix`.
3055
3056 Compatibility Notes
3057 -------------------
3058 - [Changes in method matching against higher-ranked types][43880] This may cause
3059   breakage in subtyping corner cases. [A more in-depth explanation is available.][info/43880]
3060 - [rustc's JSON error output's byte position start at top of file.][42973]
3061   Was previously relative to the rustc's internal `CodeMap` struct which
3062   required the unstable library `libsyntax` to correctly use.
3063 - [`unused_results` lint no longer ignores booleans][43728]
3064
3065 [42565]: https://github.com/rust-lang/rust/pull/42565
3066 [42973]: https://github.com/rust-lang/rust/pull/42973
3067 [43348]: https://github.com/rust-lang/rust/pull/43348
3068 [43459]: https://github.com/rust-lang/rust/pull/43459
3069 [43506]: https://github.com/rust-lang/rust/pull/43506
3070 [43540]: https://github.com/rust-lang/rust/pull/43540
3071 [43690]: https://github.com/rust-lang/rust/pull/43690
3072 [43728]: https://github.com/rust-lang/rust/pull/43728
3073 [43838]: https://github.com/rust-lang/rust/pull/43838
3074 [43863]: https://github.com/rust-lang/rust/pull/43863
3075 [43880]: https://github.com/rust-lang/rust/pull/43880
3076 [43911]: https://github.com/rust-lang/rust/pull/43911
3077 [43916]: https://github.com/rust-lang/rust/pull/43916
3078 [43917]: https://github.com/rust-lang/rust/pull/43917
3079 [44204]: https://github.com/rust-lang/rust/pull/44204
3080 [cargo/4123]: https://github.com/rust-lang/cargo/pull/4123
3081 [cargo/4216]: https://github.com/rust-lang/cargo/pull/4216
3082 [cargo/4270]: https://github.com/rust-lang/cargo/pull/4270
3083 [cargo/4335]: https://github.com/rust-lang/cargo/pull/4335
3084 [cargo/4364]: https://github.com/rust-lang/cargo/pull/4364
3085 [cargo/4400]: https://github.com/rust-lang/cargo/pull/4400
3086 [RFC 1969]: https://github.com/rust-lang/rfcs/pull/1969
3087 [info/43880]: https://github.com/rust-lang/rust/issues/44224#issuecomment-330058902
3088 [`std::mem::discriminant`]: https://doc.rust-lang.org/std/mem/fn.discriminant.html
3089
3090 Version 1.20.0 (2017-08-31)
3091 ===========================
3092
3093 Language
3094 --------
3095 - [Associated constants are now stabilised.][42809]
3096 - [A lot of macro bugs are now fixed.][42913]
3097
3098 Compiler
3099 --------
3100
3101 - [Struct fields are now properly coerced to the expected field type.][42807]
3102 - [Enabled wasm LLVM backend][42571] WASM can now be built with the
3103   `wasm32-experimental-emscripten` target.
3104 - [Changed some of the error messages to be more helpful.][42033]
3105 - [Add support for RELRO(RELocation Read-Only) for platforms that support
3106   it.][43170]
3107 - [rustc now reports the total number of errors on compilation failure][43015]
3108   previously this was only the number of errors in the pass that failed.
3109 - [Expansion in rustc has been sped up 29x.][42533]
3110 - [added `msp430-none-elf` target.][43099]
3111 - [rustc will now suggest one-argument enum variant to fix type mismatch when
3112   applicable][43178]
3113 - [Fixes backtraces on Redox][43228]
3114 - [rustc now identifies different versions of same crate when absolute paths of
3115   different types match in an error message.][42826]
3116
3117 Libraries
3118 ---------
3119
3120
3121 - [Relaxed Debug constraints on `{HashMap,BTreeMap}::{Keys,Values}`.][42854]
3122 - [Impl `PartialEq`, `Eq`, `PartialOrd`, `Ord`, `Debug`, `Hash` for unsized
3123   tuples.][43011]
3124 - [Impl `fmt::{Display, Debug}` for `Ref`, `RefMut`, `MutexGuard`,
3125   `RwLockReadGuard`, `RwLockWriteGuard`][42822]
3126 - [Impl `Clone` for `DefaultHasher`.][42799]
3127 - [Impl `Sync` for `SyncSender`.][42397]
3128 - [Impl `FromStr` for `char`][42271]
3129 - [Fixed how `{f32, f64}::{is_sign_negative, is_sign_positive}` handles
3130   NaN.][42431]
3131 - [allow messages in the `unimplemented!()` macro.][42155]
3132   ie. `unimplemented!("Waiting for 1.21 to be stable")`
3133 - [`pub(restricted)` is now supported in the `thread_local!` macro.][43185]
3134 - [Upgrade to Unicode 10.0.0][42999]
3135 - [Reimplemented `{f32, f64}::{min, max}` in Rust instead of using CMath.][42430]
3136 - [Skip the main thread's manual stack guard on Linux][43072]
3137 - [Iterator::nth for `ops::{Range, RangeFrom}` is now done in O(1) time][43077]
3138 - [`#[repr(align(N))]` attribute max number is now 2^31 - 1.][43097] This was
3139   previously 2^15.
3140 - [`{OsStr, Path}::Display` now avoids allocations where possible][42613]
3141
3142 Stabilized APIs
3143 ---------------
3144
3145 - [`CStr::into_c_string`]
3146 - [`CString::as_c_str`]
3147 - [`CString::into_boxed_c_str`]
3148 - [`Chain::get_mut`]
3149 - [`Chain::get_ref`]
3150 - [`Chain::into_inner`]
3151 - [`Option::get_or_insert_with`]
3152 - [`Option::get_or_insert`]
3153 - [`OsStr::into_os_string`]
3154 - [`OsString::into_boxed_os_str`]
3155 - [`Take::get_mut`]
3156 - [`Take::get_ref`]
3157 - [`Utf8Error::error_len`]
3158 - [`char::EscapeDebug`]
3159 - [`char::escape_debug`]
3160 - [`compile_error!`]
3161 - [`f32::from_bits`]
3162 - [`f32::to_bits`]
3163 - [`f64::from_bits`]
3164 - [`f64::to_bits`]
3165 - [`mem::ManuallyDrop`]
3166 - [`slice::sort_unstable_by_key`]
3167 - [`slice::sort_unstable_by`]
3168 - [`slice::sort_unstable`]
3169 - [`str::from_boxed_utf8_unchecked`]
3170 - [`str::as_bytes_mut`]
3171 - [`str::as_bytes_mut`]
3172 - [`str::from_utf8_mut`]
3173 - [`str::from_utf8_unchecked_mut`]
3174 - [`str::get_mut`]
3175 - [`str::get_unchecked_mut`]
3176 - [`str::get_unchecked`]
3177 - [`str::get`]
3178 - [`str::into_boxed_bytes`]
3179
3180
3181 Cargo
3182 -----
3183 - [Cargo API token location moved from `~/.cargo/config` to
3184   `~/.cargo/credentials`.][cargo/3978]
3185 - [Cargo will now build `main.rs` binaries that are in sub-directories of
3186   `src/bin`.][cargo/4214] ie. Having `src/bin/server/main.rs` and
3187   `src/bin/client/main.rs` generates `target/debug/server` and `target/debug/client`
3188 - [You can now specify version of a binary when installed through
3189   `cargo install` using `--vers`.][cargo/4229]
3190 - [Added `--no-fail-fast` flag to cargo to run all benchmarks regardless of
3191   failure.][cargo/4248]
3192 - [Changed the convention around which file is the crate root.][cargo/4259]
3193 - [The `include`/`exclude` property in `Cargo.toml` now accepts gitignore paths
3194   instead of glob patterns][cargo/4270]. Glob patterns are now deprecated.
3195
3196 Compatibility Notes
3197 -------------------
3198
3199 - [Functions with `'static` in their return types will now not be as usable as
3200   if they were using lifetime parameters instead.][42417]
3201 - [The reimplementation of `{f32, f64}::is_sign_{negative, positive}` now
3202   takes the sign of NaN into account where previously didn't.][42430]
3203
3204 [42033]: https://github.com/rust-lang/rust/pull/42033
3205 [42155]: https://github.com/rust-lang/rust/pull/42155
3206 [42271]: https://github.com/rust-lang/rust/pull/42271
3207 [42397]: https://github.com/rust-lang/rust/pull/42397
3208 [42417]: https://github.com/rust-lang/rust/pull/42417
3209 [42430]: https://github.com/rust-lang/rust/pull/42430
3210 [42431]: https://github.com/rust-lang/rust/pull/42431
3211 [42533]: https://github.com/rust-lang/rust/pull/42533
3212 [42571]: https://github.com/rust-lang/rust/pull/42571
3213 [42613]: https://github.com/rust-lang/rust/pull/42613
3214 [42799]: https://github.com/rust-lang/rust/pull/42799
3215 [42807]: https://github.com/rust-lang/rust/pull/42807
3216 [42809]: https://github.com/rust-lang/rust/pull/42809
3217 [42822]: https://github.com/rust-lang/rust/pull/42822
3218 [42826]: https://github.com/rust-lang/rust/pull/42826
3219 [42854]: https://github.com/rust-lang/rust/pull/42854
3220 [42913]: https://github.com/rust-lang/rust/pull/42913
3221 [42999]: https://github.com/rust-lang/rust/pull/42999
3222 [43011]: https://github.com/rust-lang/rust/pull/43011
3223 [43015]: https://github.com/rust-lang/rust/pull/43015
3224 [43072]: https://github.com/rust-lang/rust/pull/43072
3225 [43077]: https://github.com/rust-lang/rust/pull/43077
3226 [43097]: https://github.com/rust-lang/rust/pull/43097
3227 [43099]: https://github.com/rust-lang/rust/pull/43099
3228 [43170]: https://github.com/rust-lang/rust/pull/43170
3229 [43178]: https://github.com/rust-lang/rust/pull/43178
3230 [43185]: https://github.com/rust-lang/rust/pull/43185
3231 [43228]: https://github.com/rust-lang/rust/pull/43228
3232 [cargo/3978]: https://github.com/rust-lang/cargo/pull/3978
3233 [cargo/4214]: https://github.com/rust-lang/cargo/pull/4214
3234 [cargo/4229]: https://github.com/rust-lang/cargo/pull/4229
3235 [cargo/4248]: https://github.com/rust-lang/cargo/pull/4248
3236 [cargo/4259]: https://github.com/rust-lang/cargo/pull/4259
3237 [cargo/4270]: https://github.com/rust-lang/cargo/pull/4270
3238 [`CStr::into_c_string`]: https://doc.rust-lang.org/std/ffi/struct.CStr.html#method.into_c_string
3239 [`CString::as_c_str`]: https://doc.rust-lang.org/std/ffi/struct.CString.html#method.as_c_str
3240 [`CString::into_boxed_c_str`]: https://doc.rust-lang.org/std/ffi/struct.CString.html#method.into_boxed_c_str
3241 [`Chain::get_mut`]: https://doc.rust-lang.org/std/io/struct.Chain.html#method.get_mut
3242 [`Chain::get_ref`]: https://doc.rust-lang.org/std/io/struct.Chain.html#method.get_ref
3243 [`Chain::into_inner`]: https://doc.rust-lang.org/std/io/struct.Chain.html#method.into_inner
3244 [`Option::get_or_insert_with`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.get_or_insert_with
3245 [`Option::get_or_insert`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.get_or_insert
3246 [`OsStr::into_os_string`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html#method.into_os_string
3247 [`OsString::into_boxed_os_str`]: https://doc.rust-lang.org/std/ffi/struct.OsString.html#method.into_boxed_os_str
3248 [`Take::get_mut`]: https://doc.rust-lang.org/std/io/struct.Take.html#method.get_mut
3249 [`Take::get_ref`]: https://doc.rust-lang.org/std/io/struct.Take.html#method.get_ref
3250 [`Utf8Error::error_len`]: https://doc.rust-lang.org/std/str/struct.Utf8Error.html#method.error_len
3251 [`char::EscapeDebug`]: https://doc.rust-lang.org/std/char/struct.EscapeDebug.html
3252 [`char::escape_debug`]: https://doc.rust-lang.org/std/primitive.char.html#method.escape_debug
3253 [`compile_error!`]: https://doc.rust-lang.org/std/macro.compile_error.html
3254 [`f32::from_bits`]: https://doc.rust-lang.org/std/primitive.f32.html#method.from_bits
3255 [`f32::to_bits`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_bits
3256 [`f64::from_bits`]: https://doc.rust-lang.org/std/primitive.f64.html#method.from_bits
3257 [`f64::to_bits`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_bits
3258 [`mem::ManuallyDrop`]: https://doc.rust-lang.org/std/mem/union.ManuallyDrop.html
3259 [`slice::sort_unstable_by_key`]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_unstable_by_key
3260 [`slice::sort_unstable_by`]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_unstable_by
3261 [`slice::sort_unstable`]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_unstable
3262 [`str::from_boxed_utf8_unchecked`]: https://doc.rust-lang.org/std/str/fn.from_boxed_utf8_unchecked.html
3263 [`str::as_bytes_mut`]: https://doc.rust-lang.org/std/primitive.str.html#method.as_bytes_mut
3264 [`str::from_utf8_mut`]: https://doc.rust-lang.org/std/str/fn.from_utf8_mut.html
3265 [`str::from_utf8_unchecked_mut`]: https://doc.rust-lang.org/std/str/fn.from_utf8_unchecked_mut.html
3266 [`str::get_mut`]: https://doc.rust-lang.org/std/primitive.str.html#method.get_mut
3267 [`str::get_unchecked_mut`]: https://doc.rust-lang.org/std/primitive.str.html#method.get_unchecked_mut
3268 [`str::get_unchecked`]: https://doc.rust-lang.org/std/primitive.str.html#method.get_unchecked
3269 [`str::get`]: https://doc.rust-lang.org/std/primitive.str.html#method.get
3270 [`str::into_boxed_bytes`]: https://doc.rust-lang.org/std/primitive.str.html#method.into_boxed_bytes
3271
3272
3273 Version 1.19.0 (2017-07-20)
3274 ===========================
3275
3276 Language
3277 --------
3278
3279 - [Numeric fields can now be used for creating tuple structs.][41145] [RFC 1506]
3280   For example `struct Point(u32, u32); let x = Point { 0: 7, 1: 0 };`.
3281 - [Macro recursion limit increased to 1024 from 64.][41676]
3282 - [Added lint for detecting unused macros.][41907]
3283 - [`loop` can now return a value with `break`.][42016] [RFC 1624]
3284   For example: `let x = loop { break 7; };`
3285 - [C compatible `union`s are now available.][42068] [RFC 1444] They can only
3286   contain `Copy` types and cannot have a `Drop` implementation.
3287   Example: `union Foo { bar: u8, baz: usize }`
3288 - [Non capturing closures can now be coerced into `fn`s,][42162] [RFC 1558]
3289   Example: `let foo: fn(u8) -> u8 = |v: u8| { v };`
3290
3291 Compiler
3292 --------
3293
3294 - [Add support for bootstrapping the Rust compiler toolchain on Android.][41370]
3295 - [Change `arm-linux-androideabi` to correspond to the `armeabi`
3296   official ABI.][41656] If you wish to continue targeting the `armeabi-v7a` ABI
3297   you should use `--target armv7-linux-androideabi`.
3298 - [Fixed ICE when removing a source file between compilation sessions.][41873]
3299 - [Minor optimisation of string operations.][42037]
3300 - [Compiler error message is now `aborting due to previous error(s)` instead of
3301   `aborting due to N previous errors`][42150] This was previously inaccurate and
3302   would only count certain kinds of errors.
3303 - [The compiler now supports Visual Studio 2017][42225]
3304 - [The compiler is now built against LLVM 4.0.1 by default][42948]
3305 - [Added a lot][42264] of [new error codes][42302]
3306 - [Added `target-feature=+crt-static` option][37406] [RFC 1721] Which allows
3307   libraries with C Run-time Libraries(CRT) to be statically linked.
3308 - [Fixed various ARM codegen bugs][42740]
3309
3310 Libraries
3311 ---------
3312
3313 - [`String` now implements `FromIterator<Cow<'a, str>>` and
3314   `Extend<Cow<'a, str>>`][41449]
3315 - [`Vec` now implements `From<&mut [T]>`][41530]
3316 - [`Box<[u8]>` now implements `From<Box<str>>`][41258]
3317 - [`SplitWhitespace` now implements `Clone`][41659]
3318 - [`[u8]::reverse` is now 5x faster and `[u16]::reverse` is now
3319   1.5x faster][41764]
3320 - [`eprint!` and `eprintln!` macros added to prelude.][41192] Same as the `print!`
3321   macros, but for printing to stderr.
3322
3323 Stabilized APIs
3324 ---------------
3325
3326 - [`OsString::shrink_to_fit`]
3327 - [`cmp::Reverse`]
3328 - [`Command::envs`]
3329 - [`thread::ThreadId`]
3330
3331 Cargo
3332 -----
3333
3334 - [Build scripts can now add environment variables to the environment
3335   the crate is being compiled in.
3336   Example: `println!("cargo:rustc-env=FOO=bar");`][cargo/3929]
3337 - [Subcommands now replace the current process rather than spawning a new
3338   child process][cargo/3970]
3339 - [Workspace members can now accept glob file patterns][cargo/3979]
3340 - [Added `--all` flag to the `cargo bench` subcommand to run benchmarks of all
3341   the members in a given workspace.][cargo/3988]
3342 - [Updated `libssh2-sys` to 0.2.6][cargo/4008]
3343 - [Target directory path is now in the cargo metadata][cargo/4022]
3344 - [Cargo no longer checks out a local working directory for the
3345   crates.io index][cargo/4026] This should provide smaller file size for the
3346   registry, and improve cloning times, especially on Windows machines.
3347 - [Added an `--exclude` option for excluding certain packages when using the
3348   `--all` option][cargo/4031]
3349 - [Cargo will now automatically retry when receiving a 5xx error
3350   from crates.io][cargo/4032]
3351 - [The `--features` option now accepts multiple comma or space
3352   delimited values.][cargo/4084]
3353 - [Added support for custom target specific runners][cargo/3954]
3354
3355 Misc
3356 ----
3357
3358 - [Added `rust-windbg.cmd`][39983] for loading rust `.natvis` files in the
3359   Windows Debugger.
3360 - [Rust will now release XZ compressed packages][rust-installer/57]
3361 - [rustup will now prefer to download rust packages with
3362   XZ compression][rustup/1100] over GZip packages.
3363 - [Added the ability to escape `#` in rust documentation][41785] By adding
3364   additional `#`'s ie. `##` is now `#`
3365
3366 Compatibility Notes
3367 -------------------
3368
3369 - [`MutexGuard<T>` may only be `Sync` if `T` is `Sync`.][41624]
3370 - [`-Z` flags are now no longer allowed to be used on the stable
3371   compiler.][41751] This has been a warning for a year previous to this.
3372 - [As a result of the `-Z` flag change, the `cargo-check` plugin no
3373   longer works][42844]. Users should migrate to the built-in `check`
3374   command, which has been available since 1.16.
3375 - [Ending a float literal with `._` is now a hard error.
3376   Example: `42._` .][41946]
3377 - [Any use of a private `extern crate` outside of its module is now a
3378   hard error.][36886] This was previously a warning.
3379 - [`use ::self::foo;` is now a hard error.][36888] `self` paths are always
3380   relative while the `::` prefix makes a path absolute, but was ignored and the
3381   path was relative regardless.
3382 - [Floating point constants in match patterns is now a hard error][36890]
3383   This was previously a warning.
3384 - [Struct or enum constants that don't derive `PartialEq` & `Eq` used
3385   match patterns is now a hard error][36891] This was previously a warning.
3386 - [Lifetimes named `'_` are no longer allowed.][36892] This was previously
3387   a warning.
3388 - [From the pound escape, lines consisting of multiple `#`s are
3389   now visible][41785]
3390 - [It is an error to re-export private enum variants][42460]. This is
3391   known to break a number of crates that depend on an older version of
3392   mustache.
3393 - [On Windows, if `VCINSTALLDIR` is set incorrectly, `rustc` will try
3394   to use it to find the linker, and the build will fail where it did
3395   not previously][42607]
3396
3397 [36886]: https://github.com/rust-lang/rust/issues/36886
3398 [36888]: https://github.com/rust-lang/rust/issues/36888
3399 [36890]: https://github.com/rust-lang/rust/issues/36890
3400 [36891]: https://github.com/rust-lang/rust/issues/36891
3401 [36892]: https://github.com/rust-lang/rust/issues/36892
3402 [37406]: https://github.com/rust-lang/rust/issues/37406
3403 [39983]: https://github.com/rust-lang/rust/pull/39983
3404 [41145]: https://github.com/rust-lang/rust/pull/41145
3405 [41192]: https://github.com/rust-lang/rust/pull/41192
3406 [41258]: https://github.com/rust-lang/rust/pull/41258
3407 [41370]: https://github.com/rust-lang/rust/pull/41370
3408 [41449]: https://github.com/rust-lang/rust/pull/41449
3409 [41530]: https://github.com/rust-lang/rust/pull/41530
3410 [41624]: https://github.com/rust-lang/rust/pull/41624
3411 [41656]: https://github.com/rust-lang/rust/pull/41656
3412 [41659]: https://github.com/rust-lang/rust/pull/41659
3413 [41676]: https://github.com/rust-lang/rust/pull/41676
3414 [41751]: https://github.com/rust-lang/rust/pull/41751
3415 [41764]: https://github.com/rust-lang/rust/pull/41764
3416 [41785]: https://github.com/rust-lang/rust/pull/41785
3417 [41873]: https://github.com/rust-lang/rust/pull/41873
3418 [41907]: https://github.com/rust-lang/rust/pull/41907
3419 [41946]: https://github.com/rust-lang/rust/pull/41946
3420 [42016]: https://github.com/rust-lang/rust/pull/42016
3421 [42037]: https://github.com/rust-lang/rust/pull/42037
3422 [42068]: https://github.com/rust-lang/rust/pull/42068
3423 [42150]: https://github.com/rust-lang/rust/pull/42150
3424 [42162]: https://github.com/rust-lang/rust/pull/42162
3425 [42225]: https://github.com/rust-lang/rust/pull/42225
3426 [42264]: https://github.com/rust-lang/rust/pull/42264
3427 [42302]: https://github.com/rust-lang/rust/pull/42302
3428 [42460]: https://github.com/rust-lang/rust/issues/42460
3429 [42607]: https://github.com/rust-lang/rust/issues/42607
3430 [42740]: https://github.com/rust-lang/rust/pull/42740
3431 [42844]: https://github.com/rust-lang/rust/issues/42844
3432 [42948]: https://github.com/rust-lang/rust/pull/42948
3433 [RFC 1444]: https://github.com/rust-lang/rfcs/pull/1444
3434 [RFC 1506]: https://github.com/rust-lang/rfcs/pull/1506
3435 [RFC 1558]: https://github.com/rust-lang/rfcs/pull/1558
3436 [RFC 1624]: https://github.com/rust-lang/rfcs/pull/1624
3437 [RFC 1721]: https://github.com/rust-lang/rfcs/pull/1721
3438 [`Command::envs`]: https://doc.rust-lang.org/std/process/struct.Command.html#method.envs
3439 [`OsString::shrink_to_fit`]: https://doc.rust-lang.org/std/ffi/struct.OsString.html#method.shrink_to_fit
3440 [`cmp::Reverse`]: https://doc.rust-lang.org/std/cmp/struct.Reverse.html
3441 [`thread::ThreadId`]: https://doc.rust-lang.org/std/thread/struct.ThreadId.html
3442 [cargo/3929]: https://github.com/rust-lang/cargo/pull/3929
3443 [cargo/3954]: https://github.com/rust-lang/cargo/pull/3954
3444 [cargo/3970]: https://github.com/rust-lang/cargo/pull/3970
3445 [cargo/3979]: https://github.com/rust-lang/cargo/pull/3979
3446 [cargo/3988]: https://github.com/rust-lang/cargo/pull/3988
3447 [cargo/4008]: https://github.com/rust-lang/cargo/pull/4008
3448 [cargo/4022]: https://github.com/rust-lang/cargo/pull/4022
3449 [cargo/4026]: https://github.com/rust-lang/cargo/pull/4026
3450 [cargo/4031]: https://github.com/rust-lang/cargo/pull/4031
3451 [cargo/4032]: https://github.com/rust-lang/cargo/pull/4032
3452 [cargo/4084]: https://github.com/rust-lang/cargo/pull/4084
3453 [rust-installer/57]: https://github.com/rust-lang/rust-installer/pull/57
3454 [rustup/1100]: https://github.com/rust-lang-nursery/rustup.rs/pull/1100
3455
3456
3457 Version 1.18.0 (2017-06-08)
3458 ===========================
3459
3460 Language
3461 --------
3462
3463 - [Stabilize pub(restricted)][40556] `pub` can now accept a module path to
3464   make the item visible to just that module tree. Also accepts the keyword
3465   `crate` to make something public to the whole crate but not users of the
3466   library. Example: `pub(crate) mod utils;`. [RFC 1422].
3467 - [Stabilize `#![windows_subsystem]` attribute][40870] conservative exposure of the
3468   `/SUBSYSTEM` linker flag on Windows platforms. [RFC 1665].
3469 - [Refactor of trait object type parsing][40043] Now `ty` in macros can accept
3470   types like `Write + Send`, trailing `+` are now supported in trait objects,
3471   and better error reporting for trait objects starting with `?Sized`.
3472 - [0e+10 is now a valid floating point literal][40589]
3473 - [Now warns if you bind a lifetime parameter to 'static][40734]
3474 - [Tuples, Enum variant fields, and structs with no `repr` attribute or with
3475   `#[repr(Rust)]` are reordered to minimize padding and produce a smaller
3476   representation in some cases.][40377]
3477
3478 Compiler
3479 --------
3480
3481 - [rustc can now emit mir with `--emit mir`][39891]
3482 - [Improved LLVM IR for trivial functions][40367]
3483 - [Added explanation for E0090(Wrong number of lifetimes are supplied)][40723]
3484 - [rustc compilation is now 15%-20% faster][41469] Thanks to optimisation
3485   opportunities found through profiling
3486 - [Improved backtrace formatting when panicking][38165]
3487
3488 Libraries
3489 ---------
3490
3491 - [Specialized `Vec::from_iter` being passed `vec::IntoIter`][40731] if the
3492   iterator hasn't been advanced the original `Vec` is reassembled with no actual
3493   iteration or reallocation.
3494 - [Simplified HashMap Bucket interface][40561] provides performance
3495   improvements for iterating and cloning.
3496 - [Specialize Vec::from_elem to use calloc][40409]
3497 - [Fixed Race condition in fs::create_dir_all][39799]
3498 - [No longer caching stdio on Windows][40516]
3499 - [Optimized insertion sort in slice][40807] insertion sort in some cases
3500   2.50%~ faster and in one case now 12.50% faster.
3501 - [Optimized `AtomicBool::fetch_nand`][41143]
3502
3503 Stabilized APIs
3504 ---------------
3505
3506 - [`Child::try_wait`]
3507 - [`HashMap::retain`]
3508 - [`HashSet::retain`]
3509 - [`PeekMut::pop`]
3510 - [`TcpStream::peek`]
3511 - [`UdpSocket::peek`]
3512 - [`UdpSocket::peek_from`]
3513
3514 Cargo
3515 -----
3516
3517 - [Added partial Pijul support][cargo/3842] Pijul is a version control system in Rust.
3518   You can now create new cargo projects with Pijul using `cargo new --vcs pijul`
3519 - [Now always emits build script warnings for crates that fail to build][cargo/3847]
3520 - [Added Android build support][cargo/3885]
3521 - [Added `--bins` and `--tests` flags][cargo/3901] now you can build all programs
3522   of a certain type, for example `cargo build --bins` will build all
3523   binaries.
3524 - [Added support for haiku][cargo/3952]
3525
3526 Misc
3527 ----
3528
3529 - [rustdoc can now use pulldown-cmark with the `--enable-commonmark` flag][40338]
3530 - [Added rust-windbg script for better debugging on Windows][39983]
3531 - [Rust now uses the official cross compiler for NetBSD][40612]
3532 - [rustdoc now accepts `#` at the start of files][40828]
3533 - [Fixed jemalloc support for musl][41168]
3534
3535 Compatibility Notes
3536 -------------------
3537
3538 - [Changes to how the `0` flag works in format!][40241] Padding zeroes are now
3539   always placed after the sign if it exists and before the digits. With the `#`
3540   flag the zeroes are placed after the prefix and before the digits.
3541 - [Due to the struct field optimisation][40377], using `transmute` on structs
3542   that have no `repr` attribute or `#[repr(Rust)]` will no longer work. This has
3543   always been undefined behavior, but is now more likely to break in practice.
3544 - [The refactor of trait object type parsing][40043] fixed a bug where `+` was
3545   receiving the wrong priority parsing things like `&for<'a> Tr<'a> + Send` as
3546   `&(for<'a> Tr<'a> + Send)` instead of `(&for<'a> Tr<'a>) + Send`
3547 - [Overlapping inherent `impl`s are now a hard error][40728]
3548 - [`PartialOrd` and `Ord` must agree on the ordering.][41270]
3549 - [`rustc main.rs -o out --emit=asm,llvm-ir`][41085] Now will output
3550   `out.asm` and `out.ll` instead of only one of the filetypes.
3551 - [ calling a function that returns `Self` will no longer work][41805] when
3552   the size of `Self` cannot be statically determined.
3553 - [rustc now builds with a "pthreads" flavour of MinGW for Windows GNU][40805]
3554   this has caused a few regressions namely:
3555
3556   - Changed the link order of local static/dynamic libraries (respecting the
3557     order on given rather than having the compiler reorder).
3558   - Changed how MinGW is linked, native code linked to dynamic libraries
3559     may require manually linking to the gcc support library (for the native
3560     code itself)
3561
3562 [38165]: https://github.com/rust-lang/rust/pull/38165
3563 [39799]: https://github.com/rust-lang/rust/pull/39799
3564 [39891]: https://github.com/rust-lang/rust/pull/39891
3565 [39983]: https://github.com/rust-lang/rust/pull/39983
3566 [40043]: https://github.com/rust-lang/rust/pull/40043
3567 [40241]: https://github.com/rust-lang/rust/pull/40241
3568 [40338]: https://github.com/rust-lang/rust/pull/40338
3569 [40367]: https://github.com/rust-lang/rust/pull/40367
3570 [40377]: https://github.com/rust-lang/rust/pull/40377
3571 [40409]: https://github.com/rust-lang/rust/pull/40409
3572 [40516]: https://github.com/rust-lang/rust/pull/40516
3573 [40556]: https://github.com/rust-lang/rust/pull/40556
3574 [40561]: https://github.com/rust-lang/rust/pull/40561
3575 [40589]: https://github.com/rust-lang/rust/pull/40589
3576 [40612]: https://github.com/rust-lang/rust/pull/40612
3577 [40723]: https://github.com/rust-lang/rust/pull/40723
3578 [40728]: https://github.com/rust-lang/rust/pull/40728
3579 [40731]: https://github.com/rust-lang/rust/pull/40731
3580 [40734]: https://github.com/rust-lang/rust/pull/40734
3581 [40805]: https://github.com/rust-lang/rust/pull/40805
3582 [40807]: https://github.com/rust-lang/rust/pull/40807
3583 [40828]: https://github.com/rust-lang/rust/pull/40828
3584 [40870]: https://github.com/rust-lang/rust/pull/40870
3585 [41085]: https://github.com/rust-lang/rust/pull/41085
3586 [41143]: https://github.com/rust-lang/rust/pull/41143
3587 [41168]: https://github.com/rust-lang/rust/pull/41168
3588 [41270]: https://github.com/rust-lang/rust/issues/41270
3589 [41469]: https://github.com/rust-lang/rust/pull/41469
3590 [41805]: https://github.com/rust-lang/rust/issues/41805
3591 [RFC 1422]: https://github.com/rust-lang/rfcs/blob/master/text/1422-pub-restricted.md
3592 [RFC 1665]: https://github.com/rust-lang/rfcs/blob/master/text/1665-windows-subsystem.md
3593 [`Child::try_wait`]: https://doc.rust-lang.org/std/process/struct.Child.html#method.try_wait
3594 [`HashMap::retain`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.retain
3595 [`HashSet::retain`]: https://doc.rust-lang.org/std/collections/struct.HashSet.html#method.retain
3596 [`PeekMut::pop`]: https://doc.rust-lang.org/std/collections/binary_heap/struct.PeekMut.html#method.pop
3597 [`TcpStream::peek`]: https://doc.rust-lang.org/std/net/struct.TcpStream.html#method.peek
3598 [`UdpSocket::peek_from`]: https://doc.rust-lang.org/std/net/struct.UdpSocket.html#method.peek_from
3599 [`UdpSocket::peek`]: https://doc.rust-lang.org/std/net/struct.UdpSocket.html#method.peek
3600 [cargo/3842]: https://github.com/rust-lang/cargo/pull/3842
3601 [cargo/3847]: https://github.com/rust-lang/cargo/pull/3847
3602 [cargo/3885]: https://github.com/rust-lang/cargo/pull/3885
3603 [cargo/3901]: https://github.com/rust-lang/cargo/pull/3901
3604 [cargo/3952]: https://github.com/rust-lang/cargo/pull/3952
3605
3606
3607 Version 1.17.0 (2017-04-27)
3608 ===========================
3609
3610 Language
3611 --------
3612
3613 * [The lifetime of statics and consts defaults to `'static`][39265]. [RFC 1623]
3614 * [Fields of structs may be initialized without duplicating the field/variable
3615   names][39761]. [RFC 1682]
3616 * [`Self` may be included in the `where` clause of `impls`][38864]. [RFC 1647]
3617 * [When coercing to an unsized type lifetimes must be equal][40319]. That is,
3618   there is no subtyping between `T` and `U` when `T: Unsize<U>`. For example,
3619   coercing `&mut [&'a X; N]` to `&mut [&'b X]` requires `'a` be equal to
3620   `'b`. Soundness fix.
3621 * [Values passed to the indexing operator, `[]`, automatically coerce][40166]
3622 * [Static variables may contain references to other statics][40027]
3623
3624 Compiler
3625 --------
3626
3627 * [Exit quickly on only `--emit dep-info`][40336]
3628 * [Make `-C relocation-model` more correctly determine whether the linker
3629   creates a position-independent executable][40245]
3630 * [Add `-C overflow-checks` to directly control whether integer overflow
3631   panics][40037]
3632 * [The rustc type checker now checks items on demand instead of in a single
3633   in-order pass][40008]. This is mostly an internal refactoring in support of
3634   future work, including incremental type checking, but also resolves [RFC
3635   1647], allowing `Self` to appear in `impl` `where` clauses.
3636 * [Optimize vtable loads][39995]
3637 * [Turn off vectorization for Emscripten targets][39990]
3638 * [Provide suggestions for unknown macros imported with `use`][39953]
3639 * [Fix ICEs in path resolution][39939]
3640 * [Strip exception handling code on Emscripten when `panic=abort`][39193]
3641 * [Add clearer error message using `&str + &str`][39116]
3642
3643 Stabilized APIs
3644 ---------------
3645
3646 * [`Arc::into_raw`]
3647 * [`Arc::from_raw`]
3648 * [`Arc::ptr_eq`]
3649 * [`Rc::into_raw`]
3650 * [`Rc::from_raw`]
3651 * [`Rc::ptr_eq`]
3652 * [`Ordering::then`]
3653 * [`Ordering::then_with`]
3654 * [`BTreeMap::range`]
3655 * [`BTreeMap::range_mut`]
3656 * [`collections::Bound`]
3657 * [`process::abort`]
3658 * [`ptr::read_unaligned`]
3659 * [`ptr::write_unaligned`]
3660 * [`Result::expect_err`]
3661 * [`Cell::swap`]
3662 * [`Cell::replace`]
3663 * [`Cell::into_inner`]
3664 * [`Cell::take`]
3665
3666 Libraries
3667 ---------
3668
3669 * [`BTreeMap` and `BTreeSet` can iterate over ranges][27787]
3670 * [`Cell` can store non-`Copy` types][39793]. [RFC 1651]
3671 * [`String` implements `FromIterator<&char>`][40028]
3672 * `Box` [implements][40009] a number of new conversions:
3673   `From<Box<str>> for String`,
3674   `From<Box<[T]>> for Vec<T>`,
3675   `From<Box<CStr>> for CString`,
3676   `From<Box<OsStr>> for OsString`,
3677   `From<Box<Path>> for PathBuf`,
3678   `Into<Box<str>> for String`,
3679   `Into<Box<[T]>> for Vec<T>`,
3680   `Into<Box<CStr>> for CString`,
3681   `Into<Box<OsStr>> for OsString`,
3682   `Into<Box<Path>> for PathBuf`,
3683   `Default for Box<str>`,
3684   `Default for Box<CStr>`,
3685   `Default for Box<OsStr>`,
3686   `From<&CStr> for Box<CStr>`,
3687   `From<&OsStr> for Box<OsStr>`,
3688   `From<&Path> for Box<Path>`
3689 * [`ffi::FromBytesWithNulError` implements `Error` and `Display`][39960]
3690 * [Specialize `PartialOrd<A> for [A] where A: Ord`][39642]
3691 * [Slightly optimize `slice::sort`][39538]
3692 * [Add `ToString` trait specialization for `Cow<'a, str>` and `String`][39440]
3693 * [`Box<[T]>` implements `From<&[T]> where T: Copy`,
3694   `Box<str>` implements `From<&str>`][39438]
3695 * [`IpAddr` implements `From` for various arrays. `SocketAddr` implements
3696   `From<(I, u16)> where I: Into<IpAddr>`][39372]
3697 * [`format!` estimates the needed capacity before writing a string][39356]
3698 * [Support unprivileged symlink creation in Windows][38921]
3699 * [`PathBuf` implements `Default`][38764]
3700 * [Implement `PartialEq<[A]>` for `VecDeque<A>`][38661]
3701 * [`HashMap` resizes adaptively][38368] to guard against DOS attacks
3702   and poor hash functions.
3703
3704 Cargo
3705 -----
3706
3707 * [Add `cargo check --all`][cargo/3731]
3708 * [Add an option to ignore SSL revocation checking][cargo/3699]
3709 * [Add `cargo run --package`][cargo/3691]
3710 * [Add `required_features`][cargo/3667]
3711 * [Assume `build.rs` is a build script][cargo/3664]
3712 * [Find workspace via `workspace_root` link in containing member][cargo/3562]
3713
3714 Misc
3715 ----
3716
3717 * [Documentation is rendered with mdbook instead of the obsolete, in-tree
3718   `rustbook`][39633]
3719 * [The "Unstable Book" documents nightly-only features][ubook]
3720 * [Improve the style of the sidebar in rustdoc output][40265]
3721 * [Configure build correctly on 64-bit CPU's with the armhf ABI][40261]
3722 * [Fix MSP430 breakage due to `i128`][40257]
3723 * [Preliminary Solaris/SPARCv9 support][39903]
3724 * [`rustc` is linked statically on Windows MSVC targets][39837], allowing it to
3725   run without installing the MSVC runtime.
3726 * [`rustdoc --test` includes file names in test names][39788]
3727 * This release includes builds of `std` for `sparc64-unknown-linux-gnu`,
3728   `aarch64-unknown-linux-fuchsia`, and `x86_64-unknown-linux-fuchsia`.
3729 * [Initial support for `aarch64-unknown-freebsd`][39491]
3730 * [Initial support for `i686-unknown-netbsd`][39426]
3731 * [This release no longer includes the old makefile build system][39431]. Rust
3732   is built with a custom build system, written in Rust, and with Cargo.
3733 * [Add Debug implementations for libcollection structs][39002]
3734 * [`TypeId` implements `PartialOrd` and `Ord`][38981]
3735 * [`--test-threads=0` produces an error][38945]
3736 * [`rustup` installs documentation by default][40526]
3737 * [The Rust source includes NatVis visualizations][39843]. These can be used by
3738   WinDbg and Visual Studio to improve the debugging experience.
3739
3740 Compatibility Notes
3741 -------------------
3742
3743 * [Rust 1.17 does not correctly detect the MSVC 2017 linker][38584]. As a
3744   workaround, either use MSVC 2015 or run vcvars.bat.
3745 * [When coercing to an unsized type lifetimes must be equal][40319]. That is,
3746   disallow subtyping between `T` and `U` when `T: Unsize<U>`, e.g. coercing
3747   `&mut [&'a X; N]` to `&mut [&'b X]` requires `'a` be equal to `'b`. Soundness
3748   fix.
3749 * [`format!` and `Display::to_string` panic if an underlying formatting
3750   implementation returns an error][40117]. Previously the error was silently
3751   ignored. It is incorrect for `write_fmt` to return an error when writing
3752   to a string.
3753 * [In-tree crates are verified to be unstable][39851]. Previously, some minor
3754   crates were marked stable and could be accessed from the stable toolchain.
3755 * [Rust git source no longer includes vendored crates][39728]. Those that need
3756   to build with vendored crates should build from release tarballs.
3757 * [Fix inert attributes from `proc_macro_derives`][39572]
3758 * [During crate resolution, rustc prefers a crate in the sysroot if two crates
3759   are otherwise identical][39518]. Unlikely to be encountered outside the Rust
3760   build system.
3761 * [Fixed bugs around how type inference interacts with dead-code][39485]. The
3762   existing code generally ignores the type of dead-code unless a type-hint is
3763   provided; this can cause surprising inference interactions particularly around
3764   defaulting. The new code uniformly ignores the result type of dead-code.
3765 * [Tuple-struct constructors with private fields are no longer visible][38932]
3766 * [Lifetime parameters that do not appear in the arguments are now considered
3767   early-bound][38897], resolving a soundness bug (#[32330]). The
3768   `hr_lifetime_in_assoc_type` future-compatibility lint has been in effect since
3769   April of 2016.
3770 * [rustdoc: fix doctests with non-feature crate attributes][38161]
3771 * [Make transmuting from fn item types to pointer-sized types a hard
3772   error][34198]
3773
3774 [27787]: https://github.com/rust-lang/rust/issues/27787
3775 [32330]: https://github.com/rust-lang/rust/issues/32330
3776 [34198]: https://github.com/rust-lang/rust/pull/34198
3777 [38161]: https://github.com/rust-lang/rust/pull/38161
3778 [38368]: https://github.com/rust-lang/rust/pull/38368
3779 [38584]: https://github.com/rust-lang/rust/issues/38584
3780 [38661]: https://github.com/rust-lang/rust/pull/38661
3781 [38764]: https://github.com/rust-lang/rust/pull/38764
3782 [38864]: https://github.com/rust-lang/rust/issues/38864
3783 [38897]: https://github.com/rust-lang/rust/pull/38897
3784 [38921]: https://github.com/rust-lang/rust/pull/38921
3785 [38932]: https://github.com/rust-lang/rust/pull/38932
3786 [38945]: https://github.com/rust-lang/rust/pull/38945
3787 [38981]: https://github.com/rust-lang/rust/pull/38981
3788 [39002]: https://github.com/rust-lang/rust/pull/39002
3789 [39116]: https://github.com/rust-lang/rust/pull/39116
3790 [39193]: https://github.com/rust-lang/rust/pull/39193
3791 [39265]: https://github.com/rust-lang/rust/pull/39265
3792 [39356]: https://github.com/rust-lang/rust/pull/39356
3793 [39372]: https://github.com/rust-lang/rust/pull/39372
3794 [39426]: https://github.com/rust-lang/rust/pull/39426
3795 [39431]: https://github.com/rust-lang/rust/pull/39431
3796 [39438]: https://github.com/rust-lang/rust/pull/39438
3797 [39440]: https://github.com/rust-lang/rust/pull/39440
3798 [39485]: https://github.com/rust-lang/rust/pull/39485
3799 [39491]: https://github.com/rust-lang/rust/pull/39491
3800 [39518]: https://github.com/rust-lang/rust/pull/39518
3801 [39538]: https://github.com/rust-lang/rust/pull/39538
3802 [39572]: https://github.com/rust-lang/rust/pull/39572
3803 [39633]: https://github.com/rust-lang/rust/pull/39633
3804 [39642]: https://github.com/rust-lang/rust/pull/39642
3805 [39728]: https://github.com/rust-lang/rust/pull/39728
3806 [39761]: https://github.com/rust-lang/rust/pull/39761
3807 [39788]: https://github.com/rust-lang/rust/pull/39788
3808 [39793]: https://github.com/rust-lang/rust/pull/39793
3809 [39837]: https://github.com/rust-lang/rust/pull/39837
3810 [39843]: https://github.com/rust-lang/rust/pull/39843
3811 [39851]: https://github.com/rust-lang/rust/pull/39851
3812 [39903]: https://github.com/rust-lang/rust/pull/39903
3813 [39939]: https://github.com/rust-lang/rust/pull/39939
3814 [39953]: https://github.com/rust-lang/rust/pull/39953
3815 [39960]: https://github.com/rust-lang/rust/pull/39960
3816 [39990]: https://github.com/rust-lang/rust/pull/39990
3817 [39995]: https://github.com/rust-lang/rust/pull/39995
3818 [40008]: https://github.com/rust-lang/rust/pull/40008
3819 [40009]: https://github.com/rust-lang/rust/pull/40009
3820 [40027]: https://github.com/rust-lang/rust/pull/40027
3821 [40028]: https://github.com/rust-lang/rust/pull/40028
3822 [40037]: https://github.com/rust-lang/rust/pull/40037
3823 [40117]: https://github.com/rust-lang/rust/pull/40117
3824 [40166]: https://github.com/rust-lang/rust/pull/40166
3825 [40245]: https://github.com/rust-lang/rust/pull/40245
3826 [40257]: https://github.com/rust-lang/rust/pull/40257
3827 [40261]: https://github.com/rust-lang/rust/pull/40261
3828 [40265]: https://github.com/rust-lang/rust/pull/40265
3829 [40319]: https://github.com/rust-lang/rust/pull/40319
3830 [40336]: https://github.com/rust-lang/rust/pull/40336
3831 [40526]: https://github.com/rust-lang/rust/pull/40526
3832 [RFC 1623]: https://github.com/rust-lang/rfcs/blob/master/text/1623-static.md
3833 [RFC 1647]: https://github.com/rust-lang/rfcs/blob/master/text/1647-allow-self-in-where-clauses.md
3834 [RFC 1651]: https://github.com/rust-lang/rfcs/blob/master/text/1651-movecell.md
3835 [RFC 1682]: https://github.com/rust-lang/rfcs/blob/master/text/1682-field-init-shorthand.md
3836 [`Arc::from_raw`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.from_raw
3837 [`Arc::into_raw`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.into_raw
3838 [`Arc::ptr_eq`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.ptr_eq
3839 [`BTreeMap::range_mut`]: https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.range_mut
3840 [`BTreeMap::range`]: https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.range
3841 [`Cell::into_inner`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.into_inner
3842 [`Cell::replace`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.replace
3843 [`Cell::swap`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.swap
3844 [`Cell::take`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.take
3845 [`Ordering::then_with`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.then_with
3846 [`Ordering::then`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.then
3847 [`Rc::from_raw`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.from_raw
3848 [`Rc::into_raw`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.into_raw
3849 [`Rc::ptr_eq`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.ptr_eq
3850 [`Result::expect_err`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.expect_err
3851 [`collections::Bound`]: https://doc.rust-lang.org/std/collections/enum.Bound.html
3852 [`process::abort`]: https://doc.rust-lang.org/std/process/fn.abort.html
3853 [`ptr::read_unaligned`]: https://doc.rust-lang.org/std/ptr/fn.read_unaligned.html
3854 [`ptr::write_unaligned`]: https://doc.rust-lang.org/std/ptr/fn.write_unaligned.html
3855 [cargo/3562]: https://github.com/rust-lang/cargo/pull/3562
3856 [cargo/3664]: https://github.com/rust-lang/cargo/pull/3664
3857 [cargo/3667]: https://github.com/rust-lang/cargo/pull/3667
3858 [cargo/3691]: https://github.com/rust-lang/cargo/pull/3691
3859 [cargo/3699]: https://github.com/rust-lang/cargo/pull/3699
3860 [cargo/3731]: https://github.com/rust-lang/cargo/pull/3731
3861 [mdbook]: https://crates.io/crates/mdbook
3862 [ubook]: https://doc.rust-lang.org/unstable-book/
3863
3864
3865 Version 1.16.0 (2017-03-16)
3866 ===========================
3867
3868 Language
3869 --------
3870
3871 * [The compiler's `dead_code` lint now accounts for type aliases][38051].
3872 * [Uninhabitable enums (those without any variants) no longer permit wildcard
3873   match patterns][38069]
3874 * [Clean up semantics of `self` in an import list][38313]
3875 * [`Self` may appear in `impl` headers][38920]
3876 * [`Self` may appear in struct expressions][39282]
3877
3878 Compiler
3879 --------
3880
3881 * [`rustc` now supports `--emit=metadata`, which causes rustc to emit
3882   a `.rmeta` file containing only crate metadata][38571]. This can be
3883   used by tools like the Rust Language Service to perform
3884   metadata-only builds.
3885 * [Levenshtein based typo suggestions now work in most places, while
3886   previously they worked only for fields and sometimes for local
3887   variables][38927]. Together with the overhaul of "no
3888   resolution"/"unexpected resolution" errors (#[38154]) they result in
3889   large and systematic improvement in resolution diagnostics.
3890 * [Fix `transmute::<T, U>` where `T` requires a bigger alignment than
3891   `U`][38670]
3892 * [rustc: use -Xlinker when specifying an rpath with ',' in it][38798]
3893 * [`rustc` no longer attempts to provide "consider using an explicit
3894   lifetime" suggestions][37057]. They were inaccurate.
3895
3896 Stabilized APIs
3897 ---------------
3898
3899 * [`VecDeque::truncate`]
3900 * [`VecDeque::resize`]
3901 * [`String::insert_str`]
3902 * [`Duration::checked_add`]
3903 * [`Duration::checked_sub`]
3904 * [`Duration::checked_div`]
3905 * [`Duration::checked_mul`]
3906 * [`str::replacen`]
3907 * [`str::repeat`]
3908 * [`SocketAddr::is_ipv4`]
3909 * [`SocketAddr::is_ipv6`]
3910 * [`IpAddr::is_ipv4`]
3911 * [`IpAddr::is_ipv6`]
3912 * [`Vec::dedup_by`]
3913 * [`Vec::dedup_by_key`]
3914 * [`Result::unwrap_or_default`]
3915 * [`<*const T>::wrapping_offset`]
3916 * [`<*mut T>::wrapping_offset`]
3917 * `CommandExt::creation_flags`
3918 * [`File::set_permissions`]
3919 * [`String::split_off`]
3920
3921 Libraries
3922 ---------
3923
3924 * [`[T]::binary_search` and `[T]::binary_search_by_key` now take
3925   their argument by `Borrow` parameter][37761]
3926 * [All public types in std implement `Debug`][38006]
3927 * [`IpAddr` implements `From<Ipv4Addr>` and `From<Ipv6Addr>`][38327]
3928 * [`Ipv6Addr` implements `From<[u16; 8]>`][38131]
3929 * [Ctrl-Z returns from `Stdin.read()` when reading from the console on
3930   Windows][38274]
3931 * [std: Fix partial writes in `LineWriter`][38062]
3932 * [std: Clamp max read/write sizes on Unix][38062]
3933 * [Use more specific panic message for `&str` slicing errors][38066]
3934 * [`TcpListener::set_only_v6` is deprecated][38304]. This
3935   functionality cannot be achieved in std currently.
3936 * [`writeln!`, like `println!`, now accepts a form with no string
3937   or formatting arguments, to just print a newline][38469]
3938 * [Implement `iter::Sum` and `iter::Product` for `Result`][38580]
3939 * [Reduce the size of static data in `std_unicode::tables`][38781]
3940 * [`char::EscapeDebug`, `EscapeDefault`, `EscapeUnicode`,
3941   `CaseMappingIter`, `ToLowercase`, `ToUppercase`, implement
3942   `Display`][38909]
3943 * [`Duration` implements `Sum`][38712]
3944 * [`String` implements `ToSocketAddrs`][39048]
3945
3946 Cargo
3947 -----
3948
3949 * [The `cargo check` command does a type check of a project without
3950   building it][cargo/3296]
3951 * [crates.io will display CI badges from Travis and AppVeyor, if
3952   specified in Cargo.toml][cargo/3546]
3953 * [crates.io will display categories listed in Cargo.toml][cargo/3301]
3954 * [Compilation profiles accept integer values for `debug`, in addition
3955   to `true` and `false`. These are passed to `rustc` as the value to
3956   `-C debuginfo`][cargo/3534]
3957 * [Implement `cargo --version --verbose`][cargo/3604]
3958 * [All builds now output 'dep-info' build dependencies compatible with
3959   make and ninja][cargo/3557]
3960 * [Build all workspace members with `build --all`][cargo/3511]
3961 * [Document all workspace members with `doc --all`][cargo/3515]
3962 * [Path deps outside workspace are not members][cargo/3443]
3963
3964 Misc
3965 ----
3966
3967 * [`rustdoc` has a `--sysroot` argument that, like `rustc`, specifies
3968   the path to the Rust implementation][38589]
3969 * [The `armv7-linux-androideabi` target no longer enables NEON
3970   extensions, per Google's ABI guide][38413]
3971 * [The stock standard library can be compiled for Redox OS][38401]
3972 * [Rust has initial SPARC support][38726]. Tier 3. No builds
3973   available.
3974 * [Rust has experimental support for Nvidia PTX][38559]. Tier 3. No
3975   builds available.
3976 * [Fix backtraces on i686-pc-windows-gnu by disabling FPO][39379]
3977
3978 Compatibility Notes
3979 -------------------
3980
3981 * [Uninhabitable enums (those without any variants) no longer permit wildcard
3982   match patterns][38069]
3983 * In this release, references to uninhabited types can not be
3984   pattern-matched. This was accidentally allowed in 1.15.
3985 * [The compiler's `dead_code` lint now accounts for type aliases][38051].
3986 * [Ctrl-Z returns from `Stdin.read()` when reading from the console on
3987   Windows][38274]
3988 * [Clean up semantics of `self` in an import list][38313]
3989 * Reimplemented lifetime elision. This change was almost entirely compatible
3990   with existing code, but it did close a number of small bugs and loopholes,
3991   as well as being more accepting in some other [cases][41105].
3992
3993 [37057]: https://github.com/rust-lang/rust/pull/37057
3994 [37761]: https://github.com/rust-lang/rust/pull/37761
3995 [38006]: https://github.com/rust-lang/rust/pull/38006
3996 [38051]: https://github.com/rust-lang/rust/pull/38051
3997 [38062]: https://github.com/rust-lang/rust/pull/38062
3998 [38062]: https://github.com/rust-lang/rust/pull/38622
3999 [38066]: https://github.com/rust-lang/rust/pull/38066
4000 [38069]: https://github.com/rust-lang/rust/pull/38069
4001 [38131]: https://github.com/rust-lang/rust/pull/38131
4002 [38154]: https://github.com/rust-lang/rust/pull/38154
4003 [38274]: https://github.com/rust-lang/rust/pull/38274
4004 [38304]: https://github.com/rust-lang/rust/pull/38304
4005 [38313]: https://github.com/rust-lang/rust/pull/38313
4006 [38314]: https://github.com/rust-lang/rust/pull/38314
4007 [38327]: https://github.com/rust-lang/rust/pull/38327
4008 [38401]: https://github.com/rust-lang/rust/pull/38401
4009 [38413]: https://github.com/rust-lang/rust/pull/38413
4010 [38469]: https://github.com/rust-lang/rust/pull/38469
4011 [38559]: https://github.com/rust-lang/rust/pull/38559
4012 [38571]: https://github.com/rust-lang/rust/pull/38571
4013 [38580]: https://github.com/rust-lang/rust/pull/38580
4014 [38589]: https://github.com/rust-lang/rust/pull/38589
4015 [38670]: https://github.com/rust-lang/rust/pull/38670
4016 [38712]: https://github.com/rust-lang/rust/pull/38712
4017 [38726]: https://github.com/rust-lang/rust/pull/38726
4018 [38781]: https://github.com/rust-lang/rust/pull/38781
4019 [38798]: https://github.com/rust-lang/rust/pull/38798
4020 [38909]: https://github.com/rust-lang/rust/pull/38909
4021 [38920]: https://github.com/rust-lang/rust/pull/38920
4022 [38927]: https://github.com/rust-lang/rust/pull/38927
4023 [39048]: https://github.com/rust-lang/rust/pull/39048
4024 [39282]: https://github.com/rust-lang/rust/pull/39282
4025 [39379]: https://github.com/rust-lang/rust/pull/39379
4026 [41105]: https://github.com/rust-lang/rust/issues/41105
4027 [`<*const T>::wrapping_offset`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_offset
4028 [`<*mut T>::wrapping_offset`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_offset
4029 [`Duration::checked_add`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_add
4030 [`Duration::checked_div`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_div
4031 [`Duration::checked_mul`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_mul
4032 [`Duration::checked_sub`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_sub
4033 [`File::set_permissions`]: https://doc.rust-lang.org/std/fs/struct.File.html#method.set_permissions
4034 [`IpAddr::is_ipv4`]: https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_ipv4
4035 [`IpAddr::is_ipv6`]: https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_ipv6
4036 [`Result::unwrap_or_default`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.unwrap_or_default
4037 [`SocketAddr::is_ipv4`]: https://doc.rust-lang.org/std/net/enum.SocketAddr.html#method.is_ipv4
4038 [`SocketAddr::is_ipv6`]: https://doc.rust-lang.org/std/net/enum.SocketAddr.html#method.is_ipv6
4039 [`String::insert_str`]: https://doc.rust-lang.org/std/string/struct.String.html#method.insert_str
4040 [`String::split_off`]: https://doc.rust-lang.org/std/string/struct.String.html#method.split_off
4041 [`Vec::dedup_by_key`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.dedup_by_key
4042 [`Vec::dedup_by`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.dedup_by
4043 [`VecDeque::resize`]:  https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.resize
4044 [`VecDeque::truncate`]: https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.truncate
4045 [`str::repeat`]: https://doc.rust-lang.org/std/primitive.str.html#method.repeat
4046 [`str::replacen`]: https://doc.rust-lang.org/std/primitive.str.html#method.replacen
4047 [cargo/3296]: https://github.com/rust-lang/cargo/pull/3296
4048 [cargo/3301]: https://github.com/rust-lang/cargo/pull/3301
4049 [cargo/3443]: https://github.com/rust-lang/cargo/pull/3443
4050 [cargo/3511]: https://github.com/rust-lang/cargo/pull/3511
4051 [cargo/3515]: https://github.com/rust-lang/cargo/pull/3515
4052 [cargo/3534]: https://github.com/rust-lang/cargo/pull/3534
4053 [cargo/3546]: https://github.com/rust-lang/cargo/pull/3546
4054 [cargo/3557]: https://github.com/rust-lang/cargo/pull/3557
4055 [cargo/3604]: https://github.com/rust-lang/cargo/pull/3604
4056 [RFC 1623]: https://github.com/rust-lang/rfcs/blob/master/text/1623-static.md
4057
4058
4059 Version 1.15.1 (2017-02-09)
4060 ===========================
4061
4062 * [Fix IntoIter::as_mut_slice's signature][39466]
4063 * [Compile compiler builtins with `-fPIC` on 32-bit platforms][39523]
4064
4065 [39466]: https://github.com/rust-lang/rust/pull/39466
4066 [39523]: https://github.com/rust-lang/rust/pull/39523
4067
4068
4069 Version 1.15.0 (2017-02-02)
4070 ===========================
4071
4072 Language
4073 --------
4074
4075 * Basic procedural macros allowing custom `#[derive]`, aka "macros 1.1", are
4076   stable. This allows popular code-generating crates like Serde and Diesel to
4077   work ergonomically. [RFC 1681].
4078 * [Tuple structs may be empty. Unary and empty tuple structs may be instantiated
4079   with curly braces][36868]. Part of [RFC 1506].
4080 * [A number of minor changes to name resolution have been activated][37127].
4081   They add up to more consistent semantics, allowing for future evolution of
4082   Rust macros. Specified in [RFC 1560], see its section on ["changes"] for
4083   details of what is different. The breaking changes here have been transitioned
4084   through the [`legacy_imports`] lint since 1.14, with no known regressions.
4085 * [In `macro_rules`, `path` fragments can now be parsed as type parameter
4086   bounds][38279]
4087 * [`?Sized` can be used in `where` clauses][37791]
4088 * [There is now a limit on the size of monomorphized types and it can be
4089   modified with the `#![type_size_limit]` crate attribute, similarly to
4090   the `#![recursion_limit]` attribute][37789]
4091
4092 Compiler
4093 --------
4094
4095 * [On Windows, the compiler will apply dllimport attributes when linking to
4096   extern functions][37973]. Additional attributes and flags can control which
4097   library kind is linked and its name. [RFC 1717].
4098 * [Rust-ABI symbols are no longer exported from cdylibs][38117]
4099 * [The `--test` flag works with procedural macro crates][38107]
4100 * [Fix `extern "aapcs" fn` ABI][37814]
4101 * [The `-C no-stack-check` flag is deprecated][37636]. It does nothing.
4102 * [The `format!` expander recognizes incorrect `printf` and shell-style
4103   formatting directives and suggests the correct format][37613].
4104 * [Only report one error for all unused imports in an import list][37456]
4105
4106 Compiler Performance
4107 --------------------
4108
4109 * [Avoid unnecessary `mk_ty` calls in `Ty::super_fold_with`][37705]
4110 * [Avoid more unnecessary `mk_ty` calls in `Ty::super_fold_with`][37979]
4111 * [Don't clone in `UnificationTable::probe`][37848]
4112 * [Remove `scope_auxiliary` to cut RSS by 10%][37764]
4113 * [Use small vectors in type walker][37760]
4114 * [Macro expansion performance was improved][37701]
4115 * [Change `HirVec<P<T>>` to `HirVec<T>` in `hir::Expr`][37642]
4116 * [Replace FNV with a faster hash function][37229]
4117
4118 Stabilized APIs
4119 ---------------
4120
4121 * [`std::iter::Iterator::min_by`]
4122 * [`std::iter::Iterator::max_by`]
4123 * [`std::os::*::fs::FileExt`]
4124 * [`std::sync::atomic::Atomic*::get_mut`]
4125 * [`std::sync::atomic::Atomic*::into_inner`]
4126 * [`std::vec::IntoIter::as_slice`]
4127 * [`std::vec::IntoIter::as_mut_slice`]
4128 * [`std::sync::mpsc::Receiver::try_iter`]
4129 * [`std::os::unix::process::CommandExt::before_exec`]
4130 * [`std::rc::Rc::strong_count`]
4131 * [`std::rc::Rc::weak_count`]
4132 * [`std::sync::Arc::strong_count`]
4133 * [`std::sync::Arc::weak_count`]
4134 * [`std::char::encode_utf8`]
4135 * [`std::char::encode_utf16`]
4136 * [`std::cell::Ref::clone`]
4137 * [`std::io::Take::into_inner`]
4138
4139 Libraries
4140 ---------
4141
4142 * [The standard sorting algorithm has been rewritten for dramatic performance
4143   improvements][38192]. It is a hybrid merge sort, drawing influences from
4144   Timsort. Previously it was a naive merge sort.
4145 * [`Iterator::nth` no longer has a `Sized` bound][38134]
4146 * [`Extend<&T>` is specialized for `Vec` where `T: Copy`][38182] to improve
4147   performance.
4148 * [`chars().count()` is much faster][37888] and so are [`chars().last()`
4149   and `char_indices().last()`][37882]
4150 * [Fix ARM Objective-C ABI in `std::env::args`][38146]
4151 * [Chinese characters display correctly in `fmt::Debug`][37855]
4152 * [Derive `Default` for `Duration`][37699]
4153 * [Support creation of anonymous pipes on WinXP/2k][37677]
4154 * [`mpsc::RecvTimeoutError` implements `Error`][37527]
4155 * [Don't pass overlapped handles to processes][38835]
4156
4157 Cargo
4158 -----
4159
4160 * [In this release, Cargo build scripts no longer have access to the `OUT_DIR`
4161   environment variable at build time via `env!("OUT_DIR")`][cargo/3368]. They
4162   should instead check the variable at runtime with `std::env`. That the value
4163   was set at build time was a bug, and incorrect when cross-compiling. This
4164   change is known to cause breakage.
4165 * [Add `--all` flag to `cargo test`][cargo/3221]
4166 * [Compile statically against the MSVC CRT][cargo/3363]
4167 * [Mix feature flags into fingerprint/metadata shorthash][cargo/3102]
4168 * [Link OpenSSL statically on OSX][cargo/3311]
4169 * [Apply new fingerprinting to build dir outputs][cargo/3310]
4170 * [Test for bad path overrides with summaries][cargo/3336]
4171 * [Require `cargo install --vers` to take a semver version][cargo/3338]
4172 * [Fix retrying crate downloads for network errors][cargo/3348]
4173 * [Implement string lookup for `build.rustflags` config key][cargo/3356]
4174 * [Emit more info on --message-format=json][cargo/3319]
4175 * [Assume `build.rs` in the same directory as `Cargo.toml` is a build script][cargo/3361]
4176 * [Don't ignore errors in workspace manifest][cargo/3409]
4177 * [Fix `--message-format JSON` when rustc emits non-JSON warnings][cargo/3410]
4178
4179 Tooling
4180 -------
4181
4182 * [Test runners (binaries built with `--test`) now support a `--list` argument
4183   that lists the tests it contains][38185]
4184 * [Test runners now support a `--exact` argument that makes the test filter
4185   match exactly, instead of matching only a substring of the test name][38181]
4186 * [rustdoc supports a `--playground-url` flag][37763]
4187 * [rustdoc provides more details about `#[should_panic]` errors][37749]
4188
4189 Misc
4190 ----
4191
4192 * [The Rust build system is now written in Rust][37817]. The Makefiles may
4193   continue to be used in this release by passing `--disable-rustbuild` to the
4194   configure script, but they will be deleted soon. Note that the new build
4195   system uses a different on-disk layout that will likely affect any scripts
4196   building Rust.
4197 * [Rust supports i686-unknown-openbsd][38086]. Tier 3 support. No testing or
4198   releases.
4199 * [Rust supports the MSP430][37627]. Tier 3 support. No testing or releases.
4200 * [Rust supports the ARMv5TE architecture][37615]. Tier 3 support. No testing or
4201   releases.
4202
4203 Compatibility Notes
4204 -------------------
4205
4206 * [A number of minor changes to name resolution have been activated][37127].
4207   They add up to more consistent semantics, allowing for future evolution of
4208   Rust macros. Specified in [RFC 1560], see its section on ["changes"] for
4209   details of what is different. The breaking changes here have been transitioned
4210   through the [`legacy_imports`] lint since 1.14, with no known regressions.
4211 * [In this release, Cargo build scripts no longer have access to the `OUT_DIR`
4212   environment variable at build time via `env!("OUT_DIR")`][cargo/3368]. They
4213   should instead check the variable at runtime with `std::env`. That the value
4214   was set at build time was a bug, and incorrect when cross-compiling. This
4215   change is known to cause breakage.
4216 * [Higher-ranked lifetimes are no longer allowed to appear _only_ in associated
4217   types][33685]. The [`hr_lifetime_in_assoc_type` lint] has been a warning since
4218   1.10 and is now an error by default. It will become a hard error in the near
4219   future.
4220 * [The semantics relating modules to file system directories are changing in
4221   minor ways][37602]. This is captured in the new `legacy_directory_ownership`
4222   lint, which is a warning in this release, and will become a hard error in the
4223   future.
4224 * [Rust-ABI symbols are no longer exported from cdylibs][38117]
4225 * [Once `Peekable` peeks a `None` it will return that `None` without re-querying
4226   the underlying iterator][37834]
4227
4228 ["changes"]: https://github.com/rust-lang/rfcs/blob/master/text/1560-name-resolution.md#changes-to-name-resolution-rules
4229 [33685]: https://github.com/rust-lang/rust/issues/33685
4230 [36868]: https://github.com/rust-lang/rust/pull/36868
4231 [37127]: https://github.com/rust-lang/rust/pull/37127
4232 [37229]: https://github.com/rust-lang/rust/pull/37229
4233 [37456]: https://github.com/rust-lang/rust/pull/37456
4234 [37527]: https://github.com/rust-lang/rust/pull/37527
4235 [37602]: https://github.com/rust-lang/rust/pull/37602
4236 [37613]: https://github.com/rust-lang/rust/pull/37613
4237 [37615]: https://github.com/rust-lang/rust/pull/37615
4238 [37636]: https://github.com/rust-lang/rust/pull/37636
4239 [37627]: https://github.com/rust-lang/rust/pull/37627
4240 [37642]: https://github.com/rust-lang/rust/pull/37642
4241 [37677]: https://github.com/rust-lang/rust/pull/37677
4242 [37699]: https://github.com/rust-lang/rust/pull/37699
4243 [37701]: https://github.com/rust-lang/rust/pull/37701
4244 [37705]: https://github.com/rust-lang/rust/pull/37705
4245 [37749]: https://github.com/rust-lang/rust/pull/37749
4246 [37760]: https://github.com/rust-lang/rust/pull/37760
4247 [37763]: https://github.com/rust-lang/rust/pull/37763
4248 [37764]: https://github.com/rust-lang/rust/pull/37764
4249 [37789]: https://github.com/rust-lang/rust/pull/37789
4250 [37791]: https://github.com/rust-lang/rust/pull/37791
4251 [37814]: https://github.com/rust-lang/rust/pull/37814
4252 [37817]: https://github.com/rust-lang/rust/pull/37817
4253 [37834]: https://github.com/rust-lang/rust/pull/37834
4254 [37848]: https://github.com/rust-lang/rust/pull/37848
4255 [37855]: https://github.com/rust-lang/rust/pull/37855
4256 [37882]: https://github.com/rust-lang/rust/pull/37882
4257 [37888]: https://github.com/rust-lang/rust/pull/37888
4258 [37973]: https://github.com/rust-lang/rust/pull/37973
4259 [37979]: https://github.com/rust-lang/rust/pull/37979
4260 [38086]: https://github.com/rust-lang/rust/pull/38086
4261 [38107]: https://github.com/rust-lang/rust/pull/38107
4262 [38117]: https://github.com/rust-lang/rust/pull/38117
4263 [38134]: https://github.com/rust-lang/rust/pull/38134
4264 [38146]: https://github.com/rust-lang/rust/pull/38146
4265 [38181]: https://github.com/rust-lang/rust/pull/38181
4266 [38182]: https://github.com/rust-lang/rust/pull/38182
4267 [38185]: https://github.com/rust-lang/rust/pull/38185
4268 [38192]: https://github.com/rust-lang/rust/pull/38192
4269 [38279]: https://github.com/rust-lang/rust/pull/38279
4270 [38835]: https://github.com/rust-lang/rust/pull/38835
4271 [RFC 1492]: https://github.com/rust-lang/rfcs/blob/master/text/1492-dotdot-in-patterns.md
4272 [RFC 1506]: https://github.com/rust-lang/rfcs/blob/master/text/1506-adt-kinds.md
4273 [RFC 1560]: https://github.com/rust-lang/rfcs/blob/master/text/1560-name-resolution.md
4274 [RFC 1681]: https://github.com/rust-lang/rfcs/blob/master/text/1681-macros-1.1.md
4275 [RFC 1717]: https://github.com/rust-lang/rfcs/blob/master/text/1717-dllimport.md
4276 [`hr_lifetime_in_assoc_type` lint]: https://github.com/rust-lang/rust/issues/33685
4277 [`legacy_imports`]: https://github.com/rust-lang/rust/pull/38271
4278 [cargo/3102]: https://github.com/rust-lang/cargo/pull/3102
4279 [cargo/3221]: https://github.com/rust-lang/cargo/pull/3221
4280 [cargo/3310]: https://github.com/rust-lang/cargo/pull/3310
4281 [cargo/3311]: https://github.com/rust-lang/cargo/pull/3311
4282 [cargo/3319]: https://github.com/rust-lang/cargo/pull/3319
4283 [cargo/3336]: https://github.com/rust-lang/cargo/pull/3336
4284 [cargo/3338]: https://github.com/rust-lang/cargo/pull/3338
4285 [cargo/3348]: https://github.com/rust-lang/cargo/pull/3348
4286 [cargo/3356]: https://github.com/rust-lang/cargo/pull/3356
4287 [cargo/3361]: https://github.com/rust-lang/cargo/pull/3361
4288 [cargo/3363]: https://github.com/rust-lang/cargo/pull/3363
4289 [cargo/3368]: https://github.com/rust-lang/cargo/issues/3368
4290 [cargo/3409]: https://github.com/rust-lang/cargo/pull/3409
4291 [cargo/3410]: https://github.com/rust-lang/cargo/pull/3410
4292 [`std::iter::Iterator::min_by`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.min_by
4293 [`std::iter::Iterator::max_by`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.max_by
4294 [`std::os::*::fs::FileExt`]: https://doc.rust-lang.org/std/os/unix/fs/trait.FileExt.html
4295 [`std::sync::atomic::Atomic*::get_mut`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU8.html#method.get_mut
4296 [`std::sync::atomic::Atomic*::into_inner`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU8.html#method.into_inner
4297 [`std::vec::IntoIter::as_slice`]: https://doc.rust-lang.org/std/vec/struct.IntoIter.html#method.as_slice
4298 [`std::vec::IntoIter::as_mut_slice`]: https://doc.rust-lang.org/std/vec/struct.IntoIter.html#method.as_mut_slice
4299 [`std::sync::mpsc::Receiver::try_iter`]: https://doc.rust-lang.org/std/sync/mpsc/struct.Receiver.html#method.try_iter
4300 [`std::os::unix::process::CommandExt::before_exec`]: https://doc.rust-lang.org/std/os/unix/process/trait.CommandExt.html#tymethod.before_exec
4301 [`std::rc::Rc::strong_count`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.strong_count
4302 [`std::rc::Rc::weak_count`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.weak_count
4303 [`std::sync::Arc::strong_count`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.strong_count
4304 [`std::sync::Arc::weak_count`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.weak_count
4305 [`std::char::encode_utf8`]: https://doc.rust-lang.org/std/primitive.char.html#method.encode_utf8
4306 [`std::char::encode_utf16`]: https://doc.rust-lang.org/std/primitive.char.html#method.encode_utf16
4307 [`std::cell::Ref::clone`]: https://doc.rust-lang.org/std/cell/struct.Ref.html#method.clone
4308 [`std::io::Take::into_inner`]: https://doc.rust-lang.org/std/io/struct.Take.html#method.into_inner
4309
4310
4311 Version 1.14.0 (2016-12-22)
4312 ===========================
4313
4314 Language
4315 --------
4316
4317 * [`..` matches multiple tuple fields in enum variants, structs
4318   and tuples][36843]. [RFC 1492].
4319 * [Safe `fn` items can be coerced to `unsafe fn` pointers][37389]
4320 * [`use *` and `use ::*` both glob-import from the crate root][37367]
4321 * [It's now possible to call a `Vec<Box<Fn()>>` without explicit
4322   dereferencing][36822]
4323
4324 Compiler
4325 --------
4326
4327 * [Mark enums with non-zero discriminant as non-zero][37224]
4328 * [Lower-case `static mut` names are linted like other
4329   statics and consts][37162]
4330 * [Fix ICE on some macros in const integer positions
4331    (e.g. `[u8; m!()]`)][36819]
4332 * [Improve error message and snippet for "did you mean `x`"][36798]
4333 * [Add a panic-strategy field to the target specification][36794]
4334 * [Include LLVM version in `--version --verbose`][37200]
4335
4336 Compile-time Optimizations
4337 --------------------------
4338
4339 * [Improve macro expansion performance][37569]
4340 * [Shrink `Expr_::ExprInlineAsm`][37445]
4341 * [Replace all uses of SHA-256 with BLAKE2b][37439]
4342 * [Reduce the number of bytes hashed by `IchHasher`][37427]
4343 * [Avoid more allocations when compiling html5ever][37373]
4344 * [Use `SmallVector` in `CombineFields::instantiate`][37322]
4345 * [Avoid some allocations in the macro parser][37318]
4346 * [Use a faster deflate setting][37298]
4347 * [Add `ArrayVec` and `AccumulateVec` to reduce heap allocations
4348   during interning of slices][37270]
4349 * [Optimize `write_metadata`][37267]
4350 * [Don't process obligation forest cycles when stalled][37231]
4351 * [Avoid many `CrateConfig` clones][37161]
4352 * [Optimize `Substs::super_fold_with`][37108]
4353 * [Optimize `ObligationForest`'s `NodeState` handling][36993]
4354 * [Speed up `plug_leaks`][36917]
4355
4356 Libraries
4357 ---------
4358
4359 * [`println!()`, with no arguments, prints newline][36825].
4360   Previously, an empty string was required to achieve the same.
4361 * [`Wrapping` impls standard binary and unary operators, as well as
4362    the `Sum` and `Product` iterators][37356]
4363 * [Implement `From<Cow<str>> for String` and `From<Cow<[T]>> for
4364   Vec<T>`][37326]
4365 * [Improve `fold` performance for `chain`, `cloned`, `map`, and
4366   `VecDeque` iterators][37315]
4367 * [Improve `SipHasher` performance on small values][37312]
4368 * [Add Iterator trait TrustedLen to enable better FromIterator /
4369   Extend][37306]
4370 * [Expand `.zip()` specialization to `.map()` and `.cloned()`][37230]
4371 * [`ReadDir` implements `Debug`][37221]
4372 * [Implement `RefUnwindSafe` for atomic types][37178]
4373 * [Specialize `Vec::extend` to `Vec::extend_from_slice`][37094]
4374 * [Avoid allocations in `Decoder::read_str`][37064]
4375 * [`io::Error` implements `From<io::ErrorKind>`][37037]
4376 * [Impl `Debug` for raw pointers to unsized data][36880]
4377 * [Don't reuse `HashMap` random seeds][37470]
4378 * [The internal memory layout of `HashMap` is more cache-friendly, for
4379   significant improvements in some operations][36692]
4380 * [`HashMap` uses less memory on 32-bit architectures][36595]
4381 * [Impl `Add<{str, Cow<str>}>` for `Cow<str>`][36430]
4382
4383 Cargo
4384 -----
4385
4386 * [Expose rustc cfg values to build scripts][cargo/3243]
4387 * [Allow cargo to work with read-only `CARGO_HOME`][cargo/3259]
4388 * [Fix passing --features when testing multiple packages][cargo/3280]
4389 * [Use a single profile set per workspace][cargo/3249]
4390 * [Load `replace` sections from lock files][cargo/3220]
4391 * [Ignore `panic` configuration for test/bench profiles][cargo/3175]
4392
4393 Tooling
4394 -------
4395
4396 * [rustup is the recommended Rust installation method][1.14rustup]
4397 * This release includes host (rustc) builds for Linux on MIPS, PowerPC, and
4398   S390x. These are [tier 2] platforms and may have major defects. Follow the
4399   instructions on the website to install, or add the targets to an existing
4400   installation with `rustup target add`. The new target triples are:
4401   - `mips-unknown-linux-gnu`
4402   - `mipsel-unknown-linux-gnu`
4403   - `mips64-unknown-linux-gnuabi64`
4404   - `mips64el-unknown-linux-gnuabi64 `
4405   - `powerpc-unknown-linux-gnu`
4406   - `powerpc64-unknown-linux-gnu`
4407   - `powerpc64le-unknown-linux-gnu`
4408   - `s390x-unknown-linux-gnu `
4409 * This release includes target (std) builds for ARM Linux running MUSL
4410   libc. These are [tier 2] platforms and may have major defects. Add the
4411   following triples to an existing rustup installation with `rustup target add`:
4412   - `arm-unknown-linux-musleabi`
4413   - `arm-unknown-linux-musleabihf`
4414   - `armv7-unknown-linux-musleabihf`
4415 * This release includes [experimental support for WebAssembly][1.14wasm], via
4416   the `wasm32-unknown-emscripten` target. This target is known to have major
4417   defects. Please test, report, and fix.
4418 * rustup no longer installs documentation by default. Run `rustup
4419   component add rust-docs` to install.
4420 * [Fix line stepping in debugger][37310]
4421 * [Enable line number debuginfo in releases][37280]
4422
4423 Misc
4424 ----
4425
4426 * [Disable jemalloc on aarch64/powerpc/mips][37392]
4427 * [Add support for Fuchsia OS][37313]
4428 * [Detect local-rebuild by only MAJOR.MINOR version][37273]
4429
4430 Compatibility Notes
4431 -------------------
4432
4433 * [A number of forward-compatibility lints used by the compiler
4434   to gradually introduce language changes have been converted
4435   to deny by default][36894]:
4436   - ["use of inaccessible extern crate erroneously allowed"][36886]
4437   - ["type parameter default erroneously allowed in invalid location"][36887]
4438   - ["detects super or self keywords at the beginning of global path"][36888]
4439   - ["two overlapping inherent impls define an item with the same name
4440     were erroneously allowed"][36889]
4441   - ["floating-point constants cannot be used in patterns"][36890]
4442   - ["constants of struct or enum type can only be used in a pattern if
4443      the struct or enum has `#[derive(PartialEq, Eq)]`"][36891]
4444   - ["lifetimes or labels named `'_` were erroneously allowed"][36892]
4445 * [Prohibit patterns in trait methods without bodies][37378]
4446 * [The atomic `Ordering` enum may not be matched exhaustively][37351]
4447 * [Future-proofing `#[no_link]` breaks some obscure cases][37247]
4448 * [The `$crate` macro variable is accepted in fewer locations][37213]
4449 * [Impls specifying extra region requirements beyond the trait
4450   they implement are rejected][37167]
4451 * [Enums may not be unsized][37111]. Unsized enums are intended to
4452   work but never have. For now they are forbidden.
4453 * [Enforce the shadowing restrictions from RFC 1560 for today's macros][36767]
4454
4455 [tier 2]: https://forge.rust-lang.org/platform-support.html
4456 [1.14rustup]: https://internals.rust-lang.org/t/beta-testing-rustup-rs/3316/204
4457 [1.14wasm]: https://users.rust-lang.org/t/compiling-to-the-web-with-rust-and-emscripten/7627
4458 [36430]: https://github.com/rust-lang/rust/pull/36430
4459 [36595]: https://github.com/rust-lang/rust/pull/36595
4460 [36595]: https://github.com/rust-lang/rust/pull/36595
4461 [36692]: https://github.com/rust-lang/rust/pull/36692
4462 [36767]: https://github.com/rust-lang/rust/pull/36767
4463 [36794]: https://github.com/rust-lang/rust/pull/36794
4464 [36798]: https://github.com/rust-lang/rust/pull/36798
4465 [36819]: https://github.com/rust-lang/rust/pull/36819
4466 [36822]: https://github.com/rust-lang/rust/pull/36822
4467 [36825]: https://github.com/rust-lang/rust/pull/36825
4468 [36843]: https://github.com/rust-lang/rust/pull/36843
4469 [36880]: https://github.com/rust-lang/rust/pull/36880
4470 [36886]: https://github.com/rust-lang/rust/issues/36886
4471 [36887]: https://github.com/rust-lang/rust/issues/36887
4472 [36888]: https://github.com/rust-lang/rust/issues/36888
4473 [36889]: https://github.com/rust-lang/rust/issues/36889
4474 [36890]: https://github.com/rust-lang/rust/issues/36890
4475 [36891]: https://github.com/rust-lang/rust/issues/36891
4476 [36892]: https://github.com/rust-lang/rust/issues/36892
4477 [36894]: https://github.com/rust-lang/rust/pull/36894
4478 [36917]: https://github.com/rust-lang/rust/pull/36917
4479 [36993]: https://github.com/rust-lang/rust/pull/36993
4480 [37037]: https://github.com/rust-lang/rust/pull/37037
4481 [37064]: https://github.com/rust-lang/rust/pull/37064
4482 [37094]: https://github.com/rust-lang/rust/pull/37094
4483 [37108]: https://github.com/rust-lang/rust/pull/37108
4484 [37111]: https://github.com/rust-lang/rust/pull/37111
4485 [37161]: https://github.com/rust-lang/rust/pull/37161
4486 [37162]: https://github.com/rust-lang/rust/pull/37162
4487 [37167]: https://github.com/rust-lang/rust/pull/37167
4488 [37178]: https://github.com/rust-lang/rust/pull/37178
4489 [37200]: https://github.com/rust-lang/rust/pull/37200
4490 [37213]: https://github.com/rust-lang/rust/pull/37213
4491 [37221]: https://github.com/rust-lang/rust/pull/37221
4492 [37224]: https://github.com/rust-lang/rust/pull/37224
4493 [37230]: https://github.com/rust-lang/rust/pull/37230
4494 [37231]: https://github.com/rust-lang/rust/pull/37231
4495 [37247]: https://github.com/rust-lang/rust/pull/37247
4496 [37267]: https://github.com/rust-lang/rust/pull/37267
4497 [37270]: https://github.com/rust-lang/rust/pull/37270
4498 [37273]: https://github.com/rust-lang/rust/pull/37273
4499 [37280]: https://github.com/rust-lang/rust/pull/37280
4500 [37298]: https://github.com/rust-lang/rust/pull/37298
4501 [37306]: https://github.com/rust-lang/rust/pull/37306
4502 [37310]: https://github.com/rust-lang/rust/pull/37310
4503 [37312]: https://github.com/rust-lang/rust/pull/37312
4504 [37313]: https://github.com/rust-lang/rust/pull/37313
4505 [37315]: https://github.com/rust-lang/rust/pull/37315
4506 [37318]: https://github.com/rust-lang/rust/pull/37318
4507 [37322]: https://github.com/rust-lang/rust/pull/37322
4508 [37326]: https://github.com/rust-lang/rust/pull/37326
4509 [37351]: https://github.com/rust-lang/rust/pull/37351
4510 [37356]: https://github.com/rust-lang/rust/pull/37356
4511 [37367]: https://github.com/rust-lang/rust/pull/37367
4512 [37373]: https://github.com/rust-lang/rust/pull/37373
4513 [37378]: https://github.com/rust-lang/rust/pull/37378
4514 [37389]: https://github.com/rust-lang/rust/pull/37389
4515 [37392]: https://github.com/rust-lang/rust/pull/37392
4516 [37427]: https://github.com/rust-lang/rust/pull/37427
4517 [37439]: https://github.com/rust-lang/rust/pull/37439
4518 [37445]: https://github.com/rust-lang/rust/pull/37445
4519 [37470]: https://github.com/rust-lang/rust/pull/37470
4520 [37569]: https://github.com/rust-lang/rust/pull/37569
4521 [RFC 1492]: https://github.com/rust-lang/rfcs/blob/master/text/1492-dotdot-in-patterns.md
4522 [cargo/3175]: https://github.com/rust-lang/cargo/pull/3175
4523 [cargo/3220]: https://github.com/rust-lang/cargo/pull/3220
4524 [cargo/3243]: https://github.com/rust-lang/cargo/pull/3243
4525 [cargo/3249]: https://github.com/rust-lang/cargo/pull/3249
4526 [cargo/3259]: https://github.com/rust-lang/cargo/pull/3259
4527 [cargo/3280]: https://github.com/rust-lang/cargo/pull/3280
4528
4529
4530 Version 1.13.0 (2016-11-10)
4531 ===========================
4532
4533 Language
4534 --------
4535
4536 * [Stabilize the `?` operator][36995]. `?` is a simple way to propagate
4537   errors, like the `try!` macro, described in [RFC 0243].
4538 * [Stabilize macros in type position][36014]. Described in [RFC 873].
4539 * [Stabilize attributes on statements][36995]. Described in [RFC 0016].
4540 * [Fix `#[derive]` for empty tuple structs/variants][35728]
4541 * [Fix lifetime rules for 'if' conditions][36029]
4542 * [Avoid loading and parsing unconfigured non-inline modules][36482]
4543
4544 Compiler
4545 --------
4546
4547 * [Add the `-C link-arg` argument][36574]
4548 * [Remove the old AST-based backend from rustc_trans][35764]
4549 * [Don't enable NEON by default on armv7 Linux][35814]
4550 * [Fix debug line number info for macro expansions][35238]
4551 * [Do not emit "class method" debuginfo for types that are not
4552   DICompositeType][36008]
4553 * [Warn about multiple conflicting #[repr] hints][34623]
4554 * [When sizing DST, don't double-count nested struct prefixes][36351]
4555 * [Default RUST_MIN_STACK to 16MiB for now][36505]
4556 * [Improve rlib metadata format][36551]. Reduces rlib size significantly.
4557 * [Reject macros with empty repetitions to avoid infinite loop][36721]
4558 * [Expand macros without recursing to avoid stack overflows][36214]
4559
4560 Diagnostics
4561 -----------
4562
4563 * [Replace macro backtraces with labeled local uses][35702]
4564 * [Improve error message for misplaced doc comments][33922]
4565 * [Buffer unix and lock windows to prevent message interleaving][35975]
4566 * [Update lifetime errors to specifically note temporaries][36171]
4567 * [Special case a few colors for Windows][36178]
4568 * [Suggest `use self` when such an import resolves][36289]
4569 * [Be more specific when type parameter shadows primitive type][36338]
4570 * Many minor improvements
4571
4572 Compile-time Optimizations
4573 --------------------------
4574
4575 * [Compute and cache HIR hashes at beginning][35854]
4576 * [Don't hash types in loan paths][36004]
4577 * [Cache projections in trans][35761]
4578 * [Optimize the parser's last token handling][36527]
4579 * [Only instantiate #[inline] functions in codegen units referencing
4580   them][36524]. This leads to big improvements in cases where crates export
4581   define many inline functions without using them directly.
4582 * [Lazily allocate TypedArena's first chunk][36592]
4583 * [Don't allocate during default HashSet creation][36734]
4584
4585 Stabilized APIs
4586 ---------------
4587
4588 * [`checked_abs`]
4589 * [`wrapping_abs`]
4590 * [`overflowing_abs`]
4591 * [`RefCell::try_borrow`]
4592 * [`RefCell::try_borrow_mut`]
4593
4594 Libraries
4595 ---------
4596
4597 * [Add `assert_ne!` and `debug_assert_ne!`][35074]
4598 * [Make `vec_deque::Drain`, `hash_map::Drain`, and `hash_set::Drain`
4599   covariant][35354]
4600 * [Implement `AsRef<[T]>` for `std::slice::Iter`][35559]
4601 * [Implement `Debug` for `std::vec::IntoIter`][35707]
4602 * [`CString`: avoid excessive growth just to 0-terminate][35871]
4603 * [Implement `CoerceUnsized` for `{Cell, RefCell, UnsafeCell}`][35627]
4604 * [Use arc4rand on FreeBSD][35884]
4605 * [memrchr: Correct aligned offset computation][35969]
4606 * [Improve Demangling of Rust Symbols][36059]
4607 * [Use monotonic time in condition variables][35048]
4608 * [Implement `Debug` for `std::path::{Components,Iter}`][36101]
4609 * [Implement conversion traits for `char`][35755]
4610 * [Fix illegal instruction caused by overflow in channel cloning][36104]
4611 * [Zero first byte of CString on drop][36264]
4612 * [Inherit overflow checks for sum and product][36372]
4613 * [Add missing Eq implementations][36423]
4614 * [Implement `Debug` for `DirEntry`][36631]
4615 * [When `getaddrinfo` returns `EAI_SYSTEM` retrieve actual error from
4616   `errno`][36754]
4617 * [`SipHasher`] is deprecated. Use [`DefaultHasher`].
4618 * [Implement more traits for `std::io::ErrorKind`][35911]
4619 * [Optimize BinaryHeap bounds checking][36072]
4620 * [Work around pointer aliasing issue in `Vec::extend_from_slice`,
4621   `extend_with_element`][36355]
4622 * [Fix overflow checking in unsigned pow()][34942]
4623
4624 Cargo
4625 -----
4626
4627 * This release includes security fixes to both curl and OpenSSL.
4628 * [Fix transitive doctests when panic=abort][cargo/3021]
4629 * [Add --all-features flag to cargo][cargo/3038]
4630 * [Reject path-based dependencies in `cargo package`][cargo/3060]
4631 * [Don't parse the home directory more than once][cargo/3078]
4632 * [Don't try to generate Cargo.lock on empty workspaces][cargo/3092]
4633 * [Update OpenSSL to 1.0.2j][cargo/3121]
4634 * [Add license and license_file to cargo metadata output][cargo/3110]
4635 * [Make crates-io registry URL optional in config; ignore all changes to
4636   source.crates-io][cargo/3089]
4637 * [Don't download dependencies from other platforms][cargo/3123]
4638 * [Build transitive dev-dependencies when needed][cargo/3125]
4639 * [Add support for per-target rustflags in .cargo/config][cargo/3157]
4640 * [Avoid updating registry when adding existing deps][cargo/3144]
4641 * [Warn about path overrides that won't work][cargo/3136]
4642 * [Use workspaces during `cargo install`][cargo/3146]
4643 * [Leak mspdbsrv.exe processes on Windows][cargo/3162]
4644 * [Add --message-format flag][cargo/3000]
4645 * [Pass target environment for rustdoc][cargo/3205]
4646 * [Use `CommandExt::exec` for `cargo run` on Unix][cargo/2818]
4647 * [Update curl and curl-sys][cargo/3241]
4648 * [Call rustdoc test with the correct cfg flags of a package][cargo/3242]
4649
4650 Tooling
4651 -------
4652
4653 * [rustdoc: Add the `--sysroot` argument][36586]
4654 * [rustdoc: Fix a couple of issues with the search results][35655]
4655 * [rustdoc: remove the `!` from macro URLs and titles][35234]
4656 * [gdb: Fix pretty-printing special-cased Rust types][35585]
4657 * [rustdoc: Filter more incorrect methods inherited through Deref][36266]
4658
4659 Misc
4660 ----
4661
4662 * [Remove unmaintained style guide][35124]
4663 * [Add s390x support][36369]
4664 * [Initial work at Haiku OS support][36727]
4665 * [Add mips-uclibc targets][35734]
4666 * [Crate-ify compiler-rt into compiler-builtins][35021]
4667 * [Add rustc version info (git hash + date) to dist tarball][36213]
4668 * Many documentation improvements
4669
4670 Compatibility Notes
4671 -------------------
4672
4673 * [`SipHasher`] is deprecated. Use [`DefaultHasher`].
4674 * [Deny (by default) transmuting from fn item types to pointer-sized
4675   types][34923]. Continuing the long transition to zero-sized fn items,
4676   per [RFC 401].
4677 * [Fix `#[derive]` for empty tuple structs/variants][35728].
4678   Part of [RFC 1506].
4679 * [Issue deprecation warnings for safe accesses to extern statics][36173]
4680 * [Fix lifetime rules for 'if' conditions][36029].
4681 * [Inherit overflow checks for sum and product][36372].
4682 * [Forbid user-defined macros named "macro_rules"][36730].
4683
4684 [33922]: https://github.com/rust-lang/rust/pull/33922
4685 [34623]: https://github.com/rust-lang/rust/pull/34623
4686 [34923]: https://github.com/rust-lang/rust/pull/34923
4687 [34942]: https://github.com/rust-lang/rust/pull/34942
4688 [34982]: https://github.com/rust-lang/rust/pull/34982
4689 [35021]: https://github.com/rust-lang/rust/pull/35021
4690 [35048]: https://github.com/rust-lang/rust/pull/35048
4691 [35074]: https://github.com/rust-lang/rust/pull/35074
4692 [35124]: https://github.com/rust-lang/rust/pull/35124
4693 [35234]: https://github.com/rust-lang/rust/pull/35234
4694 [35238]: https://github.com/rust-lang/rust/pull/35238
4695 [35354]: https://github.com/rust-lang/rust/pull/35354
4696 [35559]: https://github.com/rust-lang/rust/pull/35559
4697 [35585]: https://github.com/rust-lang/rust/pull/35585
4698 [35627]: https://github.com/rust-lang/rust/pull/35627
4699 [35655]: https://github.com/rust-lang/rust/pull/35655
4700 [35702]: https://github.com/rust-lang/rust/pull/35702
4701 [35707]: https://github.com/rust-lang/rust/pull/35707
4702 [35728]: https://github.com/rust-lang/rust/pull/35728
4703 [35734]: https://github.com/rust-lang/rust/pull/35734
4704 [35755]: https://github.com/rust-lang/rust/pull/35755
4705 [35761]: https://github.com/rust-lang/rust/pull/35761
4706 [35764]: https://github.com/rust-lang/rust/pull/35764
4707 [35814]: https://github.com/rust-lang/rust/pull/35814
4708 [35854]: https://github.com/rust-lang/rust/pull/35854
4709 [35871]: https://github.com/rust-lang/rust/pull/35871
4710 [35884]: https://github.com/rust-lang/rust/pull/35884
4711 [35911]: https://github.com/rust-lang/rust/pull/35911
4712 [35969]: https://github.com/rust-lang/rust/pull/35969
4713 [35975]: https://github.com/rust-lang/rust/pull/35975
4714 [36004]: https://github.com/rust-lang/rust/pull/36004
4715 [36008]: https://github.com/rust-lang/rust/pull/36008
4716 [36014]: https://github.com/rust-lang/rust/pull/36014
4717 [36029]: https://github.com/rust-lang/rust/pull/36029
4718 [36059]: https://github.com/rust-lang/rust/pull/36059
4719 [36072]: https://github.com/rust-lang/rust/pull/36072
4720 [36101]: https://github.com/rust-lang/rust/pull/36101
4721 [36104]: https://github.com/rust-lang/rust/pull/36104
4722 [36171]: https://github.com/rust-lang/rust/pull/36171
4723 [36173]: https://github.com/rust-lang/rust/pull/36173
4724 [36178]: https://github.com/rust-lang/rust/pull/36178
4725 [36213]: https://github.com/rust-lang/rust/pull/36213
4726 [36214]: https://github.com/rust-lang/rust/pull/36214
4727 [36264]: https://github.com/rust-lang/rust/pull/36264
4728 [36266]: https://github.com/rust-lang/rust/pull/36266
4729 [36289]: https://github.com/rust-lang/rust/pull/36289
4730 [36338]: https://github.com/rust-lang/rust/pull/36338
4731 [36351]: https://github.com/rust-lang/rust/pull/36351
4732 [36355]: https://github.com/rust-lang/rust/pull/36355
4733 [36369]: https://github.com/rust-lang/rust/pull/36369
4734 [36372]: https://github.com/rust-lang/rust/pull/36372
4735 [36423]: https://github.com/rust-lang/rust/pull/36423
4736 [36482]: https://github.com/rust-lang/rust/pull/36482
4737 [36505]: https://github.com/rust-lang/rust/pull/36505
4738 [36524]: https://github.com/rust-lang/rust/pull/36524
4739 [36527]: https://github.com/rust-lang/rust/pull/36527
4740 [36551]: https://github.com/rust-lang/rust/pull/36551
4741 [36574]: https://github.com/rust-lang/rust/pull/36574
4742 [36586]: https://github.com/rust-lang/rust/pull/36586
4743 [36592]: https://github.com/rust-lang/rust/pull/36592
4744 [36631]: https://github.com/rust-lang/rust/pull/36631
4745 [36639]: https://github.com/rust-lang/rust/pull/36639
4746 [36721]: https://github.com/rust-lang/rust/pull/36721
4747 [36727]: https://github.com/rust-lang/rust/pull/36727
4748 [36730]: https://github.com/rust-lang/rust/pull/36730
4749 [36734]: https://github.com/rust-lang/rust/pull/36734
4750 [36754]: https://github.com/rust-lang/rust/pull/36754
4751 [36995]: https://github.com/rust-lang/rust/pull/36995
4752 [RFC 0016]: https://github.com/rust-lang/rfcs/blob/master/text/0016-more-attributes.md
4753 [RFC 0243]: https://github.com/rust-lang/rfcs/blob/master/text/0243-trait-based-exception-handling.md
4754 [RFC 1506]: https://github.com/rust-lang/rfcs/blob/master/text/1506-adt-kinds.md
4755 [RFC 401]: https://github.com/rust-lang/rfcs/blob/master/text/0401-coercions.md
4756 [RFC 873]: https://github.com/rust-lang/rfcs/blob/master/text/0873-type-macros.md
4757 [cargo/2818]: https://github.com/rust-lang/cargo/pull/2818
4758 [cargo/3000]: https://github.com/rust-lang/cargo/pull/3000
4759 [cargo/3021]: https://github.com/rust-lang/cargo/pull/3021
4760 [cargo/3038]: https://github.com/rust-lang/cargo/pull/3038
4761 [cargo/3060]: https://github.com/rust-lang/cargo/pull/3060
4762 [cargo/3078]: https://github.com/rust-lang/cargo/pull/3078
4763 [cargo/3089]: https://github.com/rust-lang/cargo/pull/3089
4764 [cargo/3092]: https://github.com/rust-lang/cargo/pull/3092
4765 [cargo/3110]: https://github.com/rust-lang/cargo/pull/3110
4766 [cargo/3121]: https://github.com/rust-lang/cargo/pull/3121
4767 [cargo/3123]: https://github.com/rust-lang/cargo/pull/3123
4768 [cargo/3125]: https://github.com/rust-lang/cargo/pull/3125
4769 [cargo/3136]: https://github.com/rust-lang/cargo/pull/3136
4770 [cargo/3144]: https://github.com/rust-lang/cargo/pull/3144
4771 [cargo/3146]: https://github.com/rust-lang/cargo/pull/3146
4772 [cargo/3157]: https://github.com/rust-lang/cargo/pull/3157
4773 [cargo/3162]: https://github.com/rust-lang/cargo/pull/3162
4774 [cargo/3205]: https://github.com/rust-lang/cargo/pull/3205
4775 [cargo/3241]: https://github.com/rust-lang/cargo/pull/3241
4776 [cargo/3242]: https://github.com/rust-lang/cargo/pull/3242
4777 [rustup]: https://www.rustup.rs
4778 [`checked_abs`]: https://doc.rust-lang.org/std/primitive.i32.html#method.checked_abs
4779 [`wrapping_abs`]: https://doc.rust-lang.org/std/primitive.i32.html#method.wrapping_abs
4780 [`overflowing_abs`]: https://doc.rust-lang.org/std/primitive.i32.html#method.overflowing_abs
4781 [`RefCell::try_borrow`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.try_borrow
4782 [`RefCell::try_borrow_mut`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.try_borrow_mut
4783 [`SipHasher`]: https://doc.rust-lang.org/std/hash/struct.SipHasher.html
4784 [`DefaultHasher`]: https://doc.rust-lang.org/std/collections/hash_map/struct.DefaultHasher.html
4785
4786
4787 Version 1.12.1 (2016-10-20)
4788 ===========================
4789
4790 Regression Fixes
4791 ----------------
4792
4793 * [ICE: 'rustc' panicked at 'assertion failed: concrete_substs.is_normalized_for_trans()' #36381][36381]
4794 * [Confusion with double negation and booleans][36856]
4795 * [rustc 1.12.0 fails with SIGSEGV in release mode (syn crate 0.8.0)][36875]
4796 * [Rustc 1.12.0 Windows build of `ethcore` crate fails with LLVM error][36924]
4797 * [1.12.0: High memory usage when linking in release mode with debug info][36926]
4798 * [Corrupted memory after updated to 1.12][36936]
4799 * ["Let NullaryConstructor = something;" causes internal compiler error: "tried to overwrite interned AdtDef"][37026]
4800 * [Fix ICE: inject bitcast if types mismatch for invokes/calls/stores][37112]
4801 * [debuginfo: Handle spread_arg case in MIR-trans in a more stable way.][37153]
4802
4803 [36381]: https://github.com/rust-lang/rust/issues/36381
4804 [36856]: https://github.com/rust-lang/rust/issues/36856
4805 [36875]: https://github.com/rust-lang/rust/issues/36875
4806 [36924]: https://github.com/rust-lang/rust/issues/36924
4807 [36926]: https://github.com/rust-lang/rust/issues/36926
4808 [36936]: https://github.com/rust-lang/rust/issues/36936
4809 [37026]: https://github.com/rust-lang/rust/issues/37026
4810 [37112]: https://github.com/rust-lang/rust/issues/37112
4811 [37153]: https://github.com/rust-lang/rust/issues/37153
4812
4813
4814 Version 1.12.0 (2016-09-29)
4815 ===========================
4816
4817 Highlights
4818 ----------
4819
4820 * [`rustc` translates code to LLVM IR via its own "middle" IR (MIR)](https://github.com/rust-lang/rust/pull/34096).
4821   This translation pass is far simpler than the previous AST->LLVM pass, and
4822   creates opportunities to perform new optimizations directly on the MIR. It
4823   was previously described [on the Rust blog](https://blog.rust-lang.org/2016/04/19/MIR.html).
4824 * [`rustc` presents a new, more readable error format, along with
4825   machine-readable JSON error output for use by IDEs](https://github.com/rust-lang/rust/pull/35401).
4826   Most common editors supporting Rust have been updated to work with it. It was
4827   previously described [on the Rust blog](https://blog.rust-lang.org/2016/08/10/Shape-of-errors-to-come.html).
4828
4829 Compiler
4830 --------
4831
4832 * [`rustc` translates code to LLVM IR via its own "middle" IR (MIR)](https://github.com/rust-lang/rust/pull/34096).
4833   This translation pass is far simpler than the previous AST->LLVM pass, and
4834   creates opportunities to perform new optimizations directly on the MIR. It
4835   was previously described [on the Rust blog](https://blog.rust-lang.org/2016/04/19/MIR.html).
4836 * [Print the Rust target name, not the LLVM target name, with
4837   `--print target-list`](https://github.com/rust-lang/rust/pull/35489)
4838 * [The computation of `TypeId` is correct in some cases where it was previously
4839   producing inconsistent results](https://github.com/rust-lang/rust/pull/35267)
4840 * [The `mips-unknown-linux-gnu` target uses hardware floating point by default](https://github.com/rust-lang/rust/pull/34910)
4841 * [The `rustc` arguments, `--print target-cpus`, `--print target-features`,
4842   `--print relocation-models`, and `--print code-models` print the available
4843   options to the `-C target-cpu`, `-C target-feature`, `-C relocation-model` and
4844   `-C code-model` code generation arguments](https://github.com/rust-lang/rust/pull/34845)
4845 * [`rustc` supports three new MUSL targets on ARM: `arm-unknown-linux-musleabi`,
4846   `arm-unknown-linux-musleabihf`, and `armv7-unknown-linux-musleabihf`](https://github.com/rust-lang/rust/pull/35060).
4847   These targets produce statically-linked binaries. There are no binary release
4848   builds yet though.
4849
4850 Diagnostics
4851 -----------
4852
4853 * [`rustc` presents a new, more readable error format, along with
4854   machine-readable JSON error output for use by IDEs](https://github.com/rust-lang/rust/pull/35401).
4855   Most common editors supporting Rust have been updated to work with it. It was
4856   previously described [on the Rust blog](https://blog.rust-lang.org/2016/08/10/Shape-of-errors-to-come.html).
4857 * [In error descriptions, references are now described in plain English,
4858   instead of as "&-ptr"](https://github.com/rust-lang/rust/pull/35611)
4859 * [In error type descriptions, unknown numeric types are named `{integer}` or
4860   `{float}` instead of `_`](https://github.com/rust-lang/rust/pull/35080)
4861 * [`rustc` emits a clearer error when inner attributes follow a doc comment](https://github.com/rust-lang/rust/pull/34676)
4862
4863 Language
4864 --------
4865
4866 * [`macro_rules!` invocations can be made within `macro_rules!` invocations](https://github.com/rust-lang/rust/pull/34925)
4867 * [`macro_rules!` meta-variables are hygienic](https://github.com/rust-lang/rust/pull/35453)
4868 * [`macro_rules!` `tt` matchers can be reparsed correctly, making them much more
4869   useful](https://github.com/rust-lang/rust/pull/34908)
4870 * [`macro_rules!` `stmt` matchers correctly consume the entire contents when
4871   inside non-braces invocations](https://github.com/rust-lang/rust/pull/34886)
4872 * [Semicolons are properly required as statement delimiters inside
4873   `macro_rules!` invocations](https://github.com/rust-lang/rust/pull/34660)
4874 * [`cfg_attr` works on `path` attributes](https://github.com/rust-lang/rust/pull/34546)
4875
4876 Stabilized APIs
4877 ---------------
4878
4879 * [`Cell::as_ptr`](https://doc.rust-lang.org/std/cell/struct.Cell.html#method.as_ptr)
4880 * [`RefCell::as_ptr`](https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.as_ptr)
4881 * [`IpAddr::is_unspecified`](https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_unspecified)
4882 * [`IpAddr::is_loopback`](https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_loopback)
4883 * [`IpAddr::is_multicast`](https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_multicast)
4884 * [`Ipv4Addr::is_unspecified`](https://doc.rust-lang.org/std/net/struct.Ipv4Addr.html#method.is_unspecified)
4885 * [`Ipv6Addr::octets`](https://doc.rust-lang.org/std/net/struct.Ipv6Addr.html#method.octets)
4886 * [`LinkedList::contains`](https://doc.rust-lang.org/std/collections/linked_list/struct.LinkedList.html#method.contains)
4887 * [`VecDeque::contains`](https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.contains)
4888 * [`ExitStatusExt::from_raw`](https://doc.rust-lang.org/std/os/unix/process/trait.ExitStatusExt.html#tymethod.from_raw).
4889   Both on Unix and Windows.
4890 * [`Receiver::recv_timeout`](https://doc.rust-lang.org/std/sync/mpsc/struct.Receiver.html#method.recv_timeout)
4891 * [`RecvTimeoutError`](https://doc.rust-lang.org/std/sync/mpsc/enum.RecvTimeoutError.html)
4892 * [`BinaryHeap::peek_mut`](https://doc.rust-lang.org/std/collections/binary_heap/struct.BinaryHeap.html#method.peek_mut)
4893 * [`PeekMut`](https://doc.rust-lang.org/std/collections/binary_heap/struct.PeekMut.html)
4894 * [`iter::Product`](https://doc.rust-lang.org/std/iter/trait.Product.html)
4895 * [`iter::Sum`](https://doc.rust-lang.org/std/iter/trait.Sum.html)
4896 * [`OccupiedEntry::remove_entry`](https://doc.rust-lang.org/std/collections/btree_map/struct.OccupiedEntry.html#method.remove_entry)
4897 * [`VacantEntry::into_key`](https://doc.rust-lang.org/std/collections/btree_map/struct.VacantEntry.html#method.into_key)
4898
4899 Libraries
4900 ---------
4901
4902 * [The `format!` macro and friends now allow a single argument to be formatted
4903   in multiple styles](https://github.com/rust-lang/rust/pull/33642)
4904 * [The lifetime bounds on `[T]::binary_search_by` and
4905   `[T]::binary_search_by_key` have been adjusted to be more flexible](https://github.com/rust-lang/rust/pull/34762)
4906 * [`Option` implements `From` for its contained type](https://github.com/rust-lang/rust/pull/34828)
4907 * [`Cell`, `RefCell` and `UnsafeCell` implement `From` for their contained type](https://github.com/rust-lang/rust/pull/35392)
4908 * [`RwLock` panics if the reader count overflows](https://github.com/rust-lang/rust/pull/35378)
4909 * [`vec_deque::Drain`, `hash_map::Drain` and `hash_set::Drain` are covariant](https://github.com/rust-lang/rust/pull/35354)
4910 * [`vec::Drain` and `binary_heap::Drain` are covariant](https://github.com/rust-lang/rust/pull/34951)
4911 * [`Cow<str>` implements `FromIterator` for `char`, `&str` and `String`](https://github.com/rust-lang/rust/pull/35064)
4912 * [Sockets on Linux are correctly closed in subprocesses via `SOCK_CLOEXEC`](https://github.com/rust-lang/rust/pull/34946)
4913 * [`hash_map::Entry`, `hash_map::VacantEntry` and `hash_map::OccupiedEntry`
4914   implement `Debug`](https://github.com/rust-lang/rust/pull/34937)
4915 * [`btree_map::Entry`, `btree_map::VacantEntry` and `btree_map::OccupiedEntry`
4916   implement `Debug`](https://github.com/rust-lang/rust/pull/34885)
4917 * [`String` implements `AddAssign`](https://github.com/rust-lang/rust/pull/34890)
4918 * [Variadic `extern fn` pointers implement the `Clone`, `PartialEq`, `Eq`,
4919   `PartialOrd`, `Ord`, `Hash`, `fmt::Pointer`, and `fmt::Debug` traits](https://github.com/rust-lang/rust/pull/34879)
4920 * [`FileType` implements `Debug`](https://github.com/rust-lang/rust/pull/34757)
4921 * [References to `Mutex` and `RwLock` are unwind-safe](https://github.com/rust-lang/rust/pull/34756)
4922 * [`mpsc::sync_channel` `Receiver`s return any available message before
4923   reporting a disconnect](https://github.com/rust-lang/rust/pull/34731)
4924 * [Unicode definitions have been updated to 9.0](https://github.com/rust-lang/rust/pull/34599)
4925 * [`env` iterators implement `DoubleEndedIterator`](https://github.com/rust-lang/rust/pull/33312)
4926
4927 Cargo
4928 -----
4929
4930 * [Support local mirrors of registries](https://github.com/rust-lang/cargo/pull/2857)
4931 * [Add support for command aliases](https://github.com/rust-lang/cargo/pull/2679)
4932 * [Allow `opt-level="s"` / `opt-level="z"` in profile overrides](https://github.com/rust-lang/cargo/pull/3007)
4933 * [Make `cargo doc --open --target` work as expected](https://github.com/rust-lang/cargo/pull/2988)
4934 * [Speed up noop registry updates](https://github.com/rust-lang/cargo/pull/2974)
4935 * [Update OpenSSL](https://github.com/rust-lang/cargo/pull/2971)
4936 * [Fix `--panic=abort` with plugins](https://github.com/rust-lang/cargo/pull/2954)
4937 * [Always pass `-C metadata` to the compiler](https://github.com/rust-lang/cargo/pull/2946)
4938 * [Fix depending on git repos with workspaces](https://github.com/rust-lang/cargo/pull/2938)
4939 * [Add a `--lib` flag to `cargo new`](https://github.com/rust-lang/cargo/pull/2921)
4940 * [Add `http.cainfo` for custom certs](https://github.com/rust-lang/cargo/pull/2917)
4941 * [Indicate the compilation profile after compiling](https://github.com/rust-lang/cargo/pull/2909)
4942 * [Allow enabling features for dependencies with `--features`](https://github.com/rust-lang/cargo/pull/2876)
4943 * [Add `--jobs` flag to `cargo package`](https://github.com/rust-lang/cargo/pull/2867)
4944 * [Add `--dry-run` to `cargo publish`](https://github.com/rust-lang/cargo/pull/2849)
4945 * [Add support for `RUSTDOCFLAGS`](https://github.com/rust-lang/cargo/pull/2794)
4946
4947 Performance
4948 -----------
4949
4950 * [`panic::catch_unwind` is more optimized](https://github.com/rust-lang/rust/pull/35444)
4951 * [`panic::catch_unwind` no longer accesses thread-local storage on entry](https://github.com/rust-lang/rust/pull/34866)
4952
4953 Tooling
4954 -------
4955
4956 * [Test binaries now support a `--test-threads` argument to specify the number
4957   of threads used to run tests, and which acts the same as the
4958   `RUST_TEST_THREADS` environment variable](https://github.com/rust-lang/rust/pull/35414)
4959 * [The test runner now emits a warning when tests run over 60 seconds](https://github.com/rust-lang/rust/pull/35405)
4960 * [rustdoc: Fix methods in search results](https://github.com/rust-lang/rust/pull/34752)
4961 * [`rust-lldb` warns about unsupported versions of LLDB](https://github.com/rust-lang/rust/pull/34646)
4962 * [Rust releases now come with source packages that can be installed by rustup
4963   via `rustup component add rust-src`](https://github.com/rust-lang/rust/pull/34366).
4964   The resulting source code can be used by tools and IDES, located in the
4965   sysroot under `lib/rustlib/src`.
4966
4967 Misc
4968 ----
4969
4970 * [The compiler can now be built against LLVM 3.9](https://github.com/rust-lang/rust/pull/35594)
4971 * Many minor improvements to the documentation.
4972 * [The Rust exception handling "personality" routine is now written in Rust](https://github.com/rust-lang/rust/pull/34832)
4973
4974 Compatibility Notes
4975 -------------------
4976
4977 * [When printing Windows `OsStr`s, unpaired surrogate codepoints are escaped
4978   with the lowercase format instead of the uppercase](https://github.com/rust-lang/rust/pull/35084)
4979 * [When formatting strings, if "precision" is specified, the "fill",
4980   "align" and "width" specifiers are no longer ignored](https://github.com/rust-lang/rust/pull/34544)
4981 * [The `Debug` impl for strings no longer escapes all non-ASCII characters](https://github.com/rust-lang/rust/pull/34485)
4982
4983
4984 Version 1.11.0 (2016-08-18)
4985 ===========================
4986
4987 Language
4988 --------
4989
4990 * [Support nested `cfg_attr` attributes](https://github.com/rust-lang/rust/pull/34216)
4991 * [Allow statement-generating braced macro invocations at the end of blocks](https://github.com/rust-lang/rust/pull/34436)
4992 * [Macros can be expanded inside of trait definitions](https://github.com/rust-lang/rust/pull/34213)
4993 * [`#[macro_use]` works properly when it is itself expanded from a macro](https://github.com/rust-lang/rust/pull/34032)
4994
4995 Stabilized APIs
4996 ---------------
4997
4998 * [`BinaryHeap::append`](https://doc.rust-lang.org/std/collections/binary_heap/struct.BinaryHeap.html#method.append)
4999 * [`BTreeMap::append`](https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.append)
5000 * [`BTreeMap::split_off`](https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.split_off)
5001 * [`BTreeSet::append`](https://doc.rust-lang.org/std/collections/btree_set/struct.BTreeSet.html#method.append)
5002 * [`BTreeSet::split_off`](https://doc.rust-lang.org/std/collections/btree_set/struct.BTreeSet.html#method.split_off)
5003 * [`f32::to_degrees`](https://doc.rust-lang.org/std/primitive.f32.html#method.to_degrees)
5004   (in libcore - previously stabilized in libstd)
5005 * [`f32::to_radians`](https://doc.rust-lang.org/std/primitive.f32.html#method.to_radians)
5006   (in libcore - previously stabilized in libstd)
5007 * [`f64::to_degrees`](https://doc.rust-lang.org/std/primitive.f64.html#method.to_degrees)
5008   (in libcore - previously stabilized in libstd)
5009 * [`f64::to_radians`](https://doc.rust-lang.org/std/primitive.f64.html#method.to_radians)
5010   (in libcore - previously stabilized in libstd)
5011 * [`Iterator::sum`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.sum)
5012 * [`Iterator::product`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.sum)
5013 * [`Cell::get_mut`](https://doc.rust-lang.org/std/cell/struct.Cell.html#method.get_mut)
5014 * [`RefCell::get_mut`](https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.get_mut)
5015
5016 Libraries
5017 ---------
5018
5019 * [The `thread_local!` macro supports multiple definitions in a single
5020    invocation, and can apply attributes](https://github.com/rust-lang/rust/pull/34077)
5021 * [`Cow` implements `Default`](https://github.com/rust-lang/rust/pull/34305)
5022 * [`Wrapping` implements binary, octal, lower-hex and upper-hex
5023   `Display` formatting](https://github.com/rust-lang/rust/pull/34190)
5024 * [The range types implement `Hash`](https://github.com/rust-lang/rust/pull/34180)
5025 * [`lookup_host` ignores unknown address types](https://github.com/rust-lang/rust/pull/34067)
5026 * [`assert_eq!` accepts a custom error message, like `assert!` does](https://github.com/rust-lang/rust/pull/33976)
5027 * [The main thread is now called "main" instead of "&lt;main&gt;"](https://github.com/rust-lang/rust/pull/33803)
5028
5029 Cargo
5030 -----
5031
5032 * [Disallow specifying features of transitive deps](https://github.com/rust-lang/cargo/pull/2821)
5033 * [Add color support for Windows consoles](https://github.com/rust-lang/cargo/pull/2804)
5034 * [Fix `harness = false` on `[lib]` sections](https://github.com/rust-lang/cargo/pull/2795)
5035 * [Don't panic when `links` contains a '.'](https://github.com/rust-lang/cargo/pull/2787)
5036 * [Build scripts can emit warnings](https://github.com/rust-lang/cargo/pull/2630),
5037   and `-vv` prints warnings for all crates.
5038 * [Ignore file locks on OS X NFS mounts](https://github.com/rust-lang/cargo/pull/2720)
5039 * [Don't warn about `package.metadata` keys](https://github.com/rust-lang/cargo/pull/2668).
5040   This provides room for expansion by arbitrary tools.
5041 * [Add support for cdylib crate types](https://github.com/rust-lang/cargo/pull/2741)
5042 * [Prevent publishing crates when files are dirty](https://github.com/rust-lang/cargo/pull/2781)
5043 * [Don't fetch all crates on clean](https://github.com/rust-lang/cargo/pull/2704)
5044 * [Propagate --color option to rustc](https://github.com/rust-lang/cargo/pull/2779)
5045 * [Fix `cargo doc --open` on Windows](https://github.com/rust-lang/cargo/pull/2780)
5046 * [Improve autocompletion](https://github.com/rust-lang/cargo/pull/2772)
5047 * [Configure colors of stderr as well as stdout](https://github.com/rust-lang/cargo/pull/2739)
5048
5049 Performance
5050 -----------
5051
5052 * [Caching projections speeds up type check dramatically for some
5053   workloads](https://github.com/rust-lang/rust/pull/33816)
5054 * [The default `HashMap` hasher is SipHash 1-3 instead of SipHash 2-4](https://github.com/rust-lang/rust/pull/33940)
5055   This hasher is faster, but is believed to provide sufficient
5056   protection from collision attacks.
5057 * [Comparison of `Ipv4Addr` is 10x faster](https://github.com/rust-lang/rust/pull/33891)
5058
5059 Rustdoc
5060 -------
5061
5062 * [Fix empty implementation section on some module pages](https://github.com/rust-lang/rust/pull/34536)
5063 * [Fix inlined renamed re-exports in import lists](https://github.com/rust-lang/rust/pull/34479)
5064 * [Fix search result layout for enum variants and struct fields](https://github.com/rust-lang/rust/pull/34477)
5065 * [Fix issues with source links to external crates](https://github.com/rust-lang/rust/pull/34387)
5066 * [Fix redirect pages for renamed re-exports](https://github.com/rust-lang/rust/pull/34245)
5067
5068 Tooling
5069 -------
5070
5071 * [rustc is better at finding the MSVC toolchain](https://github.com/rust-lang/rust/pull/34492)
5072 * [When emitting debug info, rustc emits frame pointers for closures,
5073   shims and glue, as it does for all other functions](https://github.com/rust-lang/rust/pull/33909)
5074 * [rust-lldb warns about unsupported versions of LLDB](https://github.com/rust-lang/rust/pull/34646)
5075 * Many more errors have been given error codes and extended
5076   explanations
5077 * API documentation continues to be improved, with many new examples
5078
5079 Misc
5080 ----
5081
5082 * [rustc no longer hangs when dependencies recursively re-export
5083   submodules](https://github.com/rust-lang/rust/pull/34542)
5084 * [rustc requires LLVM 3.7+](https://github.com/rust-lang/rust/pull/34104)
5085 * [The 'How Safe and Unsafe Interact' chapter of The Rustonomicon was
5086   rewritten](https://github.com/rust-lang/rust/pull/33895)
5087 * [rustc support 16-bit pointer sizes](https://github.com/rust-lang/rust/pull/33460).
5088   No targets use this yet, but it works toward AVR support.
5089
5090 Compatibility Notes
5091 -------------------
5092
5093 * [`const`s and `static`s may not have unsized types](https://github.com/rust-lang/rust/pull/34443)
5094 * [The new follow-set rules that place restrictions on `macro_rules!`
5095   in order to ensure syntax forward-compatibility have been enabled](https://github.com/rust-lang/rust/pull/33982)
5096   This was an [amendment to RFC 550](https://github.com/rust-lang/rfcs/pull/1384),
5097   and has been a warning since 1.10.
5098 * [`cfg` attribute process has been refactored to fix various bugs](https://github.com/rust-lang/rust/pull/33706).
5099   This causes breakage in some corner cases.
5100
5101
5102 Version 1.10.0 (2016-07-07)
5103 ===========================
5104
5105 Language
5106 --------
5107
5108 * [`Copy` types are required to have a trivial implementation of `Clone`](https://github.com/rust-lang/rust/pull/33420).
5109   [RFC 1521](https://github.com/rust-lang/rfcs/blob/master/text/1521-copy-clone-semantics.md).
5110 * [Single-variant enums support the `#[repr(..)]` attribute](https://github.com/rust-lang/rust/pull/33355).
5111 * [Fix `#[derive(RustcEncodable)]` in the presence of other `encode` methods](https://github.com/rust-lang/rust/pull/32908).
5112 * [`panic!` can be converted to a runtime abort with the
5113   `-C panic=abort` flag](https://github.com/rust-lang/rust/pull/32900).
5114   [RFC 1513](https://github.com/rust-lang/rfcs/blob/master/text/1513-less-unwinding.md).
5115 * [Add a new crate type, 'cdylib'](https://github.com/rust-lang/rust/pull/33553).
5116   cdylibs are dynamic libraries suitable for loading by non-Rust hosts.
5117   [RFC 1510](https://github.com/rust-lang/rfcs/blob/master/text/1510-cdylib.md).
5118   Note that Cargo does not yet directly support cdylibs.
5119
5120 Stabilized APIs
5121 ---------------
5122
5123 * `os::windows::fs::OpenOptionsExt::access_mode`
5124 * `os::windows::fs::OpenOptionsExt::share_mode`
5125 * `os::windows::fs::OpenOptionsExt::custom_flags`
5126 * `os::windows::fs::OpenOptionsExt::attributes`
5127 * `os::windows::fs::OpenOptionsExt::security_qos_flags`
5128 * `os::unix::fs::OpenOptionsExt::custom_flags`
5129 * [`sync::Weak::new`](http://doc.rust-lang.org/alloc/arc/struct.Weak.html#method.new)
5130 * `Default for sync::Weak`
5131 * [`panic::set_hook`](http://doc.rust-lang.org/std/panic/fn.set_hook.html)
5132 * [`panic::take_hook`](http://doc.rust-lang.org/std/panic/fn.take_hook.html)
5133 * [`panic::PanicInfo`](http://doc.rust-lang.org/std/panic/struct.PanicInfo.html)
5134 * [`panic::PanicInfo::payload`](http://doc.rust-lang.org/std/panic/struct.PanicInfo.html#method.payload)
5135 * [`panic::PanicInfo::location`](http://doc.rust-lang.org/std/panic/struct.PanicInfo.html#method.location)
5136 * [`panic::Location`](http://doc.rust-lang.org/std/panic/struct.Location.html)
5137 * [`panic::Location::file`](http://doc.rust-lang.org/std/panic/struct.Location.html#method.file)
5138 * [`panic::Location::line`](http://doc.rust-lang.org/std/panic/struct.Location.html#method.line)
5139 * [`ffi::CStr::from_bytes_with_nul`](http://doc.rust-lang.org/std/ffi/struct.CStr.html#method.from_bytes_with_nul)
5140 * [`ffi::CStr::from_bytes_with_nul_unchecked`](http://doc.rust-lang.org/std/ffi/struct.CStr.html#method.from_bytes_with_nul_unchecked)
5141 * [`ffi::FromBytesWithNulError`](http://doc.rust-lang.org/std/ffi/struct.FromBytesWithNulError.html)
5142 * [`fs::Metadata::modified`](http://doc.rust-lang.org/std/fs/struct.Metadata.html#method.modified)
5143 * [`fs::Metadata::accessed`](http://doc.rust-lang.org/std/fs/struct.Metadata.html#method.accessed)
5144 * [`fs::Metadata::created`](http://doc.rust-lang.org/std/fs/struct.Metadata.html#method.created)
5145 * `sync::atomic::Atomic{Usize,Isize,Bool,Ptr}::compare_exchange`
5146 * `sync::atomic::Atomic{Usize,Isize,Bool,Ptr}::compare_exchange_weak`
5147 * `collections::{btree,hash}_map::{Occupied,Vacant,}Entry::key`
5148 * `os::unix::net::{UnixStream, UnixListener, UnixDatagram, SocketAddr}`
5149 * [`SocketAddr::is_unnamed`](http://doc.rust-lang.org/std/os/unix/net/struct.SocketAddr.html#method.is_unnamed)
5150 * [`SocketAddr::as_pathname`](http://doc.rust-lang.org/std/os/unix/net/struct.SocketAddr.html#method.as_pathname)
5151 * [`UnixStream::connect`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.connect)
5152 * [`UnixStream::pair`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.pair)
5153 * [`UnixStream::try_clone`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.try_clone)
5154 * [`UnixStream::local_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.local_addr)
5155 * [`UnixStream::peer_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.peer_addr)
5156 * [`UnixStream::set_read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.read_timeout)
5157 * [`UnixStream::set_write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.write_timeout)
5158 * [`UnixStream::read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.read_timeout)
5159 * [`UnixStream::write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.write_timeout)
5160 * [`UnixStream::set_nonblocking`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.set_nonblocking)
5161 * [`UnixStream::take_error`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.take_error)
5162 * [`UnixStream::shutdown`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.shutdown)
5163 * Read/Write/RawFd impls for `UnixStream`
5164 * [`UnixListener::bind`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.bind)
5165 * [`UnixListener::accept`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.accept)
5166 * [`UnixListener::try_clone`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.try_clone)
5167 * [`UnixListener::local_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.local_addr)
5168 * [`UnixListener::set_nonblocking`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.set_nonblocking)
5169 * [`UnixListener::take_error`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.take_error)
5170 * [`UnixListener::incoming`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.incoming)
5171 * RawFd impls for `UnixListener`
5172 * [`UnixDatagram::bind`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.bind)
5173 * [`UnixDatagram::unbound`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.unbound)
5174 * [`UnixDatagram::pair`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.pair)
5175 * [`UnixDatagram::connect`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.connect)
5176 * [`UnixDatagram::try_clone`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.try_clone)
5177 * [`UnixDatagram::local_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.local_addr)
5178 * [`UnixDatagram::peer_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.peer_addr)
5179 * [`UnixDatagram::recv_from`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.recv_from)
5180 * [`UnixDatagram::recv`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.recv)
5181 * [`UnixDatagram::send_to`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.send_to)
5182 * [`UnixDatagram::send`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.send)
5183 * [`UnixDatagram::set_read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.set_read_timeout)
5184 * [`UnixDatagram::set_write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.set_write_timeout)
5185 * [`UnixDatagram::read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.read_timeout)
5186 * [`UnixDatagram::write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.write_timeout)
5187 * [`UnixDatagram::set_nonblocking`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.set_nonblocking)
5188 * [`UnixDatagram::take_error`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.take_error)
5189 * [`UnixDatagram::shutdown`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.shutdown)
5190 * RawFd impls for `UnixDatagram`
5191 * `{BTree,Hash}Map::values_mut`
5192 * [`<[_]>::binary_search_by_key`](http://doc.rust-lang.org/std/primitive.slice.html#method.binary_search_by_key)
5193
5194 Libraries
5195 ---------
5196
5197 * [The `abs_sub` method of floats is deprecated](https://github.com/rust-lang/rust/pull/33664).
5198   The semantics of this minor method are subtle and probably not what
5199   most people want.
5200 * [Add implementation of Ord for Cell<T> and RefCell<T> where T: Ord](https://github.com/rust-lang/rust/pull/33306).
5201 * [On Linux, if `HashMap`s can't be initialized with `getrandom` they
5202   will fall back to `/dev/urandom` temporarily to avoid blocking
5203   during early boot](https://github.com/rust-lang/rust/pull/33086).
5204 * [Implemented negation for wrapping numerals](https://github.com/rust-lang/rust/pull/33067).
5205 * [Implement `Clone` for `binary_heap::IntoIter`](https://github.com/rust-lang/rust/pull/33050).
5206 * [Implement `Display` and `Hash` for `std::num::Wrapping`](https://github.com/rust-lang/rust/pull/33023).
5207 * [Add `Default` implementation for `&CStr`, `CString`](https://github.com/rust-lang/rust/pull/32990).
5208 * [Implement `From<Vec<T>>` and `Into<Vec<T>>` for `VecDeque<T>`](https://github.com/rust-lang/rust/pull/32866).
5209 * [Implement `Default` for `UnsafeCell`, `fmt::Error`, `Condvar`,
5210   `Mutex`, `RwLock`](https://github.com/rust-lang/rust/pull/32785).
5211
5212 Cargo
5213 -----
5214 * [Cargo.toml supports the `profile.*.panic` option](https://github.com/rust-lang/cargo/pull/2687).
5215   This controls the runtime behavior of the `panic!` macro
5216   and can be either "unwind" (the default), or "abort".
5217   [RFC 1513](https://github.com/rust-lang/rfcs/blob/master/text/1513-less-unwinding.md).
5218 * [Don't throw away errors with `-p` arguments](https://github.com/rust-lang/cargo/pull/2723).
5219 * [Report status to stderr instead of stdout](https://github.com/rust-lang/cargo/pull/2693).
5220 * [Build scripts are passed a `CARGO_MANIFEST_LINKS` environment
5221   variable that corresponds to the `links` field of the manifest](https://github.com/rust-lang/cargo/pull/2710).
5222 * [Ban keywords from crate names](https://github.com/rust-lang/cargo/pull/2707).
5223 * [Canonicalize `CARGO_HOME` on Windows](https://github.com/rust-lang/cargo/pull/2604).
5224 * [Retry network requests](https://github.com/rust-lang/cargo/pull/2396).
5225   By default they are retried twice, which can be customized with the
5226   `net.retry` value in `.cargo/config`.
5227 * [Don't print extra error info for failing subcommands](https://github.com/rust-lang/cargo/pull/2674).
5228 * [Add `--force` flag to `cargo install`](https://github.com/rust-lang/cargo/pull/2405).
5229 * [Don't use `flock` on NFS mounts](https://github.com/rust-lang/cargo/pull/2623).
5230 * [Prefer building `cargo install` artifacts in temporary directories](https://github.com/rust-lang/cargo/pull/2610).
5231   Makes it possible to install multiple crates in parallel.
5232 * [Add `cargo test --doc`](https://github.com/rust-lang/cargo/pull/2578).
5233 * [Add `cargo --explain`](https://github.com/rust-lang/cargo/pull/2551).
5234 * [Don't print warnings when `-q` is passed](https://github.com/rust-lang/cargo/pull/2576).
5235 * [Add `cargo doc --lib` and `--bin`](https://github.com/rust-lang/cargo/pull/2577).
5236 * [Don't require build script output to be UTF-8](https://github.com/rust-lang/cargo/pull/2560).
5237 * [Correctly attempt multiple git usernames](https://github.com/rust-lang/cargo/pull/2584).
5238
5239 Performance
5240 -----------
5241
5242 * [rustc memory usage was reduced by refactoring the context used for
5243   type checking](https://github.com/rust-lang/rust/pull/33425).
5244 * [Speed up creation of `HashMap`s by caching the random keys used
5245   to initialize the hash state](https://github.com/rust-lang/rust/pull/33318).
5246 * [The `find` implementation for `Chain` iterators is 2x faster](https://github.com/rust-lang/rust/pull/33289).
5247 * [Trait selection optimizations speed up type checking by 15%](https://github.com/rust-lang/rust/pull/33138).
5248 * [Efficient trie lookup for boolean Unicode properties](https://github.com/rust-lang/rust/pull/33098).
5249   10x faster than the previous lookup tables.
5250 * [Special case `#[derive(Copy, Clone)]` to avoid bloat](https://github.com/rust-lang/rust/pull/31414).
5251
5252 Usability
5253 ---------
5254
5255 * Many incremental improvements to documentation and rustdoc.
5256 * [rustdoc: List blanket trait impls](https://github.com/rust-lang/rust/pull/33514).
5257 * [rustdoc: Clean up ABI rendering](https://github.com/rust-lang/rust/pull/33151).
5258 * [Indexing with the wrong type produces a more informative error](https://github.com/rust-lang/rust/pull/33401).
5259 * [Improve diagnostics for constants being used in irrefutable patterns](https://github.com/rust-lang/rust/pull/33406).
5260 * [When many method candidates are in scope limit the suggestions to 10](https://github.com/rust-lang/rust/pull/33338).
5261 * [Remove confusing suggestion when calling a `fn` type](https://github.com/rust-lang/rust/pull/33325).
5262 * [Do not suggest changing `&mut self` to `&mut mut self`](https://github.com/rust-lang/rust/pull/33319).
5263
5264 Misc
5265 ----
5266
5267 * [Update i686-linux-android features to match Android ABI](https://github.com/rust-lang/rust/pull/33651).
5268 * [Update aarch64-linux-android features to match Android ABI](https://github.com/rust-lang/rust/pull/33500).
5269 * [`std` no longer prints backtraces on platforms where the running
5270   module must be loaded with `env::current_exe`, which can't be relied
5271   on](https://github.com/rust-lang/rust/pull/33554).
5272 * This release includes std binaries for the i586-unknown-linux-gnu,
5273   i686-unknown-linux-musl, and armv7-linux-androideabi targets. The
5274   i586 target is for old x86 hardware without SSE2, and the armv7
5275   target is for Android running on modern ARM architectures.
5276 * [The `rust-gdb` and `rust-lldb` scripts are distributed on all
5277   Unix platforms](https://github.com/rust-lang/rust/pull/32835).
5278 * [On Unix the runtime aborts by calling `libc::abort` instead of
5279   generating an illegal instruction](https://github.com/rust-lang/rust/pull/31457).
5280 * [Rust is now bootstrapped from the previous release of Rust,
5281   instead of a snapshot from an arbitrary commit](https://github.com/rust-lang/rust/pull/32942).
5282
5283 Compatibility Notes
5284 -------------------
5285
5286 * [`AtomicBool` is now bool-sized, not word-sized](https://github.com/rust-lang/rust/pull/33579).
5287 * [`target_env` for Linux ARM targets is just `gnu`, not
5288   `gnueabihf`, `gnueabi`, etc](https://github.com/rust-lang/rust/pull/33403).
5289 * [Consistently panic on overflow in `Duration::new`](https://github.com/rust-lang/rust/pull/33072).
5290 * [Change `String::truncate` to panic less](https://github.com/rust-lang/rust/pull/32977).
5291 * [Add `:block` to the follow set for `:ty` and `:path`](https://github.com/rust-lang/rust/pull/32945).
5292   Affects how macros are parsed.
5293 * [Fix macro hygiene bug](https://github.com/rust-lang/rust/pull/32923).
5294 * [Feature-gated attributes on macro-generated macro invocations are
5295   now rejected](https://github.com/rust-lang/rust/pull/32791).
5296 * [Suppress fallback and ambiguity errors during type inference](https://github.com/rust-lang/rust/pull/32258).
5297   This caused some minor changes to type inference.
5298
5299
5300 Version 1.9.0 (2016-05-26)
5301 ==========================
5302
5303 Language
5304 --------
5305
5306 * The `#[deprecated]` attribute when applied to an API will generate
5307   warnings when used. The warnings may be suppressed with
5308   `#[allow(deprecated)]`. [RFC 1270].
5309 * [`fn` item types are zero sized, and each `fn` names a unique
5310   type][1.9fn]. This will break code that transmutes `fn`s, so calling
5311   `transmute` on a `fn` type will generate a warning for a few cycles,
5312   then will be converted to an error.
5313 * [Field and method resolution understand visibility, so private
5314   fields and methods cannot prevent the proper use of public fields
5315   and methods][1.9fv].
5316 * [The parser considers unicode codepoints in the
5317   `PATTERN_WHITE_SPACE` category to be whitespace][1.9ws].
5318
5319 Stabilized APIs
5320 ---------------
5321
5322 * [`std::panic`]
5323 * [`std::panic::catch_unwind`] (renamed from `recover`)
5324 * [`std::panic::resume_unwind`] (renamed from `propagate`)
5325 * [`std::panic::AssertUnwindSafe`] (renamed from `AssertRecoverSafe`)
5326 * [`std::panic::UnwindSafe`] (renamed from `RecoverSafe`)
5327 * [`str::is_char_boundary`]
5328 * [`<*const T>::as_ref`]
5329 * [`<*mut T>::as_ref`]
5330 * [`<*mut T>::as_mut`]
5331 * [`AsciiExt::make_ascii_uppercase`]
5332 * [`AsciiExt::make_ascii_lowercase`]
5333 * [`char::decode_utf16`]
5334 * [`char::DecodeUtf16`]
5335 * [`char::DecodeUtf16Error`]
5336 * [`char::DecodeUtf16Error::unpaired_surrogate`]
5337 * [`BTreeSet::take`]
5338 * [`BTreeSet::replace`]
5339 * [`BTreeSet::get`]
5340 * [`HashSet::take`]
5341 * [`HashSet::replace`]
5342 * [`HashSet::get`]
5343 * [`OsString::with_capacity`]
5344 * [`OsString::clear`]
5345 * [`OsString::capacity`]
5346 * [`OsString::reserve`]
5347 * [`OsString::reserve_exact`]
5348 * [`OsStr::is_empty`]
5349 * [`OsStr::len`]
5350 * [`std::os::unix::thread`]
5351 * [`RawPthread`]
5352 * [`JoinHandleExt`]
5353 * [`JoinHandleExt::as_pthread_t`]
5354 * [`JoinHandleExt::into_pthread_t`]
5355 * [`HashSet::hasher`]
5356 * [`HashMap::hasher`]
5357 * [`CommandExt::exec`]
5358 * [`File::try_clone`]
5359 * [`SocketAddr::set_ip`]
5360 * [`SocketAddr::set_port`]
5361 * [`SocketAddrV4::set_ip`]
5362 * [`SocketAddrV4::set_port`]
5363 * [`SocketAddrV6::set_ip`]
5364 * [`SocketAddrV6::set_port`]
5365 * [`SocketAddrV6::set_flowinfo`]
5366 * [`SocketAddrV6::set_scope_id`]
5367 * [`slice::copy_from_slice`]
5368 * [`ptr::read_volatile`]
5369 * [`ptr::write_volatile`]
5370 * [`OpenOptions::create_new`]
5371 * [`TcpStream::set_nodelay`]
5372 * [`TcpStream::nodelay`]
5373 * [`TcpStream::set_ttl`]
5374 * [`TcpStream::ttl`]
5375 * [`TcpStream::set_only_v6`]
5376 * [`TcpStream::only_v6`]
5377 * [`TcpStream::take_error`]
5378 * [`TcpStream::set_nonblocking`]
5379 * [`TcpListener::set_ttl`]
5380 * [`TcpListener::ttl`]
5381 * [`TcpListener::set_only_v6`]
5382 * [`TcpListener::only_v6`]
5383 * [`TcpListener::take_error`]
5384 * [`TcpListener::set_nonblocking`]
5385 * [`UdpSocket::set_broadcast`]
5386 * [`UdpSocket::broadcast`]
5387 * [`UdpSocket::set_multicast_loop_v4`]
5388 * [`UdpSocket::multicast_loop_v4`]
5389 * [`UdpSocket::set_multicast_ttl_v4`]
5390 * [`UdpSocket::multicast_ttl_v4`]
5391 * [`UdpSocket::set_multicast_loop_v6`]
5392 * [`UdpSocket::multicast_loop_v6`]
5393 * [`UdpSocket::set_multicast_ttl_v6`]
5394 * [`UdpSocket::multicast_ttl_v6`]
5395 * [`UdpSocket::set_ttl`]
5396 * [`UdpSocket::ttl`]
5397 * [`UdpSocket::set_only_v6`]
5398 * [`UdpSocket::only_v6`]
5399 * [`UdpSocket::join_multicast_v4`]
5400 * [`UdpSocket::join_multicast_v6`]
5401 * [`UdpSocket::leave_multicast_v4`]
5402 * [`UdpSocket::leave_multicast_v6`]
5403 * [`UdpSocket::take_error`]
5404 * [`UdpSocket::connect`]
5405 * [`UdpSocket::send`]
5406 * [`UdpSocket::recv`]
5407 * [`UdpSocket::set_nonblocking`]
5408
5409 Libraries
5410 ---------
5411
5412 * [`std::sync::Once` is poisoned if its initialization function
5413   fails][1.9o].
5414 * [`cell::Ref` and `cell::RefMut` can contain unsized types][1.9cu].
5415 * [Most types implement `fmt::Debug`][1.9db].
5416 * [The default buffer size used by `BufReader` and `BufWriter` was
5417   reduced to 8K, from 64K][1.9bf]. This is in line with the buffer size
5418   used by other languages.
5419 * [`Instant`, `SystemTime` and `Duration` implement `+=` and `-=`.
5420   `Duration` additionally implements `*=` and `/=`][1.9ta].
5421 * [`Skip` is a `DoubleEndedIterator`][1.9sk].
5422 * [`From<[u8; 4]>` is implemented for `Ipv4Addr`][1.9fi].
5423 * [`Chain` implements `BufRead`][1.9ch].
5424 * [`HashMap`, `HashSet` and iterators are covariant][1.9hc].
5425
5426 Cargo
5427 -----
5428
5429 * [Cargo can now run concurrently][1.9cc].
5430 * [Top-level overrides allow specific revisions of crates to be
5431   overridden through the entire crate graph][1.9ct].  This is intended
5432   to make upgrades easier for large projects, by allowing crates to be
5433   forked temporarily until they've been upgraded and republished.
5434 * [Cargo exports a `CARGO_PKG_AUTHORS` environment variable][1.9cp].
5435 * [Cargo will pass the contents of the `RUSTFLAGS` variable to `rustc`
5436   on the commandline][1.9cf]. `rustc` arguments can also be specified
5437   in the `build.rustflags` configuration key.
5438
5439 Performance
5440 -----------
5441
5442 * [The time complexity of comparing variables for equivalence during type
5443   unification is reduced from _O_(_n_!) to _O_(_n_)][1.9tu]. This leads
5444   to major compilation time improvement in some scenarios.
5445 * [`ToString` is specialized for `str`, giving it the same performance
5446   as `to_owned`][1.9ts].
5447 * [Spawning processes with `Command::output` no longer creates extra
5448   threads][1.9sp].
5449 * [`#[derive(PartialEq)]` and `#[derive(PartialOrd)]` emit less code
5450   for C-like enums][1.9cl].
5451
5452 Misc
5453 ----
5454
5455 * [Passing the `--quiet` flag to a test runner will produce
5456   much-abbreviated output][1.9q].
5457 * The Rust Project now publishes std binaries for the
5458   `mips-unknown-linux-musl`, `mipsel-unknown-linux-musl`, and
5459   `i586-pc-windows-msvc` targets.
5460
5461 Compatibility Notes
5462 -------------------
5463
5464 * [`std::sync::Once` is poisoned if its initialization function
5465   fails][1.9o].
5466 * [It is illegal to define methods with the same name in overlapping
5467   inherent `impl` blocks][1.9sn].
5468 * [`fn` item types are zero sized, and each `fn` names a unique
5469   type][1.9fn]. This will break code that transmutes `fn`s, so calling
5470   `transmute` on a `fn` type will generate a warning for a few cycles,
5471   then will be converted to an error.
5472 * [Improvements to const evaluation may trigger new errors when integer
5473   literals are out of range][1.9ce].
5474
5475
5476 [1.9bf]: https://github.com/rust-lang/rust/pull/32695
5477 [1.9cc]: https://github.com/rust-lang/cargo/pull/2486
5478 [1.9ce]: https://github.com/rust-lang/rust/pull/30587
5479 [1.9cf]: https://github.com/rust-lang/cargo/pull/2241
5480 [1.9ch]: https://github.com/rust-lang/rust/pull/32541
5481 [1.9cl]: https://github.com/rust-lang/rust/pull/31977
5482 [1.9cp]: https://github.com/rust-lang/cargo/pull/2465
5483 [1.9ct]: https://github.com/rust-lang/cargo/pull/2385
5484 [1.9cu]: https://github.com/rust-lang/rust/pull/32652
5485 [1.9db]: https://github.com/rust-lang/rust/pull/32054
5486 [1.9fi]: https://github.com/rust-lang/rust/pull/32050
5487 [1.9fn]: https://github.com/rust-lang/rust/pull/31710
5488 [1.9fv]: https://github.com/rust-lang/rust/pull/31938
5489 [1.9hc]: https://github.com/rust-lang/rust/pull/32635
5490 [1.9o]: https://github.com/rust-lang/rust/pull/32325
5491 [1.9q]: https://github.com/rust-lang/rust/pull/31887
5492 [1.9sk]: https://github.com/rust-lang/rust/pull/31700
5493 [1.9sn]: https://github.com/rust-lang/rust/pull/31925
5494 [1.9sp]: https://github.com/rust-lang/rust/pull/31618
5495 [1.9ta]: https://github.com/rust-lang/rust/pull/32448
5496 [1.9ts]: https://github.com/rust-lang/rust/pull/32586
5497 [1.9tu]: https://github.com/rust-lang/rust/pull/32062
5498 [1.9ws]: https://github.com/rust-lang/rust/pull/29734
5499 [RFC 1270]: https://github.com/rust-lang/rfcs/blob/master/text/1270-deprecation.md
5500 [`<*const T>::as_ref`]: http://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.as_ref
5501 [`<*mut T>::as_mut`]: http://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.as_mut
5502 [`<*mut T>::as_ref`]: http://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.as_ref
5503 [`slice::copy_from_slice`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.copy_from_slice
5504 [`AsciiExt::make_ascii_lowercase`]: http://doc.rust-lang.org/nightly/std/ascii/trait.AsciiExt.html#tymethod.make_ascii_lowercase
5505 [`AsciiExt::make_ascii_uppercase`]: http://doc.rust-lang.org/nightly/std/ascii/trait.AsciiExt.html#tymethod.make_ascii_uppercase
5506 [`BTreeSet::get`]: http://doc.rust-lang.org/nightly/collections/btree/set/struct.BTreeSet.html#method.get
5507 [`BTreeSet::replace`]: http://doc.rust-lang.org/nightly/collections/btree/set/struct.BTreeSet.html#method.replace
5508 [`BTreeSet::take`]: http://doc.rust-lang.org/nightly/collections/btree/set/struct.BTreeSet.html#method.take
5509 [`CommandExt::exec`]: http://doc.rust-lang.org/nightly/std/os/unix/process/trait.CommandExt.html#tymethod.exec
5510 [`File::try_clone`]: http://doc.rust-lang.org/nightly/std/fs/struct.File.html#method.try_clone
5511 [`HashMap::hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashMap.html#method.hasher
5512 [`HashSet::get`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.get
5513 [`HashSet::hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.hasher
5514 [`HashSet::replace`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.replace
5515 [`HashSet::take`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.take
5516 [`JoinHandleExt::as_pthread_t`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/trait.JoinHandleExt.html#tymethod.as_pthread_t
5517 [`JoinHandleExt::into_pthread_t`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/trait.JoinHandleExt.html#tymethod.into_pthread_t
5518 [`JoinHandleExt`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/trait.JoinHandleExt.html
5519 [`OpenOptions::create_new`]: http://doc.rust-lang.org/nightly/std/fs/struct.OpenOptions.html#method.create_new
5520 [`OsStr::is_empty`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsStr.html#method.is_empty
5521 [`OsStr::len`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsStr.html#method.len
5522 [`OsString::capacity`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.capacity
5523 [`OsString::clear`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.clear
5524 [`OsString::reserve_exact`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.reserve_exact
5525 [`OsString::reserve`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.reserve
5526 [`OsString::with_capacity`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.with_capacity
5527 [`RawPthread`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/type.RawPthread.html
5528 [`SocketAddr::set_ip`]: http://doc.rust-lang.org/nightly/std/net/enum.SocketAddr.html#method.set_ip
5529 [`SocketAddr::set_port`]: http://doc.rust-lang.org/nightly/std/net/enum.SocketAddr.html#method.set_port
5530 [`SocketAddrV4::set_ip`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV4.html#method.set_ip
5531 [`SocketAddrV4::set_port`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV4.html#method.set_port
5532 [`SocketAddrV6::set_flowinfo`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_flowinfo
5533 [`SocketAddrV6::set_ip`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_ip
5534 [`SocketAddrV6::set_port`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_port
5535 [`SocketAddrV6::set_scope_id`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_scope_id
5536 [`TcpListener::only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.only_v6
5537 [`TcpListener::set_nonblocking`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_nonblocking
5538 [`TcpListener::set_only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_only_v6
5539 [`TcpListener::set_ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_ttl
5540 [`TcpListener::take_error`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.take_error
5541 [`TcpListener::ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.ttl
5542 [`TcpStream::nodelay`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.nodelay
5543 [`TcpStream::only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.only_v6
5544 [`TcpStream::set_nodelay`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_nodelay
5545 [`TcpStream::set_nonblocking`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_nonblocking
5546 [`TcpStream::set_only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_only_v6
5547 [`TcpStream::set_ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_ttl
5548 [`TcpStream::take_error`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.take_error
5549 [`TcpStream::ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.ttl
5550 [`UdpSocket::broadcast`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.broadcast
5551 [`UdpSocket::connect`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.connect
5552 [`UdpSocket::join_multicast_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.join_multicast_v4
5553 [`UdpSocket::join_multicast_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.join_multicast_v6
5554 [`UdpSocket::leave_multicast_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.leave_multicast_v4
5555 [`UdpSocket::leave_multicast_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.leave_multicast_v6
5556 [`UdpSocket::multicast_loop_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_loop_v4
5557 [`UdpSocket::multicast_loop_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_loop_v6
5558 [`UdpSocket::multicast_ttl_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_ttl_v4
5559 [`UdpSocket::multicast_ttl_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_ttl_v6
5560 [`UdpSocket::only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.only_v6
5561 [`UdpSocket::recv`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.recv
5562 [`UdpSocket::send`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.send
5563 [`UdpSocket::set_broadcast`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_broadcast
5564 [`UdpSocket::set_multicast_loop_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_loop_v4
5565 [`UdpSocket::set_multicast_loop_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_loop_v6
5566 [`UdpSocket::set_multicast_ttl_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_ttl_v4
5567 [`UdpSocket::set_multicast_ttl_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_ttl_v6
5568 [`UdpSocket::set_nonblocking`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_nonblocking
5569 [`UdpSocket::set_only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_only_v6
5570 [`UdpSocket::set_ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_ttl
5571 [`UdpSocket::take_error`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.take_error
5572 [`UdpSocket::ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.ttl
5573 [`char::DecodeUtf16Error::unpaired_surrogate`]: http://doc.rust-lang.org/nightly/std/char/struct.DecodeUtf16Error.html#method.unpaired_surrogate
5574 [`char::DecodeUtf16Error`]: http://doc.rust-lang.org/nightly/std/char/struct.DecodeUtf16Error.html
5575 [`char::DecodeUtf16`]: http://doc.rust-lang.org/nightly/std/char/struct.DecodeUtf16.html
5576 [`char::decode_utf16`]: http://doc.rust-lang.org/nightly/std/char/fn.decode_utf16.html
5577 [`ptr::read_volatile`]: http://doc.rust-lang.org/nightly/std/ptr/fn.read_volatile.html
5578 [`ptr::write_volatile`]: http://doc.rust-lang.org/nightly/std/ptr/fn.write_volatile.html
5579 [`std::os::unix::thread`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/index.html
5580 [`std::panic::AssertUnwindSafe`]: http://doc.rust-lang.org/nightly/std/panic/struct.AssertUnwindSafe.html
5581 [`std::panic::UnwindSafe`]: http://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html
5582 [`std::panic::catch_unwind`]: http://doc.rust-lang.org/nightly/std/panic/fn.catch_unwind.html
5583 [`std::panic::resume_unwind`]: http://doc.rust-lang.org/nightly/std/panic/fn.resume_unwind.html
5584 [`std::panic`]: http://doc.rust-lang.org/nightly/std/panic/index.html
5585 [`str::is_char_boundary`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.is_char_boundary
5586
5587
5588 Version 1.8.0 (2016-04-14)
5589 ==========================
5590
5591 Language
5592 --------
5593
5594 * Rust supports overloading of compound assignment statements like
5595   `+=` by implementing the [`AddAssign`], [`SubAssign`],
5596   [`MulAssign`], [`DivAssign`], [`RemAssign`], [`BitAndAssign`],
5597   [`BitOrAssign`], [`BitXorAssign`], [`ShlAssign`], or [`ShrAssign`]
5598   traits. [RFC 953].
5599 * Empty structs can be defined with braces, as in `struct Foo { }`, in
5600   addition to the non-braced form, `struct Foo;`. [RFC 218].
5601
5602 Libraries
5603 ---------
5604
5605 * Stabilized APIs:
5606   * [`str::encode_utf16`] (renamed from `utf16_units`)
5607   * [`str::EncodeUtf16`] (renamed from `Utf16Units`)
5608   * [`Ref::map`]
5609   * [`RefMut::map`]
5610   * [`ptr::drop_in_place`]
5611   * [`time::Instant`]
5612   * [`time::SystemTime`]
5613   * [`Instant::now`]
5614   * [`Instant::duration_since`] (renamed from `duration_from_earlier`)
5615   * [`Instant::elapsed`]
5616   * [`SystemTime::now`]
5617   * [`SystemTime::duration_since`] (renamed from `duration_from_earlier`)
5618   * [`SystemTime::elapsed`]
5619   * Various `Add`/`Sub` impls for `Time` and `SystemTime`
5620   * [`SystemTimeError`]
5621   * [`SystemTimeError::duration`]
5622   * Various impls for `SystemTimeError`
5623   * [`UNIX_EPOCH`]
5624   * [`AddAssign`], [`SubAssign`], [`MulAssign`], [`DivAssign`],
5625     [`RemAssign`], [`BitAndAssign`], [`BitOrAssign`],
5626     [`BitXorAssign`], [`ShlAssign`], [`ShrAssign`].
5627 * [The `write!` and `writeln!` macros correctly emit errors if any of
5628   their arguments can't be formatted][1.8w].
5629 * [Various I/O functions support large files on 32-bit Linux][1.8l].
5630 * [The Unix-specific `raw` modules, which contain a number of
5631   redefined C types are deprecated][1.8r], including `os::raw::unix`,
5632   `os::raw::macos`, and `os::raw::linux`. These modules defined types
5633   such as `ino_t` and `dev_t`. The inconsistency of these definitions
5634   across platforms was making it difficult to implement `std`
5635   correctly. Those that need these definitions should use the `libc`
5636   crate. [RFC 1415].
5637 * The Unix-specific `MetadataExt` traits, including
5638   `os::unix::fs::MetadataExt`, which expose values such as inode
5639   numbers [no longer return platform-specific types][1.8r], but
5640   instead return widened integers. [RFC 1415].
5641 * [`btree_set::{IntoIter, Iter, Range}` are covariant][1.8cv].
5642 * [Atomic loads and stores are not volatile][1.8a].
5643 * [All types in `sync::mpsc` implement `fmt::Debug`][1.8mp].
5644
5645 Performance
5646 -----------
5647
5648 * [Inlining hash functions lead to a 3% compile-time improvement in
5649   some workloads][1.8h].
5650 * When using jemalloc, its symbols are [unprefixed so that it
5651   overrides the libc malloc implementation][1.8h]. This means that for
5652   rustc, LLVM is now using jemalloc, which results in a 6%
5653   compile-time improvement on a specific workload.
5654 * [Avoid quadratic growth in function size due to cleanups][1.8cu].
5655
5656 Misc
5657 ----
5658
5659 * [32-bit MSVC builds finally implement unwinding][1.8ms].
5660   i686-pc-windows-msvc is now considered a tier-1 platform.
5661 * [The `--print targets` flag prints a list of supported targets][1.8t].
5662 * [The `--print cfg` flag prints the `cfg`s defined for the current
5663   target][1.8cf].
5664 * [`rustc` can be built with an new Cargo-based build system, written
5665   in Rust][1.8b].  It will eventually replace Rust's Makefile-based
5666   build system. To enable it configure with `configure --rustbuild`.
5667 * [Errors for non-exhaustive `match` patterns now list up to 3 missing
5668   variants while also indicating the total number of missing variants
5669   if more than 3][1.8m].
5670 * [Executable stacks are disabled on Linux and BSD][1.8nx].
5671 * The Rust Project now publishes binary releases of the standard
5672   library for a number of tier-2 targets:
5673   `armv7-unknown-linux-gnueabihf`, `powerpc-unknown-linux-gnu`,
5674   `powerpc64-unknown-linux-gnu`, `powerpc64le-unknown-linux-gnu`
5675   `x86_64-rumprun-netbsd`. These can be installed with
5676   tools such as [multirust][1.8mr].
5677
5678 Cargo
5679 -----
5680
5681 * [`cargo init` creates a new Cargo project in the current
5682   directory][1.8ci].  It is otherwise like `cargo new`.
5683 * [Cargo has configuration keys for `-v` and
5684   `--color`][1.8cc]. `verbose` and `color`, respectively, go in the
5685   `[term]` section of `.cargo/config`.
5686 * [Configuration keys that evaluate to strings or integers can be set
5687   via environment variables][1.8ce]. For example the `build.jobs` key
5688   can be set via `CARGO_BUILD_JOBS`. Environment variables take
5689   precedence over config files.
5690 * [Target-specific dependencies support Rust `cfg` syntax for
5691   describing targets][1.8cfg] so that dependencies for multiple
5692   targets can be specified together. [RFC 1361].
5693 * [The environment variables `CARGO_TARGET_ROOT`, `RUSTC`, and
5694   `RUSTDOC` take precedence over the `build.target-dir`,
5695   `build.rustc`, and `build.rustdoc` configuration values][1.8cv].
5696 * [The child process tree is killed on Windows when Cargo is
5697   killed][1.8ck].
5698 * [The `build.target` configuration value sets the target platform,
5699   like `--target`][1.8ct].
5700
5701 Compatibility Notes
5702 -------------------
5703
5704 * [Unstable compiler flags have been further restricted][1.8u]. Since
5705   1.0 `-Z` flags have been considered unstable, and other flags that
5706   were considered unstable additionally required passing `-Z
5707   unstable-options` to access. Unlike unstable language and library
5708   features though, these options have been accessible on the stable
5709   release channel. Going forward, *new unstable flags will not be
5710   available on the stable release channel*, and old unstable flags
5711   will warn about their usage. In the future, all unstable flags will
5712   be unavailable on the stable release channel.
5713 * [It is no longer possible to `match` on empty enum variants using
5714   the `Variant(..)` syntax][1.8v]. This has been a warning since 1.6.
5715 * The Unix-specific `MetadataExt` traits, including
5716   `os::unix::fs::MetadataExt`, which expose values such as inode
5717   numbers [no longer return platform-specific types][1.8r], but
5718   instead return widened integers. [RFC 1415].
5719 * [Modules sourced from the filesystem cannot appear within arbitrary
5720   blocks, but only within other modules][1.8mf].
5721 * [`--cfg` compiler flags are parsed strictly as identifiers][1.8c].
5722 * On Unix, [stack overflow triggers a runtime abort instead of a
5723   SIGSEGV][1.8so].
5724 * [`Command::spawn` and its equivalents return an error if any of
5725   its command-line arguments contain interior `NUL`s][1.8n].
5726 * [Tuple and unit enum variants from other crates are in the type
5727   namespace][1.8tn].
5728 * [On Windows `rustc` emits `.lib` files for the `staticlib` library
5729   type instead of `.a` files][1.8st]. Additionally, for the MSVC
5730   toolchain, `rustc` emits import libraries named `foo.dll.lib`
5731   instead of `foo.lib`.
5732
5733
5734 [1.8a]: https://github.com/rust-lang/rust/pull/30962
5735 [1.8b]: https://github.com/rust-lang/rust/pull/31123
5736 [1.8c]: https://github.com/rust-lang/rust/pull/31530
5737 [1.8cc]: https://github.com/rust-lang/cargo/pull/2397
5738 [1.8ce]: https://github.com/rust-lang/cargo/pull/2398
5739 [1.8cf]: https://github.com/rust-lang/rust/pull/31278
5740 [1.8cfg]: https://github.com/rust-lang/cargo/pull/2328
5741 [1.8ci]: https://github.com/rust-lang/cargo/pull/2081
5742 [1.8ck]: https://github.com/rust-lang/cargo/pull/2370
5743 [1.8ct]: https://github.com/rust-lang/cargo/pull/2335
5744 [1.8cu]: https://github.com/rust-lang/rust/pull/31390
5745 [1.8cv]: https://github.com/rust-lang/cargo/issues/2365
5746 [1.8cv]: https://github.com/rust-lang/rust/pull/30998
5747 [1.8h]: https://github.com/rust-lang/rust/pull/31460
5748 [1.8l]: https://github.com/rust-lang/rust/pull/31668
5749 [1.8m]: https://github.com/rust-lang/rust/pull/31020
5750 [1.8mf]: https://github.com/rust-lang/rust/pull/31534
5751 [1.8mp]: https://github.com/rust-lang/rust/pull/30894
5752 [1.8mr]: https://users.rust-lang.org/t/multirust-0-8-with-cross-std-installation/4901
5753 [1.8ms]: https://github.com/rust-lang/rust/pull/30448
5754 [1.8n]: https://github.com/rust-lang/rust/pull/31056
5755 [1.8nx]: https://github.com/rust-lang/rust/pull/30859
5756 [1.8r]: https://github.com/rust-lang/rust/pull/31551
5757 [1.8so]: https://github.com/rust-lang/rust/pull/31333
5758 [1.8st]: https://github.com/rust-lang/rust/pull/29520
5759 [1.8t]: https://github.com/rust-lang/rust/pull/31358
5760 [1.8tn]: https://github.com/rust-lang/rust/pull/30882
5761 [1.8u]: https://github.com/rust-lang/rust/pull/31793
5762 [1.8v]: https://github.com/rust-lang/rust/pull/31757
5763 [1.8w]: https://github.com/rust-lang/rust/pull/31904
5764 [RFC 1361]: https://github.com/rust-lang/rfcs/blob/master/text/1361-cargo-cfg-dependencies.md
5765 [RFC 1415]: https://github.com/rust-lang/rfcs/blob/master/text/1415-trim-std-os.md
5766 [RFC 218]: https://github.com/rust-lang/rfcs/blob/master/text/0218-empty-struct-with-braces.md
5767 [RFC 953]: https://github.com/rust-lang/rfcs/blob/master/text/0953-op-assign.md
5768 [`AddAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.AddAssign.html
5769 [`BitAndAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.BitAndAssign.html
5770 [`BitOrAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.BitOrAssign.html
5771 [`BitXorAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.BitXorAssign.html
5772 [`DivAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.DivAssign.html
5773 [`Instant::duration_since`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html#method.duration_since
5774 [`Instant::elapsed`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html#method.elapsed
5775 [`Instant::now`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html#method.now
5776 [`MulAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.MulAssign.html
5777 [`Ref::map`]: http://doc.rust-lang.org/nightly/std/cell/struct.Ref.html#method.map
5778 [`RefMut::map`]: http://doc.rust-lang.org/nightly/std/cell/struct.RefMut.html#method.map
5779 [`RemAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.RemAssign.html
5780 [`ShlAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.ShlAssign.html
5781 [`ShrAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.ShrAssign.html
5782 [`SubAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.SubAssign.html
5783 [`SystemTime::duration_since`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html#method.duration_since
5784 [`SystemTime::elapsed`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html#method.elapsed
5785 [`SystemTime::now`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html#method.now
5786 [`SystemTimeError::duration`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTimeError.html#method.duration
5787 [`SystemTimeError`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTimeError.html
5788 [`UNIX_EPOCH`]: http://doc.rust-lang.org/nightly/std/time/constant.UNIX_EPOCH.html
5789 [`ptr::drop_in_place`]: http://doc.rust-lang.org/nightly/std/ptr/fn.drop_in_place.html
5790 [`str::EncodeUtf16`]: http://doc.rust-lang.org/nightly/std/str/struct.EncodeUtf16.html
5791 [`str::encode_utf16`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.encode_utf16
5792 [`time::Instant`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html
5793 [`time::SystemTime`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html
5794
5795
5796 Version 1.7.0 (2016-03-03)
5797 ==========================
5798
5799 Libraries
5800 ---------
5801
5802 * Stabilized APIs
5803   * `Path`
5804     * [`Path::strip_prefix`] (renamed from relative_from)
5805     * [`path::StripPrefixError`] (new error type returned from strip_prefix)
5806   * `Ipv4Addr`
5807     * [`Ipv4Addr::is_loopback`]
5808     * [`Ipv4Addr::is_private`]
5809     * [`Ipv4Addr::is_link_local`]
5810     * [`Ipv4Addr::is_multicast`]
5811     * [`Ipv4Addr::is_broadcast`]
5812     * [`Ipv4Addr::is_documentation`]
5813   * `Ipv6Addr`
5814     * [`Ipv6Addr::is_unspecified`]
5815     * [`Ipv6Addr::is_loopback`]
5816     * [`Ipv6Addr::is_multicast`]
5817   * `Vec`
5818     * [`Vec::as_slice`]
5819     * [`Vec::as_mut_slice`]
5820   * `String`
5821     * [`String::as_str`]
5822     * [`String::as_mut_str`]
5823   * Slices
5824     * `<[T]>::`[`clone_from_slice`], which now requires the two slices to
5825     be the same length
5826     * `<[T]>::`[`sort_by_key`]
5827   * checked, saturated, and overflowing operations
5828     * [`i32::checked_rem`], [`i32::checked_neg`], [`i32::checked_shl`], [`i32::checked_shr`]
5829     * [`i32::saturating_mul`]
5830     * [`i32::overflowing_add`], [`i32::overflowing_sub`], [`i32::overflowing_mul`], [`i32::overflowing_div`]
5831     * [`i32::overflowing_rem`], [`i32::overflowing_neg`], [`i32::overflowing_shl`], [`i32::overflowing_shr`]
5832     * [`u32::checked_rem`], [`u32::checked_neg`], [`u32::checked_shl`], [`u32::checked_shl`]
5833     * [`u32::saturating_mul`]
5834     * [`u32::overflowing_add`], [`u32::overflowing_sub`], [`u32::overflowing_mul`], [`u32::overflowing_div`]
5835     * [`u32::overflowing_rem`], [`u32::overflowing_neg`], [`u32::overflowing_shl`], [`u32::overflowing_shr`]
5836     * and checked, saturated, and overflowing operations for other primitive types
5837   * FFI
5838     * [`ffi::IntoStringError`]
5839     * [`CString::into_string`]
5840     * [`CString::into_bytes`]
5841     * [`CString::into_bytes_with_nul`]
5842     * `From<CString> for Vec<u8>`
5843   * `IntoStringError`
5844     * [`IntoStringError::into_cstring`]
5845     * [`IntoStringError::utf8_error`]
5846     * `Error for IntoStringError`
5847   * Hashing
5848     * [`std::hash::BuildHasher`]
5849     * [`BuildHasher::Hasher`]
5850     * [`BuildHasher::build_hasher`]
5851     * [`std::hash::BuildHasherDefault`]
5852     * [`HashMap::with_hasher`]
5853     * [`HashMap::with_capacity_and_hasher`]
5854     * [`HashSet::with_hasher`]
5855     * [`HashSet::with_capacity_and_hasher`]
5856     * [`std::collections::hash_map::RandomState`]
5857     * [`RandomState::new`]
5858 * [Validating UTF-8 is faster by a factor of between 7 and 14x for
5859   ASCII input][1.7utf8]. This means that creating `String`s and `str`s
5860   from bytes is faster.
5861 * [The performance of `LineWriter` (and thus `io::stdout`) was
5862   improved by using `memchr` to search for newlines][1.7m].
5863 * [`f32::to_degrees` and `f32::to_radians` are stable][1.7f]. The
5864   `f64` variants were stabilized previously.
5865 * [`BTreeMap` was rewritten to use less memory and improve the performance
5866   of insertion and iteration, the latter by as much as 5x][1.7bm].
5867 * [`BTreeSet` and its iterators, `Iter`, `IntoIter`, and `Range` are
5868   covariant over their contained type][1.7bt].
5869 * [`LinkedList` and its iterators, `Iter` and `IntoIter` are covariant
5870   over their contained type][1.7ll].
5871 * [`str::replace` now accepts a `Pattern`][1.7rp], like other string
5872   searching methods.
5873 * [`Any` is implemented for unsized types][1.7a].
5874 * [`Hash` is implemented for `Duration`][1.7h].
5875
5876 Misc
5877 ----
5878
5879 * [When running tests with `--test`, rustdoc will pass `--cfg`
5880   arguments to the compiler][1.7dt].
5881 * [The compiler is built with RPATH information by default][1.7rpa].
5882   This means that it will be possible to run `rustc` when installed in
5883   unusual configurations without configuring the dynamic linker search
5884   path explicitly.
5885 * [`rustc` passes `--enable-new-dtags` to GNU ld][1.7dta]. This makes
5886   any RPATH entries (emitted with `-C rpath`) *not* take precedence
5887   over `LD_LIBRARY_PATH`.
5888
5889 Cargo
5890 -----
5891
5892 * [`cargo rustc` accepts a `--profile` flag that runs `rustc` under
5893   any of the compilation profiles, 'dev', 'bench', or 'test'][1.7cp].
5894 * [The `rerun-if-changed` build script directive no longer causes the
5895   build script to incorrectly run twice in certain scenarios][1.7rr].
5896
5897 Compatibility Notes
5898 -------------------
5899
5900 * Soundness fixes to the interactions between associated types and
5901   lifetimes, specified in [RFC 1214], [now generate errors][1.7sf] for
5902   code that violates the new rules. This is a significant change that
5903   is known to break existing code, so it has emitted warnings for the
5904   new error cases since 1.4 to give crate authors time to adapt. The
5905   details of what is changing are subtle; read the RFC for more.
5906 * [Several bugs in the compiler's visibility calculations were
5907   fixed][1.7v]. Since this was found to break significant amounts of
5908   code, the new errors will be emitted as warnings for several release
5909   cycles, under the `private_in_public` lint.
5910 * Defaulted type parameters were accidentally accepted in positions
5911   that were not intended. In this release, [defaulted type parameters
5912   appearing outside of type definitions will generate a
5913   warning][1.7d], which will become an error in future releases.
5914 * [Parsing "." as a float results in an error instead of 0][1.7p].
5915   That is, `".".parse::<f32>()` returns `Err`, not `Ok(0.0)`.
5916 * [Borrows of closure parameters may not outlive the closure][1.7bc].
5917
5918 [1.7a]: https://github.com/rust-lang/rust/pull/30928
5919 [1.7bc]: https://github.com/rust-lang/rust/pull/30341
5920 [1.7bm]: https://github.com/rust-lang/rust/pull/30426
5921 [1.7bt]: https://github.com/rust-lang/rust/pull/30998
5922 [1.7cp]: https://github.com/rust-lang/cargo/pull/2224
5923 [1.7d]: https://github.com/rust-lang/rust/pull/30724
5924 [1.7dt]: https://github.com/rust-lang/rust/pull/30372
5925 [1.7dta]: https://github.com/rust-lang/rust/pull/30394
5926 [1.7f]: https://github.com/rust-lang/rust/pull/30672
5927 [1.7h]: https://github.com/rust-lang/rust/pull/30818
5928 [1.7ll]: https://github.com/rust-lang/rust/pull/30663
5929 [1.7m]: https://github.com/rust-lang/rust/pull/30381
5930 [1.7p]: https://github.com/rust-lang/rust/pull/30681
5931 [1.7rp]: https://github.com/rust-lang/rust/pull/29498
5932 [1.7rpa]: https://github.com/rust-lang/rust/pull/30353
5933 [1.7rr]: https://github.com/rust-lang/cargo/pull/2279
5934 [1.7sf]: https://github.com/rust-lang/rust/pull/30389
5935 [1.7utf8]: https://github.com/rust-lang/rust/pull/30740
5936 [1.7v]: https://github.com/rust-lang/rust/pull/29973
5937 [RFC 1214]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
5938 [`BuildHasher::Hasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hasher.html
5939 [`BuildHasher::build_hasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.BuildHasher.html#tymethod.build_hasher
5940 [`CString::into_bytes_with_nul`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_bytes_with_nul
5941 [`CString::into_bytes`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_bytes
5942 [`CString::into_string`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_string
5943 [`HashMap::with_capacity_and_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashMap.html#method.with_capacity_and_hasher
5944 [`HashMap::with_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashMap.html#method.with_hasher
5945 [`HashSet::with_capacity_and_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.with_capacity_and_hasher
5946 [`HashSet::with_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.with_hasher
5947 [`IntoStringError::into_cstring`]: http://doc.rust-lang.org/nightly/std/ffi/struct.IntoStringError.html#method.into_cstring
5948 [`IntoStringError::utf8_error`]: http://doc.rust-lang.org/nightly/std/ffi/struct.IntoStringError.html#method.utf8_error
5949 [`Ipv4Addr::is_broadcast`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_broadcast
5950 [`Ipv4Addr::is_documentation`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_documentation
5951 [`Ipv4Addr::is_link_local`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_link_local
5952 [`Ipv4Addr::is_loopback`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_loopback
5953 [`Ipv4Addr::is_multicast`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_multicast
5954 [`Ipv4Addr::is_private`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_private
5955 [`Ipv6Addr::is_loopback`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_loopback
5956 [`Ipv6Addr::is_multicast`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_multicast
5957 [`Ipv6Addr::is_unspecified`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_unspecified
5958 [`Path::strip_prefix`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.strip_prefix
5959 [`RandomState::new`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.RandomState.html#method.new
5960 [`String::as_mut_str`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.as_mut_str
5961 [`String::as_str`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.as_str
5962 [`Vec::as_mut_slice`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.as_mut_slice
5963 [`Vec::as_slice`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.as_slice
5964 [`clone_from_slice`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.clone_from_slice
5965 [`ffi::IntoStringError`]: http://doc.rust-lang.org/nightly/std/ffi/struct.IntoStringError.html
5966 [`i32::checked_neg`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_neg
5967 [`i32::checked_rem`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_rem
5968 [`i32::checked_shl`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_shl
5969 [`i32::checked_shr`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_shr
5970 [`i32::overflowing_add`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_add
5971 [`i32::overflowing_div`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_div
5972 [`i32::overflowing_mul`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_mul
5973 [`i32::overflowing_neg`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_neg
5974 [`i32::overflowing_rem`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_rem
5975 [`i32::overflowing_shl`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_shl
5976 [`i32::overflowing_shr`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_shr
5977 [`i32::overflowing_sub`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_sub
5978 [`i32::saturating_mul`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.saturating_mul
5979 [`path::StripPrefixError`]: http://doc.rust-lang.org/nightly/std/path/struct.StripPrefixError.html
5980 [`sort_by_key`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.sort_by_key
5981 [`std::collections::hash_map::RandomState`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.RandomState.html
5982 [`std::hash::BuildHasherDefault`]: http://doc.rust-lang.org/nightly/std/hash/struct.BuildHasherDefault.html
5983 [`std::hash::BuildHasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.BuildHasher.html
5984 [`u32::checked_neg`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_neg
5985 [`u32::checked_rem`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_rem
5986 [`u32::checked_neg`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_neg
5987 [`u32::checked_shl`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_shl
5988 [`u32::overflowing_add`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_add
5989 [`u32::overflowing_div`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_div
5990 [`u32::overflowing_mul`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_mul
5991 [`u32::overflowing_neg`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_neg
5992 [`u32::overflowing_rem`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_rem
5993 [`u32::overflowing_shl`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_shl
5994 [`u32::overflowing_shr`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_shr
5995 [`u32::overflowing_sub`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_sub
5996 [`u32::saturating_mul`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.saturating_mul
5997
5998
5999 Version 1.6.0 (2016-01-21)
6000 ==========================
6001
6002 Language
6003 --------
6004
6005 * The `#![no_std]` attribute causes a crate to not be linked to the
6006   standard library, but only the [core library][1.6co], as described
6007   in [RFC 1184]. The core library defines common types and traits but
6008   has no platform dependencies whatsoever, and is the basis for Rust
6009   software in environments that cannot support a full port of the
6010   standard library, such as operating systems. Most of the core
6011   library is now stable.
6012
6013 Libraries
6014 ---------
6015
6016 * Stabilized APIs:
6017   [`Read::read_exact`],
6018   [`ErrorKind::UnexpectedEof`] (renamed from `UnexpectedEOF`),
6019   [`fs::DirBuilder`], [`fs::DirBuilder::new`],
6020   [`fs::DirBuilder::recursive`], [`fs::DirBuilder::create`],
6021   [`os::unix::fs::DirBuilderExt`],
6022   [`os::unix::fs::DirBuilderExt::mode`], [`vec::Drain`],
6023   [`vec::Vec::drain`], [`string::Drain`], [`string::String::drain`],
6024   [`vec_deque::Drain`], [`vec_deque::VecDeque::drain`],
6025   [`collections::hash_map::Drain`],
6026   [`collections::hash_map::HashMap::drain`],
6027   [`collections::hash_set::Drain`],
6028   [`collections::hash_set::HashSet::drain`],
6029   [`collections::binary_heap::Drain`],
6030   [`collections::binary_heap::BinaryHeap::drain`],
6031   [`Vec::extend_from_slice`] (renamed from `push_all`),
6032   [`Mutex::get_mut`], [`Mutex::into_inner`], [`RwLock::get_mut`],
6033   [`RwLock::into_inner`],
6034   [`Iterator::min_by_key`] (renamed from `min_by`),
6035   [`Iterator::max_by_key`] (renamed from `max_by`).
6036 * The [core library][1.6co] is stable, as are most of its APIs.
6037 * [The `assert_eq!` macro supports arguments that don't implement
6038   `Sized`][1.6ae], such as arrays. In this way it behaves more like
6039   `assert!`.
6040 * Several timer functions that take duration in milliseconds [are
6041   deprecated in favor of those that take `Duration`][1.6ms]. These
6042   include `Condvar::wait_timeout_ms`, `thread::sleep_ms`, and
6043   `thread::park_timeout_ms`.
6044 * The algorithm by which `Vec` reserves additional elements was
6045   [tweaked to not allocate excessive space][1.6a] while still growing
6046   exponentially.
6047 * `From` conversions are [implemented from integers to floats][1.6f]
6048   in cases where the conversion is lossless. Thus they are not
6049   implemented for 32-bit ints to `f32`, nor for 64-bit ints to `f32`
6050   or `f64`. They are also not implemented for `isize` and `usize`
6051   because the implementations would be platform-specific. `From` is
6052   also implemented from `f32` to `f64`.
6053 * `From<&Path>` and `From<PathBuf>` are implemented for `Cow<Path>`.
6054 * `From<T>` is implemented for `Box<T>`, `Rc<T>` and `Arc<T>`.
6055 * `IntoIterator` is implemented for `&PathBuf` and `&Path`.
6056 * [`BinaryHeap` was refactored][1.6bh] for modest performance
6057   improvements.
6058 * Sorting slices that are already sorted [is 50% faster in some
6059   cases][1.6s].
6060
6061 Cargo
6062 -----
6063
6064 * Cargo will look in `$CARGO_HOME/bin` for subcommands [by default][1.6c].
6065 * Cargo build scripts can specify their dependencies by emitting the
6066   [`rerun-if-changed`][1.6rr] key.
6067 * crates.io will reject publication of crates with dependencies that
6068   have a wildcard version constraint. Crates with wildcard
6069   dependencies were seen to cause a variety of problems, as described
6070   in [RFC 1241]. Since 1.5 publication of such crates has emitted a
6071   warning.
6072 * `cargo clean` [accepts a `--release` flag][1.6cc] to clean the
6073   release folder.  A variety of artifacts that Cargo failed to clean
6074   are now correctly deleted.
6075
6076 Misc
6077 ----
6078
6079 * The `unreachable_code` lint [warns when a function call's argument
6080   diverges][1.6dv].
6081 * The parser indicates [failures that may be caused by
6082   confusingly-similar Unicode characters][1.6uc]
6083 * Certain macro errors [are reported at definition time][1.6m], not
6084   expansion.
6085
6086 Compatibility Notes
6087 -------------------
6088
6089 * The compiler no longer makes use of the [`RUST_PATH`][1.6rp]
6090   environment variable when locating crates. This was a pre-cargo
6091   feature for integrating with the package manager that was
6092   accidentally never removed.
6093 * [A number of bugs were fixed in the privacy checker][1.6p] that
6094   could cause previously-accepted code to break.
6095 * [Modules and unit/tuple structs may not share the same name][1.6ts].
6096 * [Bugs in pattern matching unit structs were fixed][1.6us]. The tuple
6097   struct pattern syntax (`Foo(..)`) can no longer be used to match
6098   unit structs. This is a warning now, but will become an error in
6099   future releases. Patterns that share the same name as a const are
6100   now an error.
6101 * A bug was fixed that causes [rustc not to apply default type
6102   parameters][1.6xc] when resolving certain method implementations of
6103   traits defined in other crates.
6104
6105 [1.6a]: https://github.com/rust-lang/rust/pull/29454
6106 [1.6ae]: https://github.com/rust-lang/rust/pull/29770
6107 [1.6bh]: https://github.com/rust-lang/rust/pull/29811
6108 [1.6c]: https://github.com/rust-lang/cargo/pull/2192
6109 [1.6cc]: https://github.com/rust-lang/cargo/pull/2131
6110 [1.6co]: http://doc.rust-lang.org/core/index.html
6111 [1.6dv]: https://github.com/rust-lang/rust/pull/30000
6112 [1.6f]: https://github.com/rust-lang/rust/pull/29129
6113 [1.6m]: https://github.com/rust-lang/rust/pull/29828
6114 [1.6ms]: https://github.com/rust-lang/rust/pull/29604
6115 [1.6p]: https://github.com/rust-lang/rust/pull/29726
6116 [1.6rp]: https://github.com/rust-lang/rust/pull/30034
6117 [1.6rr]: https://github.com/rust-lang/cargo/pull/2134
6118 [1.6s]: https://github.com/rust-lang/rust/pull/29675
6119 [1.6ts]: https://github.com/rust-lang/rust/issues/21546
6120 [1.6uc]: https://github.com/rust-lang/rust/pull/29837
6121 [1.6us]: https://github.com/rust-lang/rust/pull/29383
6122 [1.6xc]: https://github.com/rust-lang/rust/issues/30123
6123 [RFC 1184]: https://github.com/rust-lang/rfcs/blob/master/text/1184-stabilize-no_std.md
6124 [RFC 1241]: https://github.com/rust-lang/rfcs/blob/master/text/1241-no-wildcard-deps.md
6125 [`ErrorKind::UnexpectedEof`]: http://doc.rust-lang.org/nightly/std/io/enum.ErrorKind.html#variant.UnexpectedEof
6126 [`Iterator::max_by_key`]: http://doc.rust-lang.org/nightly/std/iter/trait.Iterator.html#method.max_by_key
6127 [`Iterator::min_by_key`]: http://doc.rust-lang.org/nightly/std/iter/trait.Iterator.html#method.min_by_key
6128 [`Mutex::get_mut`]: http://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html#method.get_mut
6129 [`Mutex::into_inner`]: http://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html#method.into_inner
6130 [`Read::read_exact`]: http://doc.rust-lang.org/nightly/std/io/trait.Read.html#method.read_exact
6131 [`RwLock::get_mut`]: http://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html#method.get_mut
6132 [`RwLock::into_inner`]: http://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html#method.into_inner
6133 [`Vec::extend_from_slice`]: http://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html#method.extend_from_slice
6134 [`collections::binary_heap::BinaryHeap::drain`]: http://doc.rust-lang.org/nightly/std/collections/binary_heap/struct.BinaryHeap.html#method.drain
6135 [`collections::binary_heap::Drain`]: http://doc.rust-lang.org/nightly/std/collections/binary_heap/struct.Drain.html
6136 [`collections::hash_map::Drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.Drain.html
6137 [`collections::hash_map::HashMap::drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.HashMap.html#method.drain
6138 [`collections::hash_set::Drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_set/struct.Drain.html
6139 [`collections::hash_set::HashSet::drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_set/struct.HashSet.html#method.drain
6140 [`fs::DirBuilder::create`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html#method.create
6141 [`fs::DirBuilder::new`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html#method.new
6142 [`fs::DirBuilder::recursive`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html#method.recursive
6143 [`fs::DirBuilder`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html
6144 [`os::unix::fs::DirBuilderExt::mode`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.DirBuilderExt.html#tymethod.mode
6145 [`os::unix::fs::DirBuilderExt`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.DirBuilderExt.html
6146 [`string::Drain`]: http://doc.rust-lang.org/nightly/std/string/struct.Drain.html
6147 [`string::String::drain`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.drain
6148 [`vec::Drain`]: http://doc.rust-lang.org/nightly/std/vec/struct.Drain.html
6149 [`vec::Vec::drain`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.drain
6150 [`vec_deque::Drain`]: http://doc.rust-lang.org/nightly/std/collections/vec_deque/struct.Drain.html
6151 [`vec_deque::VecDeque::drain`]: http://doc.rust-lang.org/nightly/std/collections/vec_deque/struct.VecDeque.html#method.drain
6152
6153
6154 Version 1.5.0 (2015-12-10)
6155 ==========================
6156
6157 * ~700 changes, numerous bugfixes
6158
6159 Highlights
6160 ----------
6161
6162 * Stabilized APIs:
6163   [`BinaryHeap::from`], [`BinaryHeap::into_sorted_vec`],
6164   [`BinaryHeap::into_vec`], [`Condvar::wait_timeout`],
6165   [`FileTypeExt::is_block_device`], [`FileTypeExt::is_char_device`],
6166   [`FileTypeExt::is_fifo`], [`FileTypeExt::is_socket`],
6167   [`FileTypeExt`], [`Formatter::alternate`], [`Formatter::fill`],
6168   [`Formatter::precision`], [`Formatter::sign_aware_zero_pad`],
6169   [`Formatter::sign_minus`], [`Formatter::sign_plus`],
6170   [`Formatter::width`], [`Iterator::cmp`], [`Iterator::eq`],
6171   [`Iterator::ge`], [`Iterator::gt`], [`Iterator::le`],
6172   [`Iterator::lt`], [`Iterator::ne`], [`Iterator::partial_cmp`],
6173   [`Path::canonicalize`], [`Path::exists`], [`Path::is_dir`],
6174   [`Path::is_file`], [`Path::metadata`], [`Path::read_dir`],
6175   [`Path::read_link`], [`Path::symlink_metadata`],
6176   [`Utf8Error::valid_up_to`], [`Vec::resize`],
6177   [`VecDeque::as_mut_slices`], [`VecDeque::as_slices`],
6178   [`VecDeque::insert`], [`VecDeque::shrink_to_fit`],
6179   [`VecDeque::swap_remove_back`], [`VecDeque::swap_remove_front`],
6180   [`slice::split_first_mut`], [`slice::split_first`],
6181   [`slice::split_last_mut`], [`slice::split_last`],
6182   [`char::from_u32_unchecked`], [`fs::canonicalize`],
6183   [`str::MatchIndices`], [`str::RMatchIndices`],
6184   [`str::match_indices`], [`str::rmatch_indices`],
6185   [`str::slice_mut_unchecked`], [`string::ParseError`].
6186 * Rust applications hosted on crates.io can be installed locally to
6187   `~/.cargo/bin` with the [`cargo install`] command. Among other
6188   things this makes it easier to augment Cargo with new subcommands:
6189   when a binary named e.g. `cargo-foo` is found in `$PATH` it can be
6190   invoked as `cargo foo`.
6191 * Crates with wildcard (`*`) dependencies will [emit warnings when
6192   published][1.5w]. In 1.6 it will no longer be possible to publish
6193   crates with wildcard dependencies.
6194
6195 Breaking Changes
6196 ----------------
6197
6198 * The rules determining when a particular lifetime must outlive
6199   a particular value (known as '[dropck]') have been [modified
6200   to not rely on parametricity][1.5p].
6201 * [Implementations of `AsRef` and `AsMut` were added to `Box`, `Rc`,
6202   and `Arc`][1.5a]. Because these smart pointer types implement
6203   `Deref`, this causes breakage in cases where the interior type
6204   contains methods of the same name.
6205 * [Correct a bug in Rc/Arc][1.5c] that caused [dropck] to be unaware
6206   that they could drop their content. Soundness fix.
6207 * All method invocations are [properly checked][1.5wf1] for
6208   [well-formedness][1.5wf2]. Soundness fix.
6209 * Traits whose supertraits contain `Self` are [not object
6210   safe][1.5o]. Soundness fix.
6211 * Target specifications support a [`no_default_libraries`][1.5nd]
6212   setting that controls whether `-nodefaultlibs` is passed to the
6213   linker, and in turn the `is_like_windows` setting no longer affects
6214   the `-nodefaultlibs` flag.
6215 * `#[derive(Show)]`, long-deprecated, [has been removed][1.5ds].
6216 * The `#[inline]` and `#[repr]` attributes [can only appear
6217   in valid locations][1.5at].
6218 * Native libraries linked from the local crate are [passed to
6219   the linker before native libraries from upstream crates][1.5nl].
6220 * Two rarely-used attributes, `#[no_debug]` and
6221   `#[omit_gdb_pretty_printer_section]` [are feature gated][1.5fg].
6222 * Negation of unsigned integers, which has been a warning for
6223   several releases, [is now behind a feature gate and will
6224   generate errors][1.5nu].
6225 * The parser accidentally accepted visibility modifiers on
6226   enum variants, a bug [which has been fixed][1.5ev].
6227 * [A bug was fixed that allowed `use` statements to import unstable
6228   features][1.5use].
6229
6230 Language
6231 --------
6232
6233 * When evaluating expressions at compile-time that are not
6234   compile-time constants (const-evaluating expressions in non-const
6235   contexts), incorrect code such as overlong bitshifts and arithmetic
6236   overflow will [generate a warning instead of an error][1.5ce],
6237   delaying the error until runtime. This will allow the
6238   const-evaluator to be expanded in the future backwards-compatibly.
6239 * The `improper_ctypes` lint [no longer warns about using `isize` and
6240   `usize` in FFI][1.5ict].
6241
6242 Libraries
6243 ---------
6244
6245 * `Arc<T>` and `Rc<T>` are [covariant with respect to `T` instead of
6246   invariant][1.5c].
6247 * `Default` is [implemented for mutable slices][1.5d].
6248 * `FromStr` is [implemented for `SockAddrV4` and `SockAddrV6`][1.5s].
6249 * There are now `From` conversions [between floating point
6250   types][1.5f] where the conversions are lossless.
6251 * There are now `From` conversions [between integer types][1.5i] where
6252   the conversions are lossless.
6253 * [`fs::Metadata` implements `Clone`][1.5fs].
6254 * The `parse` method [accepts a leading "+" when parsing
6255   integers][1.5pi].
6256 * [`AsMut` is implemented for `Vec`][1.5am].
6257 * The `clone_from` implementations for `String` and `BinaryHeap` [have
6258   been optimized][1.5cf] and no longer rely on the default impl.
6259 * The `extern "Rust"`, `extern "C"`, `unsafe extern "Rust"` and
6260   `unsafe extern "C"` function types now [implement `Clone`,
6261   `PartialEq`, `Eq`, `PartialOrd`, `Ord`, `Hash`, `fmt::Pointer`, and
6262   `fmt::Debug` for up to 12 arguments][1.5fp].
6263 * [Dropping `Vec`s is much faster in unoptimized builds when the
6264   element types don't implement `Drop`][1.5dv].
6265 * A bug that caused in incorrect behavior when [combining `VecDeque`
6266   with zero-sized types][1.5vdz] was resolved.
6267 * [`PartialOrd` for slices is faster][1.5po].
6268
6269 Miscellaneous
6270 -------------
6271
6272 * [Crate metadata size was reduced by 20%][1.5md].
6273 * [Improvements to code generation reduced the size of libcore by 3.3
6274   MB and rustc's memory usage by 18MB][1.5m].
6275 * [Improvements to deref translation increased performance in
6276   unoptimized builds][1.5dr].
6277 * Various errors in trait resolution [are deduplicated to only be
6278   reported once][1.5te].
6279 * Rust has preliminary [support for rumprun kernels][1.5rr].
6280 * Rust has preliminary [support for NetBSD on amd64][1.5na].
6281
6282 [1.5use]: https://github.com/rust-lang/rust/pull/28364
6283 [1.5po]: https://github.com/rust-lang/rust/pull/28436
6284 [1.5ev]: https://github.com/rust-lang/rust/pull/28442
6285 [1.5nu]: https://github.com/rust-lang/rust/pull/28468
6286 [1.5dr]: https://github.com/rust-lang/rust/pull/28491
6287 [1.5vdz]: https://github.com/rust-lang/rust/pull/28494
6288 [1.5md]: https://github.com/rust-lang/rust/pull/28521
6289 [1.5fg]: https://github.com/rust-lang/rust/pull/28522
6290 [1.5dv]: https://github.com/rust-lang/rust/pull/28531
6291 [1.5na]: https://github.com/rust-lang/rust/pull/28543
6292 [1.5fp]: https://github.com/rust-lang/rust/pull/28560
6293 [1.5rr]: https://github.com/rust-lang/rust/pull/28593
6294 [1.5cf]: https://github.com/rust-lang/rust/pull/28602
6295 [1.5nl]: https://github.com/rust-lang/rust/pull/28605
6296 [1.5te]: https://github.com/rust-lang/rust/pull/28645
6297 [1.5at]: https://github.com/rust-lang/rust/pull/28650
6298 [1.5am]: https://github.com/rust-lang/rust/pull/28663
6299 [1.5m]: https://github.com/rust-lang/rust/pull/28778
6300 [1.5ict]: https://github.com/rust-lang/rust/pull/28779
6301 [1.5a]: https://github.com/rust-lang/rust/pull/28811
6302 [1.5pi]: https://github.com/rust-lang/rust/pull/28826
6303 [1.5ce]: https://github.com/rust-lang/rfcs/blob/master/text/1229-compile-time-asserts.md
6304 [1.5p]: https://github.com/rust-lang/rfcs/blob/master/text/1238-nonparametric-dropck.md
6305 [1.5i]: https://github.com/rust-lang/rust/pull/28921
6306 [1.5fs]: https://github.com/rust-lang/rust/pull/29021
6307 [1.5f]: https://github.com/rust-lang/rust/pull/29129
6308 [1.5ds]: https://github.com/rust-lang/rust/pull/29148
6309 [1.5s]: https://github.com/rust-lang/rust/pull/29190
6310 [1.5d]: https://github.com/rust-lang/rust/pull/29245
6311 [1.5o]: https://github.com/rust-lang/rust/pull/29259
6312 [1.5nd]: https://github.com/rust-lang/rust/pull/28578
6313 [1.5wf2]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
6314 [1.5wf1]: https://github.com/rust-lang/rust/pull/28669
6315 [dropck]: https://doc.rust-lang.org/nightly/nomicon/dropck.html
6316 [1.5c]: https://github.com/rust-lang/rust/pull/29110
6317 [1.5w]: https://github.com/rust-lang/rfcs/blob/master/text/1241-no-wildcard-deps.md
6318 [`cargo install`]: https://github.com/rust-lang/rfcs/blob/master/text/1200-cargo-install.md
6319 [`BinaryHeap::from`]: http://doc.rust-lang.org/nightly/std/convert/trait.From.html#method.from
6320 [`BinaryHeap::into_sorted_vec`]: http://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html#method.into_sorted_vec
6321 [`BinaryHeap::into_vec`]: http://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html#method.into_vec
6322 [`Condvar::wait_timeout`]: http://doc.rust-lang.org/nightly/std/sync/struct.Condvar.html#method.wait_timeout
6323 [`FileTypeExt::is_block_device`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_block_device
6324 [`FileTypeExt::is_char_device`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_char_device
6325 [`FileTypeExt::is_fifo`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_fifo
6326 [`FileTypeExt::is_socket`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_socket
6327 [`FileTypeExt`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html
6328 [`Formatter::alternate`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.alternate
6329 [`Formatter::fill`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.fill
6330 [`Formatter::precision`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.precision
6331 [`Formatter::sign_aware_zero_pad`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.sign_aware_zero_pad
6332 [`Formatter::sign_minus`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.sign_minus
6333 [`Formatter::sign_plus`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.sign_plus
6334 [`Formatter::width`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.width
6335 [`Iterator::cmp`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.cmp
6336 [`Iterator::eq`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.eq
6337 [`Iterator::ge`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.ge
6338 [`Iterator::gt`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.gt
6339 [`Iterator::le`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.le
6340 [`Iterator::lt`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.lt
6341 [`Iterator::ne`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.ne
6342 [`Iterator::partial_cmp`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.partial_cmp
6343 [`Path::canonicalize`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.canonicalize
6344 [`Path::exists`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.exists
6345 [`Path::is_dir`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.is_dir
6346 [`Path::is_file`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.is_file
6347 [`Path::metadata`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.metadata
6348 [`Path::read_dir`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.read_dir
6349 [`Path::read_link`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.read_link
6350 [`Path::symlink_metadata`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.symlink_metadata
6351 [`Utf8Error::valid_up_to`]: http://doc.rust-lang.org/nightly/core/str/struct.Utf8Error.html#method.valid_up_to
6352 [`Vec::resize`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.resize
6353 [`VecDeque::as_mut_slices`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.as_mut_slices
6354 [`VecDeque::as_slices`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.as_slices
6355 [`VecDeque::insert`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.insert
6356 [`VecDeque::shrink_to_fit`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.shrink_to_fit
6357 [`VecDeque::swap_remove_back`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.swap_remove_back
6358 [`VecDeque::swap_remove_front`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.swap_remove_front
6359 [`slice::split_first_mut`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_first_mut
6360 [`slice::split_first`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_first
6361 [`slice::split_last_mut`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_last_mut
6362 [`slice::split_last`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_last
6363 [`char::from_u32_unchecked`]: http://doc.rust-lang.org/nightly/std/char/fn.from_u32_unchecked.html
6364 [`fs::canonicalize`]: http://doc.rust-lang.org/nightly/std/fs/fn.canonicalize.html
6365 [`str::MatchIndices`]: http://doc.rust-lang.org/nightly/std/str/struct.MatchIndices.html
6366 [`str::RMatchIndices`]: http://doc.rust-lang.org/nightly/std/str/struct.RMatchIndices.html
6367 [`str::match_indices`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.match_indices
6368 [`str::rmatch_indices`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.rmatch_indices
6369 [`str::slice_mut_unchecked`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.slice_mut_unchecked
6370 [`string::ParseError`]: http://doc.rust-lang.org/nightly/std/string/enum.ParseError.html
6371
6372 Version 1.4.0 (2015-10-29)
6373 ==========================
6374
6375 * ~1200 changes, numerous bugfixes
6376
6377 Highlights
6378 ----------
6379
6380 * Windows builds targeting the 64-bit MSVC ABI and linker (instead of
6381   GNU) are now supported and recommended for use.
6382
6383 Breaking Changes
6384 ----------------
6385
6386 * [Several changes have been made to fix type soundness and improve
6387   the behavior of associated types][sound]. See [RFC 1214]. Although
6388   we have mostly introduced these changes as warnings this release, to
6389   become errors next release, there are still some scenarios that will
6390   see immediate breakage.
6391 * [The `str::lines` and `BufRead::lines` iterators treat `\r\n` as
6392   line breaks in addition to `\n`][crlf].
6393 * [Loans of `'static` lifetime extend to the end of a function][stat].
6394 * [`str::parse` no longer introduces avoidable rounding error when
6395   parsing floating point numbers. Together with earlier changes to
6396   float formatting/output, "round trips" like f.to_string().parse()
6397   now preserve the value of f exactly. Additionally, leading plus
6398   signs are now accepted][fp3].
6399
6400
6401 Language
6402 --------
6403
6404 * `use` statements that import multiple items [can now rename
6405   them][i], as in `use foo::{bar as kitten, baz as puppy}`.
6406 * [Binops work correctly on fat pointers][binfat].
6407 * `pub extern crate`, which does not behave as expected, [issues a
6408   warning][pec] until a better solution is found.
6409
6410 Libraries
6411 ---------
6412
6413 * [Many APIs were stabilized][stab]: `<Box<str>>::into_string`,
6414   [`Arc::downgrade`], [`Arc::get_mut`], [`Arc::make_mut`],
6415   [`Arc::try_unwrap`], [`Box::from_raw`], [`Box::into_raw`], [`CStr::to_str`],
6416   [`CStr::to_string_lossy`], [`CString::from_raw`], [`CString::into_raw`],
6417   [`IntoRawFd::into_raw_fd`], [`IntoRawFd`],
6418   `IntoRawHandle::into_raw_handle`, `IntoRawHandle`,
6419   `IntoRawSocket::into_raw_socket`, `IntoRawSocket`, [`Rc::downgrade`],
6420   [`Rc::get_mut`], [`Rc::make_mut`], [`Rc::try_unwrap`], [`Result::expect`],
6421   [`String::into_boxed_str`], [`TcpStream::read_timeout`],
6422   [`TcpStream::set_read_timeout`], [`TcpStream::set_write_timeout`],
6423   [`TcpStream::write_timeout`], [`UdpSocket::read_timeout`],
6424   [`UdpSocket::set_read_timeout`], [`UdpSocket::set_write_timeout`],
6425   [`UdpSocket::write_timeout`], `Vec::append`, `Vec::split_off`,
6426   [`VecDeque::append`], [`VecDeque::retain`], [`VecDeque::split_off`],
6427   [`rc::Weak::upgrade`], [`rc::Weak`], [`slice::Iter::as_slice`],
6428   [`slice::IterMut::into_slice`], [`str::CharIndices::as_str`],
6429   [`str::Chars::as_str`], [`str::split_at_mut`], [`str::split_at`],
6430   [`sync::Weak::upgrade`], [`sync::Weak`], [`thread::park_timeout`],
6431   [`thread::sleep`].
6432 * [Some APIs were deprecated][dep]: `BTreeMap::with_b`,
6433   `BTreeSet::with_b`, `Option::as_mut_slice`, `Option::as_slice`,
6434   `Result::as_mut_slice`, `Result::as_slice`, `f32::from_str_radix`,
6435   `f64::from_str_radix`.
6436 * [Reverse-searching strings is faster with the 'two-way'
6437   algorithm][s].
6438 * [`std::io::copy` allows `?Sized` arguments][cc].
6439 * The `Windows`, `Chunks`, and `ChunksMut` iterators over slices all
6440   [override `count`, `nth` and `last` with an O(1)
6441   implementation][it].
6442 * [`Default` is implemented for arrays up to `[T; 32]`][d].
6443 * [`IntoRawFd` has been added to the Unix-specific prelude,
6444   `IntoRawSocket` and `IntoRawHandle` to the Windows-specific
6445   prelude][pr].
6446 * [`Extend<String>` and `FromIterator<String` are both implemented for
6447   `String`][es].
6448 * [`IntoIterator` is implemented for references to `Option` and
6449   `Result`][into2].
6450 * [`HashMap` and `HashSet` implement `Extend<&T>` where `T:
6451   Copy`][ext] as part of [RFC 839]. This will cause type inference
6452   breakage in rare situations.
6453 * [`BinaryHeap` implements `Debug`][bh2].
6454 * [`Borrow` and `BorrowMut` are implemented for fixed-size
6455   arrays][bm].
6456 * [`extern fn`s with the "Rust" and "C" ABIs implement common
6457   traits including `Eq`, `Ord`, `Debug`, `Hash`][fp].
6458 * [String comparison is faster][faststr].
6459 * `&mut T` where `T: std::fmt::Write` [also implements
6460   `std::fmt::Write`][mutw].
6461 * [A stable regression in `VecDeque::push_back` and other
6462   capacity-altering methods that caused panics for zero-sized types
6463   was fixed][vd].
6464 * [Function pointers implement traits for up to 12 parameters][fp2].
6465
6466 Miscellaneous
6467 -------------
6468
6469 * The compiler [no longer uses the 'morestack' feature to prevent
6470   stack overflow][mm]. Instead it uses guard pages and stack
6471   probes (though stack probes are not yet implemented on any platform
6472   but Windows).
6473 * [The compiler matches traits faster when projections are involved][p].
6474 * The 'improper_ctypes' lint [no longer warns about use of `isize` and
6475   `usize`][ffi].
6476 * [Cargo now displays useful information about what its doing during
6477   `cargo update`][cu].
6478
6479 [`Arc::downgrade`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.downgrade
6480 [`Arc::make_mut`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.make_mut
6481 [`Arc::get_mut`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.get_mut
6482 [`Arc::try_unwrap`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.try_unwrap
6483 [`Box::from_raw`]: http://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html#method.from_raw
6484 [`Box::into_raw`]: http://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html#method.into_raw
6485 [`CStr::to_str`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html#method.to_str
6486 [`CStr::to_string_lossy`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html#method.to_string_lossy
6487 [`CString::from_raw`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.from_raw
6488 [`CString::into_raw`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_raw
6489 [`IntoRawFd::into_raw_fd`]: http://doc.rust-lang.org/nightly/std/os/unix/io/trait.IntoRawFd.html#tymethod.into_raw_fd
6490 [`IntoRawFd`]: http://doc.rust-lang.org/nightly/std/os/unix/io/trait.IntoRawFd.html
6491 [`Rc::downgrade`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.downgrade
6492 [`Rc::get_mut`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.get_mut
6493 [`Rc::make_mut`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.make_mut
6494 [`Rc::try_unwrap`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.try_unwrap
6495 [`Result::expect`]: http://doc.rust-lang.org/nightly/core/result/enum.Result.html#method.expect
6496 [`String::into_boxed_str`]: http://doc.rust-lang.org/nightly/collections/string/struct.String.html#method.into_boxed_str
6497 [`TcpStream::read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.read_timeout
6498 [`TcpStream::set_read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_read_timeout
6499 [`TcpStream::write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.write_timeout
6500 [`TcpStream::set_write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_write_timeout
6501 [`UdpSocket::read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.read_timeout
6502 [`UdpSocket::set_read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_read_timeout
6503 [`UdpSocket::write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.write_timeout
6504 [`UdpSocket::set_write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_write_timeout
6505 [`VecDeque::append`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.append
6506 [`VecDeque::retain`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.retain
6507 [`VecDeque::split_off`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.split_off
6508 [`rc::Weak::upgrade`]: http://doc.rust-lang.org/nightly/std/rc/struct.Weak.html#method.upgrade
6509 [`rc::Weak`]: http://doc.rust-lang.org/nightly/std/rc/struct.Weak.html
6510 [`slice::Iter::as_slice`]: http://doc.rust-lang.org/nightly/std/slice/struct.Iter.html#method.as_slice
6511 [`slice::IterMut::into_slice`]: http://doc.rust-lang.org/nightly/std/slice/struct.IterMut.html#method.into_slice
6512 [`str::CharIndices::as_str`]: http://doc.rust-lang.org/nightly/std/str/struct.CharIndices.html#method.as_str
6513 [`str::Chars::as_str`]: http://doc.rust-lang.org/nightly/std/str/struct.Chars.html#method.as_str
6514 [`str::split_at_mut`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_at_mut
6515 [`str::split_at`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_at
6516 [`sync::Weak::upgrade`]: http://doc.rust-lang.org/nightly/std/sync/struct.Weak.html#method.upgrade
6517 [`sync::Weak`]: http://doc.rust-lang.org/nightly/std/sync/struct.Weak.html
6518 [`thread::park_timeout`]: http://doc.rust-lang.org/nightly/std/thread/fn.park_timeout.html
6519 [`thread::sleep`]: http://doc.rust-lang.org/nightly/std/thread/fn.sleep.html
6520 [bh2]: https://github.com/rust-lang/rust/pull/28156
6521 [binfat]: https://github.com/rust-lang/rust/pull/28270
6522 [bm]: https://github.com/rust-lang/rust/pull/28197
6523 [cc]: https://github.com/rust-lang/rust/pull/27531
6524 [crlf]: https://github.com/rust-lang/rust/pull/28034
6525 [cu]: https://github.com/rust-lang/cargo/pull/1931
6526 [d]: https://github.com/rust-lang/rust/pull/27825
6527 [dep]: https://github.com/rust-lang/rust/pull/28339
6528 [es]: https://github.com/rust-lang/rust/pull/27956
6529 [ext]: https://github.com/rust-lang/rust/pull/28094
6530 [faststr]: https://github.com/rust-lang/rust/pull/28338
6531 [ffi]: https://github.com/rust-lang/rust/pull/28779
6532 [fp]: https://github.com/rust-lang/rust/pull/28268
6533 [fp2]: https://github.com/rust-lang/rust/pull/28560
6534 [fp3]: https://github.com/rust-lang/rust/pull/27307
6535 [i]: https://github.com/rust-lang/rust/pull/27451
6536 [into2]: https://github.com/rust-lang/rust/pull/28039
6537 [it]: https://github.com/rust-lang/rust/pull/27652
6538 [mm]: https://github.com/rust-lang/rust/pull/27338
6539 [mutw]: https://github.com/rust-lang/rust/pull/28368
6540 [sound]: https://github.com/rust-lang/rust/pull/27641
6541 [p]: https://github.com/rust-lang/rust/pull/27866
6542 [pec]: https://github.com/rust-lang/rust/pull/28486
6543 [pr]: https://github.com/rust-lang/rust/pull/27896
6544 [RFC 839]: https://github.com/rust-lang/rfcs/blob/master/text/0839-embrace-extend-extinguish.md
6545 [RFC 1214]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
6546 [s]: https://github.com/rust-lang/rust/pull/27474
6547 [stab]: https://github.com/rust-lang/rust/pull/28339
6548 [stat]: https://github.com/rust-lang/rust/pull/28321
6549 [vd]: https://github.com/rust-lang/rust/pull/28494
6550
6551 Version 1.3.0 (2015-09-17)
6552 ==============================
6553
6554 * ~900 changes, numerous bugfixes
6555
6556 Highlights
6557 ----------
6558
6559 * The [new object lifetime defaults][nold] have been [turned
6560   on][nold2] after a cycle of warnings about the change. Now types
6561   like `&'a Box<Trait>` (or `&'a Rc<Trait>`, etc) will change from
6562   being interpreted as `&'a Box<Trait+'a>` to `&'a
6563   Box<Trait+'static>`.
6564 * [The Rustonomicon][nom] is a new book in the official documentation
6565   that dives into writing unsafe Rust.
6566 * The [`Duration`] API, [has been stabilized][ds]. This basic unit of
6567   timekeeping is employed by other std APIs, as well as out-of-tree
6568   time crates.
6569
6570 Breaking Changes
6571 ----------------
6572
6573 * The [new object lifetime defaults][nold] have been [turned
6574   on][nold2] after a cycle of warnings about the change.
6575 * There is a known [regression][lr] in how object lifetime elision is
6576   interpreted, the proper solution for which is undetermined.
6577 * The `#[prelude_import]` attribute, an internal implementation
6578   detail, was accidentally stabilized previously. [It has been put
6579   behind the `prelude_import` feature gate][pi]. This change is
6580   believed to break no existing code.
6581 * The behavior of [`size_of_val`][dst1] and [`align_of_val`][dst2] is
6582   [more sane for dynamically sized types][dst3]. Code that relied on
6583   the previous behavior is thought to be broken.
6584 * The `dropck` rules, which checks that destructors can't access
6585   destroyed values, [have been updated][dropck] to match the
6586   [RFC][dropckrfc]. This fixes some soundness holes, and as such will
6587   cause some previously-compiling code to no longer build.
6588
6589 Language
6590 --------
6591
6592 * The [new object lifetime defaults][nold] have been [turned
6593   on][nold2] after a cycle of warnings about the change.
6594 * Semicolons may [now follow types and paths in
6595   macros](https://github.com/rust-lang/rust/pull/27000).
6596 * The behavior of [`size_of_val`][dst1] and [`align_of_val`][dst2] is
6597   [more sane for dynamically sized types][dst3]. Code that relied on
6598   the previous behavior is not known to exist, and suspected to be
6599   broken.
6600 * `'static` variables [may now be recursive][st].
6601 * `ref` bindings choose between [`Deref`] and [`DerefMut`]
6602   implementations correctly.
6603 * The `dropck` rules, which checks that destructors can't access
6604   destroyed values, [have been updated][dropck] to match the
6605   [RFC][dropckrfc].
6606
6607 Libraries
6608 ---------
6609
6610 * The [`Duration`] API, [has been stabilized][ds], as well as the
6611   `std::time` module, which presently contains only `Duration`.
6612 * `Box<str>` and `Box<[T]>` both implement `Clone`.
6613 * The owned C string, [`CString`], implements [`Borrow`] and the
6614   borrowed C string, [`CStr`], implements [`ToOwned`]. The two of
6615   these allow C strings to be borrowed and cloned in generic code.
6616 * [`CStr`] implements [`Debug`].
6617 * [`AtomicPtr`] implements [`Debug`].
6618 * [`Error`] trait objects [can be downcast to their concrete types][e]
6619   in many common configurations, using the [`is`], [`downcast`],
6620   [`downcast_ref`] and [`downcast_mut`] methods, similarly to the
6621   [`Any`] trait.
6622 * Searching for substrings now [employs the two-way algorithm][search]
6623   instead of doing a naive search. This gives major speedups to a
6624   number of methods, including [`contains`][sc], [`find`][sf],
6625   [`rfind`][srf], [`split`][ss]. [`starts_with`][ssw] and
6626   [`ends_with`][sew] are also faster.
6627 * The performance of `PartialEq` for slices is [much faster][ps].
6628 * The [`Hash`] trait offers the default method, [`hash_slice`], which
6629   is overridden and optimized by the implementations for scalars.
6630 * The [`Hasher`] trait now has a number of specialized `write_*`
6631   methods for primitive types, for efficiency.
6632 * The I/O-specific error type, [`std::io::Error`][ie], gained a set of
6633   methods for accessing the 'inner error', if any: [`get_ref`][iegr],
6634   [`get_mut`][iegm], [`into_inner`][ieii]. As well, the implementation
6635   of [`std::error::Error::cause`][iec] also delegates to the inner
6636   error.
6637 * [`process::Child`][pc] gained the [`id`] method, which returns a
6638   `u32` representing the platform-specific process identifier.
6639 * The [`connect`] method on slices is deprecated, replaced by the new
6640   [`join`] method (note that both of these are on the *unstable*
6641   [`SliceConcatExt`] trait, but through the magic of the prelude are
6642   available to stable code anyway).
6643 * The [`Div`] operator is implemented for [`Wrapping`] types.
6644 * [`DerefMut` is implemented for `String`][dms].
6645 * Performance of SipHash (the default hasher for `HashMap`) is
6646   [better for long data][sh].
6647 * [`AtomicPtr`] implements [`Send`].
6648 * The [`read_to_end`] implementations for [`Stdin`] and [`File`]
6649   are now [specialized to use uninitialized buffers for increased
6650   performance][rte].
6651 * Lifetime parameters of foreign functions [are now resolved
6652   properly][f].
6653
6654 Misc
6655 ----
6656
6657 * Rust can now, with some coercion, [produce programs that run on
6658   Windows XP][xp], though XP is not considered a supported platform.
6659 * Porting Rust on Windows from the GNU toolchain to MSVC continues
6660   ([1][win1], [2][win2], [3][win3], [4][win4]). It is still not
6661   recommended for use in 1.3, though should be fully-functional
6662   in the [64-bit 1.4 beta][b14].
6663 * On Fedora-based systems installation will [properly configure the
6664   dynamic linker][fl].
6665 * The compiler gained many new extended error descriptions, which can
6666   be accessed with the `--explain` flag.
6667 * The `dropck` pass, which checks that destructors can't access
6668   destroyed values, [has been rewritten][dropck]. This fixes some
6669   soundness holes, and as such will cause some previously-compiling
6670   code to no longer build.
6671 * `rustc` now uses [LLVM to write archive files where possible][ar].
6672   Eventually this will eliminate the compiler's dependency on the ar
6673   utility.
6674 * Rust has [preliminary support for i686 FreeBSD][fb] (it has long
6675   supported FreeBSD on x86_64).
6676 * The [`unused_mut`][lum], [`unconditional_recursion`][lur],
6677   [`improper_ctypes`][lic], and [`negate_unsigned`][lnu] lints are
6678   more strict.
6679 * If landing pads are disabled (with `-Z no-landing-pads`), [`panic!`
6680   will kill the process instead of leaking][nlp].
6681
6682 [`Any`]: http://doc.rust-lang.org/nightly/std/any/trait.Any.html
6683 [`AtomicPtr`]: http://doc.rust-lang.org/nightly/std/sync/atomic/struct.AtomicPtr.html
6684 [`Borrow`]: http://doc.rust-lang.org/nightly/std/borrow/trait.Borrow.html
6685 [`CStr`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html
6686 [`CString`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html
6687 [`Debug`]: http://doc.rust-lang.org/nightly/std/fmt/trait.Debug.html
6688 [`DerefMut`]: http://doc.rust-lang.org/nightly/std/ops/trait.DerefMut.html
6689 [`Deref`]: http://doc.rust-lang.org/nightly/std/ops/trait.Deref.html
6690 [`Div`]: http://doc.rust-lang.org/nightly/std/ops/trait.Div.html
6691 [`Duration`]: http://doc.rust-lang.org/nightly/std/time/struct.Duration.html
6692 [`Error`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html
6693 [`File`]: http://doc.rust-lang.org/nightly/std/fs/struct.File.html
6694 [`Hash`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html
6695 [`Hasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hasher.html
6696 [`Send`]: http://doc.rust-lang.org/nightly/std/marker/trait.Send.html
6697 [`SliceConcatExt`]: http://doc.rust-lang.org/nightly/std/slice/trait.SliceConcatExt.html
6698 [`Stdin`]: http://doc.rust-lang.org/nightly/std/io/struct.Stdin.html
6699 [`ToOwned`]: http://doc.rust-lang.org/nightly/std/borrow/trait.ToOwned.html
6700 [`Wrapping`]: http://doc.rust-lang.org/nightly/std/num/struct.Wrapping.html
6701 [`connect`]: http://doc.rust-lang.org/nightly/std/slice/trait.SliceConcatExt.html#method.connect
6702 [`downcast_mut`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.downcast_mut
6703 [`downcast_ref`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.downcast_ref
6704 [`downcast`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.downcast
6705 [`hash_slice`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html#method.hash_slice
6706 [`id`]: http://doc.rust-lang.org/nightly/std/process/struct.Child.html#method.id
6707 [`is`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.is
6708 [`join`]: http://doc.rust-lang.org/nightly/std/slice/trait.SliceConcatExt.html#method.join
6709 [`read_to_end`]: http://doc.rust-lang.org/nightly/std/io/trait.Read.html#method.read_to_end
6710 [ar]: https://github.com/rust-lang/rust/pull/26926
6711 [b14]: https://static.rust-lang.org/dist/rust-beta-x86_64-pc-windows-msvc.msi
6712 [dms]: https://github.com/rust-lang/rust/pull/26241
6713 [dropck]: https://github.com/rust-lang/rust/pull/27261
6714 [dropckrfc]: https://github.com/rust-lang/rfcs/blob/master/text/0769-sound-generic-drop.md
6715 [ds]: https://github.com/rust-lang/rust/pull/26818
6716 [dst1]: http://doc.rust-lang.org/nightly/std/mem/fn.size_of_val.html
6717 [dst2]: http://doc.rust-lang.org/nightly/std/mem/fn.align_of_val.html
6718 [dst3]: https://github.com/rust-lang/rust/pull/27351
6719 [e]: https://github.com/rust-lang/rust/pull/24793
6720 [f]: https://github.com/rust-lang/rust/pull/26588
6721 [fb]: https://github.com/rust-lang/rust/pull/26959
6722 [fl]: https://github.com/rust-lang/rust-installer/pull/41
6723 [hs]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html#method.hash_slice
6724 [ie]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html
6725 [iec]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.cause
6726 [iegm]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.get_mut
6727 [iegr]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.get_ref
6728 [ieii]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.into_inner
6729 [lic]: https://github.com/rust-lang/rust/pull/26583
6730 [lnu]: https://github.com/rust-lang/rust/pull/27026
6731 [lr]: https://github.com/rust-lang/rust/issues/27248
6732 [lum]: https://github.com/rust-lang/rust/pull/26378
6733 [lur]: https://github.com/rust-lang/rust/pull/26783
6734 [nlp]: https://github.com/rust-lang/rust/pull/27176
6735 [nold2]: https://github.com/rust-lang/rust/pull/27045
6736 [nold]: https://github.com/rust-lang/rfcs/blob/master/text/1156-adjust-default-object-bounds.md
6737 [nom]: http://doc.rust-lang.org/nightly/nomicon/
6738 [pc]: http://doc.rust-lang.org/nightly/std/process/struct.Child.html
6739 [pi]: https://github.com/rust-lang/rust/pull/26699
6740 [ps]: https://github.com/rust-lang/rust/pull/26884
6741 [rte]: https://github.com/rust-lang/rust/pull/26950
6742 [sc]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.contains
6743 [search]: https://github.com/rust-lang/rust/pull/26327
6744 [sew]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.ends_with
6745 [sf]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.find
6746 [sh]: https://github.com/rust-lang/rust/pull/27280
6747 [srf]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.rfind
6748 [ss]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split
6749 [ssw]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.starts_with
6750 [st]: https://github.com/rust-lang/rust/pull/26630
6751 [win1]: https://github.com/rust-lang/rust/pull/26569
6752 [win2]: https://github.com/rust-lang/rust/pull/26741
6753 [win3]: https://github.com/rust-lang/rust/pull/26741
6754 [win4]: https://github.com/rust-lang/rust/pull/27210
6755 [xp]: https://github.com/rust-lang/rust/pull/26569
6756
6757 Version 1.2.0 (2015-08-07)
6758 ==========================
6759
6760 * ~1200 changes, numerous bugfixes
6761
6762 Highlights
6763 ----------
6764
6765 * [Dynamically-sized-type coercions][dst] allow smart pointer types
6766   like `Rc` to contain types without a fixed size, arrays and trait
6767   objects, finally enabling use of `Rc<[T]>` and completing the
6768   implementation of DST.
6769 * [Parallel codegen][parcodegen] is now working again, which can
6770   substantially speed up large builds in debug mode; It also gets
6771   another ~33% speedup when bootstrapping on a 4 core machine (using 8
6772   jobs). It's not enabled by default, but will be "in the near
6773   future". It can be activated with the `-C codegen-units=N` flag to
6774   `rustc`.
6775 * This is the first release with [experimental support for linking
6776   with the MSVC linker and lib C on Windows (instead of using the GNU
6777   variants via MinGW)][win]. It is yet recommended only for the most
6778   intrepid Rustaceans.
6779 * Benchmark compilations are showing a 30% improvement in
6780   bootstrapping over 1.1.
6781
6782 Breaking Changes
6783 ----------------
6784
6785 * The [`to_uppercase`] and [`to_lowercase`] methods on `char` now do
6786   unicode case mapping, which is a previously-planned change in
6787   behavior and considered a bugfix.
6788 * [`mem::align_of`] now specifies [the *minimum alignment* for
6789   T][align], which is usually the alignment programs are interested
6790   in, and the same value reported by clang's
6791   `alignof`. [`mem::min_align_of`] is deprecated. This is not known to
6792   break real code.
6793 * [The `#[packed]` attribute is no longer silently accepted by the
6794   compiler][packed]. This attribute did nothing and code that
6795   mentioned it likely did not work as intended.
6796 * Associated type defaults are [now behind the
6797   `associated_type_defaults` feature gate][ad]. In 1.1 associated type
6798   defaults *did not work*, but could be mentioned syntactically. As
6799   such this breakage has minimal impact.
6800
6801 Language
6802 --------
6803
6804 * Patterns with `ref mut` now correctly invoke [`DerefMut`] when
6805   matching against dereferenceable values.
6806
6807 Libraries
6808 ---------
6809
6810 * The [`Extend`] trait, which grows a collection from an iterator, is
6811   implemented over iterators of references, for `String`, `Vec`,
6812   `LinkedList`, `VecDeque`, `EnumSet`, `BinaryHeap`, `VecMap`,
6813   `BTreeSet` and `BTreeMap`. [RFC][extend-rfc].
6814 * The [`iter::once`] function returns an iterator that yields a single
6815   element, and [`iter::empty`] returns an iterator that yields no
6816   elements.
6817 * The [`matches`] and [`rmatches`] methods on `str` return iterators
6818   over substring matches.
6819 * [`Cell`] and [`RefCell`] both implement `Eq`.
6820 * A number of methods for wrapping arithmetic are added to the
6821   integral types, [`wrapping_div`], [`wrapping_rem`],
6822   [`wrapping_neg`], [`wrapping_shl`], [`wrapping_shr`]. These are in
6823   addition to the existing [`wrapping_add`], [`wrapping_sub`], and
6824   [`wrapping_mul`] methods, and alternatives to the [`Wrapping`]
6825   type.. It is illegal for the default arithmetic operations in Rust
6826   to overflow; the desire to wrap must be explicit.
6827 * The `{:#?}` formatting specifier [displays the alternate,
6828   pretty-printed][debugfmt] form of the `Debug` formatter. This
6829   feature was actually introduced prior to 1.0 with little
6830   fanfare.
6831 * [`fmt::Formatter`] implements [`fmt::Write`], a `fmt`-specific trait
6832   for writing data to formatted strings, similar to [`io::Write`].
6833 * [`fmt::Formatter`] adds 'debug builder' methods, [`debug_struct`],
6834   [`debug_tuple`], [`debug_list`], [`debug_set`], [`debug_map`]. These
6835   are used by code generators to emit implementations of [`Debug`].
6836 * `str` has new [`to_uppercase`][strup] and [`to_lowercase`][strlow]
6837   methods that convert case, following Unicode case mapping.
6838 * It is now easier to handle poisoned locks. The [`PoisonError`]
6839   type, returned by failing lock operations, exposes `into_inner`,
6840   `get_ref`, and `get_mut`, which all give access to the inner lock
6841   guard, and allow the poisoned lock to continue to operate. The
6842   `is_poisoned` method of [`RwLock`] and [`Mutex`] can poll for a
6843   poisoned lock without attempting to take the lock.
6844 * On Unix the [`FromRawFd`] trait is implemented for [`Stdio`], and
6845   [`AsRawFd`] for [`ChildStdin`], [`ChildStdout`], [`ChildStderr`].
6846   On Windows the `FromRawHandle` trait is implemented for `Stdio`,
6847   and `AsRawHandle` for `ChildStdin`, `ChildStdout`,
6848   `ChildStderr`.
6849 * [`io::ErrorKind`] has a new variant, `InvalidData`, which indicates
6850   malformed input.
6851
6852 Misc
6853 ----
6854
6855 * `rustc` employs smarter heuristics for guessing at [typos].
6856 * `rustc` emits more efficient code for [no-op conversions between
6857   unsafe pointers][nop].
6858 * Fat pointers are now [passed in pairs of immediate arguments][fat],
6859   resulting in faster compile times and smaller code.
6860
6861 [`Extend`]: https://doc.rust-lang.org/nightly/std/iter/trait.Extend.html
6862 [extend-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0839-embrace-extend-extinguish.md
6863 [`iter::once`]: https://doc.rust-lang.org/nightly/std/iter/fn.once.html
6864 [`iter::empty`]: https://doc.rust-lang.org/nightly/std/iter/fn.empty.html
6865 [`matches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.matches
6866 [`rmatches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.rmatches
6867 [`Cell`]: https://doc.rust-lang.org/nightly/std/cell/struct.Cell.html
6868 [`RefCell`]: https://doc.rust-lang.org/nightly/std/cell/struct.RefCell.html
6869 [`wrapping_add`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_add
6870 [`wrapping_sub`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_sub
6871 [`wrapping_mul`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_mul
6872 [`wrapping_div`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_div
6873 [`wrapping_rem`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_rem
6874 [`wrapping_neg`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_neg
6875 [`wrapping_shl`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_shl
6876 [`wrapping_shr`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_shr
6877 [`Wrapping`]: https://doc.rust-lang.org/nightly/std/num/struct.Wrapping.html
6878 [`fmt::Formatter`]: https://doc.rust-lang.org/nightly/std/fmt/struct.Formatter.html
6879 [`fmt::Write`]: https://doc.rust-lang.org/nightly/std/fmt/trait.Write.html
6880 [`io::Write`]: https://doc.rust-lang.org/nightly/std/io/trait.Write.html
6881 [`debug_struct`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_struct
6882 [`debug_tuple`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_tuple
6883 [`debug_list`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_list
6884 [`debug_set`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_set
6885 [`debug_map`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_map
6886 [`Debug`]: https://doc.rust-lang.org/nightly/std/fmt/trait.Debug.html
6887 [strup]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.to_uppercase
6888 [strlow]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.to_lowercase
6889 [`to_uppercase`]: https://doc.rust-lang.org/nightly/std/primitive.char.html#method.to_uppercase
6890 [`to_lowercase`]: https://doc.rust-lang.org/nightly/std/primitive.char.html#method.to_lowercase
6891 [`PoisonError`]: https://doc.rust-lang.org/nightly/std/sync/struct.PoisonError.html
6892 [`RwLock`]: https://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html
6893 [`Mutex`]: https://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html
6894 [`FromRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.FromRawFd.html
6895 [`AsRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.AsRawFd.html
6896 [`Stdio`]: https://doc.rust-lang.org/nightly/std/process/struct.Stdio.html
6897 [`ChildStdin`]: https://doc.rust-lang.org/nightly/std/process/struct.ChildStdin.html
6898 [`ChildStdout`]: https://doc.rust-lang.org/nightly/std/process/struct.ChildStdout.html
6899 [`ChildStderr`]: https://doc.rust-lang.org/nightly/std/process/struct.ChildStderr.html
6900 [`io::ErrorKind`]: https://doc.rust-lang.org/nightly/std/io/enum.ErrorKind.html
6901 [debugfmt]: https://www.reddit.com/r/rust/comments/3ceaui/psa_produces_prettyprinted_debug_output/
6902 [`DerefMut`]: https://doc.rust-lang.org/nightly/std/ops/trait.DerefMut.html
6903 [`mem::align_of`]: https://doc.rust-lang.org/nightly/std/mem/fn.align_of.html
6904 [align]: https://github.com/rust-lang/rust/pull/25646
6905 [`mem::min_align_of`]: https://doc.rust-lang.org/nightly/std/mem/fn.min_align_of.html
6906 [typos]: https://github.com/rust-lang/rust/pull/26087
6907 [nop]: https://github.com/rust-lang/rust/pull/26336
6908 [fat]: https://github.com/rust-lang/rust/pull/26411
6909 [dst]: https://github.com/rust-lang/rfcs/blob/master/text/0982-dst-coercion.md
6910 [parcodegen]: https://github.com/rust-lang/rust/pull/26018
6911 [packed]: https://github.com/rust-lang/rust/pull/25541
6912 [ad]: https://github.com/rust-lang/rust/pull/27382
6913 [win]: https://github.com/rust-lang/rust/pull/25350
6914
6915 Version 1.1.0 (2015-06-25)
6916 =========================
6917
6918 * ~850 changes, numerous bugfixes
6919
6920 Highlights
6921 ----------
6922
6923 * The [`std::fs` module has been expanded][fs] to expand the set of
6924   functionality exposed:
6925   * `DirEntry` now supports optimizations like `file_type` and `metadata` which
6926     don't incur a syscall on some platforms.
6927   * A `symlink_metadata` function has been added.
6928   * The `fs::Metadata` structure now lowers to its OS counterpart, providing
6929     access to all underlying information.
6930 * The compiler now contains extended explanations of many errors. When an error
6931   with an explanation occurs the compiler suggests using the `--explain` flag
6932   to read the explanation. Error explanations are also [available online][err-index].
6933 * Thanks to multiple [improvements][sk] to [type checking][pre], as
6934   well as other work, the time to bootstrap the compiler decreased by
6935   32%.
6936
6937 Libraries
6938 ---------
6939
6940 * The [`str::split_whitespace`] method splits a string on unicode
6941   whitespace boundaries.
6942 * On both Windows and Unix, new extension traits provide conversion of
6943   I/O types to and from the underlying system handles. On Unix, these
6944   traits are [`FromRawFd`] and [`AsRawFd`], on Windows `FromRawHandle`
6945   and `AsRawHandle`. These are implemented for `File`, `TcpStream`,
6946   `TcpListener`, and `UpdSocket`. Further implementations for
6947   `std::process` will be stabilized later.
6948 * On Unix, [`std::os::unix::symlink`] creates symlinks. On
6949   Windows, symlinks can be created with
6950   `std::os::windows::symlink_dir` and
6951   `std::os::windows::symlink_file`.
6952 * The `mpsc::Receiver` type can now be converted into an iterator with
6953   `into_iter` on the [`IntoIterator`] trait.
6954 * `Ipv4Addr` can be created from `u32` with the `From<u32>`
6955   implementation of the [`From`] trait.
6956 * The `Debug` implementation for `RangeFull` [creates output that is
6957   more consistent with other implementations][rf].
6958 * [`Debug` is implemented for `File`][file].
6959 * The `Default` implementation for `Arc` [no longer requires `Sync +
6960   Send`][arc].
6961 * [The `Iterator` methods `count`, `nth`, and `last` have been
6962   overridden for slices to have O(1) performance instead of O(n)][si].
6963 * Incorrect handling of paths on Windows has been improved in both the
6964   compiler and the standard library.
6965 * [`AtomicPtr` gained a `Default` implementation][ap].
6966 * In accordance with Rust's policy on arithmetic overflow `abs` now
6967   [panics on overflow when debug assertions are enabled][abs].
6968 * The [`Cloned`] iterator, which was accidentally left unstable for
6969   1.0 [has been stabilized][c].
6970 * The [`Incoming`] iterator, which iterates over incoming TCP
6971   connections, and which was accidentally unnamable in 1.0, [is now
6972   properly exported][inc].
6973 * [`BinaryHeap`] no longer corrupts itself [when functions called by
6974   `sift_up` or `sift_down` panic][bh].
6975 * The [`split_off`] method of `LinkedList` [no longer corrupts
6976   the list in certain scenarios][ll].
6977
6978 Misc
6979 ----
6980
6981 * Type checking performance [has improved notably][sk] with
6982   [multiple improvements][pre].
6983 * The compiler [suggests code changes][ch] for more errors.
6984 * rustc and it's build system have experimental support for [building
6985   toolchains against MUSL][m] instead of glibc on Linux.
6986 * The compiler defines the `target_env` cfg value, which is used for
6987   distinguishing toolchains that are otherwise for the same
6988   platform. Presently this is set to `gnu` for common GNU Linux
6989   targets and for MinGW targets, and `musl` for MUSL Linux targets.
6990 * The [`cargo rustc`][crc] command invokes a build with custom flags
6991   to rustc.
6992 * [Android executables are always position independent][pie].
6993 * [The `drop_with_repr_extern` lint warns about mixing `repr(C)`
6994   with `Drop`][drop].
6995
6996 [`str::split_whitespace`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_whitespace
6997 [`FromRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.FromRawFd.html
6998 [`AsRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.AsRawFd.html
6999 [`std::os::unix::symlink`]: https://doc.rust-lang.org/nightly/std/os/unix/fs/fn.symlink.html
7000 [`IntoIterator`]: https://doc.rust-lang.org/nightly/std/iter/trait.IntoIterator.html
7001 [`From`]: https://doc.rust-lang.org/nightly/std/convert/trait.From.html
7002 [rf]: https://github.com/rust-lang/rust/pull/24491
7003 [err-index]: https://doc.rust-lang.org/error-index.html
7004 [sk]: https://github.com/rust-lang/rust/pull/24615
7005 [pre]: https://github.com/rust-lang/rust/pull/25323
7006 [file]: https://github.com/rust-lang/rust/pull/24598
7007 [ch]: https://github.com/rust-lang/rust/pull/24683
7008 [arc]: https://github.com/rust-lang/rust/pull/24695
7009 [si]: https://github.com/rust-lang/rust/pull/24701
7010 [ap]: https://github.com/rust-lang/rust/pull/24834
7011 [m]: https://github.com/rust-lang/rust/pull/24777
7012 [fs]: https://github.com/rust-lang/rfcs/blob/master/text/1044-io-fs-2.1.md
7013 [crc]: https://github.com/rust-lang/cargo/pull/1568
7014 [pie]: https://github.com/rust-lang/rust/pull/24953
7015 [abs]: https://github.com/rust-lang/rust/pull/25441
7016 [c]: https://github.com/rust-lang/rust/pull/25496
7017 [`Cloned`]: https://doc.rust-lang.org/nightly/std/iter/struct.Cloned.html
7018 [`Incoming`]: https://doc.rust-lang.org/nightly/std/net/struct.Incoming.html
7019 [inc]: https://github.com/rust-lang/rust/pull/25522
7020 [bh]: https://github.com/rust-lang/rust/pull/25856
7021 [`BinaryHeap`]: https://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html
7022 [ll]: https://github.com/rust-lang/rust/pull/26022
7023 [`split_off`]: https://doc.rust-lang.org/nightly/collections/linked_list/struct.LinkedList.html#method.split_off
7024 [drop]: https://github.com/rust-lang/rust/pull/24935
7025
7026 Version 1.0.0 (2015-05-15)
7027 ========================
7028
7029 * ~1500 changes, numerous bugfixes
7030
7031 Highlights
7032 ----------
7033
7034 * The vast majority of the standard library is now `#[stable]`. It is
7035   no longer possible to use unstable features with a stable build of
7036   the compiler.
7037 * Many popular crates on [crates.io] now work on the stable release
7038   channel.
7039 * Arithmetic on basic integer types now [checks for overflow in debug
7040   builds][overflow].
7041
7042 Language
7043 --------
7044
7045 * Several [restrictions have been added to trait coherence][coh] in
7046   order to make it easier for upstream authors to change traits
7047   without breaking downstream code.
7048 * Digits of binary and octal literals are [lexed more eagerly][lex] to
7049   improve error messages and macro behavior. For example, `0b1234` is
7050   now lexed as `0b1234` instead of two tokens, `0b1` and `234`.
7051 * Trait bounds [are always invariant][inv], eliminating the need for
7052   the `PhantomFn` and `MarkerTrait` lang items, which have been
7053   removed.
7054 * ["-" is no longer a valid character in crate names][cr], the `extern crate
7055   "foo" as bar` syntax has been replaced with `extern crate foo as
7056   bar`, and Cargo now automatically translates "-" in *package* names
7057   to underscore for the crate name.
7058 * [Lifetime shadowing is an error][lt].
7059 * [`Send` no longer implies `'static`][send-rfc].
7060 * [UFCS now supports trait-less associated paths][moar-ufcs] like
7061   `MyType::default()`.
7062 * Primitive types [now have inherent methods][prim-inherent],
7063   obviating the need for extension traits like `SliceExt`.
7064 * Methods with `Self: Sized` in their `where` clause are [considered
7065   object-safe][self-sized], allowing many extension traits like
7066   `IteratorExt` to be merged into the traits they extended.
7067 * You can now [refer to associated types][assoc-where] whose
7068   corresponding trait bounds appear only in a `where` clause.
7069 * The final bits of [OIBIT landed][oibit-final], meaning that traits
7070   like `Send` and `Sync` are now library-defined.
7071 * A [Reflect trait][reflect] was introduced, which means that
7072   downcasting via the `Any` trait is effectively limited to concrete
7073   types. This helps retain the potentially-important "parametricity"
7074   property: generic code cannot behave differently for different type
7075   arguments except in minor ways.
7076 * The `unsafe_destructor` feature is now deprecated in favor of the
7077   [new `dropck`][dropck]. This change is a major reduction in unsafe
7078   code.
7079
7080 Libraries
7081 ---------
7082
7083 * The `thread_local` module [has been renamed to `std::thread`][th].
7084 * The methods of `IteratorExt` [have been moved to the `Iterator`
7085   trait itself][ie].
7086 * Several traits that implement Rust's conventions for type
7087   conversions, `AsMut`, `AsRef`, `From`, and `Into` have been
7088   [centralized in the `std::convert` module][con].
7089 * The `FromError` trait [was removed in favor of `From`][fe].
7090 * The basic sleep function [has moved to
7091   `std::thread::sleep_ms`][slp].
7092 * The `splitn` function now takes an `n` parameter that represents the
7093   number of items yielded by the returned iterator [instead of the
7094   number of 'splits'][spl].
7095 * [On Unix, all file descriptors are `CLOEXEC` by default][clo].
7096 * [Derived implementations of `PartialOrd` now order enums according
7097   to their explicitly-assigned discriminants][po].
7098 * [Methods for searching strings are generic over `Pattern`s][pat],
7099   implemented presently by `&char`, `&str`, `FnMut(char) -> bool` and
7100   some others.
7101 * [In method resolution, object methods are resolved before inherent
7102   methods][meth].
7103 * [`String::from_str` has been deprecated in favor of the `From` impl,
7104   `String::from`][sf].
7105 * [`io::Error` implements `Sync`][ios].
7106 * [The `words` method on `&str` has been replaced with
7107   `split_whitespace`][sw], to avoid answering the tricky question, 'what is
7108   a word?'
7109 * The new path and IO modules are complete and `#[stable]`. This
7110   was the major library focus for this cycle.
7111 * The path API was [revised][path-normalize] to normalize `.`,
7112   adjusting the tradeoffs in favor of the most common usage.
7113 * A large number of remaining APIs in `std` were also stabilized
7114   during this cycle; about 75% of the non-deprecated API surface
7115   is now stable.
7116 * The new [string pattern API][string-pattern] landed, which makes
7117   the string slice API much more internally consistent and flexible.
7118 * A new set of [generic conversion traits][conversion] replaced
7119   many existing ad hoc traits.
7120 * Generic numeric traits were [completely removed][num-traits]. This
7121   was made possible thanks to inherent methods for primitive types,
7122   and the removal gives maximal flexibility for designing a numeric
7123   hierarchy in the future.
7124 * The `Fn` traits are now related via [inheritance][fn-inherit]
7125   and provide ergonomic [blanket implementations][fn-blanket].
7126 * The `Index` and `IndexMut` traits were changed to
7127   [take the index by value][index-value], enabling code like
7128   `hash_map["string"]` to work.
7129 * `Copy` now [inherits][copy-clone] from `Clone`, meaning that all
7130   `Copy` data is known to be `Clone` as well.
7131
7132 Misc
7133 ----
7134
7135 * Many errors now have extended explanations that can be accessed with
7136   the `--explain` flag to `rustc`.
7137 * Many new examples have been added to the standard library
7138   documentation.
7139 * rustdoc has received a number of improvements focused on completion
7140   and polish.
7141 * Metadata was tuned, shrinking binaries [by 27%][metadata-shrink].
7142 * Much headway was made on ecosystem-wide CI, making it possible
7143   to [compare builds for breakage][ci-compare].
7144
7145
7146 [crates.io]: http://crates.io
7147 [clo]: https://github.com/rust-lang/rust/pull/24034
7148 [coh]: https://github.com/rust-lang/rfcs/blob/master/text/1023-rebalancing-coherence.md
7149 [con]: https://github.com/rust-lang/rust/pull/23875
7150 [cr]: https://github.com/rust-lang/rust/pull/23419
7151 [fe]: https://github.com/rust-lang/rust/pull/23879
7152 [ie]: https://github.com/rust-lang/rust/pull/23300
7153 [inv]: https://github.com/rust-lang/rust/pull/23938
7154 [ios]: https://github.com/rust-lang/rust/pull/24133
7155 [lex]: https://github.com/rust-lang/rfcs/blob/master/text/0879-small-base-lexing.md
7156 [lt]: https://github.com/rust-lang/rust/pull/24057
7157 [meth]: https://github.com/rust-lang/rust/pull/24056
7158 [pat]: https://github.com/rust-lang/rfcs/blob/master/text/0528-string-patterns.md
7159 [po]: https://github.com/rust-lang/rust/pull/24270
7160 [sf]: https://github.com/rust-lang/rust/pull/24517
7161 [slp]: https://github.com/rust-lang/rust/pull/23949
7162 [spl]: https://github.com/rust-lang/rfcs/blob/master/text/0979-align-splitn-with-other-languages.md
7163 [sw]: https://github.com/rust-lang/rfcs/blob/master/text/1054-str-words.md
7164 [th]: https://github.com/rust-lang/rfcs/blob/master/text/0909-move-thread-local-to-std-thread.md
7165 [send-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0458-send-improvements.md
7166 [moar-ufcs]: https://github.com/rust-lang/rust/pull/22172
7167 [prim-inherent]: https://github.com/rust-lang/rust/pull/23104
7168 [overflow]: https://github.com/rust-lang/rfcs/blob/master/text/0560-integer-overflow.md
7169 [metadata-shrink]: https://github.com/rust-lang/rust/pull/22971
7170 [self-sized]: https://github.com/rust-lang/rust/pull/22301
7171 [assoc-where]: https://github.com/rust-lang/rust/pull/22512
7172 [string-pattern]: https://github.com/rust-lang/rust/pull/22466
7173 [oibit-final]: https://github.com/rust-lang/rust/pull/21689
7174 [reflect]: https://github.com/rust-lang/rust/pull/23712
7175 [conversion]: https://github.com/rust-lang/rfcs/pull/529
7176 [num-traits]: https://github.com/rust-lang/rust/pull/23549
7177 [index-value]: https://github.com/rust-lang/rust/pull/23601
7178 [dropck]: https://github.com/rust-lang/rfcs/pull/769
7179 [ci-compare]: https://gist.github.com/brson/a30a77836fbec057cbee
7180 [fn-inherit]: https://github.com/rust-lang/rust/pull/23282
7181 [fn-blanket]: https://github.com/rust-lang/rust/pull/23895
7182 [copy-clone]: https://github.com/rust-lang/rust/pull/23860
7183 [path-normalize]: https://github.com/rust-lang/rust/pull/23229
7184
7185
7186 Version 1.0.0-alpha.2 (2015-02-20)
7187 =====================================
7188
7189 * ~1300 changes, numerous bugfixes
7190
7191 * Highlights
7192
7193     * The various I/O modules were [overhauled][io-rfc] to reduce
7194       unnecessary abstractions and provide better interoperation with
7195       the underlying platform. The old `io` module remains temporarily
7196       at `std::old_io`.
7197     * The standard library now [participates in feature gating][feat],
7198       so use of unstable libraries now requires a `#![feature(...)]`
7199       attribute. The impact of this change is [described on the
7200       forum][feat-forum]. [RFC][feat-rfc].
7201
7202 * Language
7203
7204     * `for` loops [now operate on the `IntoIterator` trait][into],
7205       which eliminates the need to call `.iter()`, etc. to iterate
7206       over collections. There are some new subtleties to remember
7207       though regarding what sort of iterators various types yield, in
7208       particular that `for foo in bar { }` yields values from a move
7209       iterator, destroying the original collection. [RFC][into-rfc].
7210     * Objects now have [default lifetime bounds][obj], so you don't
7211       have to write `Box<Trait+'static>` when you don't care about
7212       storing references. [RFC][obj-rfc].
7213     * In types that implement `Drop`, [lifetimes must outlive the
7214       value][drop]. This will soon make it possible to safely
7215       implement `Drop` for types where `#[unsafe_destructor]` is now
7216       required. Read the [gorgeous RFC][drop-rfc] for details.
7217     * The fully qualified <T as Trait>::X syntax lets you set the Self
7218       type for a trait method or associated type. [RFC][ufcs-rfc].
7219     * References to types that implement `Deref<U>` now [automatically
7220       coerce to references][deref] to the dereferenced type `U`,
7221       e.g. `&T where T: Deref<U>` automatically coerces to `&U`. This
7222       should eliminate many unsightly uses of `&*`, as when converting
7223       from references to vectors into references to
7224       slices. [RFC][deref-rfc].
7225     * The explicit [closure kind syntax][close] (`|&:|`, `|&mut:|`,
7226       `|:|`) is obsolete and closure kind is inferred from context.
7227     * [`Self` is a keyword][Self].
7228
7229 * Libraries
7230
7231     * The `Show` and `String` formatting traits [have been
7232       renamed][fmt] to `Debug` and `Display` to more clearly reflect
7233       their related purposes. Automatically getting a string
7234       conversion to use with `format!("{:?}", something_to_debug)` is
7235       now written `#[derive(Debug)]`.
7236     * Abstract [OS-specific string types][osstr], `std::ff::{OsString,
7237       OsStr}`, provide strings in platform-specific encodings for easier
7238       interop with system APIs. [RFC][osstr-rfc].
7239     * The `boxed::into_raw` and `Box::from_raw` functions [convert
7240       between `Box<T>` and `*mut T`][boxraw], a common pattern for
7241       creating raw pointers.
7242
7243 * Tooling
7244
7245     * Certain long error messages of the form 'expected foo found bar'
7246       are now [split neatly across multiple
7247       lines][multiline]. Examples in the PR.
7248     * On Unix Rust can be [uninstalled][un] by running
7249       `/usr/local/lib/rustlib/uninstall.sh`.
7250     * The `#[rustc_on_unimplemented]` attribute, requiring the
7251       'on_unimplemented' feature, lets rustc [display custom error
7252       messages when a trait is expected to be implemented for a type
7253       but is not][onun].
7254
7255 * Misc
7256
7257     * Rust is tested against a [LALR grammar][lalr], which parses
7258       almost all the Rust files that rustc does.
7259
7260 [boxraw]: https://github.com/rust-lang/rust/pull/21318
7261 [close]: https://github.com/rust-lang/rust/pull/21843
7262 [deref]: https://github.com/rust-lang/rust/pull/21351
7263 [deref-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0241-deref-conversions.md
7264 [drop]: https://github.com/rust-lang/rust/pull/21972
7265 [drop-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0769-sound-generic-drop.md
7266 [feat]: https://github.com/rust-lang/rust/pull/21248
7267 [feat-forum]: https://users.rust-lang.org/t/psa-important-info-about-rustcs-new-feature-staging/82/5
7268 [feat-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0507-release-channels.md
7269 [fmt]: https://github.com/rust-lang/rust/pull/21457
7270 [into]: https://github.com/rust-lang/rust/pull/20790
7271 [into-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0235-collections-conventions.md#intoiterator-and-iterable
7272 [io-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0517-io-os-reform.md
7273 [lalr]: https://github.com/rust-lang/rust/pull/21452
7274 [multiline]: https://github.com/rust-lang/rust/pull/19870
7275 [obj]: https://github.com/rust-lang/rust/pull/22230
7276 [obj-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0599-default-object-bound.md
7277 [onun]: https://github.com/rust-lang/rust/pull/20889
7278 [osstr]: https://github.com/rust-lang/rust/pull/21488
7279 [osstr-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0517-io-os-reform.md
7280 [Self]: https://github.com/rust-lang/rust/pull/22158
7281 [ufcs-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0132-ufcs.md
7282 [un]: https://github.com/rust-lang/rust/pull/22256
7283
7284
7285 Version 1.0.0-alpha (2015-01-09)
7286 ==================================
7287
7288   * ~2400 changes, numerous bugfixes
7289
7290   * Highlights
7291
7292     * The language itself is considered feature complete for 1.0,
7293       though there will be many usability improvements and bugfixes
7294       before the final release.
7295     * Nearly 50% of the public API surface of the standard library has
7296       been declared 'stable'. Those interfaces are unlikely to change
7297       before 1.0.
7298     * The long-running debate over integer types has been
7299       [settled][ints]: Rust will ship with types named `isize` and
7300       `usize`, rather than `int` and `uint`, for pointer-sized
7301       integers. Guidelines will be rolled out during the alpha cycle.
7302     * Most crates that are not `std` have been moved out of the Rust
7303       distribution into the Cargo ecosystem so they can evolve
7304       separately and don't need to be stabilized as quickly, including
7305       'time', 'getopts', 'num', 'regex', and 'term'.
7306     * Documentation continues to be expanded with more API coverage, more
7307       examples, and more in-depth explanations. The guides have been
7308       consolidated into [The Rust Programming Language][trpl].
7309     * "[Rust By Example][rbe]" is now maintained by the Rust team.
7310     * All official Rust binary installers now come with [Cargo], the
7311       Rust package manager.
7312
7313 * Language
7314
7315     * Closures have been [completely redesigned][unboxed] to be
7316       implemented in terms of traits, can now be used as generic type
7317       bounds and thus monomorphized and inlined, or via an opaque
7318       pointer (boxed) as in the old system. The new system is often
7319       referred to as 'unboxed' closures.
7320     * Traits now support [associated types][assoc], allowing families
7321       of related types to be defined together and used generically in
7322       powerful ways.
7323     * Enum variants are [namespaced by their type names][enum].
7324     * [`where` clauses][where] provide a more versatile and attractive
7325       syntax for specifying generic bounds, though the previous syntax
7326       remains valid.
7327     * Rust again picks a [fallback][fb] (either i32 or f64) for uninferred
7328       numeric types.
7329     * Rust [no longer has a runtime][rt] of any description, and only
7330       supports OS threads, not green threads.
7331     * At long last, Rust has been overhauled for 'dynamically-sized
7332       types' ([DST]), which integrates 'fat pointers' (object types,
7333       arrays, and `str`) more deeply into the type system, making it
7334       more consistent.
7335     * Rust now has a general [range syntax][range], `i..j`, `i..`, and
7336       `..j` that produce range types and which, when combined with the
7337       `Index` operator and multidispatch, leads to a convenient slice
7338       notation, `[i..j]`.
7339     * The new range syntax revealed an ambiguity in the fixed-length
7340       array syntax, so now fixed length arrays [are written `[T;
7341       N]`][arrays].
7342     * The `Copy` trait is no longer implemented automatically. Unsafe
7343       pointers no longer implement `Sync` and `Send` so types
7344       containing them don't automatically either. `Sync` and `Send`
7345       are now 'unsafe traits' so one can "forcibly" implement them via
7346       `unsafe impl` if a type confirms to the requirements for them
7347       even though the internals do not (e.g. structs containing unsafe
7348       pointers like `Arc`). These changes are intended to prevent some
7349       footguns and are collectively known as [opt-in built-in
7350       traits][oibit] (though `Sync` and `Send` will soon become pure
7351       library types unknown to the compiler).
7352     * Operator traits now take their operands [by value][ops], and
7353       comparison traits can use multidispatch to compare one type
7354       against multiple other types, allowing e.g. `String` to be
7355       compared with `&str`.
7356     * `if let` and `while let` are no longer feature-gated.
7357     * Rust has adopted a more [uniform syntax for escaping unicode
7358       characters][unicode].
7359     * `macro_rules!` [has been declared stable][mac]. Though it is a
7360       flawed system it is sufficiently popular that it must be usable
7361       for 1.0. Effort has gone into [future-proofing][mac-future] it
7362       in ways that will allow other macro systems to be developed in
7363       parallel, and won't otherwise impact the evolution of the
7364       language.
7365     * The prelude has been [pared back significantly][prelude] such
7366       that it is the minimum necessary to support the most pervasive
7367       code patterns, and through [generalized where clauses][where]
7368       many of the prelude extension traits have been consolidated.
7369     * Rust's rudimentary reflection [has been removed][refl], as it
7370       incurred too much code generation for little benefit.
7371     * [Struct variants][structvars] are no longer feature-gated.
7372     * Trait bounds can be [polymorphic over lifetimes][hrtb]. Also
7373       known as 'higher-ranked trait bounds', this crucially allows
7374       unboxed closures to work.
7375     * Macros invocations surrounded by parens or square brackets and
7376       not terminated by a semicolon are [parsed as
7377       expressions][macros], which makes expressions like `vec![1i32,
7378       2, 3].len()` work as expected.
7379     * Trait objects now implement their traits automatically, and
7380       traits that can be coerced to objects now must be [object
7381       safe][objsafe].
7382     * Automatically deriving traits is now done with `#[derive(...)]`
7383       not `#[deriving(...)]` for [consistency with other naming
7384       conventions][derive].
7385     * Importing the containing module or enum at the same time as
7386       items or variants they contain is [now done with `self` instead
7387       of `mod`][self], as in use `foo::{self, bar}`
7388     * Glob imports are no longer feature-gated.
7389     * The `box` operator and `box` patterns have been feature-gated
7390       pending a redesign. For now unique boxes should be allocated
7391       like other containers, with `Box::new`.
7392
7393 * Libraries
7394
7395     * A [series][coll1] of [efforts][coll2] to establish
7396       [conventions][coll3] for collections types has resulted in API
7397       improvements throughout the standard library.
7398     * New [APIs for error handling][err] provide ergonomic interop
7399       between error types, and [new conventions][err-conv] describe
7400       more clearly the recommended error handling strategies in Rust.
7401     * The `fail!` macro has been renamed to [`panic!`][panic] so that
7402       it is easier to discuss failure in the context of error handling
7403       without making clarifications as to whether you are referring to
7404       the 'fail' macro or failure more generally.
7405     * On Linux, `OsRng` prefers the new, more reliable `getrandom`
7406       syscall when available.
7407     * The 'serialize' crate has been renamed 'rustc-serialize' and
7408       moved out of the distribution to Cargo. Although it is widely
7409       used now, it is expected to be superseded in the near future.
7410     * The `Show` formatter, typically implemented with
7411       `#[derive(Show)]` is [now requested with the `{:?}`
7412       specifier][show] and is intended for use by all types, for uses
7413       such as `println!` debugging. The new `String` formatter must be
7414       implemented by hand, uses the `{}` specifier, and is intended
7415       for full-fidelity conversions of things that can logically be
7416       represented as strings.
7417
7418 * Tooling
7419
7420     * [Flexible target specification][flex] allows rustc's code
7421       generation to be configured to support otherwise-unsupported
7422       platforms.
7423     * Rust comes with rust-gdb and rust-lldb scripts that launch their
7424       respective debuggers with Rust-appropriate pretty-printing.
7425     * The Windows installation of Rust is distributed with the
7426       MinGW components currently required to link binaries on that
7427       platform.
7428
7429 * Misc
7430
7431     * Nullable enum optimizations have been extended to more types so
7432       that e.g. `Option<Vec<T>>` and `Option<String>` take up no more
7433       space than the inner types themselves.
7434     * Work has begun on supporting AArch64.
7435
7436 [Cargo]: https://crates.io
7437 [unboxed]: http://smallcultfollowing.com/babysteps/blog/2014/11/26/purging-proc/
7438 [enum]: https://github.com/rust-lang/rfcs/blob/master/text/0390-enum-namespacing.md
7439 [flex]: https://github.com/rust-lang/rfcs/blob/master/text/0131-target-specification.md
7440 [err]: https://github.com/rust-lang/rfcs/blob/master/text/0201-error-chaining.md
7441 [err-conv]: https://github.com/rust-lang/rfcs/blob/master/text/0236-error-conventions.md
7442 [rt]: https://github.com/rust-lang/rfcs/blob/master/text/0230-remove-runtime.md
7443 [mac]: https://github.com/rust-lang/rfcs/blob/master/text/0453-macro-reform.md
7444 [mac-future]: https://github.com/rust-lang/rfcs/pull/550
7445 [DST]: http://smallcultfollowing.com/babysteps/blog/2014/01/05/dst-take-5/
7446 [coll1]: https://github.com/rust-lang/rfcs/blob/master/text/0235-collections-conventions.md
7447 [coll2]: https://github.com/rust-lang/rfcs/blob/master/text/0509-collections-reform-part-2.md
7448 [coll3]: https://github.com/rust-lang/rfcs/blob/master/text/0216-collection-views.md
7449 [ops]: https://github.com/rust-lang/rfcs/blob/master/text/0439-cmp-ops-reform.md
7450 [prelude]: https://github.com/rust-lang/rfcs/blob/master/text/0503-prelude-stabilization.md
7451 [where]: https://github.com/rust-lang/rfcs/blob/master/text/0135-where.md
7452 [refl]: https://github.com/rust-lang/rfcs/blob/master/text/0379-remove-reflection.md
7453 [panic]: https://github.com/rust-lang/rfcs/blob/master/text/0221-panic.md
7454 [structvars]: https://github.com/rust-lang/rfcs/blob/master/text/0418-struct-variants.md
7455 [hrtb]: https://github.com/rust-lang/rfcs/blob/master/text/0387-higher-ranked-trait-bounds.md
7456 [unicode]: https://github.com/rust-lang/rfcs/blob/master/text/0446-es6-unicode-escapes.md
7457 [oibit]: https://github.com/rust-lang/rfcs/blob/master/text/0019-opt-in-builtin-traits.md
7458 [macros]: https://github.com/rust-lang/rfcs/blob/master/text/0378-expr-macros.md
7459 [range]: https://github.com/rust-lang/rfcs/blob/master/text/0439-cmp-ops-reform.md#indexing-and-slicing
7460 [arrays]: https://github.com/rust-lang/rfcs/blob/master/text/0520-new-array-repeat-syntax.md
7461 [show]: https://github.com/rust-lang/rfcs/blob/master/text/0504-show-stabilization.md
7462 [derive]: https://github.com/rust-lang/rfcs/blob/master/text/0534-deriving2derive.md
7463 [self]: https://github.com/rust-lang/rfcs/blob/master/text/0532-self-in-use.md
7464 [fb]: https://github.com/rust-lang/rfcs/blob/master/text/0212-restore-int-fallback.md
7465 [objsafe]: https://github.com/rust-lang/rfcs/blob/master/text/0255-object-safety.md
7466 [assoc]: https://github.com/rust-lang/rfcs/blob/master/text/0195-associated-items.md
7467 [ints]: https://github.com/rust-lang/rfcs/pull/544#issuecomment-68760871
7468 [trpl]: https://doc.rust-lang.org/book/index.html
7469 [rbe]: http://rustbyexample.com/
7470
7471
7472 Version 0.12.0 (2014-10-09)
7473 =============================
7474
7475   * ~1900 changes, numerous bugfixes
7476
7477   * Highlights
7478
7479     * The introductory documentation (now called The Rust Guide) has
7480       been completely rewritten, as have a number of supplementary
7481       guides.
7482     * Rust's package manager, Cargo, continues to improve and is
7483       sometimes considered to be quite awesome.
7484     * Many API's in `std` have been reviewed and updated for
7485       consistency with the in-development Rust coding
7486       guidelines. The standard library documentation tracks
7487       stabilization progress.
7488     * Minor libraries have been moved out-of-tree to the rust-lang org
7489       on GitHub: uuid, semver, glob, num, hexfloat, fourcc. They can
7490       be installed with Cargo.
7491     * Lifetime elision allows lifetime annotations to be left off of
7492       function declarations in many common scenarios.
7493     * Rust now works on 64-bit Windows.
7494
7495   * Language
7496     * Indexing can be overloaded with the `Index` and `IndexMut`
7497       traits.
7498     * The `if let` construct takes a branch only if the `let` pattern
7499       matches, currently behind the 'if_let' feature gate.
7500     * 'where clauses', a more flexible syntax for specifying trait
7501       bounds that is more aesthetic, have been added for traits and
7502       free functions. Where clauses will in the future make it
7503       possible to constrain associated types, which would be
7504       impossible with the existing syntax.
7505     * A new slicing syntax (e.g. `[0..4]`) has been introduced behind
7506       the 'slicing_syntax' feature gate, and can be overloaded with
7507       the `Slice` or `SliceMut` traits.
7508     * The syntax for matching of sub-slices has been changed to use a
7509       postfix `..` instead of prefix (.e.g. `[a, b, c..]`), for
7510       consistency with other uses of `..` and to future-proof
7511       potential additional uses of the syntax.
7512     * The syntax for matching inclusive ranges in patterns has changed
7513       from `0..3` to `0...4` to be consistent with the exclusive range
7514       syntax for slicing.
7515     * Matching of sub-slices in non-tail positions (e.g.  `[a.., b,
7516       c]`) has been put behind the 'advanced_slice_patterns' feature
7517       gate and may be removed in the future.
7518     * Components of tuples and tuple structs can be extracted using
7519       the `value.0` syntax, currently behind the `tuple_indexing`
7520       feature gate.
7521     * The `#[crate_id]` attribute is no longer supported; versioning
7522       is handled by the package manager.
7523     * Renaming crate imports are now written `extern crate foo as bar`
7524       instead of `extern crate bar = foo`.
7525     * Renaming use statements are now written `use foo as bar` instead
7526       of `use bar = foo`.
7527     * `let` and `match` bindings and argument names in macros are now
7528       hygienic.
7529     * The new, more efficient, closure types ('unboxed closures') have
7530       been added under a feature gate, 'unboxed_closures'. These will
7531       soon replace the existing closure types, once higher-ranked
7532       trait lifetimes are added to the language.
7533     * `move` has been added as a keyword, for indicating closures
7534       that capture by value.
7535     * Mutation and assignment is no longer allowed in pattern guards.
7536     * Generic structs and enums can now have trait bounds.
7537     * The `Share` trait is now called `Sync` to free up the term
7538       'shared' to refer to 'shared reference' (the default reference
7539       type.
7540     * Dynamically-sized types have been mostly implemented,
7541       unifying the behavior of fat-pointer types with the rest of the
7542       type system.
7543     * As part of dynamically-sized types, the `Sized` trait has been
7544       introduced, which qualifying types implement by default, and
7545       which type parameters expect by default. To specify that a type
7546       parameter does not need to be sized, write `<Sized? T>`. Most
7547       types are `Sized`, notable exceptions being unsized arrays
7548       (`[T]`) and trait types.
7549     * Closures can return `!`, as in `|| -> !` or `proc() -> !`.
7550     * Lifetime bounds can now be applied to type parameters and object
7551       types.
7552     * The old, reference counted GC type, `Gc<T>` which was once
7553       denoted by the `@` sigil, has finally been removed. GC will be
7554       revisited in the future.
7555
7556   * Libraries
7557     * Library documentation has been improved for a number of modules.
7558     * Bit-vectors, collections::bitv has been modernized.
7559     * The url crate is deprecated in favor of
7560       http://github.com/servo/rust-url, which can be installed with
7561       Cargo.
7562     * Most I/O stream types can be cloned and subsequently closed from
7563       a different thread.
7564     * A `std::time::Duration` type has been added for use in I/O
7565       methods that rely on timers, as well as in the 'time' crate's
7566       `Timespec` arithmetic.
7567     * The runtime I/O abstraction layer that enabled the green thread
7568       scheduler to do non-thread-blocking I/O has been removed, along
7569       with the libuv-based implementation employed by the green thread
7570       scheduler. This will greatly simplify the future I/O work.
7571     * `collections::btree` has been rewritten to have a more
7572       idiomatic and efficient design.
7573
7574   * Tooling
7575     * rustdoc output now indicates the stability levels of API's.
7576     * The `--crate-name` flag can specify the name of the crate
7577       being compiled, like `#[crate_name]`.
7578     * The `-C metadata` specifies additional metadata to hash into
7579       symbol names, and `-C extra-filename` specifies additional
7580       information to put into the output filename, for use by the
7581       package manager for versioning.
7582     * debug info generation has continued to improve and should be
7583       more reliable under both gdb and lldb.
7584     * rustc has experimental support for compiling in parallel
7585       using the `-C codegen-units` flag.
7586     * rustc no longer encodes rpath information into binaries by
7587       default.
7588
7589   * Misc
7590     * Stack usage has been optimized with LLVM lifetime annotations.
7591     * Official Rust binaries on Linux are more compatible with older
7592       kernels and distributions, built on CentOS 5.10.
7593
7594
7595 Version 0.11.0 (2014-07-02)
7596 ==========================
7597
7598   * ~1700 changes, numerous bugfixes
7599
7600   * Language
7601     * ~[T] has been removed from the language. This type is superseded by
7602       the Vec<T> type.
7603     * ~str has been removed from the language. This type is superseded by
7604       the String type.
7605     * ~T has been removed from the language. This type is superseded by the
7606       Box<T> type.
7607     * @T has been removed from the language. This type is superseded by the
7608       standard library's std::gc::Gc<T> type.
7609     * Struct fields are now all private by default.
7610     * Vector indices and shift amounts are both required to be a `uint`
7611       instead of any integral type.
7612     * Byte character, byte string, and raw byte string literals are now all
7613       supported by prefixing the normal literal with a `b`.
7614     * Multiple ABIs are no longer allowed in an ABI string
7615     * The syntax for lifetimes on closures/procedures has been tweaked
7616       slightly: `<'a>|A, B|: 'b + K -> T`
7617     * Floating point modulus has been removed from the language; however it
7618       is still provided by a library implementation.
7619     * Private enum variants are now disallowed.
7620     * The `priv` keyword has been removed from the language.
7621     * A closure can no longer be invoked through a &-pointer.
7622     * The `use foo, bar, baz;` syntax has been removed from the language.
7623     * The transmute intrinsic no longer works on type parameters.
7624     * Statics now allow blocks/items in their definition.
7625     * Trait bounds are separated from objects with + instead of : now.
7626     * Objects can no longer be read while they are mutably borrowed.
7627     * The address of a static is now marked as insignificant unless the
7628       #[inline(never)] attribute is placed it.
7629     * The #[unsafe_destructor] attribute is now behind a feature gate.
7630     * Struct literals are no longer allowed in ambiguous positions such as
7631       if, while, match, and for..in.
7632     * Declaration of lang items and intrinsics are now feature-gated by
7633       default.
7634     * Integral literals no longer default to `int`, and floating point
7635       literals no longer default to `f64`. Literals must be suffixed with an
7636       appropriate type if inference cannot determine the type of the
7637       literal.
7638     * The Box<T> type is no longer implicitly borrowed to &mut T.
7639     * Procedures are now required to not capture borrowed references.
7640
7641   * Libraries
7642     * The standard library is now a "facade" over a number of underlying
7643       libraries. This means that development on the standard library should
7644       be speedier due to smaller crates, as well as a clearer line between
7645       all dependencies.
7646     * A new library, libcore, lives under the standard library's facade
7647       which is Rust's "0-assumption" library, suitable for embedded and
7648       kernel development for example.
7649     * A regex crate has been added to the standard distribution. This crate
7650       includes statically compiled regular expressions.
7651     * The unwrap/unwrap_err methods on Result require a Show bound for
7652       better error messages.
7653     * The return types of the std::comm primitives have been centralized
7654       around the Result type.
7655     * A number of I/O primitives have gained the ability to time out their
7656       operations.
7657     * A number of I/O primitives have gained the ability to close their
7658       reading/writing halves to cancel pending operations.
7659     * Reverse iterator methods have been removed in favor of `rev()` on
7660       their forward-iteration counterparts.
7661     * A bitflags! macro has been added to enable easy interop with C and
7662       management of bit flags.
7663     * A debug_assert! macro is now provided which is disabled when
7664       `--cfg ndebug` is passed to the compiler.
7665     * A graphviz crate has been added for creating .dot files.
7666     * The std::cast module has been migrated into std::mem.
7667     * The std::local_data api has been migrated from freestanding functions
7668       to being based on methods.
7669     * The Pod trait has been renamed to Copy.
7670     * jemalloc has been added as the default allocator for types.
7671     * The API for allocating memory has been changed to use proper alignment
7672       and sized deallocation
7673     * Connecting a TcpStream or binding a TcpListener is now based on a
7674       string address and a u16 port. This allows connecting to a hostname as
7675       opposed to an IP.
7676     * The Reader trait now contains a core method, read_at_least(), which
7677       correctly handles many repeated 0-length reads.
7678     * The process-spawning API is now centered around a builder-style
7679       Command struct.
7680     * The :? printing qualifier has been moved from the standard library to
7681       an external libdebug crate.
7682     * Eq/Ord have been renamed to PartialEq/PartialOrd. TotalEq/TotalOrd
7683       have been renamed to Eq/Ord.
7684     * The select/plural methods have been removed from format!. The escapes
7685       for { and } have also changed from \{ and \} to {{ and }},
7686       respectively.
7687     * The TaskBuilder API has been re-worked to be a true builder, and
7688       extension traits for spawning native/green tasks have been added.
7689
7690   * Tooling
7691     * All breaking changes to the language or libraries now have their
7692       commit message annotated with `[breaking-change]` to allow for easy
7693       discovery of breaking changes.
7694     * The compiler will now try to suggest how to annotate lifetimes if a
7695       lifetime-related error occurs.
7696     * Debug info continues to be improved greatly with general bug fixes and
7697       better support for situations like link time optimization (LTO).
7698     * Usage of syntax extensions when cross-compiling has been fixed.
7699     * Functionality equivalent to GCC & Clang's -ffunction-sections,
7700       -fdata-sections and --gc-sections has been enabled by default
7701     * The compiler is now stricter about where it will load module files
7702       from when a module is declared via `mod foo;`.
7703     * The #[phase(syntax)] attribute has been renamed to #[phase(plugin)].
7704       Syntax extensions are now discovered via a "plugin registrar" type
7705       which will be extended in the future to other various plugins.
7706     * Lints have been restructured to allow for dynamically loadable lints.
7707     * A number of rustdoc improvements:
7708       * The HTML output has been visually redesigned.
7709       * Markdown is now powered by hoedown instead of sundown.
7710       * Searching heuristics have been greatly improved.
7711       * The search index has been reduced in size by a great amount.
7712       * Cross-crate documentation via `pub use` has been greatly improved.
7713       * Primitive types are now hyperlinked and documented.
7714     * Documentation has been moved from static.rust-lang.org/doc to
7715       doc.rust-lang.org
7716     * A new sandbox, play.rust-lang.org, is available for running and
7717       sharing rust code examples on-line.
7718     * Unused attributes are now more robustly warned about.
7719     * The dead_code lint now warns about unused struct fields.
7720     * Cross-compiling to iOS is now supported.
7721     * Cross-compiling to mipsel is now supported.
7722     * Stability attributes are now inherited by default and no longer apply
7723       to intra-crate usage, only inter-crate usage.
7724     * Error message related to non-exhaustive match expressions have been
7725       greatly improved.
7726
7727
7728 Version 0.10 (2014-04-03)
7729 =========================
7730
7731   * ~1500 changes, numerous bugfixes
7732
7733   * Language
7734     * A new RFC process is now in place for modifying the language.
7735     * Patterns with `@`-pointers have been removed from the language.
7736     * Patterns with unique vectors (`~[T]`) have been removed from the
7737       language.
7738     * Patterns with unique strings (`~str`) have been removed from the
7739       language.
7740     * `@str` has been removed from the language.
7741     * `@[T]` has been removed from the language.
7742     * `@self` has been removed from the language.
7743     * `@Trait` has been removed from the language.
7744     * Headers on `~` allocations which contain `@` boxes inside the type for
7745       reference counting have been removed.
7746     * The semantics around the lifetimes of temporary expressions have changed,
7747       see #3511 and #11585 for more information.
7748     * Cross-crate syntax extensions are now possible, but feature gated. See
7749       #11151 for more information. This includes both `macro_rules!` macros as
7750       well as syntax extensions such as `format!`.
7751     * New lint modes have been added, and older ones have been turned on to be
7752       warn-by-default.
7753       * Unnecessary parentheses
7754       * Uppercase statics
7755       * Camel Case types
7756       * Uppercase variables
7757       * Publicly visible private types
7758       * `#[deriving]` with raw pointers
7759     * Unsafe functions can no longer be coerced to closures.
7760     * Various obscure macros such as `log_syntax!` are now behind feature gates.
7761     * The `#[simd]` attribute is now behind a feature gate.
7762     * Visibility is no longer allowed on `extern crate` statements, and
7763       unnecessary visibility (`priv`) is no longer allowed on `use` statements.
7764     * Trailing commas are now allowed in argument lists and tuple patterns.
7765     * The `do` keyword has been removed, it is now a reserved keyword.
7766     * Default type parameters have been implemented, but are feature gated.
7767     * Borrowed variables through captures in closures are now considered soundly.
7768     * `extern mod` is now `extern crate`
7769     * The `Freeze` trait has been removed.
7770     * The `Share` trait has been added for types that can be shared among
7771       threads.
7772     * Labels in macros are now hygienic.
7773     * Expression/statement macro invocations can be delimited with `{}` now.
7774     * Treatment of types allowed in `static mut` locations has been tweaked.
7775     * The `*` and `.` operators are now overloadable through the `Deref` and
7776       `DerefMut` traits.
7777     * `~Trait` and `proc` no longer have `Send` bounds by default.
7778     * Partial type hints are now supported with the `_` type marker.
7779     * An `Unsafe` type was introduced for interior mutability. It is now
7780       considered undefined to transmute from `&T` to `&mut T` without using the
7781       `Unsafe` type.
7782     * The #[linkage] attribute was implemented for extern statics/functions.
7783     * The inner attribute syntax has changed from `#[foo];` to `#![foo]`.
7784     * `Pod` was renamed to `Copy`.
7785
7786   * Libraries
7787     * The `libextra` library has been removed. It has now been decomposed into
7788       component libraries with smaller and more focused nuggets of
7789       functionality. The full list of libraries can be found on the
7790       documentation index page.
7791     * std: `std::condition` has been removed. All I/O errors are now propagated
7792       through the `Result` type. In order to assist with error handling, a
7793       `try!` macro for unwrapping errors with an early return and a lint for
7794       unused results has been added. See #12039 for more information.
7795     * std: The `vec` module has been renamed to `slice`.
7796     * std: A new vector type, `Vec<T>`, has been added in preparation for DST.
7797       This will become the only growable vector in the future.
7798     * std: `std::io` now has more public re-exports. Types such as `BufferedReader`
7799       are now found at `std::io::BufferedReader` instead of
7800       `std::io::buffered::BufferedReader`.
7801     * std: `print` and `println` are no longer in the prelude, the `print!` and
7802       `println!` macros are intended to be used instead.
7803     * std: `Rc` now has a `Weak` pointer for breaking cycles, and it no longer
7804       attempts to statically prevent cycles.
7805     * std: The standard distribution is adopting the policy of pushing failure
7806       to the user rather than failing in libraries. Many functions (such as
7807       `slice::last()`) now return `Option<T>` instead of `T` + failing.
7808     * std: `fmt::Default` has been renamed to `fmt::Show`, and it now has a new
7809       deriving mode: `#[deriving(Show)]`.
7810     * std: `ToStr` is now implemented for all types implementing `Show`.
7811     * std: The formatting trait methods now take `&self` instead of `&T`
7812     * std: The `invert()` method on iterators has been renamed to `rev()`
7813     * std: `std::num` has seen a reduction in the genericity of its traits,
7814       consolidating functionality into a few core traits.
7815     * std: Backtraces are now printed on task failure if the environment
7816       variable `RUST_BACKTRACE` is present.
7817     * std: Naming conventions for iterators have been standardized. More details
7818       can be found on the wiki's style guide.
7819     * std: `eof()` has been removed from the `Reader` trait. Specific types may
7820       still implement the function.
7821     * std: Networking types are now cloneable to allow simultaneous reads/writes.
7822     * std: `assert_approx_eq!` has been removed
7823     * std: The `e` and `E` formatting specifiers for floats have been added to
7824       print them in exponential notation.
7825     * std: The `Times` trait has been removed
7826     * std: Indications of variance and opting out of builtin bounds is done
7827       through marker types in `std::kinds::marker` now
7828     * std: `hash` has been rewritten, `IterBytes` has been removed, and
7829       `#[deriving(Hash)]` is now possible.
7830     * std: `SharedChan` has been removed, `Sender` is now cloneable.
7831     * std: `Chan` and `Port` were renamed to `Sender` and `Receiver`.
7832     * std: `Chan::new` is now `channel()`.
7833     * std: A new synchronous channel type has been implemented.
7834     * std: A `select!` macro is now provided for selecting over `Receiver`s.
7835     * std: `hashmap` and `trie` have been moved to `libcollections`
7836     * std: `run` has been rolled into `io::process`
7837     * std: `assert_eq!` now uses `{}` instead of `{:?}`
7838     * std: The equality and comparison traits have seen some reorganization.
7839     * std: `rand` has moved to `librand`.
7840     * std: `to_{lower,upper}case` has been implemented for `char`.
7841     * std: Logging has been moved to `liblog`.
7842     * collections: `HashMap` has been rewritten for higher performance and less
7843       memory usage.
7844     * native: The default runtime is now `libnative`. If `libgreen` is desired,
7845       it can be booted manually. The runtime guide has more information and
7846       examples.
7847     * native: All I/O functionality except signals has been implemented.
7848     * green: Task spawning with `libgreen` has been optimized with stack caching
7849       and various trimming of code.
7850     * green: Tasks spawned by `libgreen` now have an unmapped guard page.
7851     * sync: The `extra::sync` module has been updated to modern rust (and moved
7852       to the `sync` library), tweaking and improving various interfaces while
7853       dropping redundant functionality.
7854     * sync: A new `Barrier` type has been added to the `sync` library.
7855     * sync: An efficient mutex for native and green tasks has been implemented.
7856     * serialize: The `base64` module has seen some improvement. It treats
7857       newlines better, has non-string error values, and has seen general
7858       cleanup.
7859     * fourcc: A `fourcc!` macro was introduced
7860     * hexfloat: A `hexfloat!` macro was implemented for specifying floats via a
7861       hexadecimal literal.
7862
7863   * Tooling
7864     * `rustpkg` has been deprecated and removed from the main repository. Its
7865       replacement, `cargo`, is under development.
7866     * Nightly builds of rust are now available
7867     * The memory usage of rustc has been improved many times throughout this
7868       release cycle.
7869     * The build process supports disabling rpath support for the rustc binary
7870       itself.
7871     * Code generation has improved in some cases, giving more information to the
7872       LLVM optimization passes to enable more extensive optimizations.
7873     * Debuginfo compatibility with lldb on OSX has been restored.
7874     * The master branch is now gated on an android bot, making building for
7875       android much more reliable.
7876     * Output flags have been centralized into one `--emit` flag.
7877     * Crate type flags have been centralized into one `--crate-type` flag.
7878     * Codegen flags have been consolidated behind a `-C` flag.
7879     * Linking against outdated crates now has improved error messages.
7880     * Error messages with lifetimes will often suggest how to annotate the
7881       function to fix the error.
7882     * Many more types are documented in the standard library, and new guides
7883       were written.
7884     * Many `rustdoc` improvements:
7885       * code blocks are syntax highlighted.
7886       * render standalone markdown files.
7887       * the --test flag tests all code blocks by default.
7888       * exported macros are displayed.
7889       * re-exported types have their documentation inlined at the location of the
7890         first re-export.
7891       * search works across crates that have been rendered to the same output
7892         directory.
7893
7894
7895 Version 0.9 (2014-01-09)
7896 ==========================
7897
7898    * ~1800 changes, numerous bugfixes
7899
7900    * Language
7901       * The `float` type has been removed. Use `f32` or `f64` instead.
7902       * A new facility for enabling experimental features (feature gating) has
7903         been added, using the crate-level `#[feature(foo)]` attribute.
7904       * Managed boxes (@) are now behind a feature gate
7905         (`#[feature(managed_boxes)]`) in preparation for future removal. Use the
7906         standard library's `Gc` or `Rc` types instead.
7907       * `@mut` has been removed. Use `std::cell::{Cell, RefCell}` instead.
7908       * Jumping back to the top of a loop is now done with `continue` instead of
7909         `loop`.
7910       * Strings can no longer be mutated through index assignment.
7911       * Raw strings can be created via the basic `r"foo"` syntax or with matched
7912         hash delimiters, as in `r###"foo"###`.
7913       * `~fn` is now written `proc (args) -> retval { ... }` and may only be
7914         called once.
7915       * The `&fn` type is now written `|args| -> ret` to match the literal form.
7916       * `@fn`s have been removed.
7917       * `do` only works with procs in order to make it obvious what the cost
7918         of `do` is.
7919       * Single-element tuple-like structs can no longer be dereferenced to
7920         obtain the inner value. A more comprehensive solution for overloading
7921         the dereference operator will be provided in the future.
7922       * The `#[link(...)]` attribute has been replaced with
7923         `#[crate_id = "name#vers"]`.
7924       * Empty `impl`s must be terminated with empty braces and may not be
7925         terminated with a semicolon.
7926       * Keywords are no longer allowed as lifetime names; the `self` lifetime
7927         no longer has any special meaning.
7928       * The old `fmt!` string formatting macro has been removed.
7929       * `printf!` and `printfln!` (old-style formatting) removed in favor of
7930         `print!` and `println!`.
7931       * `mut` works in patterns now, as in `let (mut x, y) = (1, 2);`.
7932       * The `extern mod foo (name = "bar")` syntax has been removed. Use
7933         `extern mod foo = "bar"` instead.
7934       * New reserved keywords: `alignof`, `offsetof`, `sizeof`.
7935       * Macros can have attributes.
7936       * Macros can expand to items with attributes.
7937       * Macros can expand to multiple items.
7938       * The `asm!` macro is feature-gated (`#[feature(asm)]`).
7939       * Comments may be nested.
7940       * Values automatically coerce to trait objects they implement, without
7941         an explicit `as`.
7942       * Enum discriminants are no longer an entire word but as small as needed to
7943         contain all the variants. The `repr` attribute can be used to override
7944         the discriminant size, as in `#[repr(int)]` for integer-sized, and
7945         `#[repr(C)]` to match C enums.
7946       * Non-string literals are not allowed in attributes (they never worked).
7947       * The FFI now supports variadic functions.
7948       * Octal numeric literals, as in `0o7777`.
7949       * The `concat!` syntax extension performs compile-time string concatenation.
7950       * The `#[fixed_stack_segment]` and `#[rust_stack]` attributes have been
7951         removed as Rust no longer uses segmented stacks.
7952       * Non-ascii identifiers are feature-gated (`#[feature(non_ascii_idents)]`).
7953       * Ignoring all fields of an enum variant or tuple-struct is done with `..`,
7954         not `*`; ignoring remaining fields of a struct is also done with `..`,
7955         not `_`; ignoring a slice of a vector is done with `..`, not `.._`.
7956       * `rustc` supports the "win64" calling convention via `extern "win64"`.
7957       * `rustc` supports the "system" calling convention, which defaults to the
7958         preferred convention for the target platform, "stdcall" on 32-bit Windows,
7959         "C" elsewhere.
7960       * The `type_overflow` lint (default: warn) checks literals for overflow.
7961       * The `unsafe_block` lint (default: allow) checks for usage of `unsafe`.
7962       * The `attribute_usage` lint (default: warn) warns about unknown
7963         attributes.
7964       * The `unknown_features` lint (default: warn) warns about unknown
7965         feature gates.
7966       * The `dead_code` lint (default: warn) checks for dead code.
7967       * Rust libraries can be linked statically to one another
7968       * `#[link_args]` is behind the `link_args` feature gate.
7969       * Native libraries are now linked with `#[link(name = "foo")]`
7970       * Native libraries can be statically linked to a rust crate
7971         (`#[link(name = "foo", kind = "static")]`).
7972       * Native OS X frameworks are now officially supported
7973         (`#[link(name = "foo", kind = "framework")]`).
7974       * The `#[thread_local]` attribute creates thread-local (not task-local)
7975         variables. Currently behind the `thread_local` feature gate.
7976       * The `return` keyword may be used in closures.
7977       * Types that can be copied via a memcpy implement the `Pod` kind.
7978       * The `cfg` attribute can now be used on struct fields and enum variants.
7979
7980    * Libraries
7981       * std: The `option` and `result` API's have been overhauled to make them
7982         simpler, more consistent, and more composable.
7983       * std: The entire `std::io` module has been replaced with one that is
7984         more comprehensive and that properly interfaces with the underlying
7985         scheduler. File, TCP, UDP, Unix sockets, pipes, and timers are all
7986         implemented.
7987       * std: `io::util` contains a number of useful implementations of
7988         `Reader` and `Writer`, including `NullReader`, `NullWriter`,
7989         `ZeroReader`, `TeeReader`.
7990       * std: The reference counted pointer type `extra::rc` moved into std.
7991       * std: The `Gc` type in the `gc` module will replace `@` (it is currently
7992         just a wrapper around it).
7993       * std: The `Either` type has been removed.
7994       * std: `fmt::Default` can be implemented for any type to provide default
7995         formatting to the `format!` macro, as in `format!("{}", myfoo)`.
7996       * std: The `rand` API continues to be tweaked.
7997       * std: The `rust_begin_unwind` function, useful for inserting breakpoints
7998         on failure in gdb, is now named `rust_fail`.
7999       * std: The `each_key` and `each_value` methods on `HashMap` have been
8000         replaced by the `keys` and `values` iterators.
8001       * std: Functions dealing with type size and alignment have moved from the
8002         `sys` module to the `mem` module.
8003       * std: The `path` module was written and API changed.
8004       * std: `str::from_utf8` has been changed to cast instead of allocate.
8005       * std: `starts_with` and `ends_with` methods added to vectors via the
8006         `ImmutableEqVector` trait, which is in the prelude.
8007       * std: Vectors can be indexed with the `get_opt` method, which returns `None`
8008         if the index is out of bounds.
8009       * std: Task failure no longer propagates between tasks, as the model was
8010         complex, expensive, and incompatible with thread-based tasks.
8011       * std: The `Any` type can be used for dynamic typing.
8012       * std: `~Any` can be passed to the `fail!` macro and retrieved via
8013         `task::try`.
8014       * std: Methods that produce iterators generally do not have an `_iter`
8015         suffix now.
8016       * std: `cell::Cell` and `cell::RefCell` can be used to introduce mutability
8017         roots (mutable fields, etc.). Use instead of e.g. `@mut`.
8018       * std: `util::ignore` renamed to `prelude::drop`.
8019       * std: Slices have `sort` and `sort_by` methods via the `MutableVector`
8020         trait.
8021       * std: `vec::raw` has seen a lot of cleanup and API changes.
8022       * std: The standard library no longer includes any C++ code, and very
8023         minimal C, eliminating the dependency on libstdc++.
8024       * std: Runtime scheduling and I/O functionality has been factored out into
8025         extensible interfaces and is now implemented by two different crates:
8026         libnative, for native threading and I/O; and libgreen, for green threading
8027         and I/O. This paves the way for using the standard library in more limited
8028         embedded environments.
8029       * std: The `comm` module has been rewritten to be much faster, have a
8030         simpler, more consistent API, and to work for both native and green
8031         threading.
8032       * std: All libuv dependencies have been moved into the rustuv crate.
8033       * native: New implementations of runtime scheduling on top of OS threads.
8034       * native: New native implementations of TCP, UDP, file I/O, process spawning,
8035         and other I/O.
8036       * green: The green thread scheduler and message passing types are almost
8037         entirely lock-free.
8038       * extra: The `flatpipes` module had bitrotted and was removed.
8039       * extra: All crypto functions have been removed and Rust now has a policy of
8040         not reimplementing crypto in the standard library. In the future crypto
8041         will be provided by external crates with bindings to established libraries.
8042       * extra: `c_vec` has been modernized.
8043       * extra: The `sort` module has been removed. Use the `sort` method on
8044         mutable slices.
8045
8046    * Tooling
8047       * The `rust` and `rusti` commands have been removed, due to lack of
8048         maintenance.
8049       * `rustdoc` was completely rewritten.
8050       * `rustdoc` can test code examples in documentation.
8051       * `rustpkg` can test packages with the argument, 'test'.
8052       * `rustpkg` supports arbitrary dependencies, including C libraries.
8053       * `rustc`'s support for generating debug info is improved again.
8054       * `rustc` has better error reporting for unbalanced delimiters.
8055       * `rustc`'s JIT support was removed due to bitrot.
8056       * Executables and static libraries can be built with LTO (-Z lto)
8057       * `rustc` adds a `--dep-info` flag for communicating dependencies to
8058         build tools.
8059
8060
8061 Version 0.8 (2013-09-26)
8062 ============================
8063
8064    * ~2200 changes, numerous bugfixes
8065
8066    * Language
8067       * The `for` loop syntax has changed to work with the `Iterator` trait.
8068       * At long last, unwinding works on Windows.
8069       * Default methods are ready for use.
8070       * Many trait inheritance bugs fixed.
8071       * Owned and borrowed trait objects work more reliably.
8072       * `copy` is no longer a keyword. It has been replaced by the `Clone` trait.
8073       * rustc can omit emission of code for the `debug!` macro if it is passed
8074         `--cfg ndebug`
8075       * mod.rs is now "blessed". When loading `mod foo;`, rustc will now look
8076         for foo.rs, then foo/mod.rs, and will generate an error when both are
8077         present.
8078       * Strings no longer contain trailing nulls. The new `std::c_str` module
8079         provides new mechanisms for converting to C strings.
8080       * The type of foreign functions is now `extern "C" fn` instead of `*u8'.
8081       * The FFI has been overhauled such that foreign functions are called directly,
8082         instead of through a stack-switching wrapper.
8083       * Calling a foreign function must be done through a Rust function with the
8084         `#[fixed_stack_segment]` attribute.
8085       * The `externfn!` macro can be used to declare both a foreign function and
8086         a `#[fixed_stack_segment]` wrapper at once.
8087       * `pub` and `priv` modifiers on `extern` blocks are no longer parsed.
8088       * `unsafe` is no longer allowed on extern fns - they are all unsafe.
8089       * `priv` is disallowed everywhere except for struct fields and enum variants.
8090       * `&T` (besides `&'static T`) is no longer allowed in `@T`.
8091       * `ref` bindings in irrefutable patterns work correctly now.
8092       * `char` is now prevented from containing invalid code points.
8093       * Casting to `bool` is no longer allowed.
8094       * `\0` is now accepted as an escape in chars and strings.
8095       * `yield` is a reserved keyword.
8096       * `typeof` is a reserved keyword.
8097       * Crates may be imported by URL with `extern mod foo = "url";`.
8098       * Explicit enum discriminants may be given as uints as in `enum E { V = 0u }`
8099       * Static vectors can be initialized with repeating elements,
8100         e.g. `static foo: [u8, .. 100]: [0, .. 100];`.
8101       * Static structs can be initialized with functional record update,
8102         e.g. `static foo: Foo = Foo { a: 5, .. bar };`.
8103       * `cfg!` can be used to conditionally execute code based on the crate
8104         configuration, similarly to `#[cfg(...)]`.
8105       * The `unnecessary_qualification` lint detects unneeded module
8106         prefixes (default: allow).
8107       * Arithmetic operations have been implemented on the SIMD types in
8108         `std::unstable::simd`.
8109       * Exchange allocation headers were removed, reducing memory usage.
8110       * `format!` implements a completely new, extensible, and higher-performance
8111         string formatting system. It will replace `fmt!`.
8112       * `print!` and `println!` write formatted strings (using the `format!`
8113         extension) to stdout.
8114       * `write!` and `writeln!` write formatted strings (using the `format!`
8115         extension) to the new Writers in `std::rt::io`.
8116       * The library section in which a function or static is placed may
8117         be specified with `#[link_section = "..."]`.
8118       * The `proto!` syntax extension for defining bounded message protocols
8119         was removed.
8120       * `macro_rules!` is hygienic for `let` declarations.
8121       * The `#[export_name]` attribute specifies the name of a symbol.
8122       * `unreachable!` can be used to indicate unreachable code, and fails
8123         if executed.
8124
8125    * Libraries
8126       * std: Transitioned to the new runtime, written in Rust.
8127       * std: Added an experimental I/O library, `rt::io`, based on the new
8128         runtime.
8129       * std: A new generic `range` function was added to the prelude, replacing
8130         `uint::range` and friends.
8131       * std: `range_rev` no longer exists. Since range is an iterator it can be
8132         reversed with `range(lo, hi).invert()`.
8133       * std: The `chain` method on option renamed to `and_then`; `unwrap_or_default`
8134         renamed to `unwrap_or`.
8135       * std: The `iterator` module was renamed to `iter`.
8136       * std: Integral types now support the `checked_add`, `checked_sub`, and
8137         `checked_mul` operations for detecting overflow.
8138       * std: Many methods in `str`, `vec`, `option, `result` were renamed for
8139         consistency.
8140       * std: Methods are standardizing on conventions for casting methods:
8141         `to_foo` for copying, `into_foo` for moving, `as_foo` for temporary
8142         and cheap casts.
8143       * std: The `CString` type in `c_str` provides new ways to convert to and
8144         from C strings.
8145       * std: `DoubleEndedIterator` can yield elements in two directions.
8146       * std: The `mut_split` method on vectors partitions an `&mut [T]` into
8147         two splices.
8148       * std: `str::from_bytes` renamed to `str::from_utf8`.
8149       * std: `pop_opt` and `shift_opt` methods added to vectors.
8150       * std: The task-local data interface no longer uses @, and keys are
8151         no longer function pointers.
8152       * std: The `swap_unwrap` method of `Option` renamed to `take_unwrap`.
8153       * std: Added `SharedPort` to `comm`.
8154       * std: `Eq` has a default method for `ne`; only `eq` is required
8155         in implementations.
8156       * std: `Ord` has default methods for `le`, `gt` and `ge`; only `lt`
8157         is required in implementations.
8158       * std: `is_utf8` performance is improved, impacting many string functions.
8159       * std: `os::MemoryMap` provides cross-platform mmap.
8160       * std: `ptr::offset` is now unsafe, but also more optimized. Offsets that
8161         are not 'in-bounds' are considered undefined.
8162       * std: Many freestanding functions in `vec` removed in favor of methods.
8163       * std: Many freestanding functions on scalar types removed in favor of
8164         methods.
8165       * std: Many options to task builders were removed since they don't make
8166         sense in the new scheduler design.
8167       * std: More containers implement `FromIterator` so can be created by the
8168         `collect` method.
8169       * std: More complete atomic types in `unstable::atomics`.
8170       * std: `comm::PortSet` removed.
8171       * std: Mutating methods in the `Set` and `Map` traits have been moved into
8172         the `MutableSet` and `MutableMap` traits. `Container::is_empty`,
8173         `Map::contains_key`, `MutableMap::insert`, and `MutableMap::remove` have
8174         default implementations.
8175       * std: Various `from_str` functions were removed in favor of a generic
8176         `from_str` which is available in the prelude.
8177       * std: `util::unreachable` removed in favor of the `unreachable!` macro.
8178       * extra: `dlist`, the doubly-linked list was modernized.
8179       * extra: Added a `hex` module with `ToHex` and `FromHex` traits.
8180       * extra: Added `glob` module, replacing `std::os::glob`.
8181       * extra: `rope` was removed.
8182       * extra: `deque` was renamed to `ringbuf`. `RingBuf` implements `Deque`.
8183       * extra: `net`, and `timer` were removed. The experimental replacements
8184         are `std::rt::io::net` and `std::rt::io::timer`.
8185       * extra: Iterators implemented for `SmallIntMap`.
8186       * extra: Iterators implemented for `Bitv` and `BitvSet`.
8187       * extra: `SmallIntSet` removed. Use `BitvSet`.
8188       * extra: Performance of JSON parsing greatly improved.
8189       * extra: `semver` updated to SemVer 2.0.0.
8190       * extra: `term` handles more terminals correctly.
8191       * extra: `dbg` module removed.
8192       * extra: `par` module removed.
8193       * extra: `future` was cleaned up, with some method renames.
8194       * extra: Most free functions in `getopts` were converted to methods.
8195
8196    * Other
8197       * rustc's debug info generation (`-Z debug-info`) is greatly improved.
8198       * rustc accepts `--target-cpu` to compile to a specific CPU architecture,
8199         similarly to gcc's `--march` flag.
8200       * rustc's performance compiling small crates is much better.
8201       * rustpkg has received many improvements.
8202       * rustpkg supports git tags as package IDs.
8203       * rustpkg builds into target-specific directories so it can be used for
8204         cross-compiling.
8205       * The number of concurrent test tasks is controlled by the environment
8206         variable RUST_TEST_TASKS.
8207       * The test harness can now report metrics for benchmarks.
8208       * All tools have man pages.
8209       * Programs compiled with `--test` now support the `-h` and `--help` flags.
8210       * The runtime uses jemalloc for allocations.
8211       * Segmented stacks are temporarily disabled as part of the transition to
8212         the new runtime. Stack overflows are possible!
8213       * A new documentation backend, rustdoc_ng, is available for use. It is
8214         still invoked through the normal `rustdoc` command.
8215
8216
8217 Version 0.7 (2013-07-03)
8218 =======================
8219
8220    * ~2000 changes, numerous bugfixes
8221
8222    * Language
8223       * `impl`s no longer accept a visibility qualifier. Put them on methods
8224         instead.
8225       * The borrow checker has been rewritten with flow-sensitivity, fixing
8226         many bugs and inconveniences.
8227       * The `self` parameter no longer implicitly means `&'self self`,
8228         and can be explicitly marked with a lifetime.
8229       * Overloadable compound operators (`+=`, etc.) have been temporarily
8230         removed due to bugs.
8231       * The `for` loop protocol now requires `for`-iterators to return `bool`
8232         so they compose better.
8233       * The `Durable` trait is replaced with the `'static` bounds.
8234       * Trait default methods work more often.
8235       * Structs with the `#[packed]` attribute have byte alignment and
8236         no padding between fields.
8237       * Type parameters bound by `Copy` must now be copied explicitly with
8238         the `copy` keyword.
8239       * It is now illegal to move out of a dereferenced unsafe pointer.
8240       * `Option<~T>` is now represented as a nullable pointer.
8241       * `@mut` does dynamic borrow checks correctly.
8242       * The `main` function is only detected at the topmost level of the crate.
8243         The `#[main]` attribute is still valid anywhere.
8244       * Struct fields may no longer be mutable. Use inherited mutability.
8245       * The `#[no_send]` attribute makes a type that would otherwise be
8246         `Send`, not.
8247       * The `#[no_freeze]` attribute makes a type that would otherwise be
8248         `Freeze`, not.
8249       * Unbounded recursion will abort the process after reaching the limit
8250         specified by the `RUST_MAX_STACK` environment variable (default: 1GB).
8251       * The `vecs_implicitly_copyable` lint mode has been removed. Vectors
8252         are never implicitly copyable.
8253       * `#[static_assert]` makes compile-time assertions about static bools.
8254       * At long last, 'argument modes' no longer exist.
8255       * The rarely used `use mod` statement no longer exists.
8256
8257    * Syntax extensions
8258       * `fail!` and `assert!` accept `~str`, `&'static str` or `fmt!`-style
8259         argument list.
8260       * `Encodable`, `Decodable`, `Ord`, `TotalOrd`, `TotalEq`, `DeepClone`,
8261         `Rand`, `Zero` and `ToStr` can all be automatically derived with
8262         `#[deriving(...)]`.
8263       * The `bytes!` macro returns a vector of bytes for string, u8, char,
8264         and unsuffixed integer literals.
8265
8266    * Libraries
8267       * The `core` crate was renamed to `std`.
8268       * The `std` crate was renamed to `extra`.
8269       * More and improved documentation.
8270       * std: `iterator` module for external iterator objects.
8271       * Many old-style (internal, higher-order function) iterators replaced by
8272         implementations of `Iterator`.
8273       * std: Many old internal vector and string iterators,
8274         incl. `any`, `all`. removed.
8275       * std: The `finalize` method of `Drop` renamed to `drop`.
8276       * std: The `drop` method now takes `&mut self` instead of `&self`.
8277       * std: The prelude no longer re-exports any modules, only types and traits.
8278       * std: Prelude additions: `print`, `println`, `FromStr`, `ApproxEq`, `Equiv`,
8279         `Iterator`, `IteratorUtil`, many numeric traits, many tuple traits.
8280       * std: New numeric traits: `Fractional`, `Real`, `RealExt`, `Integer`, `Ratio`,
8281         `Algebraic`, `Trigonometric`, `Exponential`, `Primitive`.
8282       * std: Tuple traits and accessors defined for up to 12-tuples, e.g.
8283         `(0, 1, 2).n2()` or `(0, 1, 2).n2_ref()`.
8284       * std: Many types implement `Clone`.
8285       * std: `path` type renamed to `Path`.
8286       * std: `mut` module and `Mut` type removed.
8287       * std: Many standalone functions removed in favor of methods and iterators
8288         in `vec`, `str`. In the future methods will also work as functions.
8289       * std: `reinterpret_cast` removed. Use `transmute`.
8290       * std: ascii string handling in `std::ascii`.
8291       * std: `Rand` is implemented for ~/@.
8292       * std: `run` module for spawning processes overhauled.
8293       * std: Various atomic types added to `unstable::atomic`.
8294       * std: Various types implement `Zero`.
8295       * std: `LinearMap` and `LinearSet` renamed to `HashMap` and `HashSet`.
8296       * std: Borrowed pointer functions moved from `ptr` to `borrow`.
8297       * std: Added `os::mkdir_recursive`.
8298       * std: Added `os::glob` function performs filesystems globs.
8299       * std: `FuzzyEq` renamed to `ApproxEq`.
8300       * std: `Map` now defines `pop` and `swap` methods.
8301       * std: `Cell` constructors converted to static methods.
8302       * extra: `rc` module adds the reference counted pointers, `Rc` and `RcMut`.
8303       * extra: `flate` module moved from `std` to `extra`.
8304       * extra: `fileinput` module for iterating over a series of files.
8305       * extra: `Complex` number type and `complex` module.
8306       * extra: `Rational` number type and `rational` module.
8307       * extra: `BigInt`, `BigUint` implement numeric and comparison traits.
8308       * extra: `term` uses terminfo now, is more correct.
8309       * extra: `arc` functions converted to methods.
8310       * extra: Implementation of fixed output size variations of SHA-2.
8311
8312    * Tooling
8313       * `unused_variables` lint mode for unused variables (default: warn).
8314       * `unused_unsafe` lint mode for detecting unnecessary `unsafe` blocks
8315         (default: warn).
8316       * `unused_mut` lint mode for identifying unused `mut` qualifiers
8317         (default: warn).
8318       * `dead_assignment` lint mode for unread variables (default: warn).
8319       * `unnecessary_allocation` lint mode detects some heap allocations that are
8320         immediately borrowed so could be written without allocating (default: warn).
8321       * `missing_doc` lint mode (default: allow).
8322       * `unreachable_code` lint mode (default: warn).
8323       * The `rusti` command has been rewritten and a number of bugs addressed.
8324       * rustc outputs in color on more terminals.
8325       * rustc accepts a `--link-args` flag to pass arguments to the linker.
8326       * rustc accepts a `-Z print-link-args` flag for debugging linkage.
8327       * Compiling with `-g` will make the binary record information about
8328         dynamic borrowcheck failures for debugging.
8329       * rustdoc has a nicer stylesheet.
8330       * Various improvements to rustdoc.
8331       * Improvements to rustpkg (see the detailed release notes).
8332
8333
8334 Version 0.6 (2013-04-03)
8335 ========================
8336
8337    * ~2100 changes, numerous bugfixes
8338
8339    * Syntax changes
8340       * The self type parameter in traits is now spelled `Self`
8341       * The `self` parameter in trait and impl methods must now be explicitly
8342         named (for example: `fn f(&self) { }`). Implicit self is deprecated.
8343       * Static methods no longer require the `static` keyword and instead
8344         are distinguished by the lack of a `self` parameter
8345       * Replaced the `Durable` trait with the `'static` lifetime
8346       * The old closure type syntax with the trailing sigil has been
8347         removed in favor of the more consistent leading sigil
8348       * `super` is a keyword, and may be prefixed to paths
8349       * Trait bounds are separated with `+` instead of whitespace
8350       * Traits are implemented with `impl Trait for Type`
8351         instead of `impl Type: Trait`
8352       * Lifetime syntax is now `&'l foo` instead of `&l/foo`
8353       * The `export` keyword has finally been removed
8354       * The `move` keyword has been removed (see "Semantic changes")
8355       * The interior mutability qualifier on vectors, `[mut T]`, has been
8356         removed. Use `&mut [T]`, etc.
8357       * `mut` is no longer valid in `~mut T`. Use inherited mutability
8358       * `fail` is no longer a keyword. Use `fail!()`
8359       * `assert` is no longer a keyword. Use `assert!()`
8360       * `log` is no longer a keyword. use `debug!`, etc.
8361       * 1-tuples may be represented as `(T,)`
8362       * Struct fields may no longer be `mut`. Use inherited mutability,
8363         `@mut T`, `core::mut` or `core::cell`
8364       * `extern mod { ... }` is no longer valid syntax for foreign
8365         function modules. Use extern blocks: `extern { ... }`
8366       * Newtype enums removed. Use tuple-structs.
8367       * Trait implementations no longer support visibility modifiers
8368       * Pattern matching over vectors improved and expanded
8369       * `const` renamed to `static` to correspond to lifetime name,
8370         and make room for future `static mut` unsafe mutable globals.
8371       * Replaced `#[deriving_eq]` with `#[deriving(Eq)]`, etc.
8372       * `Clone` implementations can be automatically generated with
8373         `#[deriving(Clone)]`
8374       * Casts to traits must use a pointer sigil, e.g. `@foo as @Bar`
8375         instead of `foo as Bar`.
8376       * Fixed length vector types are now written as `[int, .. 3]`
8377         instead of `[int * 3]`.
8378       * Fixed length vector types can express the length as a constant
8379         expression. (ex: `[int, .. GL_BUFFER_SIZE - 2]`)
8380
8381    * Semantic changes
8382       * Types with owned pointers or custom destructors move by default,
8383         eliminating the `move` keyword
8384       * All foreign functions are considered unsafe
8385       * &mut is now unaliasable
8386       * Writes to borrowed @mut pointers are prevented dynamically
8387       * () has size 0
8388       * The name of the main function can be customized using #[main]
8389       * The default type of an inferred closure is &fn instead of @fn
8390       * `use` statements may no longer be "chained" - they cannot import
8391         identifiers imported by previous `use` statements
8392       * `use` statements are crate relative, importing from the "top"
8393         of the crate by default. Paths may be prefixed with `super::`
8394         or `self::` to change the search behavior.
8395       * Method visibility is inherited from the implementation declaration
8396       * Structural records have been removed
8397       * Many more types can be used in static items, including enums
8398         'static-lifetime pointers and vectors
8399       * Pattern matching over vectors improved and expanded
8400       * Typechecking of closure types has been overhauled to
8401         improve inference and eliminate unsoundness
8402       * Macros leave scope at the end of modules, unless that module is
8403         tagged with #[macro_escape]
8404
8405    * Libraries
8406       * Added big integers to `std::bigint`
8407       * Removed `core::oldcomm` module
8408       * Added pipe-based `core::comm` module
8409       * Numeric traits have been reorganized under `core::num`
8410       * `vec::slice` finally returns a slice
8411       * `debug!` and friends don't require a format string, e.g. `debug!(Foo)`
8412       * Containers reorganized around traits in `core::container`
8413       * `core::dvec` removed, `~[T]` is a drop-in replacement
8414       * `core::send_map` renamed to `core::hashmap`
8415       * `std::map` removed; replaced with `core::hashmap`
8416       * `std::treemap` reimplemented as an owned balanced tree
8417       * `std::deque` and `std::smallintmap` reimplemented as owned containers
8418       * `core::trie` added as a fast ordered map for integer keys
8419       * Set types added to `core::hashmap`, `core::trie` and `std::treemap`
8420       * `Ord` split into `Ord` and `TotalOrd`. `Ord` is still used to
8421         overload the comparison operators, whereas `TotalOrd` is used
8422         by certain container types
8423
8424    * Other
8425       * Replaced the 'cargo' package manager with 'rustpkg'
8426       * Added all-purpose 'rust' tool
8427       * `rustc --test` now supports benchmarks with the `#[bench]` attribute
8428       * rustc now *attempts* to offer spelling suggestions
8429       * Improved support for ARM and Android
8430       * Preliminary MIPS backend
8431       * Improved foreign function ABI implementation for x86, x86_64
8432       * Various memory usage improvements
8433       * Rust code may be embedded in foreign code under limited circumstances
8434       * Inline assembler supported by new asm!() syntax extension.
8435
8436
8437 Version 0.5 (2012-12-21)
8438 ===========================
8439
8440    * ~900 changes, numerous bugfixes
8441
8442    * Syntax changes
8443       * Removed `<-` move operator
8444       * Completed the transition from the `#fmt` extension syntax to `fmt!`
8445       * Removed old fixed length vector syntax - `[T]/N`
8446       * New token-based quasi-quoters, `quote_tokens!`, `quote_expr!`, etc.
8447       * Macros may now expand to items and statements
8448       * `a.b()` is always parsed as a method call, never as a field projection
8449       * `Eq` and `IterBytes` implementations can be automatically generated
8450         with `#[deriving_eq]` and `#[deriving_iter_bytes]` respectively
8451       * Removed the special crate language for `.rc` files
8452       * Function arguments may consist of any irrefutable pattern
8453
8454    * Semantic changes
8455       * `&` and `~` pointers may point to objects
8456       * Tuple structs - `struct Foo(Bar, Baz)`. Will replace newtype enums.
8457       * Enum variants may be structs
8458       * Destructors can be added to all nominal types with the Drop trait
8459       * Structs and nullary enum variants may be constants
8460       * Values that cannot be implicitly copied are now automatically moved
8461         without writing `move` explicitly
8462       * `&T` may now be coerced to `*T`
8463       * Coercions happen in `let` statements as well as function calls
8464       * `use` statements now take crate-relative paths
8465       * The module and type namespaces have been merged so that static
8466         method names can be resolved under the trait in which they are
8467         declared
8468
8469    * Improved support for language features
8470       * Trait inheritance works in many scenarios
8471       * More support for explicit self arguments in methods - `self`, `&self`
8472         `@self`, and `~self` all generally work as expected
8473       * Static methods work in more situations
8474       * Experimental: Traits may declare default methods for the implementations
8475         to use
8476
8477    * Libraries
8478       * New condition handling system in `core::condition`
8479       * Timsort added to `std::sort`
8480       * New priority queue, `std::priority_queue`
8481       * Pipes for serializable types, `std::flatpipes'
8482       * Serialization overhauled to be trait-based
8483       * Expanded `getopts` definitions
8484       * Moved futures to `std`
8485       * More functions are pure now
8486       * `core::comm` renamed to `oldcomm`. Still deprecated
8487       * `rustdoc` and `cargo` are libraries now
8488
8489    * Misc
8490       * Added a preliminary REPL, `rusti`
8491       * License changed from MIT to dual MIT/APL2
8492
8493
8494 Version 0.4 (2012-10-15)
8495 ==========================
8496
8497    * ~2000 changes, numerous bugfixes
8498
8499    * Syntax
8500       * All keywords are now strict and may not be used as identifiers anywhere
8501       * Keyword removal: 'again', 'import', 'check', 'new', 'owned', 'send',
8502         'of', 'with', 'to', 'class'.
8503       * Classes are replaced with simpler structs
8504       * Explicit method self types
8505       * `ret` became `return` and `alt` became `match`
8506       * `import` is now `use`; `use is now `extern mod`
8507       * `extern mod { ... }` is now `extern { ... }`
8508       * `use mod` is the recommended way to import modules
8509       * `pub` and `priv` replace deprecated export lists
8510       * The syntax of `match` pattern arms now uses fat arrow (=>)
8511       * `main` no longer accepts an args vector; use `os::args` instead
8512
8513    * Semantics
8514       * Trait implementations are now coherent, ala Haskell typeclasses
8515       * Trait methods may be static
8516       * Argument modes are deprecated
8517       * Borrowed pointers are much more mature and recommended for use
8518       * Strings and vectors in the static region are stored in constant memory
8519       * Typestate was removed
8520       * Resolution rewritten to be more reliable
8521       * Support for 'dual-mode' data structures (freezing and thawing)
8522
8523    * Libraries
8524       * Most binary operators can now be overloaded via the traits in
8525         `core::ops'
8526       * `std::net::url` for representing URLs
8527       * Sendable hash maps in `core::send_map`
8528       * `core::task' gained a (currently unsafe) task-local storage API
8529
8530    * Concurrency
8531       * An efficient new intertask communication primitive called the pipe,
8532         along with a number of higher-level channel types, in `core::pipes`
8533       * `std::arc`, an atomically reference counted, immutable, shared memory
8534         type
8535       * `std::sync`, various exotic synchronization tools based on arcs and pipes
8536       * Futures are now based on pipes and sendable
8537       * More robust linked task failure
8538       * Improved task builder API
8539
8540    * Other
8541       * Improved error reporting
8542       * Preliminary JIT support
8543       * Preliminary work on precise GC
8544       * Extensive architectural improvements to rustc
8545       * Begun a transition away from buggy C++-based reflection (shape) code to
8546         Rust-based (visitor) code
8547       * All hash functions and tables converted to secure, randomized SipHash
8548
8549
8550 Version 0.3  (2012-07-12)
8551 ========================
8552
8553    * ~1900 changes, numerous bugfixes
8554
8555    * New coding conveniences
8556       * Integer-literal suffix inference
8557       * Per-item control over warnings, errors
8558       * #[cfg(windows)] and #[cfg(unix)] attributes
8559       * Documentation comments
8560       * More compact closure syntax
8561       * 'do' expressions for treating higher-order functions as
8562         control structures
8563       * *-patterns (wildcard extended to all constructor fields)
8564
8565    * Semantic cleanup
8566       * Name resolution pass and exhaustiveness checker rewritten
8567       * Region pointers and borrow checking supersede alias
8568         analysis
8569       * Init-ness checking is now provided by a region-based liveness
8570         pass instead of the typestate pass; same for last-use analysis
8571       * Extensive work on region pointers
8572
8573    * Experimental new language features
8574       * Slices and fixed-size, interior-allocated vectors
8575       * #!-comments for lang versioning, shell execution
8576       * Destructors and iface implementation for classes;
8577         type-parameterized classes and class methods
8578       * 'const' type kind for types that can be used to implement
8579         shared-memory concurrency patterns
8580
8581    * Type reflection
8582
8583    * Removal of various obsolete features
8584       * Keywords: 'be', 'prove', 'syntax', 'note', 'mutable', 'bind',
8585                  'crust', 'native' (now 'extern'), 'cont' (now 'again')
8586
8587       * Constructs: do-while loops ('do' repurposed), fn binding,
8588                     resources (replaced by destructors)
8589
8590    * Compiler reorganization
8591       * Syntax-layer of compiler split into separate crate
8592       * Clang (from LLVM project) integrated into build
8593       * Typechecker split into sub-modules
8594
8595    * New library code
8596       * New time functions
8597       * Extension methods for many built-in types
8598       * Arc: atomic-refcount read-only / exclusive-use shared cells
8599       * Par: parallel map and search routines
8600       * Extensive work on libuv interface
8601       * Much vector code moved to libraries
8602       * Syntax extensions: #line, #col, #file, #mod, #stringify,
8603         #include, #include_str, #include_bin
8604
8605    * Tool improvements
8606       * Cargo automatically resolves dependencies
8607
8608
8609 Version 0.2  (2012-03-29)
8610 =========================
8611
8612    * >1500 changes, numerous bugfixes
8613
8614    * New docs and doc tooling
8615
8616    * New port: FreeBSD x86_64
8617
8618    * Compilation model enhancements
8619       * Generics now specialized, multiply instantiated
8620       * Functions now inlined across separate crates
8621
8622    * Scheduling, stack and threading fixes
8623       * Noticeably improved message-passing performance
8624       * Explicit schedulers
8625       * Callbacks from C
8626       * Helgrind clean
8627
8628    * Experimental new language features
8629       * Operator overloading
8630       * Region pointers
8631       * Classes
8632
8633    * Various language extensions
8634       * C-callback function types: 'crust fn ...'
8635       * Infinite-loop construct: 'loop { ... }'
8636       * Shorten 'mutable' to 'mut'
8637       * Required mutable-local qualifier: 'let mut ...'
8638       * Basic glob-exporting: 'export foo::*;'
8639       * Alt now exhaustive, 'alt check' for runtime-checked
8640       * Block-function form of 'for' loop, with 'break' and 'ret'.
8641
8642    * New library code
8643       * AST quasi-quote syntax extension
8644       * Revived libuv interface
8645       * New modules: core::{future, iter}, std::arena
8646       * Merged per-platform std::{os*, fs*} to core::{libc, os}
8647       * Extensive cleanup, regularization in libstd, libcore
8648
8649
8650 Version 0.1  (2012-01-20)
8651 ===============================
8652
8653    * Most language features work, including:
8654       * Unique pointers, unique closures, move semantics
8655       * Interface-constrained generics
8656       * Static interface dispatch
8657       * Stack growth
8658       * Multithread task scheduling
8659       * Typestate predicates
8660       * Failure unwinding, destructors
8661       * Pattern matching and destructuring assignment
8662       * Lightweight block-lambda syntax
8663       * Preliminary macro-by-example
8664
8665    * Compiler works with the following configurations:
8666       * Linux: x86 and x86_64 hosts and targets
8667       * macOS: x86 and x86_64 hosts and targets
8668       * Windows: x86 hosts and targets
8669
8670    * Cross compilation / multi-target configuration supported.
8671
8672    * Preliminary API-documentation and package-management tools included.
8673
8674 Known issues:
8675
8676    * Documentation is incomplete.
8677
8678    * Performance is below intended target.
8679
8680    * Standard library APIs are subject to extensive change, reorganization.
8681
8682    * Language-level versioning is not yet operational - future code will
8683      break unexpectedly.