]> git.lizzy.rs Git - rust.git/blob - RELEASES.md
rustdoc: decouple stability and const-stability
[rust.git] / RELEASES.md
1 Version 1.58.0 (2022-01-13)
2 ==========================
3
4 Language
5 --------
6
7 - [Format strings can now capture arguments simply by writing `{ident}` in the string.][90473] This works in all macros accepting format strings. Support for this in `panic!` (`panic!("{ident}")`) requires the 2021 edition; panic invocations in previous editions that appear to be trying to use this will result in a warning lint about not having the intended effect.
8 - [`*const T` pointers can now be dereferenced in const contexts.][89551]
9 - [The rules for when a generic struct implements `Unsize` have been relaxed.][90417]
10
11 Compiler
12 --------
13
14 - [Add LLVM CFI support to the Rust compiler][89652]
15 - [Stabilize -Z strip as -C strip][90058]. Note that while release builds already don't add debug symbols for the code you compile, the compiled standard library that ships with Rust includes debug symbols, so you may want to use the `strip` option to remove these symbols to produce smaller release binaries. Note that this release only includes support in rustc, not directly in cargo.
16 - [Add support for LLVM coverage mapping format versions 5 and 6][91207]
17 - [Emit LLVM optimization remarks when enabled with `-Cremark`][90833]
18 - [Update the minimum external LLVM to 12][90175]
19 - [Add `x86_64-unknown-none` at Tier 3*][89062]
20 - [Build musl dist artifacts with debuginfo enabled][90733]. When building release binaries using musl, you may want to use the newly stabilized strip option to remove these debug symbols, reducing the size of your binaries.
21 - [Don't abort compilation after giving a lint error][87337]
22 - [Error messages point at the source of trait bound obligations in more places][89580]
23
24 \* Refer to Rust's [platform support page][platform-support-doc] for more
25    information on Rust's tiered platform support.
26
27 Libraries
28 ---------
29
30 - [All remaining functions in the standard library have `#[must_use]` annotations where appropriate][89692], producing a warning when ignoring their return value. This helps catch mistakes such as expecting a function to mutate a value in place rather than return a new value.
31 - [Paths are automatically canonicalized on Windows for operations that support it][89174]
32 - [Re-enable debug checks for `copy` and `copy_nonoverlapping`][90041]
33 - [Implement `RefUnwindSafe` for `Rc<T>`][87467]
34 - [Make RSplit<T, P>: Clone not require T: Clone][90117]
35 - [Implement `Termination` for `Result<Infallible, E>`][88601]. This allows writing `fn main() -> Result<Infallible, ErrorType>`, for a program whose successful exits never involve returning from `main` (for instance, a program that calls `exit`, or that uses `exec` to run another program).
36
37 Stabilized APIs
38 ---------------
39
40 - [`Metadata::is_symlink`]
41 - [`Path::is_symlink`]
42 - [`{integer}::saturating_div`]
43 - [`Option::unwrap_unchecked`]
44 - [`Result::unwrap_unchecked`]
45 - [`Result::unwrap_err_unchecked`]
46 - [`NonZero{unsigned}::is_power_of_two`]
47 - [`File::options`]
48
49 These APIs are now usable in const contexts:
50
51 - [`Duration::new`]
52 - [`Duration::checked_add`]
53 - [`Duration::saturating_add`]
54 - [`Duration::checked_sub`]
55 - [`Duration::saturating_sub`]
56 - [`Duration::checked_mul`]
57 - [`Duration::saturating_mul`]
58 - [`Duration::checked_div`]
59 - [`MaybeUninit::as_ptr`]
60 - [`MaybeUninit::as_mut_ptr`]
61 - [`MaybeUninit::assume_init`]
62 - [`MaybeUninit::assume_init_ref`]
63
64 Cargo
65 -----
66
67 - [Add --message-format for install command][cargo/10107]
68 - [Warn when alias shadows external subcommand][cargo/10082]
69
70 Rustdoc
71 -------
72
73 - [Show all Deref implementations recursively in rustdoc][90183]
74 - [Use computed visibility in rustdoc][88447]
75
76 Compatibility Notes
77 -------------------
78
79 - [Try all stable method candidates first before trying unstable ones][90329]. This change ensures that adding new nightly-only methods to the Rust standard library will not break code invoking methods of the same name from traits outside the standard library.
80 - Windows: [`std::process::Command` will no longer search the current directory for executables.][87704]
81 - [All proc-macro backward-compatibility lints are now deny-by-default.][88041]
82 - [proc_macro: Append .0 to unsuffixed float if it would otherwise become int token][90297]
83 - [Refactor weak symbols in std::sys::unix][90846]. This optimizes accesses to glibc functions, by avoiding the use of dlopen. This does not increase the [minimum expected version of glibc](https://doc.rust-lang.org/nightly/rustc/platform-support.html). However, software distributions that use symbol versions to detect library dependencies, and which take weak symbols into account in that analysis, may detect rust binaries as requiring newer versions of glibc.
84 - [rustdoc now rejects some unexpected semicolons in doctests][91026]
85
86 Internal Changes
87 ----------------
88
89 These changes provide no direct user facing benefits, but represent significant
90 improvements to the internals and overall performance of rustc
91 and related tools.
92
93 - [Implement coherence checks for negative trait impls][90104]
94 - [Add rustc lint, warning when iterating over hashmaps][89558]
95 - [Optimize live point computation][90491]
96 - [Enable verification for 1/32nd of queries loaded from disk][90361]
97 - [Implement version of normalize_erasing_regions that allows for normalization failure][91255]
98
99 [87337]: https://github.com/rust-lang/rust/pull/87337/
100 [87467]: https://github.com/rust-lang/rust/pull/87467/
101 [87704]: https://github.com/rust-lang/rust/pull/87704/
102 [88041]: https://github.com/rust-lang/rust/pull/88041/
103 [88300]: https://github.com/rust-lang/rust/pull/88300/
104 [88447]: https://github.com/rust-lang/rust/pull/88447/
105 [88601]: https://github.com/rust-lang/rust/pull/88601/
106 [88624]: https://github.com/rust-lang/rust/pull/88624/
107 [89062]: https://github.com/rust-lang/rust/pull/89062/
108 [89174]: https://github.com/rust-lang/rust/pull/89174/
109 [89542]: https://github.com/rust-lang/rust/pull/89542/
110 [89551]: https://github.com/rust-lang/rust/pull/89551/
111 [89558]: https://github.com/rust-lang/rust/pull/89558/
112 [89580]: https://github.com/rust-lang/rust/pull/89580/
113 [89652]: https://github.com/rust-lang/rust/pull/89652/
114 [89677]: https://github.com/rust-lang/rust/pull/89677/
115 [89951]: https://github.com/rust-lang/rust/pull/89951/
116 [90041]: https://github.com/rust-lang/rust/pull/90041/
117 [90058]: https://github.com/rust-lang/rust/pull/90058/
118 [90104]: https://github.com/rust-lang/rust/pull/90104/
119 [90117]: https://github.com/rust-lang/rust/pull/90117/
120 [90175]: https://github.com/rust-lang/rust/pull/90175/
121 [90183]: https://github.com/rust-lang/rust/pull/90183/
122 [90297]: https://github.com/rust-lang/rust/pull/90297/
123 [90329]: https://github.com/rust-lang/rust/pull/90329/
124 [90361]: https://github.com/rust-lang/rust/pull/90361/
125 [90417]: https://github.com/rust-lang/rust/pull/90417/
126 [90473]: https://github.com/rust-lang/rust/pull/90473/
127 [90491]: https://github.com/rust-lang/rust/pull/90491/
128 [90733]: https://github.com/rust-lang/rust/pull/90733/
129 [90833]: https://github.com/rust-lang/rust/pull/90833/
130 [90846]: https://github.com/rust-lang/rust/pull/90846/
131 [90896]: https://github.com/rust-lang/rust/pull/90896/
132 [91026]: https://github.com/rust-lang/rust/pull/91026/
133 [91207]: https://github.com/rust-lang/rust/pull/91207/
134 [91255]: https://github.com/rust-lang/rust/pull/91255/
135 [91301]: https://github.com/rust-lang/rust/pull/91301/
136 [cargo/10082]: https://github.com/rust-lang/cargo/pull/10082/
137 [cargo/10107]: https://github.com/rust-lang/cargo/pull/10107/
138 [`Metadata::is_symlink`]: https://doc.rust-lang.org/stable/std/fs/struct.Metadata.html#method.is_symlink
139 [`Path::is_symlink`]: https://doc.rust-lang.org/stable/std/path/struct.Path.html#method.is_symlink
140 [`{integer}::saturating_div`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.saturating_div
141 [`Option::unwrap_unchecked`]: https://doc.rust-lang.org/stable/std/option/enum.Option.html#method.unwrap_unchecked
142 [`Result::unwrap_unchecked`]: https://doc.rust-lang.org/stable/std/result/enum.Result.html#method.unwrap_unchecked
143 [`Result::unwrap_err_unchecked`]: https://doc.rust-lang.org/stable/std/result/enum.Result.html#method.unwrap_err_unchecked
144 [`NonZero{unsigned}::is_power_of_two`]: https://doc.rust-lang.org/stable/std/num/struct.NonZeroU8.html#method.is_power_of_two
145 [`File::options`]: https://doc.rust-lang.org/stable/std/fs/struct.File.html#method.options
146 [`unix::process::ExitStatusExt::core_dumped`]: https://doc.rust-lang.org/stable/std/os/unix/process/trait.ExitStatusExt.html#tymethod.core_dumped
147 [`unix::process::ExitStatusExt::stopped_signal`]: https://doc.rust-lang.org/stable/std/os/unix/process/trait.ExitStatusExt.html#tymethod.stopped_signal
148 [`unix::process::ExitStatusExt::continued`]: https://doc.rust-lang.org/stable/std/os/unix/process/trait.ExitStatusExt.html#tymethod.continued
149 [`unix::process::ExitStatusExt::into_raw`]: https://doc.rust-lang.org/stable/std/os/unix/process/trait.ExitStatusExt.html#tymethod.into_raw
150 [`Duration::new`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.new
151 [`Duration::checked_add`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.checked_add
152 [`Duration::saturating_add`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.saturating_add
153 [`Duration::checked_sub`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.checked_sub
154 [`Duration::saturating_sub`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.saturating_sub
155 [`Duration::checked_mul`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.checked_mul
156 [`Duration::saturating_mul`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.saturating_mul
157 [`Duration::checked_div`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.checked_div
158 [`Duration::as_secs_f64`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.as_secs_f64
159 [`Duration::as_secs_f32`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.as_secs_f32
160 [`Duration::from_secs_f64`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.from_secs_f64
161 [`Duration::from_secs_f32`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.from_secs_f32
162 [`Duration::mul_f64`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.mul_f64
163 [`Duration::mul_f32`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.mul_f32
164 [`Duration::div_f64`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.div_f64
165 [`Duration::div_f32`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.div_f32
166 [`Duration::div_duration_f64`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.div_duration_f64
167 [`Duration::div_duration_f32`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.div_duration_f32
168 [`MaybeUninit::as_ptr`]: https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.as_ptr
169 [`MaybeUninit::as_mut_ptr`]: https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.as_mut_ptr
170 [`MaybeUninit::assume_init`]: https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.assume_init
171 [`MaybeUninit::assume_init_ref`]: https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.assume_init_ref
172
173 Version 1.57.0 (2021-12-02)
174 ==========================
175
176 Language
177 --------
178
179 - [Macro attributes may follow `#[derive]` and will see the original (pre-`cfg`) input.][87220]
180 - [Accept curly-brace macros in expressions, like `m!{ .. }.method()` and `m!{ .. }?`.][88690]
181 - [Allow panicking in constant evaluation.][89508]
182
183 Compiler
184 --------
185
186 - [Create more accurate debuginfo for vtables.][89597]
187 - [Add `armv6k-nintendo-3ds` at Tier 3\*.][88529]
188 - [Add `armv7-unknown-linux-uclibceabihf` at Tier 3\*.][88952]
189 - [Add `m68k-unknown-linux-gnu` at Tier 3\*.][88321]
190 - [Add SOLID targets at Tier 3\*:][86191] `aarch64-kmc-solid_asp3`, `armv7a-kmc-solid_asp3-eabi`, `armv7a-kmc-solid_asp3-eabihf`
191
192 \* Refer to Rust's [platform support page][platform-support-doc] for more
193    information on Rust's tiered platform support.
194
195 Libraries
196 ---------
197
198 - [Avoid allocations and copying in `Vec::leak`][89337]
199 - [Add `#[repr(i8)]` to `Ordering`][89507]
200 - [Optimize `File::read_to_end` and `read_to_string`][89582]
201 - [Update to Unicode 14.0][89614]
202 - [Many more functions are marked `#[must_use]`][89692], producing a warning
203   when ignoring their return value. This helps catch mistakes such as expecting
204   a function to mutate a value in place rather than return a new value.
205
206 Stabilised APIs
207 ---------------
208
209 - [`[T; N]::as_mut_slice`][`array::as_mut_slice`]
210 - [`[T; N]::as_slice`][`array::as_slice`]
211 - [`collections::TryReserveError`]
212 - [`HashMap::try_reserve`]
213 - [`HashSet::try_reserve`]
214 - [`String::try_reserve`]
215 - [`String::try_reserve_exact`]
216 - [`Vec::try_reserve`]
217 - [`Vec::try_reserve_exact`]
218 - [`VecDeque::try_reserve`]
219 - [`VecDeque::try_reserve_exact`]
220 - [`Iterator::map_while`]
221 - [`iter::MapWhile`]
222 - [`proc_macro::is_available`]
223 - [`Command::get_program`]
224 - [`Command::get_args`]
225 - [`Command::get_envs`]
226 - [`Command::get_current_dir`]
227 - [`CommandArgs`]
228 - [`CommandEnvs`]
229
230 These APIs are now usable in const contexts:
231
232 - [`hint::unreachable_unchecked`]
233
234 Cargo
235 -----
236
237 - [Stabilize custom profiles][cargo/9943]
238
239 Compatibility notes
240 -------------------
241
242 Internal changes
243 ----------------
244 These changes provide no direct user facing benefits, but represent significant
245 improvements to the internals and overall performance of rustc
246 and related tools.
247
248 - [Added an experimental backend for codegen with `libgccjit`.][87260]
249
250 [86191]: https://github.com/rust-lang/rust/pull/86191/
251 [87220]: https://github.com/rust-lang/rust/pull/87220/
252 [87260]: https://github.com/rust-lang/rust/pull/87260/
253 [88243]: https://github.com/rust-lang/rust/pull/88243/
254 [88321]: https://github.com/rust-lang/rust/pull/88321/
255 [88529]: https://github.com/rust-lang/rust/pull/88529/
256 [88690]: https://github.com/rust-lang/rust/pull/88690/
257 [88952]: https://github.com/rust-lang/rust/pull/88952/
258 [89337]: https://github.com/rust-lang/rust/pull/89337/
259 [89507]: https://github.com/rust-lang/rust/pull/89507/
260 [89508]: https://github.com/rust-lang/rust/pull/89508/
261 [89582]: https://github.com/rust-lang/rust/pull/89582/
262 [89597]: https://github.com/rust-lang/rust/pull/89597/
263 [89614]: https://github.com/rust-lang/rust/pull/89614/
264 [89692]: https://github.com/rust-lang/rust/issues/89692/
265 [cargo/9943]: https://github.com/rust-lang/cargo/pull/9943/
266 [`array::as_mut_slice`]: https://doc.rust-lang.org/std/primitive.array.html#method.as_mut_slice
267 [`array::as_slice`]: https://doc.rust-lang.org/std/primitive.array.html#method.as_slice
268 [`collections::TryReserveError`]: https://doc.rust-lang.org/std/collections/struct.TryReserveError.html
269 [`HashMap::try_reserve`]: https://doc.rust-lang.org/std/collections/hash_map/struct.HashMap.html#method.try_reserve
270 [`HashSet::try_reserve`]: https://doc.rust-lang.org/std/collections/hash_set/struct.HashSet.html#method.try_reserve
271 [`String::try_reserve`]: https://doc.rust-lang.org/alloc/string/struct.String.html#method.try_reserve
272 [`String::try_reserve_exact`]: https://doc.rust-lang.org/alloc/string/struct.String.html#method.try_reserve_exact
273 [`Vec::try_reserve`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.try_reserve
274 [`Vec::try_reserve_exact`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.try_reserve_exact
275 [`VecDeque::try_reserve`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.try_reserve
276 [`VecDeque::try_reserve_exact`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.try_reserve_exact
277 [`Iterator::map_while`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.map_while
278 [`iter::MapWhile`]: https://doc.rust-lang.org/std/iter/struct.MapWhile.html
279 [`proc_macro::is_available`]: https://doc.rust-lang.org/proc_macro/fn.is_available.html
280 [`Command::get_program`]: https://doc.rust-lang.org/std/process/struct.Command.html#method.get_program
281 [`Command::get_args`]: https://doc.rust-lang.org/std/process/struct.Command.html#method.get_args
282 [`Command::get_envs`]: https://doc.rust-lang.org/std/process/struct.Command.html#method.get_envs
283 [`Command::get_current_dir`]: https://doc.rust-lang.org/std/process/struct.Command.html#method.get_current_dir
284 [`CommandArgs`]: https://doc.rust-lang.org/std/process/struct.CommandArgs.html
285 [`CommandEnvs`]: https://doc.rust-lang.org/std/process/struct.CommandEnvs.html
286
287 Version 1.56.1 (2021-11-01)
288 ===========================
289
290 - New lints to detect the presence of bidirectional-override Unicode
291   codepoints in the compiled source code ([CVE-2021-42574])
292
293 [CVE-2021-42574]: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-42574
294
295 Version 1.56.0 (2021-10-21)
296 ========================
297
298 Language
299 --------
300
301 - [The 2021 Edition is now stable.][rust#88100]
302   See [the edition guide][rust-2021-edition-guide] for more details.
303 - [The pattern in `binding @ pattern` can now also introduce new bindings.][rust#85305]
304 - [Union field access is permitted in `const fn`.][rust#85769]
305
306 [rust-2021-edition-guide]: https://doc.rust-lang.org/nightly/edition-guide/rust-2021/index.html
307
308 Compiler
309 --------
310
311 - [Upgrade to LLVM 13.][rust#87570]
312 - [Support memory, address, and thread sanitizers on aarch64-unknown-freebsd.][rust#88023]
313 - [Allow specifying a deployment target version for all iOS targets][rust#87699]
314 - [Warnings can be forced on with `--force-warn`.][rust#87472]
315   This feature is primarily intended for usage by `cargo fix`, rather than end users.
316 - [Promote `aarch64-apple-ios-sim` to Tier 2\*.][rust#87760]
317 - [Add `powerpc-unknown-freebsd` at Tier 3\*.][rust#87370]
318 - [Add `riscv32imc-esp-espidf` at Tier 3\*.][rust#87666]
319
320 \* Refer to Rust's [platform support page][platform-support-doc] for more
321 information on Rust's tiered platform support.
322
323 Libraries
324 ---------
325
326 - [Allow writing of incomplete UTF-8 sequences via stdout/stderr on Windows.][rust#83342]
327   The Windows console still requires valid Unicode, but this change allows
328   splitting a UTF-8 character across multiple write calls. This allows, for
329   instance, programs that just read and write data buffers (e.g. copying a file
330   to stdout) without regard for Unicode or character boundaries.
331 - [Prefer `AtomicU{64,128}` over Mutex for Instant backsliding protection.][rust#83093]
332   For this use case, atomics scale much better under contention.
333 - [Implement `Extend<(A, B)>` for `(Extend<A>, Extend<B>)`][rust#85835]
334 - [impl Default, Copy, Clone for std::io::Sink and std::io::Empty][rust#86744]
335 - [`impl From<[(K, V); N]>` for all collections.][rust#84111]
336 - [Remove `P: Unpin` bound on impl Future for Pin.][rust#81363]
337 - [Treat invalid environment variable names as non-existent.][rust#86183]
338   Previously, the environment functions would panic if given a variable name
339   with an internal null character or equal sign (`=`). Now, these functions will
340   just treat such names as non-existent variables, since the OS cannot represent
341   the existence of a variable with such a name.
342
343 Stabilised APIs
344 ---------------
345
346 - [`std::os::unix::fs::chroot`]
347 - [`UnsafeCell::raw_get`]
348 - [`BufWriter::into_parts`]
349 - [`core::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe}`]
350   These APIs were previously stable in `std`, but are now also available in `core`.
351 - [`Vec::shrink_to`]
352 - [`String::shrink_to`]
353 - [`OsString::shrink_to`]
354 - [`PathBuf::shrink_to`]
355 - [`BinaryHeap::shrink_to`]
356 - [`VecDeque::shrink_to`]
357 - [`HashMap::shrink_to`]
358 - [`HashSet::shrink_to`]
359
360 These APIs are now usable in const contexts:
361
362 - [`std::mem::transmute`]
363 - [`[T]::first`][`slice::first`]
364 - [`[T]::split_first`][`slice::split_first`]
365 - [`[T]::last`][`slice::last`]
366 - [`[T]::split_last`][`slice::split_last`]
367
368 Cargo
369 -----
370
371 - [Cargo supports specifying a minimum supported Rust version in Cargo.toml.][`rust-version`]
372   This has no effect at present on dependency version selection.
373   We encourage crates to specify their minimum supported Rust version, and we encourage CI systems
374   that support Rust code to include a crate's specified minimum version in the test matrix for that
375   crate by default.
376
377 Compatibility notes
378 -------------------
379
380 - [Update to new argument parsing rules on Windows.][rust#87580]
381   This adjusts Rust's standard library to match the behavior of the standard
382   libraries for C/C++. The rules have changed slightly over time, and this PR
383   brings us to the latest set of rules (changed in 2008).
384 - [Disallow the aapcs calling convention on aarch64][rust#88399]
385   This was already not supported by LLVM; this change surfaces this lack of
386   support with a better error message.
387 - [Make `SEMICOLON_IN_EXPRESSIONS_FROM_MACROS` warn by default][rust#87385]
388 - [Warn when an escaped newline skips multiple lines.][rust#87671]
389 - [Calls to `libc::getpid` / `std::process::id` from `Command::pre_exec`
390    may return different values on glibc <= 2.24.][rust#81825]
391    Rust now invokes the `clone3` system call directly, when available, to use new functionality
392    available via that system call. Older versions of glibc cache the result of `getpid`, and only
393    update that cache when calling glibc's clone/fork functions, so a direct system call bypasses
394    that cache update. glibc 2.25 and newer no longer cache `getpid` for exactly this reason.
395
396 Internal changes
397 ----------------
398 These changes provide no direct user facing benefits, but represent significant
399 improvements to the internals and overall performance of rustc
400 and related tools.
401
402 - [LLVM is compiled with PGO in published x86_64-unknown-linux-gnu artifacts.][rust#88069]
403   This improves the performance of most Rust builds.
404 - [Unify representation of macros in internal data structures.][rust#88019]
405   This change fixes a host of bugs with the handling of macros by the compiler,
406   as well as rustdoc.
407
408 [`std::os::unix::fs::chroot`]: https://doc.rust-lang.org/stable/std/os/unix/fs/fn.chroot.html
409 [`Iterator::intersperse`]: https://doc.rust-lang.org/stable/std/iter/trait.Iterator.html#method.intersperse
410 [`Iterator::intersperse_with`]: https://doc.rust-lang.org/stable/std/iter/trait.Iterator.html#method.intersperse
411 [`UnsafeCell::raw_get`]: https://doc.rust-lang.org/stable/std/cell/struct.UnsafeCell.html#method.raw_get
412 [`BufWriter::into_parts`]: https://doc.rust-lang.org/stable/std/io/struct.BufWriter.html#method.into_parts
413 [`core::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe}`]: https://github.com/rust-lang/rust/pull/84662
414 [`Vec::shrink_to`]: https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.shrink_to
415 [`String::shrink_to`]: https://doc.rust-lang.org/stable/std/string/struct.String.html#method.shrink_to
416 [`OsString::shrink_to`]: https://doc.rust-lang.org/stable/std/ffi/struct.OsString.html#method.shrink_to
417 [`PathBuf::shrink_to`]: https://doc.rust-lang.org/stable/std/path/struct.PathBuf.html#method.shrink_to
418 [`BinaryHeap::shrink_to`]: https://doc.rust-lang.org/stable/std/collections/struct.BinaryHeap.html#method.shrink_to
419 [`VecDeque::shrink_to`]: https://doc.rust-lang.org/stable/std/collections/struct.VecDeque.html#method.shrink_to
420 [`HashMap::shrink_to`]: https://doc.rust-lang.org/stable/std/collections/hash_map/struct.HashMap.html#method.shrink_to
421 [`HashSet::shrink_to`]: https://doc.rust-lang.org/stable/std/collections/hash_set/struct.HashSet.html#method.shrink_to
422 [`std::mem::transmute`]: https://doc.rust-lang.org/stable/std/mem/fn.transmute.html
423 [`slice::first`]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.first
424 [`slice::split_first`]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.split_first
425 [`slice::last`]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.last
426 [`slice::split_last`]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.split_last
427 [`rust-version`]: https://doc.rust-lang.org/nightly/cargo/reference/manifest.html#the-rust-version-field
428 [rust#87671]: https://github.com/rust-lang/rust/pull/87671
429 [rust#86183]: https://github.com/rust-lang/rust/pull/86183
430 [rust#87385]: https://github.com/rust-lang/rust/pull/87385
431 [rust#88100]: https://github.com/rust-lang/rust/pull/88100
432 [rust#86860]: https://github.com/rust-lang/rust/pull/86860
433 [rust#84039]: https://github.com/rust-lang/rust/pull/84039
434 [rust#86492]: https://github.com/rust-lang/rust/pull/86492
435 [rust#88363]: https://github.com/rust-lang/rust/pull/88363
436 [rust#85305]: https://github.com/rust-lang/rust/pull/85305
437 [rust#87832]: https://github.com/rust-lang/rust/pull/87832
438 [rust#88069]: https://github.com/rust-lang/rust/pull/88069
439 [rust#87472]: https://github.com/rust-lang/rust/pull/87472
440 [rust#87699]: https://github.com/rust-lang/rust/pull/87699
441 [rust#87570]: https://github.com/rust-lang/rust/pull/87570
442 [rust#88023]: https://github.com/rust-lang/rust/pull/88023
443 [rust#87760]: https://github.com/rust-lang/rust/pull/87760
444 [rust#87370]: https://github.com/rust-lang/rust/pull/87370
445 [rust#87580]: https://github.com/rust-lang/rust/pull/87580
446 [rust#83342]: https://github.com/rust-lang/rust/pull/83342
447 [rust#83093]: https://github.com/rust-lang/rust/pull/83093
448 [rust#88177]: https://github.com/rust-lang/rust/pull/88177
449 [rust#88548]: https://github.com/rust-lang/rust/pull/88548
450 [rust#88551]: https://github.com/rust-lang/rust/pull/88551
451 [rust#88299]: https://github.com/rust-lang/rust/pull/88299
452 [rust#88220]: https://github.com/rust-lang/rust/pull/88220
453 [rust#85835]: https://github.com/rust-lang/rust/pull/85835
454 [rust#86879]: https://github.com/rust-lang/rust/pull/86879
455 [rust#86744]: https://github.com/rust-lang/rust/pull/86744
456 [rust#84662]: https://github.com/rust-lang/rust/pull/84662
457 [rust#86593]: https://github.com/rust-lang/rust/pull/86593
458 [rust#81050]: https://github.com/rust-lang/rust/pull/81050
459 [rust#81363]: https://github.com/rust-lang/rust/pull/81363
460 [rust#84111]: https://github.com/rust-lang/rust/pull/84111
461 [rust#85769]: https://github.com/rust-lang/rust/pull/85769#issuecomment-854363720
462 [rust#88490]: https://github.com/rust-lang/rust/pull/88490
463 [rust#88269]: https://github.com/rust-lang/rust/pull/88269
464 [rust#84176]: https://github.com/rust-lang/rust/pull/84176
465 [rust#88399]: https://github.com/rust-lang/rust/pull/88399
466 [rust#88227]: https://github.com/rust-lang/rust/pull/88227
467 [rust#88200]: https://github.com/rust-lang/rust/pull/88200
468 [rust#82776]: https://github.com/rust-lang/rust/pull/82776
469 [rust#88077]: https://github.com/rust-lang/rust/pull/88077
470 [rust#87728]: https://github.com/rust-lang/rust/pull/87728
471 [rust#87050]: https://github.com/rust-lang/rust/pull/87050
472 [rust#87619]: https://github.com/rust-lang/rust/pull/87619
473 [rust#81825]: https://github.com/rust-lang/rust/pull/81825#issuecomment-808406918
474 [rust#88019]: https://github.com/rust-lang/rust/pull/88019
475 [rust#87666]: https://github.com/rust-lang/rust/pull/87666
476
477 Version 1.55.0 (2021-09-09)
478 ============================
479
480 Language
481 --------
482 - [You can now write open "from" range patterns (`X..`), which will start at `X` and
483   will end at the maximum value of the integer.][83918]
484 - [You can now explicitly import the prelude of different editions
485   through `std::prelude` (e.g. `use std::prelude::rust_2021::*;`).][86294]
486
487 Compiler
488 --------
489 - [Added tier 3\* support for `powerpc64le-unknown-freebsd`.][83572]
490
491 \* Refer to Rust's [platform support page][platform-support-doc] for more
492    information on Rust's tiered platform support.
493
494 Libraries
495 ---------
496
497 - [Updated std's float parsing to use the Eisel-Lemire algorithm.][86761]
498   These improvements should in general provide faster string parsing of floats,
499   no longer reject certain valid floating point values, and reduce
500   the produced code size for non-stripped artifacts.
501 - [`string::Drain` now implements `AsRef<str>` and `AsRef<[u8]>`.][86858]
502
503 Stabilised APIs
504 ---------------
505
506 - [`Bound::cloned`]
507 - [`Drain::as_str`]
508 - [`IntoInnerError::into_error`]
509 - [`IntoInnerError::into_parts`]
510 - [`MaybeUninit::assume_init_mut`]
511 - [`MaybeUninit::assume_init_ref`]
512 - [`MaybeUninit::write`]
513 - [`array::map`]
514 - [`ops::ControlFlow`]
515 - [`x86::_bittest`]
516 - [`x86::_bittestandcomplement`]
517 - [`x86::_bittestandreset`]
518 - [`x86::_bittestandset`]
519 - [`x86_64::_bittest64`]
520 - [`x86_64::_bittestandcomplement64`]
521 - [`x86_64::_bittestandreset64`]
522 - [`x86_64::_bittestandset64`]
523
524 The following previously stable functions are now `const`.
525
526 - [`str::from_utf8_unchecked`]
527
528
529 Cargo
530 -----
531 - [Cargo will now deduplicate compiler diagnostics to the terminal when invoking
532   rustc in parallel such as when using `cargo test`.][cargo/9675]
533 - [The package definition in `cargo metadata` now includes the `"default_run"`
534   field from the manifest.][cargo/9550]
535 - [Added `cargo d` as an alias for `cargo doc`.][cargo/9680]
536 - [Added `{lib}` as formatting option for `cargo tree` to print the `"lib_name"`
537   of packages.][cargo/9663]
538
539 Rustdoc
540 -------
541 - [Added "Go to item on exact match" search option.][85876]
542 - [The "Implementors" section on traits no longer shows redundant
543   method definitions.][85970]
544 - [Trait implementations are toggled open by default.][86260] This should make the
545   implementations more searchable by tools like `CTRL+F` in your browser.
546 - [Intra-doc links should now correctly resolve associated items (e.g. methods)
547   through type aliases.][86334]
548 - [Traits which are marked with `#[doc(hidden)]` will no longer appear in the
549   "Trait Implementations" section.][86513]
550
551
552 Compatibility Notes
553 -------------------
554 - [std functions that return an `io::Error` will no longer use the
555   `ErrorKind::Other` variant.][85746] This is to better reflect that these
556   kinds of errors could be categorised [into newer more specific `ErrorKind`
557   variants][79965], and that they do not represent a user error.
558 - [Using environment variable names with `process::Command` on Windows now
559   behaves as expected.][85270] Previously using envionment variables with
560   `Command` would cause them to be ASCII-uppercased.
561 - [Rustdoc will now warn on using rustdoc lints that aren't prefixed
562   with `rustdoc::`][86849]
563 - `RUSTFLAGS` is no longer set for build scripts. Build scripts
564   should use `CARGO_ENCODED_RUSTFLAGS` instead. See the
565   [documentation](https://doc.rust-lang.org/nightly/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-build-scripts)
566   for more details.
567
568 [86849]: https://github.com/rust-lang/rust/pull/86849
569 [86513]: https://github.com/rust-lang/rust/pull/86513
570 [86334]: https://github.com/rust-lang/rust/pull/86334
571 [86260]: https://github.com/rust-lang/rust/pull/86260
572 [85970]: https://github.com/rust-lang/rust/pull/85970
573 [85876]: https://github.com/rust-lang/rust/pull/85876
574 [83572]: https://github.com/rust-lang/rust/pull/83572
575 [86294]: https://github.com/rust-lang/rust/pull/86294
576 [86858]: https://github.com/rust-lang/rust/pull/86858
577 [86761]: https://github.com/rust-lang/rust/pull/86761
578 [85769]: https://github.com/rust-lang/rust/pull/85769
579 [85746]: https://github.com/rust-lang/rust/pull/85746
580 [85305]: https://github.com/rust-lang/rust/pull/85305
581 [85270]: https://github.com/rust-lang/rust/pull/85270
582 [84111]: https://github.com/rust-lang/rust/pull/84111
583 [83918]: https://github.com/rust-lang/rust/pull/83918
584 [79965]: https://github.com/rust-lang/rust/pull/79965
585 [87370]: https://github.com/rust-lang/rust/pull/87370
586 [87298]: https://github.com/rust-lang/rust/pull/87298
587 [cargo/9663]: https://github.com/rust-lang/cargo/pull/9663
588 [cargo/9675]: https://github.com/rust-lang/cargo/pull/9675
589 [cargo/9550]: https://github.com/rust-lang/cargo/pull/9550
590 [cargo/9680]: https://github.com/rust-lang/cargo/pull/9680
591 [cargo/9663]: https://github.com/rust-lang/cargo/pull/9663
592 [`array::map`]: https://doc.rust-lang.org/stable/std/primitive.array.html#method.map
593 [`Bound::cloned`]: https://doc.rust-lang.org/stable/std/ops/enum.Bound.html#method.cloned
594 [`Drain::as_str`]: https://doc.rust-lang.org/stable/std/string/struct.Drain.html#method.as_str
595 [`IntoInnerError::into_error`]: https://doc.rust-lang.org/stable/std/io/struct.IntoInnerError.html#method.into_error
596 [`IntoInnerError::into_parts`]: https://doc.rust-lang.org/stable/std/io/struct.IntoInnerError.html#method.into_parts
597 [`MaybeUninit::assume_init_mut`]: https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.assume_init_mut
598 [`MaybeUninit::assume_init_ref`]: https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.assume_init_ref
599 [`MaybeUninit::write`]: https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.write
600 [`Seek::rewind`]: https://doc.rust-lang.org/stable/std/io/trait.Seek.html#method.rewind
601 [`ops::ControlFlow`]: https://doc.rust-lang.org/stable/std/ops/enum.ControlFlow.html
602 [`str::from_utf8_unchecked`]: https://doc.rust-lang.org/stable/std/str/fn.from_utf8_unchecked.html
603 [`x86::_bittest`]: https://doc.rust-lang.org/stable/core/arch/x86/fn._bittest.html
604 [`x86::_bittestandcomplement`]: https://doc.rust-lang.org/stable/core/arch/x86/fn._bittestandcomplement.html
605 [`x86::_bittestandreset`]: https://doc.rust-lang.org/stable/core/arch/x86/fn._bittestandreset.html
606 [`x86::_bittestandset`]: https://doc.rust-lang.org/stable/core/arch/x86/fn._bittestandset.html
607 [`x86_64::_bittest64`]: https://doc.rust-lang.org/stable/core/arch/x86_64/fn._bittest64.html
608 [`x86_64::_bittestandcomplement64`]: https://doc.rust-lang.org/stable/core/arch/x86_64/fn._bittestandcomplement64.html
609 [`x86_64::_bittestandreset64`]: https://doc.rust-lang.org/stable/core/arch/x86_64/fn._bittestandreset64.html
610 [`x86_64::_bittestandset64`]: https://doc.rust-lang.org/stable/core/arch/x86_64/fn._bittestandset64.html
611
612
613 Version 1.54.0 (2021-07-29)
614 ============================
615
616 Language
617 -----------------------
618
619 - [You can now use macros for values in some built-in attributes.][83366]
620   This primarily allows you to call macros within the `#[doc]` attribute. For
621   example, to include external documentation in your crate, you can now write
622   the following:
623   ```rust
624   #![doc = include_str!("README.md")]
625   ```
626
627 - [You can now cast between unsized slice types (and types which contain
628   unsized slices) in `const fn`.][85078]
629 - [You can now use multiple generic lifetimes with `impl Trait` where the
630    lifetimes don't explicitly outlive another.][84701] In code this means
631    that you can now have `impl Trait<'a, 'b>` where as before you could
632    only have `impl Trait<'a, 'b> where 'b: 'a`.
633
634 Compiler
635 -----------------------
636
637 - [Rustc will now search for custom JSON targets in
638   `/lib/rustlib/<target-triple>/target.json` where `/` is the "sysroot"
639   directory.][83800] You can find your sysroot directory by running
640   `rustc --print sysroot`.
641 - [Added `wasm` as a `target_family` for WebAssembly platforms.][84072]
642 - [You can now use `#[target_feature]` on safe functions when targeting
643   WebAssembly platforms.][84988]
644 - [Improved debugger output for enums on Windows MSVC platforms.][85292]
645 - [Added tier 3\* support for `bpfel-unknown-none`
646    and `bpfeb-unknown-none`.][79608]
647 - [`-Zmutable-noalias=yes`][82834] is enabled by default when using LLVM 12 or above.
648
649 \* Refer to Rust's [platform support page][platform-support-doc] for more
650    information on Rust's tiered platform support.
651
652 Libraries
653 -----------------------
654
655 - [`panic::panic_any` will now `#[track_caller]`.][85745]
656 - [Added `OutOfMemory` as a variant of `io::ErrorKind`.][84744]
657 - [ `proc_macro::Literal` now implements `FromStr`.][84717]
658 - [The implementations of vendor intrinsics in core::arch have been
659    significantly refactored.][83278] The main user-visible changes are
660    a 50% reduction in the size of libcore.rlib and stricter validation
661    of constant operands passed to intrinsics. The latter is technically
662    a breaking change, but allows Rust to more closely match the C vendor
663    intrinsics API.
664
665 Stabilized APIs
666 ---------------
667
668 - [`BTreeMap::into_keys`]
669 - [`BTreeMap::into_values`]
670 - [`HashMap::into_keys`]
671 - [`HashMap::into_values`]
672 - [`arch::wasm32`]
673 - [`VecDeque::binary_search`]
674 - [`VecDeque::binary_search_by`]
675 - [`VecDeque::binary_search_by_key`]
676 - [`VecDeque::partition_point`]
677
678 Cargo
679 -----
680
681 - [Added the `--prune <spec>` option to `cargo-tree` to remove a package from
682   the dependency graph.][cargo/9520]
683 - [Added the `--depth` option to `cargo-tree` to print only to a certain depth
684   in the tree ][cargo/9499]
685 - [Added the `no-proc-macro` value to `cargo-tree --edges` to hide procedural
686   macro dependencies.][cargo/9488]
687 - [A new environment variable named `CARGO_TARGET_TMPDIR` is available.][cargo/9375]
688   This variable points to a directory that integration tests and benches
689   can use as a "scratchpad" for testing filesystem operations.
690
691 Compatibility Notes
692 -------------------
693 - [Mixing Option and Result via `?` is no longer permitted in closures for inferred types.][86831]
694 - [Previously unsound code is no longer permitted where different constructors in branches
695   could require different lifetimes.][85574]
696 - As previously mentioned the [`std::arch` instrinsics now uses stricter const checking][83278]
697   than before and may reject some previously accepted code.
698 - [`i128` multiplication on Cortex M0+ platforms currently unconditionally causes overflow
699    when compiled with `codegen-units = 1`.][86063]
700
701 [85574]: https://github.com/rust-lang/rust/issues/85574
702 [86831]: https://github.com/rust-lang/rust/issues/86831
703 [86063]: https://github.com/rust-lang/rust/issues/86063
704 [86831]: https://github.com/rust-lang/rust/issues/86831
705 [79608]: https://github.com/rust-lang/rust/pull/79608
706 [84988]: https://github.com/rust-lang/rust/pull/84988
707 [84701]: https://github.com/rust-lang/rust/pull/84701
708 [84072]: https://github.com/rust-lang/rust/pull/84072
709 [85745]: https://github.com/rust-lang/rust/pull/85745
710 [84744]: https://github.com/rust-lang/rust/pull/84744
711 [85078]: https://github.com/rust-lang/rust/pull/85078
712 [84717]: https://github.com/rust-lang/rust/pull/84717
713 [83800]: https://github.com/rust-lang/rust/pull/83800
714 [83366]: https://github.com/rust-lang/rust/pull/83366
715 [83278]: https://github.com/rust-lang/rust/pull/83278
716 [85292]: https://github.com/rust-lang/rust/pull/85292
717 [82834]: https://github.com/rust-lang/rust/pull/82834
718 [cargo/9520]: https://github.com/rust-lang/cargo/pull/9520
719 [cargo/9499]: https://github.com/rust-lang/cargo/pull/9499
720 [cargo/9488]: https://github.com/rust-lang/cargo/pull/9488
721 [cargo/9375]: https://github.com/rust-lang/cargo/pull/9375
722 [`BTreeMap::into_keys`]: https://doc.rust-lang.org/std/collections/struct.BTreeMap.html#method.into_keys
723 [`BTreeMap::into_values`]: https://doc.rust-lang.org/std/collections/struct.BTreeMap.html#method.into_values
724 [`HashMap::into_keys`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.into_keys
725 [`HashMap::into_values`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.into_values
726 [`arch::wasm32`]: https://doc.rust-lang.org/core/arch/wasm32/index.html
727 [`VecDeque::binary_search`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.binary_search
728 [`VecDeque::binary_search_by`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.binary_search_by
729
730 [`VecDeque::binary_search_by_key`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.binary_search_by_key
731
732 [`VecDeque::partition_point`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.partition_point
733
734 Version 1.53.0 (2021-06-17)
735 ============================
736
737 Language
738 -----------------------
739 - [You can now use unicode for identifiers.][83799] This allows multilingual
740   identifiers but still doesn't allow glyphs that are not considered characters
741   such as `◆` or `🦀`. More specifically you can now use any identifier that
742   matches the UAX #31 "Unicode Identifier and Pattern Syntax" standard. This
743   is the same standard as languages like Python, however Rust uses NFC
744   normalization which may be different from other languages.
745 - [You can now specify "or patterns" inside pattern matches.][79278]
746   Previously you could only use `|` (OR) on complete patterns. E.g.
747   ```rust
748   let x = Some(2u8);
749   // Before
750   matches!(x, Some(1) | Some(2));
751   // Now
752   matches!(x, Some(1 | 2));
753   ```
754 - [Added the `:pat_param` `macro_rules!` matcher.][83386] This matcher
755   has the same semantics as the `:pat` matcher. This is to allow `:pat`
756   to change semantics to being a pattern fragment in a future edition.
757
758 Compiler
759 -----------------------
760 - [Updated the minimum external LLVM version to LLVM 10.][83387]
761 - [Added Tier 3\* support for the `wasm64-unknown-unknown` target.][80525]
762 - [Improved debuginfo for closures and async functions on Windows MSVC.][83941]
763
764 \* Refer to Rust's [platform support page][platform-support-doc] for more
765 information on Rust's tiered platform support.
766
767 Libraries
768 -----------------------
769 - [Abort messages will now forward to `android_set_abort_message` on
770   Android platforms when available.][81469]
771 - [`slice::IterMut<'_, T>` now implements `AsRef<[T]>`][82771]
772 - [Arrays of any length now implement `IntoIterator`.][84147]
773   Currently calling `.into_iter()` as a method on an array will
774   return `impl Iterator<Item=&T>`, but this may change in a
775   future edition to change `Item` to `T`. Calling `IntoIterator::into_iter`
776   directly on arrays will provide `impl Iterator<Item=T>` as expected.
777 - [`leading_zeros`, and `trailing_zeros` are now available on all
778   `NonZero` integer types.][84082]
779 - [`{f32, f64}::from_str` now parse and print special values
780   (`NaN`, `-0`) according to IEEE 754.][78618]
781 - [You can now index into slices using `(Bound<usize>, Bound<usize>)`.][77704]
782 - [Add the `BITS` associated constant to all numeric types.][82565]
783
784 Stabilised APIs
785 ---------------
786 - [`AtomicBool::fetch_update`]
787 - [`AtomicPtr::fetch_update`]
788 - [`BTreeMap::retain`]
789 - [`BTreeSet::retain`]
790 - [`BufReader::seek_relative`]
791 - [`DebugStruct::non_exhaustive`]
792 - [`Duration::MAX`]
793 - [`Duration::ZERO`]
794 - [`Duration::is_zero`]
795 - [`Duration::saturating_add`]
796 - [`Duration::saturating_mul`]
797 - [`Duration::saturating_sub`]
798 - [`ErrorKind::Unsupported`]
799 - [`Option::insert`]
800 - [`Ordering::is_eq`]
801 - [`Ordering::is_ge`]
802 - [`Ordering::is_gt`]
803 - [`Ordering::is_le`]
804 - [`Ordering::is_lt`]
805 - [`Ordering::is_ne`]
806 - [`OsStr::is_ascii`]
807 - [`OsStr::make_ascii_lowercase`]
808 - [`OsStr::make_ascii_uppercase`]
809 - [`OsStr::to_ascii_lowercase`]
810 - [`OsStr::to_ascii_uppercase`]
811 - [`Peekable::peek_mut`]
812 - [`Rc::decrement_strong_count`]
813 - [`Rc::increment_strong_count`]
814 - [`Vec::extend_from_within`]
815 - [`array::from_mut`]
816 - [`array::from_ref`]
817 - [`cmp::max_by_key`]
818 - [`cmp::max_by`]
819 - [`cmp::min_by_key`]
820 - [`cmp::min_by`]
821 - [`f32::is_subnormal`]
822 - [`f64::is_subnormal`]
823
824 Cargo
825 -----------------------
826 - [Cargo now supports git repositories where the default `HEAD` branch is not
827   "master".][cargo/9392] This also includes a switch to the version 3 `Cargo.lock` format
828   which can handle default branches correctly.
829 - [macOS targets now default to `unpacked` split-debuginfo.][cargo/9298]
830 - [The `authors` field is no longer included in `Cargo.toml` for new
831   projects.][cargo/9282]
832
833 Rustdoc
834 -----------------------
835 - [Added the `rustdoc::bare_urls` lint that warns when you have URLs
836   without hyperlinks.][81764]
837
838 Compatibility Notes
839 -------------------
840 - [Implement token-based handling of attributes during expansion][82608]
841 - [`Ipv4::from_str` will now reject octal format IP addresses in addition
842   to rejecting hexadecimal IP addresses.][83652] The octal format can lead
843   to confusion and potential security vulnerabilities and [is no
844   longer recommended][ietf6943].
845 - [The added `BITS` constant may conflict with external definitions.][85667]
846   In particular, this was known to be a problem in the `lexical-core` crate,
847   but they have published fixes for semantic versions 0.4 through 0.7. To
848   update this dependency alone, use `cargo update -p lexical-core`.
849 - Incremental compilation remains off by default, unless one uses the `RUSTC_FORCE_INCREMENTAL=1` environment variable added in 1.52.1.
850
851 Internal Only
852 -------------
853 These changes provide no direct user facing benefits, but represent significant
854 improvements to the internals and overall performance of rustc and
855 related tools.
856
857 - [Rework the `std::sys::windows::alloc` implementation.][83065]
858 - [rustdoc: Don't enter an infer_ctxt in get_blanket_impls for impls that aren't blanket impls.][82864]
859 - [rustdoc: Only look at blanket impls in `get_blanket_impls`][83681]
860 - [Rework rustdoc const type][82873]
861
862 [85667]: https://github.com/rust-lang/rust/pull/85667
863 [83386]: https://github.com/rust-lang/rust/pull/83386
864 [82771]: https://github.com/rust-lang/rust/pull/82771
865 [84147]: https://github.com/rust-lang/rust/pull/84147
866 [84082]: https://github.com/rust-lang/rust/pull/84082
867 [83799]: https://github.com/rust-lang/rust/pull/83799
868 [83681]: https://github.com/rust-lang/rust/pull/83681
869 [83652]: https://github.com/rust-lang/rust/pull/83652
870 [83387]: https://github.com/rust-lang/rust/pull/83387
871 [82873]: https://github.com/rust-lang/rust/pull/82873
872 [82864]: https://github.com/rust-lang/rust/pull/82864
873 [82608]: https://github.com/rust-lang/rust/pull/82608
874 [82565]: https://github.com/rust-lang/rust/pull/82565
875 [80525]: https://github.com/rust-lang/rust/pull/80525
876 [79278]: https://github.com/rust-lang/rust/pull/79278
877 [78618]: https://github.com/rust-lang/rust/pull/78618
878 [77704]: https://github.com/rust-lang/rust/pull/77704
879 [83941]: https://github.com/rust-lang/rust/pull/83941
880 [83065]: https://github.com/rust-lang/rust/pull/83065
881 [81764]: https://github.com/rust-lang/rust/pull/81764
882 [81469]: https://github.com/rust-lang/rust/pull/81469
883 [cargo/9298]: https://github.com/rust-lang/cargo/pull/9298
884 [cargo/9282]: https://github.com/rust-lang/cargo/pull/9282
885 [cargo/9392]: https://github.com/rust-lang/cargo/pull/9392
886 [`AtomicBool::fetch_update`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicBool.html#method.fetch_update
887 [`AtomicPtr::fetch_update`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicPtr.html#method.fetch_update
888 [`BTreeMap::retain`]: https://doc.rust-lang.org/std/collections/struct.BTreeMap.html#method.retain
889 [`BTreeSet::retain`]: https://doc.rust-lang.org/std/collections/struct.BTreeSet.html#method.retain
890 [`BufReader::seek_relative`]: https://doc.rust-lang.org/std/io/struct.BufReader.html#method.seek_relative
891 [`DebugStruct::non_exhaustive`]: https://doc.rust-lang.org/std/fmt/struct.DebugStruct.html#method.finish_non_exhaustive
892 [`Duration::MAX`]: https://doc.rust-lang.org/std/time/struct.Duration.html#associatedconstant.MAX
893 [`Duration::ZERO`]: https://doc.rust-lang.org/std/time/struct.Duration.html#associatedconstant.ZERO
894 [`Duration::is_zero`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.is_zero
895 [`Duration::saturating_add`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.saturating_add
896 [`Duration::saturating_mul`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.saturating_mul
897 [`Duration::saturating_sub`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.saturating_sub
898 [`ErrorKind::Unsupported`]: https://doc.rust-lang.org/std/io/enum.ErrorKind.html#variant.Unsupported
899 [`Option::insert`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.insert
900 [`Ordering::is_eq`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.is_eq
901 [`Ordering::is_ge`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.is_ge
902 [`Ordering::is_gt`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.is_gt
903 [`Ordering::is_le`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.is_le
904 [`Ordering::is_lt`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.is_lt
905 [`Ordering::is_ne`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.is_ne
906 [`OsStr::eq_ignore_ascii_case`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html#method.eq_ignore_ascii_case
907 [`OsStr::is_ascii`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html#method.is_ascii
908 [`OsStr::make_ascii_lowercase`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html#method.make_ascii_lowercase
909 [`OsStr::make_ascii_uppercase`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html#method.make_ascii_uppercase
910 [`OsStr::to_ascii_lowercase`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html#method.to_ascii_lowercase
911 [`OsStr::to_ascii_uppercase`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html#method.to_ascii_uppercase
912 [`Peekable::peek_mut`]: https://doc.rust-lang.org/std/iter/struct.Peekable.html#method.peek_mut
913 [`Rc::decrement_strong_count`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.increment_strong_count
914 [`Rc::increment_strong_count`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.increment_strong_count
915 [`Vec::extend_from_within`]: https://doc.rust-lang.org/beta/std/vec/struct.Vec.html#method.extend_from_within
916 [`array::from_mut`]: https://doc.rust-lang.org/beta/std/array/fn.from_mut.html
917 [`array::from_ref`]: https://doc.rust-lang.org/beta/std/array/fn.from_ref.html
918 [`cmp::max_by_key`]: https://doc.rust-lang.org/beta/std/cmp/fn.max_by_key.html
919 [`cmp::max_by`]: https://doc.rust-lang.org/beta/std/cmp/fn.max_by.html
920 [`cmp::min_by_key`]: https://doc.rust-lang.org/beta/std/cmp/fn.min_by_key.html
921 [`cmp::min_by`]: https://doc.rust-lang.org/beta/std/cmp/fn.min_by.html
922 [`f32::is_subnormal`]: https://doc.rust-lang.org/std/primitive.f64.html#method.is_subnormal
923 [`f64::is_subnormal`]: https://doc.rust-lang.org/std/primitive.f64.html#method.is_subnormal
924 [ietf6943]: https://datatracker.ietf.org/doc/html/rfc6943#section-3.1.1
925
926
927 Version 1.52.1 (2021-05-10)
928 ============================
929
930 This release disables incremental compilation, unless the user has explicitly
931 opted in via the newly added RUSTC_FORCE_INCREMENTAL=1 environment variable.
932
933 This is due to the widespread, and frequently occuring, breakage encountered by
934 Rust users due to newly enabled incremental verification in 1.52.0. Notably,
935 Rust users **should** upgrade to 1.52.0 or 1.52.1: the bugs that are detected by
936 newly added incremental verification are still present in past stable versions,
937 and are not yet fixed on any channel. These bugs can lead to miscompilation of
938 Rust binaries.
939
940 These problems only affect incremental builds, so release builds with Cargo
941 should not be affected unless the user has explicitly opted into incremental.
942 Debug and check builds are affected.
943
944 See [84970] for more details.
945
946 [84970]: https://github.com/rust-lang/rust/issues/84970
947
948 Version 1.52.0 (2021-05-06)
949 ============================
950
951 Language
952 --------
953 - [Added the `unsafe_op_in_unsafe_fn` lint, which checks whether the unsafe code
954   in an `unsafe fn` is wrapped in a `unsafe` block.][79208] This lint
955   is allowed by default, and may become a warning or hard error in a
956   future edition.
957 - [You can now cast mutable references to arrays to a pointer of the same type as
958   the element.][81479]
959
960 Compiler
961 --------
962 - [Upgraded the default LLVM to LLVM 12.][81451]
963
964 Added tier 3\* support for the following targets.
965
966 - [`s390x-unknown-linux-musl`][82166]
967 - [`riscv32gc-unknown-linux-musl` & `riscv64gc-unknown-linux-musl`][82202]
968 - [`powerpc-unknown-openbsd`][82733]
969
970 \* Refer to Rust's [platform support page][platform-support-doc] for more
971 information on Rust's tiered platform support.
972
973 Libraries
974 ---------
975 - [`OsString` now implements `Extend` and `FromIterator`.][82121]
976 - [`cmp::Reverse` now has `#[repr(transparent)]` representation.][81879]
977 - [`Arc<impl Error>` now implements `error::Error`.][80553]
978 - [All integer division and remainder operations are now `const`.][80962]
979
980 Stabilised APIs
981 -------------
982 - [`Arguments::as_str`]
983 - [`char::MAX`]
984 - [`char::REPLACEMENT_CHARACTER`]
985 - [`char::UNICODE_VERSION`]
986 - [`char::decode_utf16`]
987 - [`char::from_digit`]
988 - [`char::from_u32_unchecked`]
989 - [`char::from_u32`]
990 - [`slice::partition_point`]
991 - [`str::rsplit_once`]
992 - [`str::split_once`]
993
994 The following previously stable APIs are now `const`.
995
996 - [`char::len_utf8`]
997 - [`char::len_utf16`]
998 - [`char::to_ascii_uppercase`]
999 - [`char::to_ascii_lowercase`]
1000 - [`char::eq_ignore_ascii_case`]
1001 - [`u8::to_ascii_uppercase`]
1002 - [`u8::to_ascii_lowercase`]
1003 - [`u8::eq_ignore_ascii_case`]
1004
1005 Rustdoc
1006 -------
1007 - [Rustdoc lints are now treated as a tool lint, meaning that
1008   lints are now prefixed with `rustdoc::` (e.g. `#[warn(rustdoc::broken_intra_doc_links)]`).][80527]
1009   Using the old style is still allowed, and will become a warning in
1010   a future release.
1011 - [Rustdoc now supports argument files.][82261]
1012 - [Rustdoc now generates smart punctuation for documentation.][79423]
1013 - [You can now use "task lists" in Rustdoc Markdown.][81766] E.g.
1014   ```markdown
1015   - [x] Complete
1016   - [ ] Todo
1017   ```
1018
1019 Misc
1020 ----
1021 - [You can now pass multiple filters to tests.][81356] E.g.
1022   `cargo test -- foo bar` will run all tests that match `foo` and `bar`.
1023 - [Rustup now distributes PDB symbols for the `std` library on Windows,
1024   allowing you to see `std` symbols when debugging.][82218]
1025
1026 Internal Only
1027 -------------
1028 These changes provide no direct user facing benefits, but represent significant
1029 improvements to the internals and overall performance of rustc and
1030 related tools.
1031
1032 - [Check the result cache before the DepGraph when ensuring queries][81855]
1033 - [Try fast_reject::simplify_type in coherence before doing full check][81744]
1034 - [Only store a LocalDefId in some HIR nodes][81611]
1035 - [Store HIR attributes in a side table][79519]
1036
1037 Compatibility Notes
1038 -------------------
1039 - [Cargo build scripts are now forbidden from setting `RUSTC_BOOTSTRAP`.][cargo/9181]
1040 - [Removed support for the `x86_64-rumprun-netbsd` target.][82594]
1041 - [Deprecated the `x86_64-sun-solaris` target in favor of `x86_64-pc-solaris`.][82216]
1042 - [Rustdoc now only accepts `,`, ` `, and `\t` as delimiters for specifying
1043   languages in code blocks.][78429]
1044 - [Rustc now catches more cases of `pub_use_of_private_extern_crate`][80763]
1045 - [Changes in how proc macros handle whitespace may lead to panics when used
1046   with older `proc-macro-hack` versions. A `cargo update` should be sufficient to fix this in all cases.][84136]
1047 - [Turn `#[derive]` into a regular macro attribute][79078]
1048
1049 [84136]: https://github.com/rust-lang/rust/issues/84136
1050 [80763]: https://github.com/rust-lang/rust/pull/80763
1051 [82166]: https://github.com/rust-lang/rust/pull/82166
1052 [82121]: https://github.com/rust-lang/rust/pull/82121
1053 [81879]: https://github.com/rust-lang/rust/pull/81879
1054 [82261]: https://github.com/rust-lang/rust/pull/82261
1055 [82218]: https://github.com/rust-lang/rust/pull/82218
1056 [82216]: https://github.com/rust-lang/rust/pull/82216
1057 [82202]: https://github.com/rust-lang/rust/pull/82202
1058 [81855]: https://github.com/rust-lang/rust/pull/81855
1059 [81766]: https://github.com/rust-lang/rust/pull/81766
1060 [81744]: https://github.com/rust-lang/rust/pull/81744
1061 [81611]: https://github.com/rust-lang/rust/pull/81611
1062 [81479]: https://github.com/rust-lang/rust/pull/81479
1063 [81451]: https://github.com/rust-lang/rust/pull/81451
1064 [81356]: https://github.com/rust-lang/rust/pull/81356
1065 [80962]: https://github.com/rust-lang/rust/pull/80962
1066 [80553]: https://github.com/rust-lang/rust/pull/80553
1067 [80527]: https://github.com/rust-lang/rust/pull/80527
1068 [79519]: https://github.com/rust-lang/rust/pull/79519
1069 [79423]: https://github.com/rust-lang/rust/pull/79423
1070 [79208]: https://github.com/rust-lang/rust/pull/79208
1071 [78429]: https://github.com/rust-lang/rust/pull/78429
1072 [82733]: https://github.com/rust-lang/rust/pull/82733
1073 [82594]: https://github.com/rust-lang/rust/pull/82594
1074 [79078]: https://github.com/rust-lang/rust/pull/79078
1075 [cargo/9181]: https://github.com/rust-lang/cargo/pull/9181
1076 [`char::MAX`]: https://doc.rust-lang.org/std/primitive.char.html#associatedconstant.MAX
1077 [`char::REPLACEMENT_CHARACTER`]: https://doc.rust-lang.org/std/primitive.char.html#associatedconstant.REPLACEMENT_CHARACTER
1078 [`char::UNICODE_VERSION`]: https://doc.rust-lang.org/std/primitive.char.html#associatedconstant.UNICODE_VERSION
1079 [`char::decode_utf16`]: https://doc.rust-lang.org/std/primitive.char.html#method.decode_utf16
1080 [`char::from_u32`]: https://doc.rust-lang.org/std/primitive.char.html#method.from_u32
1081 [`char::from_u32_unchecked`]: https://doc.rust-lang.org/std/primitive.char.html#method.from_u32_unchecked
1082 [`char::from_digit`]: https://doc.rust-lang.org/std/primitive.char.html#method.from_digit
1083 [`Peekable::next_if`]: https://doc.rust-lang.org/stable/std/iter/struct.Peekable.html#method.next_if
1084 [`Peekable::next_if_eq`]: https://doc.rust-lang.org/stable/std/iter/struct.Peekable.html#method.next_if_eq
1085 [`Arguments::as_str`]: https://doc.rust-lang.org/stable/std/fmt/struct.Arguments.html#method.as_str
1086 [`str::split_once`]: https://doc.rust-lang.org/stable/std/primitive.str.html#method.split_once
1087 [`str::rsplit_once`]: https://doc.rust-lang.org/stable/std/primitive.str.html#method.rsplit_once
1088 [`slice::partition_point`]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.partition_point
1089 [`char::len_utf8`]: https://doc.rust-lang.org/stable/std/primitive.char.html#method.len_utf8
1090 [`char::len_utf16`]: https://doc.rust-lang.org/stable/std/primitive.char.html#method.len_utf16
1091 [`char::to_ascii_uppercase`]: https://doc.rust-lang.org/stable/std/primitive.char.html#method.to_ascii_uppercase
1092 [`char::to_ascii_lowercase`]: https://doc.rust-lang.org/stable/std/primitive.char.html#method.to_ascii_lowercase
1093 [`char::eq_ignore_ascii_case`]: https://doc.rust-lang.org/stable/std/primitive.char.html#method.eq_ignore_ascii_case
1094 [`u8::to_ascii_uppercase`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.to_ascii_uppercase
1095 [`u8::to_ascii_lowercase`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.to_ascii_lowercase
1096 [`u8::eq_ignore_ascii_case`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.eq_ignore_ascii_case
1097
1098 Version 1.51.0 (2021-03-25)
1099 ============================
1100
1101 Language
1102 --------
1103 - [You can now parameterize items such as functions, traits, and `struct`s by constant
1104   values in addition to by types and lifetimes.][79135] Also known as "const generics"
1105   E.g. you can now write the following. Note: Only values of primitive integers,
1106   `bool`, or `char` types are currently permitted.
1107   ```rust
1108   struct GenericArray<T, const LENGTH: usize> {
1109       inner: [T; LENGTH]
1110   }
1111
1112   impl<T, const LENGTH: usize> GenericArray<T, LENGTH> {
1113       const fn last(&self) -> Option<&T> {
1114           if LENGTH == 0 {
1115               None
1116           } else {
1117               Some(&self.inner[LENGTH - 1])
1118           }
1119       }
1120   }
1121   ```
1122
1123
1124 Compiler
1125 --------
1126
1127 - [Added the `-Csplit-debuginfo` codegen option for macOS platforms.][79570]
1128   This option controls whether debug information is split across multiple files
1129   or packed into a single file. **Note** This option is unstable on other platforms.
1130 - [Added tier 3\* support for `aarch64_be-unknown-linux-gnu`,
1131   `aarch64-unknown-linux-gnu_ilp32`, and `aarch64_be-unknown-linux-gnu_ilp32` targets.][81455]
1132 - [Added tier 3 support for `i386-unknown-linux-gnu` and `i486-unknown-linux-gnu` targets.][80662]
1133 - [The `target-cpu=native` option will now detect individual features of CPUs.][80749]
1134
1135 \* Refer to Rust's [platform support page][platform-support-doc] for more
1136 information on Rust's tiered platform support.
1137
1138 Libraries
1139 ---------
1140
1141 - [`Box::downcast` is now also implemented for any `dyn Any + Send + Sync` object.][80945]
1142 - [`str` now implements `AsMut<str>`.][80279]
1143 - [`u64` and `u128` now implement `From<char>`.][79502]
1144 - [`Error` is now implemented for `&T` where `T` implements `Error`.][75180]
1145 - [`Poll::{map_ok, map_err}` are now implemented for `Poll<Option<Result<T, E>>>`.][80968]
1146 - [`unsigned_abs` is now implemented for all signed integer types.][80959]
1147 - [`io::Empty` now implements `io::Seek`.][78044]
1148 - [`rc::Weak<T>` and `sync::Weak<T>`'s methods such as `as_ptr` are now implemented for
1149   `T: ?Sized` types.][80764]
1150 - [`Div` and `Rem` by their `NonZero` variant is now implemented for all unsigned integers.][79134]
1151
1152
1153 Stabilized APIs
1154 ---------------
1155
1156 - [`Arc::decrement_strong_count`]
1157 - [`Arc::increment_strong_count`]
1158 - [`Once::call_once_force`]
1159 - [`Peekable::next_if_eq`]
1160 - [`Peekable::next_if`]
1161 - [`Seek::stream_position`]
1162 - [`array::IntoIter`]
1163 - [`panic::panic_any`]
1164 - [`ptr::addr_of!`]
1165 - [`ptr::addr_of_mut!`]
1166 - [`slice::fill_with`]
1167 - [`slice::split_inclusive_mut`]
1168 - [`slice::split_inclusive`]
1169 - [`slice::strip_prefix`]
1170 - [`slice::strip_suffix`]
1171 - [`str::split_inclusive`]
1172 - [`sync::OnceState`]
1173 - [`task::Wake`]
1174 - [`VecDeque::range`]
1175 - [`VecDeque::range_mut`]
1176
1177 Cargo
1178 -----
1179 - [Added the `split-debuginfo` profile option to control the -Csplit-debuginfo
1180   codegen option.][cargo/9112]
1181 - [Added the `resolver` field to `Cargo.toml` to enable the new feature resolver
1182   and CLI option behavior.][cargo/8997] Version 2 of the feature resolver will try
1183   to avoid unifying features of dependencies where that unification could be unwanted.
1184   Such as using the same dependency with a `std` feature in a build scripts and
1185   proc-macros, while using the `no-std` feature in the final binary. See the
1186   [Cargo book documentation][feature-resolver@2.0] for more information on the feature.
1187
1188 Rustdoc
1189 -------
1190
1191 - [Rustdoc will now include documentation for methods available from _nested_ `Deref` traits.][80653]
1192 - [You can now provide a `--default-theme` flag which sets the default theme to use for
1193   documentation.][79642]
1194
1195 Various improvements to intra-doc links:
1196
1197 - [You can link to non-path primitives such as `slice`.][80181]
1198 - [You can link to associated items.][74489]
1199 - [You can now include generic parameters when linking to items, like `Vec<T>`.][76934]
1200
1201 Misc
1202 ----
1203 - [You can now pass `--include-ignored` to tests (e.g. with
1204   `cargo test -- --include-ignored`) to include testing tests marked `#[ignore]`.][80053]
1205
1206 Compatibility Notes
1207 -------------------
1208
1209 - [WASI platforms no longer use the `wasm-bindgen` ABI, and instead use the wasm32 ABI.][79998]
1210 - [`rustc` no longer promotes division, modulo and indexing operations to `const` that
1211   could fail.][80579]
1212 - [The minimum version of glibc for the following platforms has been bumped to version 2.31
1213   for the distributed artifacts.][81521]
1214     - `armv5te-unknown-linux-gnueabi`
1215     - `sparc64-unknown-linux-gnu`
1216     - `thumbv7neon-unknown-linux-gnueabihf`
1217     - `armv7-unknown-linux-gnueabi`
1218     - `x86_64-unknown-linux-gnux32`
1219 - [`atomic::spin_loop_hint` has been deprecated.][80966] It's recommended to use `hint::spin_loop` instead.
1220
1221 Internal Only
1222 -------------
1223
1224 - [Consistently avoid constructing optimized MIR when not doing codegen][80718]
1225
1226 [79135]: https://github.com/rust-lang/rust/pull/79135
1227 [74489]: https://github.com/rust-lang/rust/pull/74489
1228 [76934]: https://github.com/rust-lang/rust/pull/76934
1229 [79570]: https://github.com/rust-lang/rust/pull/79570
1230 [80181]: https://github.com/rust-lang/rust/pull/80181
1231 [79642]: https://github.com/rust-lang/rust/pull/79642
1232 [80945]: https://github.com/rust-lang/rust/pull/80945
1233 [80279]: https://github.com/rust-lang/rust/pull/80279
1234 [80053]: https://github.com/rust-lang/rust/pull/80053
1235 [79502]: https://github.com/rust-lang/rust/pull/79502
1236 [75180]: https://github.com/rust-lang/rust/pull/75180
1237 [79135]: https://github.com/rust-lang/rust/pull/79135
1238 [81521]: https://github.com/rust-lang/rust/pull/81521
1239 [80968]: https://github.com/rust-lang/rust/pull/80968
1240 [80959]: https://github.com/rust-lang/rust/pull/80959
1241 [80718]: https://github.com/rust-lang/rust/pull/80718
1242 [80653]: https://github.com/rust-lang/rust/pull/80653
1243 [80579]: https://github.com/rust-lang/rust/pull/80579
1244 [79998]: https://github.com/rust-lang/rust/pull/79998
1245 [78044]: https://github.com/rust-lang/rust/pull/78044
1246 [81455]: https://github.com/rust-lang/rust/pull/81455
1247 [80764]: https://github.com/rust-lang/rust/pull/80764
1248 [80749]: https://github.com/rust-lang/rust/pull/80749
1249 [80662]: https://github.com/rust-lang/rust/pull/80662
1250 [79134]: https://github.com/rust-lang/rust/pull/79134
1251 [80966]: https://github.com/rust-lang/rust/pull/80966
1252 [cargo/8997]: https://github.com/rust-lang/cargo/pull/8997
1253 [cargo/9112]: https://github.com/rust-lang/cargo/pull/9112
1254 [feature-resolver@2.0]: https://doc.rust-lang.org/nightly/cargo/reference/features.html#feature-resolver-version-2
1255 [`Once::call_once_force`]: https://doc.rust-lang.org/stable/std/sync/struct.Once.html#method.call_once_force
1256 [`sync::OnceState`]: https://doc.rust-lang.org/stable/std/sync/struct.OnceState.html
1257 [`panic::panic_any`]: https://doc.rust-lang.org/stable/std/panic/fn.panic_any.html
1258 [`slice::strip_prefix`]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.strip_prefix
1259 [`slice::strip_suffix`]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.strip_prefix
1260 [`Arc::increment_strong_count`]: https://doc.rust-lang.org/nightly/std/sync/struct.Arc.html#method.increment_strong_count
1261 [`Arc::decrement_strong_count`]: https://doc.rust-lang.org/nightly/std/sync/struct.Arc.html#method.decrement_strong_count
1262 [`slice::fill_with`]: https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.fill_with
1263 [`ptr::addr_of!`]: https://doc.rust-lang.org/nightly/std/ptr/macro.addr_of.html
1264 [`ptr::addr_of_mut!`]: https://doc.rust-lang.org/nightly/std/ptr/macro.addr_of_mut.html
1265 [`array::IntoIter`]: https://doc.rust-lang.org/nightly/std/array/struct.IntoIter.html
1266 [`slice::split_inclusive`]: https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_inclusive
1267 [`slice::split_inclusive_mut`]: https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_inclusive_mut
1268 [`str::split_inclusive`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_inclusive
1269 [`task::Wake`]: https://doc.rust-lang.org/nightly/std/task/trait.Wake.html
1270 [`Seek::stream_position`]: https://doc.rust-lang.org/nightly/std/io/trait.Seek.html#method.stream_position
1271 [`Peekable::next_if`]: https://doc.rust-lang.org/nightly/std/iter/struct.Peekable.html#method.next_if
1272 [`Peekable::next_if_eq`]: https://doc.rust-lang.org/nightly/std/iter/struct.Peekable.html#method.next_if_eq
1273 [`VecDeque::range`]: https://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.range
1274 [`VecDeque::range_mut`]: https://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.range_mut
1275
1276 Version 1.50.0 (2021-02-11)
1277 ============================
1278
1279 Language
1280 -----------------------
1281 - [You can now use `const` values for `x` in `[x; N]` array expressions.][79270]
1282   This has been technically possible since 1.38.0, as it was unintentionally stabilized.
1283 - [Assignments to `ManuallyDrop<T>` union fields are now considered safe.][78068]
1284
1285 Compiler
1286 -----------------------
1287 - [Added tier 3\* support for the `armv5te-unknown-linux-uclibceabi` target.][78142]
1288 - [Added tier 3 support for the `aarch64-apple-ios-macabi` target.][77484]
1289 - [The `x86_64-unknown-freebsd` is now built with the full toolset.][79484]
1290 - [Dropped support for all cloudabi targets.][78439]
1291
1292 \* Refer to Rust's [platform support page][platform-support-doc] for more
1293 information on Rust's tiered platform support.
1294
1295 Libraries
1296 -----------------------
1297
1298 - [`proc_macro::Punct` now implements `PartialEq<char>`.][78636]
1299 - [`ops::{Index, IndexMut}` are now implemented for fixed sized arrays of any length.][74989]
1300 - [On Unix platforms, the `std::fs::File` type now has a "niche" of `-1`.][74699]
1301   This value cannot be a valid file descriptor, and now means `Option<File>` takes
1302   up the same amount of space as `File`.
1303
1304 Stabilized APIs
1305 ---------------
1306
1307 - [`bool::then`]
1308 - [`btree_map::Entry::or_insert_with_key`]
1309 - [`f32::clamp`]
1310 - [`f64::clamp`]
1311 - [`hash_map::Entry::or_insert_with_key`]
1312 - [`Ord::clamp`]
1313 - [`RefCell::take`]
1314 - [`slice::fill`]
1315 - [`UnsafeCell::get_mut`]
1316
1317 The following previously stable methods are now `const`.
1318
1319 - [`IpAddr::is_ipv4`]
1320 - [`IpAddr::is_ipv6`]
1321 - [`IpAddr::is_unspecified`]
1322 - [`IpAddr::is_loopback`]
1323 - [`IpAddr::is_multicast`]
1324 - [`Ipv4Addr::octets`]
1325 - [`Ipv4Addr::is_loopback`]
1326 - [`Ipv4Addr::is_private`]
1327 - [`Ipv4Addr::is_link_local`]
1328 - [`Ipv4Addr::is_multicast`]
1329 - [`Ipv4Addr::is_broadcast`]
1330 - [`Ipv4Addr::is_documentation`]
1331 - [`Ipv4Addr::to_ipv6_compatible`]
1332 - [`Ipv4Addr::to_ipv6_mapped`]
1333 - [`Ipv6Addr::segments`]
1334 - [`Ipv6Addr::is_unspecified`]
1335 - [`Ipv6Addr::is_loopback`]
1336 - [`Ipv6Addr::is_multicast`]
1337 - [`Ipv6Addr::to_ipv4`]
1338 - [`Layout::size`]
1339 - [`Layout::align`]
1340 - [`Layout::from_size_align`]
1341 - `pow` for all integer types.
1342 - `checked_pow` for all integer types.
1343 - `saturating_pow` for all integer types.
1344 - `wrapping_pow` for all integer types.
1345 - `next_power_of_two` for all unsigned integer types.
1346 - `checked_next_power_of_two` for all unsigned integer types.
1347
1348 Cargo
1349 -----------------------
1350
1351 - [Added the `[build.rustc-workspace-wrapper]` option.][cargo/8976]
1352   This option sets a wrapper to execute instead of `rustc`, for workspace members only.
1353 - [`cargo:rerun-if-changed` will now, if provided a directory, scan the entire
1354   contents of that directory for changes.][cargo/8973]
1355 - [Added the `--workspace` flag to the `cargo update` command.][cargo/8725]
1356
1357 Misc
1358 ----
1359
1360 - [The search results tab and the help button are focusable with keyboard in rustdoc.][79896]
1361 - [Running tests will now print the total time taken to execute.][75752]
1362
1363 Compatibility Notes
1364 -------------------
1365
1366 - [The `compare_and_swap` method on atomics has been deprecated.][79261] It's
1367   recommended to use the `compare_exchange` and `compare_exchange_weak` methods instead.
1368 - [Changes in how `TokenStream`s are checked have fixed some cases where you could write
1369   unhygenic `macro_rules!` macros.][79472]
1370 - [`#![test]` as an inner attribute is now considered unstable like other inner macro
1371   attributes, and reports an error by default through the `soft_unstable` lint.][79003]
1372 - [Overriding a `forbid` lint at the same level that it was set is now a hard error.][78864]
1373 - [You can no longer intercept `panic!` calls by supplying your own macro.][78343] It's
1374   recommended to use the `#[panic_handler]` attribute to provide your own implementation.
1375 - [Semi-colons after item statements (e.g. `struct Foo {};`) now produce a warning.][78296]
1376
1377 [74989]: https://github.com/rust-lang/rust/pull/74989
1378 [79261]: https://github.com/rust-lang/rust/pull/79261
1379 [79896]: https://github.com/rust-lang/rust/pull/79896
1380 [79484]: https://github.com/rust-lang/rust/pull/79484
1381 [79472]: https://github.com/rust-lang/rust/pull/79472
1382 [79270]: https://github.com/rust-lang/rust/pull/79270
1383 [79003]: https://github.com/rust-lang/rust/pull/79003
1384 [78864]: https://github.com/rust-lang/rust/pull/78864
1385 [78636]: https://github.com/rust-lang/rust/pull/78636
1386 [78439]: https://github.com/rust-lang/rust/pull/78439
1387 [78343]: https://github.com/rust-lang/rust/pull/78343
1388 [78296]: https://github.com/rust-lang/rust/pull/78296
1389 [78068]: https://github.com/rust-lang/rust/pull/78068
1390 [75752]: https://github.com/rust-lang/rust/pull/75752
1391 [74699]: https://github.com/rust-lang/rust/pull/74699
1392 [78142]: https://github.com/rust-lang/rust/pull/78142
1393 [77484]: https://github.com/rust-lang/rust/pull/77484
1394 [cargo/8976]: https://github.com/rust-lang/cargo/pull/8976
1395 [cargo/8973]: https://github.com/rust-lang/cargo/pull/8973
1396 [cargo/8725]: https://github.com/rust-lang/cargo/pull/8725
1397 [`IpAddr::is_ipv4`]: https://doc.rust-lang.org/stable/std/net/enum.IpAddr.html#method.is_ipv4
1398 [`IpAddr::is_ipv6`]: https://doc.rust-lang.org/stable/std/net/enum.IpAddr.html#method.is_ipv6
1399 [`IpAddr::is_unspecified`]: https://doc.rust-lang.org/stable/std/net/enum.IpAddr.html#method.is_unspecified
1400 [`IpAddr::is_loopback`]: https://doc.rust-lang.org/stable/std/net/enum.IpAddr.html#method.is_loopback
1401 [`IpAddr::is_multicast`]: https://doc.rust-lang.org/stable/std/net/enum.IpAddr.html#method.is_multicast
1402 [`Ipv4Addr::octets`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html#method.octets
1403 [`Ipv4Addr::is_loopback`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html#method.is_loopback
1404 [`Ipv4Addr::is_private`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html#method.is_private
1405 [`Ipv4Addr::is_link_local`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html#method.is_link_local
1406 [`Ipv4Addr::is_multicast`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html#method.is_multicast
1407 [`Ipv4Addr::is_broadcast`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html#method.is_broadcast
1408 [`Ipv4Addr::is_documentation`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html#method.is_documentation
1409 [`Ipv4Addr::to_ipv6_compatible`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html#method.to_ipv6_compatible
1410 [`Ipv4Addr::to_ipv6_mapped`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html#method.to_ipv6_mapped
1411 [`Ipv6Addr::segments`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv6Addr.html#method.segments
1412 [`Ipv6Addr::is_unspecified`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv6Addr.html#method.is_unspecified
1413 [`Ipv6Addr::is_loopback`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv6Addr.html#method.is_loopback
1414 [`Ipv6Addr::is_multicast`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv6Addr.html#method.is_multicast
1415 [`Ipv6Addr::to_ipv4`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv6Addr.html#method.to_ipv4
1416 [`Layout::align`]: https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.align
1417 [`Layout::from_size_align`]: https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.from_size_align
1418 [`Layout::size`]: https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.size
1419 [`Ord::clamp`]: https://doc.rust-lang.org/stable/std/cmp/trait.Ord.html#method.clamp
1420 [`RefCell::take`]: https://doc.rust-lang.org/stable/std/cell/struct.RefCell.html#method.take
1421 [`UnsafeCell::get_mut`]: https://doc.rust-lang.org/stable/std/cell/struct.UnsafeCell.html#method.get_mut
1422 [`bool::then`]: https://doc.rust-lang.org/stable/std/primitive.bool.html#method.then
1423 [`btree_map::Entry::or_insert_with_key`]: https://doc.rust-lang.org/stable/std/collections/btree_map/enum.Entry.html#method.or_insert_with_key
1424 [`f32::clamp`]: https://doc.rust-lang.org/stable/std/primitive.f32.html#method.clamp
1425 [`f64::clamp`]: https://doc.rust-lang.org/stable/std/primitive.f64.html#method.clamp
1426 [`hash_map::Entry::or_insert_with_key`]: https://doc.rust-lang.org/stable/std/collections/hash_map/enum.Entry.html#method.or_insert_with_key
1427 [`slice::fill`]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.fill
1428
1429
1430 Version 1.49.0 (2020-12-31)
1431 ============================
1432
1433 Language
1434 -----------------------
1435
1436 - [Unions can now implement `Drop`, and you can now have a field in a union
1437   with `ManuallyDrop<T>`.][77547]
1438 - [You can now cast uninhabited enums to integers.][76199]
1439 - [You can now bind by reference and by move in patterns.][76119] This
1440   allows you to selectively borrow individual components of a type. E.g.
1441   ```rust
1442   #[derive(Debug)]
1443   struct Person {
1444       name: String,
1445       age: u8,
1446   }
1447
1448   let person = Person {
1449       name: String::from("Alice"),
1450       age: 20,
1451   };
1452
1453   // `name` is moved out of person, but `age` is referenced.
1454   let Person { name, ref age } = person;
1455   println!("{} {}", name, age);
1456   ```
1457
1458 Compiler
1459 -----------------------
1460
1461 - [Added tier 1\* support for `aarch64-unknown-linux-gnu`.][78228]
1462 - [Added tier 2 support for `aarch64-apple-darwin`.][75991]
1463 - [Added tier 2 support for `aarch64-pc-windows-msvc`.][75914]
1464 - [Added tier 3 support for `mipsel-unknown-none`.][78676]
1465 - [Raised the minimum supported LLVM version to LLVM 9.][78848]
1466 - [Output from threads spawned in tests is now captured.][78227]
1467 - [Change os and vendor values to "none" and "unknown" for some targets][78951]
1468
1469 \* Refer to Rust's [platform support page][platform-support-doc] for more
1470 information on Rust's tiered platform support.
1471
1472 Libraries
1473 -----------------------
1474
1475 - [`RangeInclusive` now checks for exhaustion when calling `contains` and indexing.][78109]
1476 - [`ToString::to_string` now no longer shrinks the internal buffer in the default implementation.][77997]
1477
1478 Stabilized APIs
1479 ---------------
1480
1481 - [`slice::select_nth_unstable`]
1482 - [`slice::select_nth_unstable_by`]
1483 - [`slice::select_nth_unstable_by_key`]
1484
1485 The following previously stable methods are now `const`.
1486
1487 - [`Poll::is_ready`]
1488 - [`Poll::is_pending`]
1489
1490 Cargo
1491 -----------------------
1492 - [Building a crate with `cargo-package` should now be independently reproducible.][cargo/8864]
1493 - [`cargo-tree` now marks proc-macro crates.][cargo/8765]
1494 - [Added `CARGO_PRIMARY_PACKAGE` build-time environment variable.][cargo/8758] This
1495   variable will be set if the crate being built is one the user selected to build, either
1496   with `-p` or through defaults.
1497 - [You can now use glob patterns when specifying packages & targets.][cargo/8752]
1498
1499
1500 Compatibility Notes
1501 -------------------
1502
1503 - [Demoted `i686-unknown-freebsd` from host tier 2 to target tier 2 support.][78746]
1504 - [Macros that end with a semi-colon are now treated as statements even if they expand to nothing.][78376]
1505 - [Rustc will now check for the validity of some built-in attributes on enum variants.][77015]
1506   Previously such invalid or unused attributes could be ignored.
1507 - Leading whitespace is stripped more uniformly in documentation comments, which may change behavior. You
1508   read [this post about the changes][rustdoc-ws-post] for more details.
1509 - [Trait bounds are no longer inferred for associated types.][79904]
1510
1511 Internal Only
1512 -------------
1513 These changes provide no direct user facing benefits, but represent significant
1514 improvements to the internals and overall performance of rustc and
1515 related tools.
1516
1517 - [rustc's internal crates are now compiled using the `initial-exec` Thread
1518   Local Storage model.][78201]
1519 - [Calculate visibilities once in resolve.][78077]
1520 - [Added `system` to the `llvm-libunwind` bootstrap config option.][77703]
1521 - [Added `--color` for configuring terminal color support to bootstrap.][79004]
1522
1523
1524 [75991]: https://github.com/rust-lang/rust/pull/75991
1525 [78951]: https://github.com/rust-lang/rust/pull/78951
1526 [78848]: https://github.com/rust-lang/rust/pull/78848
1527 [78746]: https://github.com/rust-lang/rust/pull/78746
1528 [78376]: https://github.com/rust-lang/rust/pull/78376
1529 [78228]: https://github.com/rust-lang/rust/pull/78228
1530 [78227]: https://github.com/rust-lang/rust/pull/78227
1531 [78201]: https://github.com/rust-lang/rust/pull/78201
1532 [78109]: https://github.com/rust-lang/rust/pull/78109
1533 [78077]: https://github.com/rust-lang/rust/pull/78077
1534 [77997]: https://github.com/rust-lang/rust/pull/77997
1535 [77703]: https://github.com/rust-lang/rust/pull/77703
1536 [77547]: https://github.com/rust-lang/rust/pull/77547
1537 [77015]: https://github.com/rust-lang/rust/pull/77015
1538 [76199]: https://github.com/rust-lang/rust/pull/76199
1539 [76119]: https://github.com/rust-lang/rust/pull/76119
1540 [75914]: https://github.com/rust-lang/rust/pull/75914
1541 [79004]: https://github.com/rust-lang/rust/pull/79004
1542 [78676]: https://github.com/rust-lang/rust/pull/78676
1543 [79904]: https://github.com/rust-lang/rust/issues/79904
1544 [cargo/8864]: https://github.com/rust-lang/cargo/pull/8864
1545 [cargo/8765]: https://github.com/rust-lang/cargo/pull/8765
1546 [cargo/8758]: https://github.com/rust-lang/cargo/pull/8758
1547 [cargo/8752]: https://github.com/rust-lang/cargo/pull/8752
1548 [`slice::select_nth_unstable`]: https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.select_nth_unstable
1549 [`slice::select_nth_unstable_by`]: https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.select_nth_unstable_by
1550 [`slice::select_nth_unstable_by_key`]: https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.select_nth_unstable_by_key
1551 [`hint::spin_loop`]: https://doc.rust-lang.org/stable/std/hint/fn.spin_loop.html
1552 [`Poll::is_ready`]: https://doc.rust-lang.org/stable/std/task/enum.Poll.html#method.is_ready
1553 [`Poll::is_pending`]: https://doc.rust-lang.org/stable/std/task/enum.Poll.html#method.is_pending
1554 [rustdoc-ws-post]: https://blog.guillaume-gomez.fr/articles/2020-11-11+New+doc+comment+handling+in+rustdoc
1555
1556 Version 1.48.0 (2020-11-19)
1557 ==========================
1558
1559 Language
1560 --------
1561
1562 - [The `unsafe` keyword is now syntactically permitted on modules.][75857] This
1563   is still rejected *semantically*, but can now be parsed by procedural macros.
1564
1565 Compiler
1566 --------
1567 - [Stabilised the `-C link-self-contained=<yes|no>` compiler flag.][76158] This tells
1568   `rustc` whether to link its own C runtime and libraries or to rely on a external
1569   linker to find them. (Supported only on `windows-gnu`, `linux-musl`, and `wasi` platforms.)
1570 - [You can now use `-C target-feature=+crt-static` on `linux-gnu` targets.][77386]
1571   Note: If you're using cargo you must explicitly pass the `--target` flag.
1572 - [Added tier 2\* support for `aarch64-unknown-linux-musl`.][76420]
1573
1574 \* Refer to Rust's [platform support page][platform-support-doc] for more
1575 information on Rust's tiered platform support.
1576
1577 Libraries
1578 ---------
1579 - [`io::Write` is now implemented for `&ChildStdin` `&Sink`, `&Stdout`,
1580   and `&Stderr`.][76275]
1581 - [All arrays of any length now implement `TryFrom<Vec<T>>`.][76310]
1582 - [The `matches!` macro now supports having a trailing comma.][74880]
1583 - [`Vec<A>` now implements `PartialEq<[B]>` where `A: PartialEq<B>`.][74194]
1584 - [The `RefCell::{replace, replace_with, clone}` methods now all use `#[track_caller]`.][77055]
1585
1586 Stabilized APIs
1587 ---------------
1588 - [`slice::as_ptr_range`]
1589 - [`slice::as_mut_ptr_range`]
1590 - [`VecDeque::make_contiguous`]
1591 - [`future::pending`]
1592 - [`future::ready`]
1593
1594 The following previously stable methods are now `const fn`'s:
1595
1596 - [`Option::is_some`]
1597 - [`Option::is_none`]
1598 - [`Option::as_ref`]
1599 - [`Result::is_ok`]
1600 - [`Result::is_err`]
1601 - [`Result::as_ref`]
1602 - [`Ordering::reverse`]
1603 - [`Ordering::then`]
1604
1605 Cargo
1606 -----
1607
1608 Rustdoc
1609 -------
1610 - [You can now link to items in `rustdoc` using the intra-doc link
1611   syntax.][74430] E.g. ``/// Uses [`std::future`]`` will automatically generate
1612   a link to `std::future`'s documentation. See ["Linking to items by
1613   name"][intradoc-links] for more information.
1614 - [You can now specify `#[doc(alias = "<alias>")]` on items to add search aliases
1615   when searching through `rustdoc`'s UI.][75740]
1616
1617 Compatibility Notes
1618 -------------------
1619 - [Promotion of references to `'static` lifetime inside `const fn` now follows the
1620   same rules as inside a `fn` body.][75502] In particular, `&foo()` will not be
1621   promoted to `'static` lifetime any more inside `const fn`s.
1622 - [Associated type bindings on trait objects are now verified to meet the bounds
1623   declared on the trait when checking that they implement the trait.][27675]
1624 - [When trait bounds on associated types or opaque types are ambiguous, the
1625   compiler no longer makes an arbitrary choice on which bound to use.][54121]
1626 - [Fixed recursive nonterminals not being expanded in macros during
1627   pretty-print/reparse check.][77153] This may cause errors if your macro wasn't
1628   correctly handling recursive nonterminal tokens.
1629 - [`&mut` references to non zero-sized types are no longer promoted.][75585]
1630 - [`rustc` will now warn if you use attributes like `#[link_name]` or `#[cold]`
1631   in places where they have no effect.][73461]
1632 - [Updated `_mm256_extract_epi8` and `_mm256_extract_epi16` signatures in
1633   `arch::{x86, x86_64}` to return `i32` to match the vendor signatures.][73166]
1634 - [`mem::uninitialized` will now panic if any inner types inside a struct or enum
1635   disallow zero-initialization.][71274]
1636 - [`#[target_feature]` will now error if used in a place where it has no effect.][78143]
1637 - [Foreign exceptions are now caught by `catch_unwind` and will cause an abort.][70212]
1638   Note: This behaviour is not guaranteed and is still considered undefined behaviour,
1639   see the [`catch_unwind`] documentation for further information.
1640
1641
1642
1643 Internal Only
1644 -------------
1645 These changes provide no direct user facing benefits, but represent significant
1646 improvements to the internals and overall performance of rustc and
1647 related tools.
1648
1649 - [Building `rustc` from source now uses `ninja` by default over `make`.][74922]
1650   You can continue building with `make` by setting `ninja=false` in
1651   your `config.toml`.
1652 - [cg_llvm: `fewer_names` in `uncached_llvm_type`][76030]
1653 - [Made `ensure_sufficient_stack()` non-generic][76680]
1654
1655 [78143]: https://github.com/rust-lang/rust/issues/78143
1656 [76680]: https://github.com/rust-lang/rust/pull/76680/
1657 [76030]: https://github.com/rust-lang/rust/pull/76030/
1658 [70212]: https://github.com/rust-lang/rust/pull/70212/
1659 [27675]: https://github.com/rust-lang/rust/issues/27675/
1660 [54121]: https://github.com/rust-lang/rust/issues/54121/
1661 [71274]: https://github.com/rust-lang/rust/pull/71274/
1662 [77386]: https://github.com/rust-lang/rust/pull/77386/
1663 [77153]: https://github.com/rust-lang/rust/pull/77153/
1664 [77055]: https://github.com/rust-lang/rust/pull/77055/
1665 [76275]: https://github.com/rust-lang/rust/pull/76275/
1666 [76310]: https://github.com/rust-lang/rust/pull/76310/
1667 [76420]: https://github.com/rust-lang/rust/pull/76420/
1668 [76158]: https://github.com/rust-lang/rust/pull/76158/
1669 [75857]: https://github.com/rust-lang/rust/pull/75857/
1670 [75585]: https://github.com/rust-lang/rust/pull/75585/
1671 [75740]: https://github.com/rust-lang/rust/pull/75740/
1672 [75502]: https://github.com/rust-lang/rust/pull/75502/
1673 [74880]: https://github.com/rust-lang/rust/pull/74880/
1674 [74922]: https://github.com/rust-lang/rust/pull/74922/
1675 [74430]: https://github.com/rust-lang/rust/pull/74430/
1676 [74194]: https://github.com/rust-lang/rust/pull/74194/
1677 [73461]: https://github.com/rust-lang/rust/pull/73461/
1678 [73166]: https://github.com/rust-lang/rust/pull/73166/
1679 [intradoc-links]: https://doc.rust-lang.org/rustdoc/linking-to-items-by-name.html
1680 [`catch_unwind`]: https://doc.rust-lang.org/std/panic/fn.catch_unwind.html
1681 [`Option::is_some`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.is_some
1682 [`Option::is_none`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.is_none
1683 [`Option::as_ref`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.as_ref
1684 [`Result::is_ok`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.is_ok
1685 [`Result::is_err`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.is_err
1686 [`Result::as_ref`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.as_ref
1687 [`Ordering::reverse`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.reverse
1688 [`Ordering::then`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.then
1689 [`slice::as_ptr_range`]: https://doc.rust-lang.org/std/primitive.slice.html#method.as_ptr_range
1690 [`slice::as_mut_ptr_range`]: https://doc.rust-lang.org/std/primitive.slice.html#method.as_mut_ptr_range
1691 [`VecDeque::make_contiguous`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.make_contiguous
1692 [`future::pending`]: https://doc.rust-lang.org/std/future/fn.pending.html
1693 [`future::ready`]: https://doc.rust-lang.org/std/future/fn.ready.html
1694
1695
1696 Version 1.47.0 (2020-10-08)
1697 ==========================
1698
1699 Language
1700 --------
1701 - [Closures will now warn when not used.][74869]
1702
1703 Compiler
1704 --------
1705 - [Stabilized the `-C control-flow-guard` codegen option][73893], which enables
1706   [Control Flow Guard][1.47.0-cfg] for Windows platforms, and is ignored on other
1707   platforms.
1708 - [Upgraded to LLVM 11.][73526]
1709 - [Added tier 3\* support for the `thumbv4t-none-eabi` target.][74419]
1710 - [Upgrade the FreeBSD toolchain to version 11.4][75204]
1711 - [`RUST_BACKTRACE`'s output is now more compact.][75048]
1712
1713 \* Refer to Rust's [platform support page][platform-support-doc] for more
1714 information on Rust's tiered platform support.
1715
1716 Libraries
1717 ---------
1718 - [`CStr` now implements `Index<RangeFrom<usize>>`.][74021]
1719 - [Traits in `std`/`core` are now implemented for arrays of any length, not just
1720   those of length less than 33.][74060]
1721 - [`ops::RangeFull` and `ops::Range` now implement Default.][73197]
1722 - [`panic::Location` now implements `Copy`, `Clone`, `Eq`, `Hash`, `Ord`,
1723   `PartialEq`, and `PartialOrd`.][73583]
1724
1725 Stabilized APIs
1726 ---------------
1727 - [`Ident::new_raw`]
1728 - [`Range::is_empty`]
1729 - [`RangeInclusive::is_empty`]
1730 - [`Result::as_deref`]
1731 - [`Result::as_deref_mut`]
1732 - [`Vec::leak`]
1733 - [`pointer::offset_from`]
1734 - [`f32::TAU`]
1735 - [`f64::TAU`]
1736
1737 The following previously stable APIs have now been made const.
1738
1739 - [The `new` method for all `NonZero` integers.][73858]
1740 - [The `checked_add`,`checked_sub`,`checked_mul`,`checked_neg`, `checked_shl`,
1741   `checked_shr`, `saturating_add`, `saturating_sub`, and `saturating_mul`
1742   methods for all integers.][73858]
1743 - [The `checked_abs`, `saturating_abs`, `saturating_neg`, and `signum`  for all
1744   signed integers.][73858]
1745 - [The `is_ascii_alphabetic`, `is_ascii_uppercase`, `is_ascii_lowercase`,
1746   `is_ascii_alphanumeric`, `is_ascii_digit`, `is_ascii_hexdigit`,
1747   `is_ascii_punctuation`, `is_ascii_graphic`, `is_ascii_whitespace`, and
1748   `is_ascii_control` methods for `char` and `u8`.][73858]
1749
1750 Cargo
1751 -----
1752 - [`build-dependencies` are now built with opt-level 0 by default.][cargo/8500]
1753   You can override this by setting the following in your `Cargo.toml`.
1754   ```toml
1755   [profile.release.build-override]
1756   opt-level = 3
1757   ```
1758 - [`cargo-help` will now display man pages for commands rather just the
1759   `--help` text.][cargo/8456]
1760 - [`cargo-metadata` now emits a `test` field indicating if a target has
1761   tests enabled.][cargo/8478]
1762 - [`workspace.default-members` now respects `workspace.exclude`.][cargo/8485]
1763 - [`cargo-publish` will now use an alternative registry by default if it's the
1764   only registry specified in `package.publish`.][cargo/8571]
1765
1766 Misc
1767 ----
1768 - [Added a help button beside Rustdoc's searchbar that explains rustdoc's
1769   type based search.][75366]
1770 - [Added the Ayu theme to rustdoc.][71237]
1771
1772 Compatibility Notes
1773 -------------------
1774 - [Bumped the minimum supported Emscripten version to 1.39.20.][75716]
1775 - [Fixed a regression parsing `{} && false` in tail expressions.][74650]
1776 - [Added changes to how proc-macros are expanded in `macro_rules!` that should
1777   help to preserve more span information.][73084] These changes may cause
1778   compiliation errors if your macro was unhygenic or didn't correctly handle
1779   `Delimiter::None`.
1780 - [Moved support for the CloudABI target to tier 3.][75568]
1781 - [`linux-gnu` targets now require minimum kernel 2.6.32 and glibc 2.11.][74163]
1782 - [Added the `rustc-docs` component.][75560] This allows you to install
1783   and read the documentation for the compiler internal APIs. (Currently only
1784   available for `x86_64-unknown-linux-gnu`.)
1785
1786 Internal Only
1787 --------
1788
1789 - [Improved default settings for bootstrapping in `x.py`.][73964] You can read details about this change in the ["Changes to `x.py` defaults"](https://blog.rust-lang.org/inside-rust/2020/08/30/changes-to-x-py-defaults.html) post on the Inside Rust blog.
1790
1791 [1.47.0-cfg]: https://docs.microsoft.com/en-us/windows/win32/secbp/control-flow-guard
1792 [75048]: https://github.com/rust-lang/rust/pull/75048/
1793 [74163]: https://github.com/rust-lang/rust/pull/74163/
1794 [71237]: https://github.com/rust-lang/rust/pull/71237/
1795 [74869]: https://github.com/rust-lang/rust/pull/74869/
1796 [73858]: https://github.com/rust-lang/rust/pull/73858/
1797 [75716]: https://github.com/rust-lang/rust/pull/75716/
1798 [75908]: https://github.com/rust-lang/rust/pull/75908/
1799 [75516]: https://github.com/rust-lang/rust/pull/75516/
1800 [75560]: https://github.com/rust-lang/rust/pull/75560/
1801 [75568]: https://github.com/rust-lang/rust/pull/75568/
1802 [75366]: https://github.com/rust-lang/rust/pull/75366/
1803 [75204]: https://github.com/rust-lang/rust/pull/75204/
1804 [74650]: https://github.com/rust-lang/rust/pull/74650/
1805 [74419]: https://github.com/rust-lang/rust/pull/74419/
1806 [73964]: https://github.com/rust-lang/rust/pull/73964/
1807 [74021]: https://github.com/rust-lang/rust/pull/74021/
1808 [74060]: https://github.com/rust-lang/rust/pull/74060/
1809 [73893]: https://github.com/rust-lang/rust/pull/73893/
1810 [73526]: https://github.com/rust-lang/rust/pull/73526/
1811 [73583]: https://github.com/rust-lang/rust/pull/73583/
1812 [73084]: https://github.com/rust-lang/rust/pull/73084/
1813 [73197]: https://github.com/rust-lang/rust/pull/73197/
1814 [72488]: https://github.com/rust-lang/rust/pull/72488/
1815 [cargo/8456]: https://github.com/rust-lang/cargo/pull/8456/
1816 [cargo/8478]: https://github.com/rust-lang/cargo/pull/8478/
1817 [cargo/8485]: https://github.com/rust-lang/cargo/pull/8485/
1818 [cargo/8500]: https://github.com/rust-lang/cargo/pull/8500/
1819 [cargo/8571]: https://github.com/rust-lang/cargo/pull/8571/
1820 [`Ident::new_raw`]:  https://doc.rust-lang.org/nightly/proc_macro/struct.Ident.html#method.new_raw
1821 [`Range::is_empty`]: https://doc.rust-lang.org/nightly/std/ops/struct.Range.html#method.is_empty
1822 [`RangeInclusive::is_empty`]: https://doc.rust-lang.org/nightly/std/ops/struct.RangeInclusive.html#method.is_empty
1823 [`Result::as_deref_mut`]: https://doc.rust-lang.org/nightly/std/result/enum.Result.html#method.as_deref_mut
1824 [`Result::as_deref`]: https://doc.rust-lang.org/nightly/std/result/enum.Result.html#method.as_deref
1825 [`TypeId::of`]: https://doc.rust-lang.org/nightly/std/any/struct.TypeId.html#method.of
1826 [`Vec::leak`]: https://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.leak
1827 [`f32::TAU`]: https://doc.rust-lang.org/nightly/std/f32/consts/constant.TAU.html
1828 [`f64::TAU`]: https://doc.rust-lang.org/nightly/std/f64/consts/constant.TAU.html
1829 [`pointer::offset_from`]: https://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.offset_from
1830
1831
1832 Version 1.46.0 (2020-08-27)
1833 ==========================
1834
1835 Language
1836 --------
1837 - [`if`, `match`, and `loop` expressions can now be used in const functions.][72437]
1838 - [Additionally you are now also able to coerce and cast to slices (`&[T]`) in
1839   const functions.][73862]
1840 - [The `#[track_caller]` attribute can now be added to functions to use the
1841   function's caller's location information for panic messages.][72445]
1842 - [Recursively indexing into tuples no longer needs parentheses.][71322] E.g.
1843   `x.0.0` over `(x.0).0`.
1844 - [`mem::transmute` can now be used in statics and constants.][72920] **Note**
1845   You currently can't use `mem::transmute` in constant functions.
1846
1847 Compiler
1848 --------
1849 - [You can now use the `cdylib` target on Apple iOS and tvOS platforms.][73516]
1850 - [Enabled static "Position Independent Executables" by default
1851   for `x86_64-unknown-linux-musl`.][70740]
1852
1853 Libraries
1854 ---------
1855 - [`mem::forget` is now a `const fn`.][73887]
1856 - [`String` now implements `From<char>`.][73466]
1857 - [The `leading_ones`, and `trailing_ones` methods have been stabilised for all
1858   integer types.][73032]
1859 - [`vec::IntoIter<T>` now implements `AsRef<[T]>`.][72583]
1860 - [All non-zero integer types (`NonZeroU8`) now implement `TryFrom` for their
1861   zero-able equivalent (e.g. `TryFrom<u8>`).][72717]
1862 - [`&[T]` and `&mut [T]` now implement `PartialEq<Vec<T>>`.][71660]
1863 - [`(String, u16)` now implements `ToSocketAddrs`.][73007]
1864 - [`vec::Drain<'_, T>` now implements `AsRef<[T]>`.][72584]
1865
1866 Stabilized APIs
1867 ---------------
1868 - [`Option::zip`]
1869 - [`vec::Drain::as_slice`]
1870
1871 Cargo
1872 -----
1873 Added a number of new environment variables that are now available when
1874 compiling your crate.
1875
1876 - [`CARGO_BIN_NAME` and `CARGO_CRATE_NAME`][cargo/8270] Providing the name of
1877   the specific binary being compiled and the name of the crate.
1878 - [`CARGO_PKG_LICENSE`][cargo/8325] The license from the manifest of the package.
1879 - [`CARGO_PKG_LICENSE_FILE`][cargo/8387] The path to the license file.
1880
1881 Compatibility Notes
1882 -------------------
1883 - [The target configuration option `abi_blacklist` has been renamed
1884   to `unsupported_abis`.][74150] The old name will still continue to work.
1885 - [Rustc will now warn if you cast a C-like enum that implements `Drop`.][72331]
1886   This was previously accepted but will become a hard error in a future release.
1887 - [Rustc will fail to compile if you have a struct with
1888   `#[repr(i128)]` or `#[repr(u128)]`.][74109] This representation is currently only
1889   allowed on `enum`s.
1890 - [Tokens passed to `macro_rules!` are now always captured.][73293] This helps
1891   ensure that spans have the correct information, and may cause breakage if you
1892   were relying on receiving spans with dummy information.
1893 - [The InnoSetup installer for Windows is no longer available.][72569] This was
1894   a legacy installer that was replaced by a MSI installer a few years ago but
1895   was still being built.
1896 - [`{f32, f64}::asinh` now returns the correct values for negative numbers.][72486]
1897 - [Rustc will no longer accept overlapping trait implementations that only
1898   differ in how the lifetime was bound.][72493]
1899 - [Rustc now correctly relates the lifetime of an existential associated
1900   type.][71896] This fixes some edge cases where `rustc` would erroneously allow
1901   you to pass a shorter lifetime than expected.
1902 - [Rustc now dynamically links to `libz` (also called `zlib`) on Linux.][74420]
1903   The library will need to be installed for `rustc` to work, even though we
1904   expect it to be already available on most systems.
1905 - [Tests annotated with `#[should_panic]` are broken on ARMv7 while running
1906   under QEMU.][74820]
1907 - [Pretty printing of some tokens in procedural macros changed.][75453] The
1908   exact output returned by rustc's pretty printing is an unstable
1909   implementation detail: we recommend any macro relying on it to switch to a
1910   more robust parsing system.
1911
1912 [75453]: https://github.com/rust-lang/rust/issues/75453/
1913 [74820]: https://github.com/rust-lang/rust/issues/74820/
1914 [74420]: https://github.com/rust-lang/rust/issues/74420/
1915 [74109]: https://github.com/rust-lang/rust/pull/74109/
1916 [74150]: https://github.com/rust-lang/rust/pull/74150/
1917 [73862]: https://github.com/rust-lang/rust/pull/73862/
1918 [73887]: https://github.com/rust-lang/rust/pull/73887/
1919 [73466]: https://github.com/rust-lang/rust/pull/73466/
1920 [73516]: https://github.com/rust-lang/rust/pull/73516/
1921 [73293]: https://github.com/rust-lang/rust/pull/73293/
1922 [73007]: https://github.com/rust-lang/rust/pull/73007/
1923 [73032]: https://github.com/rust-lang/rust/pull/73032/
1924 [72920]: https://github.com/rust-lang/rust/pull/72920/
1925 [72569]: https://github.com/rust-lang/rust/pull/72569/
1926 [72583]: https://github.com/rust-lang/rust/pull/72583/
1927 [72584]: https://github.com/rust-lang/rust/pull/72584/
1928 [72717]: https://github.com/rust-lang/rust/pull/72717/
1929 [72437]: https://github.com/rust-lang/rust/pull/72437/
1930 [72445]: https://github.com/rust-lang/rust/pull/72445/
1931 [72486]: https://github.com/rust-lang/rust/pull/72486/
1932 [72493]: https://github.com/rust-lang/rust/pull/72493/
1933 [72331]: https://github.com/rust-lang/rust/pull/72331/
1934 [71896]: https://github.com/rust-lang/rust/pull/71896/
1935 [71660]: https://github.com/rust-lang/rust/pull/71660/
1936 [71322]: https://github.com/rust-lang/rust/pull/71322/
1937 [70740]: https://github.com/rust-lang/rust/pull/70740/
1938 [cargo/8270]: https://github.com/rust-lang/cargo/pull/8270/
1939 [cargo/8325]: https://github.com/rust-lang/cargo/pull/8325/
1940 [cargo/8387]: https://github.com/rust-lang/cargo/pull/8387/
1941 [`Option::zip`]: https://doc.rust-lang.org/stable/std/option/enum.Option.html#method.zip
1942 [`vec::Drain::as_slice`]: https://doc.rust-lang.org/stable/std/vec/struct.Drain.html#method.as_slice
1943
1944
1945 Version 1.45.2 (2020-08-03)
1946 ==========================
1947
1948 * [Fix bindings in tuple struct patterns][74954]
1949 * [Fix track_caller integration with trait objects][74784]
1950
1951 [74954]: https://github.com/rust-lang/rust/issues/74954
1952 [74784]: https://github.com/rust-lang/rust/issues/74784
1953
1954
1955 Version 1.45.1 (2020-07-30)
1956 ==========================
1957
1958 * [Fix const propagation with references.][73613]
1959 * [rustfmt accepts rustfmt_skip in cfg_attr again.][73078]
1960 * [Avoid spurious implicit region bound.][74509]
1961 * [Install clippy on x.py install][74457]
1962
1963 [73613]: https://github.com/rust-lang/rust/pull/73613
1964 [73078]: https://github.com/rust-lang/rust/issues/73078
1965 [74509]: https://github.com/rust-lang/rust/pull/74509
1966 [74457]: https://github.com/rust-lang/rust/pull/74457
1967
1968
1969 Version 1.45.0 (2020-07-16)
1970 ==========================
1971
1972 Language
1973 --------
1974 - [Out of range float to int conversions using `as` has been defined as a saturating
1975   conversion.][71269] This was previously undefined behaviour, but you can use the
1976    `{f64, f32}::to_int_unchecked` methods to continue using the current behaviour, which
1977    may be desirable in rare performance sensitive situations.
1978 - [`mem::Discriminant<T>` now uses `T`'s discriminant type instead of always
1979   using `u64`.][70705]
1980 - [Function like procedural macros can now be used in expression, pattern, and  statement
1981   positions.][68717] This means you can now use a function-like procedural macro
1982   anywhere you can use a declarative (`macro_rules!`) macro.
1983
1984 Compiler
1985 --------
1986 - [You can now override individual target features through the `target-feature`
1987   flag.][72094] E.g. `-C target-feature=+avx2 -C target-feature=+fma` is now
1988   equivalent to `-C target-feature=+avx2,+fma`.
1989 - [Added the `force-unwind-tables` flag.][69984] This option allows
1990   rustc to always generate unwind tables regardless of panic strategy.
1991 - [Added the `embed-bitcode` flag.][71716] This codegen flag allows rustc
1992   to include LLVM bitcode into generated `rlib`s (this is on by default).
1993 - [Added the `tiny` value to the `code-model` codegen flag.][72397]
1994 - [Added tier 3 support\* for the `mipsel-sony-psp` target.][72062]
1995 - [Added tier 3 support for the `thumbv7a-uwp-windows-msvc` target.][72133]
1996 - [Upgraded to LLVM 10.][67759]
1997
1998 \* Refer to Rust's [platform support page][platform-support-doc] for more
1999 information on Rust's tiered platform support.
2000
2001
2002 Libraries
2003 ---------
2004 - [`net::{SocketAddr, SocketAddrV4, SocketAddrV6}` now implements `PartialOrd`
2005   and `Ord`.][72239]
2006 - [`proc_macro::TokenStream` now implements `Default`.][72234]
2007 - [You can now use `char` with
2008   `ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}` to iterate over
2009   a range of codepoints.][72413] E.g.
2010   you can now write the following;
2011   ```rust
2012   for ch in 'a'..='z' {
2013       print!("{}", ch);
2014   }
2015   println!();
2016   // Prints "abcdefghijklmnopqrstuvwxyz"
2017   ```
2018 - [`OsString` now implements `FromStr`.][71662]
2019 - [The `saturating_neg` method has been added to all signed integer primitive
2020   types, and the `saturating_abs` method has been added for all integer
2021   primitive types.][71886]
2022 - [`Arc<T>`, `Rc<T>` now implement  `From<Cow<'_, T>>`, and `Box` now
2023   implements `From<Cow>` when `T` is `[T: Copy]`, `str`, `CStr`, `OsStr`,
2024   or `Path`.][71447]
2025 - [`Box<[T]>` now implements `From<[T; N]>`.][71095]
2026 - [`BitOr` and `BitOrAssign` are implemented for all `NonZero`
2027   integer types.][69813]
2028 - [The `fetch_min`, and `fetch_max` methods have been added to all atomic
2029   integer types.][72324]
2030 - [The `fetch_update` method has been added to all atomic integer types.][71843]
2031
2032 Stabilized APIs
2033 ---------------
2034 - [`Arc::as_ptr`]
2035 - [`BTreeMap::remove_entry`]
2036 - [`Rc::as_ptr`]
2037 - [`rc::Weak::as_ptr`]
2038 - [`rc::Weak::from_raw`]
2039 - [`rc::Weak::into_raw`]
2040 - [`str::strip_prefix`]
2041 - [`str::strip_suffix`]
2042 - [`sync::Weak::as_ptr`]
2043 - [`sync::Weak::from_raw`]
2044 - [`sync::Weak::into_raw`]
2045 - [`char::UNICODE_VERSION`]
2046 - [`Span::resolved_at`]
2047 - [`Span::located_at`]
2048 - [`Span::mixed_site`]
2049 - [`unix::process::CommandExt::arg0`]
2050
2051 Cargo
2052 -----
2053
2054 - [Cargo uses the `embed-bitcode` flag to optimize disk usage and build
2055   time.][cargo/8066]
2056
2057 Misc
2058 ----
2059 - [Rustdoc now supports strikethrough text in Markdown.][71928] E.g.
2060   `~~outdated information~~` becomes "~~outdated information~~".
2061 - [Added an emoji to Rustdoc's deprecated API message.][72014]
2062
2063 Compatibility Notes
2064 -------------------
2065 - [Trying to self initialize a static value (that is creating a value using
2066   itself) is unsound and now causes a compile error.][71140]
2067 - [`{f32, f64}::powi` now returns a slightly different value on Windows.][73420]
2068   This is due to changes in LLVM's intrinsics which `{f32, f64}::powi` uses.
2069 - [Rustdoc's CLI's extra error exit codes have been removed.][71900] These were
2070   previously undocumented and not intended for public use. Rustdoc still provides
2071   a non-zero exit code on errors.
2072 - [Rustc's `lto` flag is incompatible with the new `embed-bitcode=no`.][71848]
2073   This may cause issues if LTO is enabled through `RUSTFLAGS` or `cargo rustc`
2074   flags while cargo is adding `embed-bitcode` itself. The recommended way to
2075   control LTO is with Cargo profiles, either in `Cargo.toml` or `.cargo/config`,
2076   or by setting `CARGO_PROFILE_<name>_LTO` in the environment.
2077
2078 Internals Only
2079 --------------
2080 - [Make clippy a git subtree instead of a git submodule][70655]
2081 - [Unify the undo log of all snapshot types][69464]
2082
2083 [71848]: https://github.com/rust-lang/rust/issues/71848/
2084 [73420]: https://github.com/rust-lang/rust/issues/73420/
2085 [72324]: https://github.com/rust-lang/rust/pull/72324/
2086 [71843]: https://github.com/rust-lang/rust/pull/71843/
2087 [71886]: https://github.com/rust-lang/rust/pull/71886/
2088 [72234]: https://github.com/rust-lang/rust/pull/72234/
2089 [72239]: https://github.com/rust-lang/rust/pull/72239/
2090 [72397]: https://github.com/rust-lang/rust/pull/72397/
2091 [72413]: https://github.com/rust-lang/rust/pull/72413/
2092 [72014]: https://github.com/rust-lang/rust/pull/72014/
2093 [72062]: https://github.com/rust-lang/rust/pull/72062/
2094 [72094]: https://github.com/rust-lang/rust/pull/72094/
2095 [72133]: https://github.com/rust-lang/rust/pull/72133/
2096 [67759]: https://github.com/rust-lang/rust/pull/67759/
2097 [71900]: https://github.com/rust-lang/rust/pull/71900/
2098 [71928]: https://github.com/rust-lang/rust/pull/71928/
2099 [71662]: https://github.com/rust-lang/rust/pull/71662/
2100 [71716]: https://github.com/rust-lang/rust/pull/71716/
2101 [71447]: https://github.com/rust-lang/rust/pull/71447/
2102 [71269]: https://github.com/rust-lang/rust/pull/71269/
2103 [71095]: https://github.com/rust-lang/rust/pull/71095/
2104 [71140]: https://github.com/rust-lang/rust/pull/71140/
2105 [70655]: https://github.com/rust-lang/rust/pull/70655/
2106 [70705]: https://github.com/rust-lang/rust/pull/70705/
2107 [69984]: https://github.com/rust-lang/rust/pull/69984/
2108 [69813]: https://github.com/rust-lang/rust/pull/69813/
2109 [69464]: https://github.com/rust-lang/rust/pull/69464/
2110 [68717]: https://github.com/rust-lang/rust/pull/68717/
2111 [cargo/8066]: https://github.com/rust-lang/cargo/pull/8066
2112 [`Arc::as_ptr`]: https://doc.rust-lang.org/stable/std/sync/struct.Arc.html#method.as_ptr
2113 [`BTreeMap::remove_entry`]: https://doc.rust-lang.org/stable/std/collections/struct.BTreeMap.html#method.remove_entry
2114 [`Rc::as_ptr`]: https://doc.rust-lang.org/stable/std/rc/struct.Rc.html#method.as_ptr
2115 [`rc::Weak::as_ptr`]: https://doc.rust-lang.org/stable/std/rc/struct.Weak.html#method.as_ptr
2116 [`rc::Weak::from_raw`]: https://doc.rust-lang.org/stable/std/rc/struct.Weak.html#method.from_raw
2117 [`rc::Weak::into_raw`]: https://doc.rust-lang.org/stable/std/rc/struct.Weak.html#method.into_raw
2118 [`sync::Weak::as_ptr`]: https://doc.rust-lang.org/stable/std/sync/struct.Weak.html#method.as_ptr
2119 [`sync::Weak::from_raw`]: https://doc.rust-lang.org/stable/std/sync/struct.Weak.html#method.from_raw
2120 [`sync::Weak::into_raw`]: https://doc.rust-lang.org/stable/std/sync/struct.Weak.html#method.into_raw
2121 [`str::strip_prefix`]: https://doc.rust-lang.org/stable/std/primitive.str.html#method.strip_prefix
2122 [`str::strip_suffix`]: https://doc.rust-lang.org/stable/std/primitive.str.html#method.strip_suffix
2123 [`char::UNICODE_VERSION`]: https://doc.rust-lang.org/stable/std/char/constant.UNICODE_VERSION.html
2124 [`Span::resolved_at`]: https://doc.rust-lang.org/stable/proc_macro/struct.Span.html#method.resolved_at
2125 [`Span::located_at`]: https://doc.rust-lang.org/stable/proc_macro/struct.Span.html#method.located_at
2126 [`Span::mixed_site`]: https://doc.rust-lang.org/stable/proc_macro/struct.Span.html#method.mixed_site
2127 [`unix::process::CommandExt::arg0`]: https://doc.rust-lang.org/std/os/unix/process/trait.CommandExt.html#tymethod.arg0
2128
2129
2130 Version 1.44.1 (2020-06-18)
2131 ===========================
2132
2133 * [rustfmt accepts rustfmt_skip in cfg_attr again.][73078]
2134 * [Don't hash executable filenames on apple platforms, fixing backtraces.][cargo/8329]
2135 * [Fix crashes when finding backtrace on macOS.][71397]
2136 * [Clippy applies lint levels into different files.][clippy/5356]
2137
2138 [71397]: https://github.com/rust-lang/rust/issues/71397
2139 [73078]: https://github.com/rust-lang/rust/issues/73078
2140 [cargo/8329]: https://github.com/rust-lang/cargo/pull/8329
2141 [clippy/5356]: https://github.com/rust-lang/rust-clippy/issues/5356
2142
2143
2144 Version 1.44.0 (2020-06-04)
2145 ==========================
2146
2147 Language
2148 --------
2149 - [You can now use `async/.await` with `#[no_std]` enabled.][69033]
2150 - [Added the `unused_braces` lint.][70081]
2151
2152 **Syntax-only changes**
2153
2154 - [Expansion-driven outline module parsing][69838]
2155 ```rust
2156 #[cfg(FALSE)]
2157 mod foo {
2158     mod bar {
2159         mod baz; // `foo/bar/baz.rs` doesn't exist, but no error!
2160     }
2161 }
2162 ```
2163
2164 These are still rejected semantically, so you will likely receive an error but
2165 these changes can be seen and parsed by macros and conditional compilation.
2166
2167 Compiler
2168 --------
2169 - [Rustc now respects the `-C codegen-units` flag in incremental mode.][70156]
2170   Additionally when in incremental mode rustc defaults to 256 codegen units.
2171 - [Refactored `catch_unwind` to have zero-cost, unless unwinding is enabled and
2172   a panic is thrown.][67502]
2173 - [Added tier 3\* support for the `aarch64-unknown-none` and
2174   `aarch64-unknown-none-softfloat` targets.][68334]
2175 - [Added tier 3 support for `arm64-apple-tvos` and
2176   `x86_64-apple-tvos` targets.][68191]
2177
2178
2179 Libraries
2180 ---------
2181 - [Special cased `vec![]` to map directly to `Vec::new()`.][70632] This allows
2182   `vec![]` to be able to be used in `const` contexts.
2183 - [`convert::Infallible` now implements `Hash`.][70281]
2184 - [`OsString` now implements `DerefMut` and `IndexMut` returning
2185   a `&mut OsStr`.][70048]
2186 - [Unicode 13 is now supported.][69929]
2187 - [`String` now implements `From<&mut str>`.][69661]
2188 - [`IoSlice` now implements `Copy`.][69403]
2189 - [`Vec<T>` now implements `From<[T; N]>`.][68692] Where `N` is at most 32.
2190 - [`proc_macro::LexError` now implements `fmt::Display` and `Error`.][68899]
2191 - [`from_le_bytes`, `to_le_bytes`, `from_be_bytes`, `to_be_bytes`,
2192   `from_ne_bytes`, and `to_ne_bytes` methods are now `const` for all
2193   integer types.][69373]
2194
2195 Stabilized APIs
2196 ---------------
2197 - [`PathBuf::with_capacity`]
2198 - [`PathBuf::capacity`]
2199 - [`PathBuf::clear`]
2200 - [`PathBuf::reserve`]
2201 - [`PathBuf::reserve_exact`]
2202 - [`PathBuf::shrink_to_fit`]
2203 - [`f32::to_int_unchecked`]
2204 - [`f64::to_int_unchecked`]
2205 - [`Layout::align_to`]
2206 - [`Layout::pad_to_align`]
2207 - [`Layout::array`]
2208 - [`Layout::extend`]
2209
2210 Cargo
2211 -----
2212 - [Added the `cargo tree` command which will print a tree graph of
2213   your dependencies.][cargo/8062] E.g.
2214   ```
2215     mdbook v0.3.2 (/Users/src/rust/mdbook)
2216   ├── ammonia v3.0.0
2217   │   ├── html5ever v0.24.0
2218   │   │   ├── log v0.4.8
2219   │   │   │   └── cfg-if v0.1.9
2220   │   │   ├── mac v0.1.1
2221   │   │   └── markup5ever v0.9.0
2222   │   │       ├── log v0.4.8 (*)
2223   │   │       ├── phf v0.7.24
2224   │   │       │   └── phf_shared v0.7.24
2225   │   │       │       ├── siphasher v0.2.3
2226   │   │       │       └── unicase v1.4.2
2227   │   │       │           [build-dependencies]
2228   │   │       │           └── version_check v0.1.5
2229   ...
2230   ```
2231   You can also display dependencies on multiple versions of the same crate with
2232   `cargo tree -d` (short for `cargo tree --duplicates`).
2233
2234 Misc
2235 ----
2236 - [Rustdoc now allows you to specify `--crate-version` to have rustdoc include
2237   the version in the sidebar.][69494]
2238
2239 Compatibility Notes
2240 -------------------
2241 - [Rustc now correctly generates static libraries on Windows GNU targets with
2242   the `.a` extension, rather than the previous `.lib`.][70937]
2243 - [Removed the `-C no_integrated_as` flag from rustc.][70345]
2244 - [The `file_name` property in JSON output of macro errors now points the actual
2245   source file rather than the previous format of `<NAME macros>`.][70969]
2246   **Note:** this may not point to a file that actually exists on the user's system.
2247 - [The minimum required external LLVM version has been bumped to LLVM 8.][71147]
2248 - [`mem::{zeroed, uninitialised}` will now panic when used with types that do
2249   not allow zero initialization such as `NonZeroU8`.][66059] This was
2250   previously a warning.
2251 - [In 1.45.0 (the next release) converting a `f64` to `u32` using the `as`
2252   operator has been defined as a saturating operation.][71269] This was previously
2253   undefined behaviour, but you can use the `{f64, f32}::to_int_unchecked` methods to
2254   continue using the current behaviour, which may be desirable in rare performance
2255   sensitive situations.
2256
2257 Internal Only
2258 -------------
2259 These changes provide no direct user facing benefits, but represent significant
2260 improvements to the internals and overall performance of rustc and
2261 related tools.
2262
2263 - [dep_graph Avoid allocating a set on when the number reads are small.][69778]
2264 - [Replace big JS dict with JSON parsing.][71250]
2265
2266 [69373]: https://github.com/rust-lang/rust/pull/69373/
2267 [66059]: https://github.com/rust-lang/rust/pull/66059/
2268 [68191]: https://github.com/rust-lang/rust/pull/68191/
2269 [68899]: https://github.com/rust-lang/rust/pull/68899/
2270 [71147]: https://github.com/rust-lang/rust/pull/71147/
2271 [71250]: https://github.com/rust-lang/rust/pull/71250/
2272 [70937]: https://github.com/rust-lang/rust/pull/70937/
2273 [70969]: https://github.com/rust-lang/rust/pull/70969/
2274 [70632]: https://github.com/rust-lang/rust/pull/70632/
2275 [70281]: https://github.com/rust-lang/rust/pull/70281/
2276 [70345]: https://github.com/rust-lang/rust/pull/70345/
2277 [70048]: https://github.com/rust-lang/rust/pull/70048/
2278 [70081]: https://github.com/rust-lang/rust/pull/70081/
2279 [70156]: https://github.com/rust-lang/rust/pull/70156/
2280 [71269]: https://github.com/rust-lang/rust/pull/71269/
2281 [69838]: https://github.com/rust-lang/rust/pull/69838/
2282 [69929]: https://github.com/rust-lang/rust/pull/69929/
2283 [69661]: https://github.com/rust-lang/rust/pull/69661/
2284 [69778]: https://github.com/rust-lang/rust/pull/69778/
2285 [69494]: https://github.com/rust-lang/rust/pull/69494/
2286 [69403]: https://github.com/rust-lang/rust/pull/69403/
2287 [69033]: https://github.com/rust-lang/rust/pull/69033/
2288 [68692]: https://github.com/rust-lang/rust/pull/68692/
2289 [68334]: https://github.com/rust-lang/rust/pull/68334/
2290 [67502]: https://github.com/rust-lang/rust/pull/67502/
2291 [cargo/8062]: https://github.com/rust-lang/cargo/pull/8062/
2292 [`PathBuf::with_capacity`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.with_capacity
2293 [`PathBuf::capacity`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.capacity
2294 [`PathBuf::clear`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.clear
2295 [`PathBuf::reserve`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.reserve
2296 [`PathBuf::reserve_exact`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.reserve_exact
2297 [`PathBuf::shrink_to_fit`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.shrink_to_fit
2298 [`f32::to_int_unchecked`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_int_unchecked
2299 [`f64::to_int_unchecked`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_int_unchecked
2300 [`Layout::align_to`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html#method.align_to
2301 [`Layout::pad_to_align`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html#method.pad_to_align
2302 [`Layout::array`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html#method.array
2303 [`Layout::extend`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html#method.extend
2304
2305
2306 Version 1.43.1 (2020-05-07)
2307 ===========================
2308
2309 * [Updated openssl-src to 1.1.1g for CVE-2020-1967.][71430]
2310 * [Fixed the stabilization of AVX-512 features.][71473]
2311 * [Fixed `cargo package --list` not working with unpublished dependencies.][cargo/8151]
2312
2313 [71430]: https://github.com/rust-lang/rust/pull/71430
2314 [71473]: https://github.com/rust-lang/rust/issues/71473
2315 [cargo/8151]: https://github.com/rust-lang/cargo/issues/8151
2316
2317
2318 Version 1.43.0 (2020-04-23)
2319 ==========================
2320
2321 Language
2322 --------
2323 - [Fixed using binary operations with `&{number}` (e.g. `&1.0`) not having
2324   the type inferred correctly.][68129]
2325 - [Attributes such as `#[cfg()]` can now be used on `if` expressions.][69201]
2326
2327 **Syntax only changes**
2328 - [Allow `type Foo: Ord` syntactically.][69361]
2329 - [Fuse associated and extern items up to defaultness.][69194]
2330 - [Syntactically allow `self` in all `fn` contexts.][68764]
2331 - [Merge `fn` syntax + cleanup item parsing.][68728]
2332 - [`item` macro fragments can be interpolated into `trait`s, `impl`s, and `extern` blocks.][69366]
2333   For example, you may now write:
2334   ```rust
2335   macro_rules! mac_trait {
2336       ($i:item) => {
2337           trait T { $i }
2338       }
2339   }
2340   mac_trait! {
2341       fn foo() {}
2342   }
2343   ```
2344
2345 These are still rejected *semantically*, so you will likely receive an error but
2346 these changes can be seen and parsed by macros and
2347 conditional compilation.
2348
2349
2350 Compiler
2351 --------
2352 - [You can now pass multiple lint flags to rustc to override the previous
2353   flags.][67885] For example; `rustc -D unused -A unused-variables` denies
2354   everything in the `unused` lint group except `unused-variables` which
2355   is explicitly allowed. However, passing `rustc -A unused-variables -D unused` denies
2356   everything in the `unused` lint group **including** `unused-variables` since
2357   the allow flag is specified before the deny flag (and therefore overridden).
2358 - [rustc will now prefer your system MinGW libraries over its bundled libraries
2359   if they are available on `windows-gnu`.][67429]
2360 - [rustc now buffers errors/warnings printed in JSON.][69227]
2361
2362 Libraries
2363 ---------
2364 - [`Arc<[T; N]>`, `Box<[T; N]>`, and `Rc<[T; N]>`, now implement
2365   `TryFrom<Arc<[T]>>`,`TryFrom<Box<[T]>>`, and `TryFrom<Rc<[T]>>`
2366   respectively.][69538] **Note** These conversions are only available when `N`
2367   is `0..=32`.
2368 - [You can now use associated constants on floats and integers directly, rather
2369   than having to import the module.][68952] e.g. You can now write `u32::MAX` or
2370   `f32::NAN` with no imports.
2371 - [`u8::is_ascii` is now `const`.][68984]
2372 - [`String` now implements `AsMut<str>`.][68742]
2373 - [Added the `primitive` module to `std` and `core`.][67637] This module
2374   reexports Rust's primitive types. This is mainly useful in macros
2375   where you want avoid these types being shadowed.
2376 - [Relaxed some of the trait bounds on `HashMap` and `HashSet`.][67642]
2377 - [`string::FromUtf8Error` now implements `Clone + Eq`.][68738]
2378
2379 Stabilized APIs
2380 ---------------
2381 - [`Once::is_completed`]
2382 - [`f32::LOG10_2`]
2383 - [`f32::LOG2_10`]
2384 - [`f64::LOG10_2`]
2385 - [`f64::LOG2_10`]
2386 - [`iter::once_with`]
2387
2388 Cargo
2389 -----
2390 - [You can now set config `[profile]`s in your `.cargo/config`, or through
2391   your environment.][cargo/7823]
2392 - [Cargo will now set `CARGO_BIN_EXE_<name>` pointing to a binary's
2393   executable path when running integration tests or benchmarks.][cargo/7697]
2394   `<name>` is the name of your binary as-is e.g. If you wanted the executable
2395   path for a binary named `my-program`you would use `env!("CARGO_BIN_EXE_my-program")`.
2396
2397 Misc
2398 ----
2399 - [Certain checks in the `const_err` lint were deemed unrelated to const
2400   evaluation][69185], and have been moved to the `unconditional_panic` and
2401   `arithmetic_overflow` lints.
2402
2403 Compatibility Notes
2404 -------------------
2405
2406 - [Having trailing syntax in the `assert!` macro is now a hard error.][69548] This
2407   has been a warning since 1.36.0.
2408 - [Fixed `Self` not having the correctly inferred type.][69340] This incorrectly
2409   led to some instances being accepted, and now correctly emits a hard error.
2410
2411 [69340]: https://github.com/rust-lang/rust/pull/69340
2412
2413 Internal Only
2414 -------------
2415 These changes provide no direct user facing benefits, but represent significant
2416 improvements to the internals and overall performance of `rustc` and
2417 related tools.
2418
2419 - [All components are now built with `opt-level=3` instead of `2`.][67878]
2420 - [Improved how rustc generates drop code.][67332]
2421 - [Improved performance from `#[inline]`-ing certain hot functions.][69256]
2422 - [traits: preallocate 2 Vecs of known initial size][69022]
2423 - [Avoid exponential behaviour when relating types][68772]
2424 - [Skip `Drop` terminators for enum variants without drop glue][68943]
2425 - [Improve performance of coherence checks][68966]
2426 - [Deduplicate types in the generator witness][68672]
2427 - [Invert control in struct_lint_level.][68725]
2428
2429 [67332]: https://github.com/rust-lang/rust/pull/67332/
2430 [67429]: https://github.com/rust-lang/rust/pull/67429/
2431 [67637]: https://github.com/rust-lang/rust/pull/67637/
2432 [67642]: https://github.com/rust-lang/rust/pull/67642/
2433 [67878]: https://github.com/rust-lang/rust/pull/67878/
2434 [67885]: https://github.com/rust-lang/rust/pull/67885/
2435 [68129]: https://github.com/rust-lang/rust/pull/68129/
2436 [68672]: https://github.com/rust-lang/rust/pull/68672/
2437 [68725]: https://github.com/rust-lang/rust/pull/68725/
2438 [68728]: https://github.com/rust-lang/rust/pull/68728/
2439 [68738]: https://github.com/rust-lang/rust/pull/68738/
2440 [68742]: https://github.com/rust-lang/rust/pull/68742/
2441 [68764]: https://github.com/rust-lang/rust/pull/68764/
2442 [68772]: https://github.com/rust-lang/rust/pull/68772/
2443 [68943]: https://github.com/rust-lang/rust/pull/68943/
2444 [68952]: https://github.com/rust-lang/rust/pull/68952/
2445 [68966]: https://github.com/rust-lang/rust/pull/68966/
2446 [68984]: https://github.com/rust-lang/rust/pull/68984/
2447 [69022]: https://github.com/rust-lang/rust/pull/69022/
2448 [69185]: https://github.com/rust-lang/rust/pull/69185/
2449 [69194]: https://github.com/rust-lang/rust/pull/69194/
2450 [69201]: https://github.com/rust-lang/rust/pull/69201/
2451 [69227]: https://github.com/rust-lang/rust/pull/69227/
2452 [69548]: https://github.com/rust-lang/rust/pull/69548/
2453 [69256]: https://github.com/rust-lang/rust/pull/69256/
2454 [69361]: https://github.com/rust-lang/rust/pull/69361/
2455 [69366]: https://github.com/rust-lang/rust/pull/69366/
2456 [69538]: https://github.com/rust-lang/rust/pull/69538/
2457 [cargo/7823]: https://github.com/rust-lang/cargo/pull/7823
2458 [cargo/7697]: https://github.com/rust-lang/cargo/pull/7697
2459 [`Once::is_completed`]: https://doc.rust-lang.org/std/sync/struct.Once.html#method.is_completed
2460 [`f32::LOG10_2`]: https://doc.rust-lang.org/std/f32/consts/constant.LOG10_2.html
2461 [`f32::LOG2_10`]: https://doc.rust-lang.org/std/f32/consts/constant.LOG2_10.html
2462 [`f64::LOG10_2`]: https://doc.rust-lang.org/std/f64/consts/constant.LOG10_2.html
2463 [`f64::LOG2_10`]: https://doc.rust-lang.org/std/f64/consts/constant.LOG2_10.html
2464 [`iter::once_with`]: https://doc.rust-lang.org/std/iter/fn.once_with.html
2465
2466
2467 Version 1.42.0 (2020-03-12)
2468 ==========================
2469
2470 Language
2471 --------
2472 - [You can now use the slice pattern syntax with subslices.][67712] e.g.
2473   ```rust
2474   fn foo(words: &[&str]) {
2475       match words {
2476           ["Hello", "World", "!", ..] => println!("Hello World!"),
2477           ["Foo", "Bar", ..] => println!("Baz"),
2478           rest => println!("{:?}", rest),
2479       }
2480   }
2481   ```
2482 - [You can now use `#[repr(transparent)]` on univariant `enum`s.][68122] Meaning
2483   that you can create an enum that has the exact layout and ABI of the type
2484   it contains.
2485 - [You can now use outer attribute procedural macros on inline modules.][64273]
2486 - [There are some *syntax-only* changes:][67131]
2487    - `default` is syntactically allowed before items in `trait` definitions.
2488    - Items in `impl`s (i.e. `const`s, `type`s, and `fn`s) may syntactically
2489      leave out their bodies in favor of `;`.
2490    - Bounds on associated types in `impl`s are now syntactically allowed
2491      (e.g. `type Foo: Ord;`).
2492    - `...` (the C-variadic type) may occur syntactically directly as the type of
2493       any function parameter.
2494
2495   These are still rejected *semantically*, so you will likely receive an error
2496   but these changes can be seen and parsed by procedural macros and
2497   conditional compilation.
2498
2499 Compiler
2500 --------
2501 - [Added tier 2\* support for `armv7a-none-eabi`.][68253]
2502 - [Added tier 2 support for `riscv64gc-unknown-linux-gnu`.][68339]
2503 - [`Option::{expect,unwrap}` and
2504    `Result::{expect, expect_err, unwrap, unwrap_err}` now produce panic messages
2505    pointing to the location where they were called, rather than
2506    `core`'s internals. ][67887]
2507
2508 \* Refer to Rust's [platform support page][platform-support-doc] for more
2509 information on Rust's tiered platform support.
2510
2511 Libraries
2512 ---------
2513 - [`iter::Empty<T>` now implements `Send` and `Sync` for any `T`.][68348]
2514 - [`Pin::{map_unchecked, map_unchecked_mut}` no longer require the return type
2515    to implement `Sized`.][67935]
2516 - [`io::Cursor` now derives `PartialEq` and `Eq`.][67233]
2517 - [`Layout::new` is now `const`.][66254]
2518 - [Added Standard Library support for `riscv64gc-unknown-linux-gnu`.][66899]
2519
2520
2521 Stabilized APIs
2522 ---------------
2523 - [`CondVar::wait_while`]
2524 - [`CondVar::wait_timeout_while`]
2525 - [`DebugMap::key`]
2526 - [`DebugMap::value`]
2527 - [`ManuallyDrop::take`]
2528 - [`matches!`]
2529 - [`ptr::slice_from_raw_parts_mut`]
2530 - [`ptr::slice_from_raw_parts`]
2531
2532 Cargo
2533 -----
2534 - [You no longer need to include `extern crate proc_macro;` to be able to
2535   `use proc_macro;` in the `2018` edition.][cargo/7700]
2536
2537 Compatibility Notes
2538 -------------------
2539 - [`Error::description` has been deprecated, and its use will now produce a
2540   warning.][66919] It's recommended to use `Display`/`to_string` instead.
2541
2542 [68253]: https://github.com/rust-lang/rust/pull/68253/
2543 [68348]: https://github.com/rust-lang/rust/pull/68348/
2544 [67935]: https://github.com/rust-lang/rust/pull/67935/
2545 [68339]: https://github.com/rust-lang/rust/pull/68339/
2546 [68122]: https://github.com/rust-lang/rust/pull/68122/
2547 [64273]: https://github.com/rust-lang/rust/pull/64273/
2548 [67712]: https://github.com/rust-lang/rust/pull/67712/
2549 [67887]: https://github.com/rust-lang/rust/pull/67887/
2550 [67131]: https://github.com/rust-lang/rust/pull/67131/
2551 [67233]: https://github.com/rust-lang/rust/pull/67233/
2552 [66899]: https://github.com/rust-lang/rust/pull/66899/
2553 [66919]: https://github.com/rust-lang/rust/pull/66919/
2554 [66254]: https://github.com/rust-lang/rust/pull/66254/
2555 [cargo/7700]: https://github.com/rust-lang/cargo/pull/7700
2556 [`DebugMap::key`]: https://doc.rust-lang.org/stable/std/fmt/struct.DebugMap.html#method.key
2557 [`DebugMap::value`]: https://doc.rust-lang.org/stable/std/fmt/struct.DebugMap.html#method.value
2558 [`ManuallyDrop::take`]: https://doc.rust-lang.org/stable/std/mem/struct.ManuallyDrop.html#method.take
2559 [`matches!`]: https://doc.rust-lang.org/stable/std/macro.matches.html
2560 [`ptr::slice_from_raw_parts_mut`]: https://doc.rust-lang.org/stable/std/ptr/fn.slice_from_raw_parts_mut.html
2561 [`ptr::slice_from_raw_parts`]: https://doc.rust-lang.org/stable/std/ptr/fn.slice_from_raw_parts.html
2562 [`CondVar::wait_while`]: https://doc.rust-lang.org/stable/std/sync/struct.Condvar.html#method.wait_while
2563 [`CondVar::wait_timeout_while`]: https://doc.rust-lang.org/stable/std/sync/struct.Condvar.html#method.wait_timeout_while
2564
2565
2566 Version 1.41.1 (2020-02-27)
2567 ===========================
2568
2569 * [Always check types of static items][69145]
2570 * [Always check lifetime bounds of `Copy` impls][69145]
2571 * [Fix miscompilation in callers of `Layout::repeat`][69225]
2572
2573 [69225]: https://github.com/rust-lang/rust/issues/69225
2574 [69145]: https://github.com/rust-lang/rust/pull/69145
2575
2576
2577 Version 1.41.0 (2020-01-30)
2578 ===========================
2579
2580 Language
2581 --------
2582
2583 - [You can now pass type parameters to foreign items when implementing
2584   traits.][65879] E.g. You can now write `impl<T> From<Foo> for Vec<T> {}`.
2585 - [You can now arbitrarily nest receiver types in the `self` position.][64325] E.g. you can
2586   now write `fn foo(self: Box<Box<Self>>) {}`. Previously only `Self`, `&Self`,
2587   `&mut Self`, `Arc<Self>`, `Rc<Self>`, and `Box<Self>` were allowed.
2588 - [You can now use any valid identifier in a `format_args` macro.][66847]
2589   Previously identifiers starting with an underscore were not allowed.
2590 - [Visibility modifiers (e.g. `pub`) are now syntactically allowed on trait items and
2591   enum variants.][66183] These are still rejected semantically, but
2592   can be seen and parsed by procedural macros and conditional compilation.
2593 - [You can now define a Rust `extern "C"` function with `Box<T>` and use `T*` as the corresponding
2594   type on the C side.][62514] Please see [the documentation][box-memory-layout] for more information,
2595   including the important caveat about preferring to avoid `Box<T>` in Rust signatures for functions defined in C.
2596
2597 [box-memory-layout]: https://doc.rust-lang.org/std/boxed/index.html#memory-layout
2598
2599 Compiler
2600 --------
2601
2602 - [Rustc will now warn if you have unused loop `'label`s.][66325]
2603 - [Removed support for the `i686-unknown-dragonfly` target.][67255]
2604 - [Added tier 3 support\* for the `riscv64gc-unknown-linux-gnu` target.][66661]
2605 - [You can now pass an arguments file passing the `@path` syntax
2606   to rustc.][66172] Note that the format differs somewhat from what is
2607   found in other tooling; please see [the documentation][argfile-docs] for
2608   more information.
2609 - [You can now provide `--extern` flag without a path, indicating that it is
2610   available from the search path or specified with an `-L` flag.][64882]
2611
2612 \* Refer to Rust's [platform support page][platform-support-doc] for more
2613 information on Rust's tiered platform support.
2614
2615 [argfile-docs]: https://doc.rust-lang.org/nightly/rustc/command-line-arguments.html#path-load-command-line-flags-from-a-path
2616
2617 Libraries
2618 ---------
2619
2620 - [The `core::panic` module is now stable.][66771] It was already stable
2621   through `std`.
2622 - [`NonZero*` numerics now implement `From<NonZero*>` if it's a smaller integer
2623   width.][66277] E.g. `NonZeroU16` now implements `From<NonZeroU8>`.
2624 - [`MaybeUninit<T>` now implements `fmt::Debug`.][65013]
2625
2626 Stabilized APIs
2627 ---------------
2628
2629 - [`Result::map_or`]
2630 - [`Result::map_or_else`]
2631 - [`std::rc::Weak::weak_count`]
2632 - [`std::rc::Weak::strong_count`]
2633 - [`std::sync::Weak::weak_count`]
2634 - [`std::sync::Weak::strong_count`]
2635
2636 Cargo
2637 -----
2638
2639 - [Cargo will now document all the private items for binary crates
2640   by default.][cargo/7593]
2641 - [`cargo-install` will now reinstall the package if it detects that it is out
2642   of date.][cargo/7560]
2643 - [Cargo.lock now uses a more git friendly format that should help to reduce
2644   merge conflicts.][cargo/7579]
2645 - [You can now override specific dependencies's build settings][cargo/7591] E.g.
2646   `[profile.dev.package.image] opt-level = 2` sets the `image` crate's
2647   optimisation level to `2` for debug builds. You can also use
2648   `[profile.<profile>.build-override]` to override build scripts and
2649   their dependencies.
2650
2651 Misc
2652 ----
2653
2654 - [You can now specify `edition` in documentation code blocks to compile the block
2655   for that edition.][66238] E.g. `edition2018` tells rustdoc that the code sample
2656   should be compiled the 2018 edition of Rust.
2657 - [You can now provide custom themes to rustdoc with `--theme`, and check the
2658   current theme with `--check-theme`.][54733]
2659 - [You can use `#[cfg(doc)]` to compile an item when building documentation.][61351]
2660
2661 Compatibility Notes
2662 -------------------
2663
2664 - [As previously announced 1.41.0 will be the last tier 1 release for 32-bit
2665   Apple targets.][apple-32bit-drop] This means that the source code is still
2666   available to build, but the targets are no longer being tested and release
2667   binaries for those platforms will no longer be distributed by the Rust project.
2668   Please refer to the linked blog post for more information.
2669
2670 [54733]: https://github.com/rust-lang/rust/pull/54733/
2671 [61351]: https://github.com/rust-lang/rust/pull/61351/
2672 [62514]: https://github.com/rust-lang/rust/pull/62514/
2673 [67255]: https://github.com/rust-lang/rust/pull/67255/
2674 [66661]: https://github.com/rust-lang/rust/pull/66661/
2675 [66771]: https://github.com/rust-lang/rust/pull/66771/
2676 [66847]: https://github.com/rust-lang/rust/pull/66847/
2677 [66238]: https://github.com/rust-lang/rust/pull/66238/
2678 [66277]: https://github.com/rust-lang/rust/pull/66277/
2679 [66325]: https://github.com/rust-lang/rust/pull/66325/
2680 [66172]: https://github.com/rust-lang/rust/pull/66172/
2681 [66183]: https://github.com/rust-lang/rust/pull/66183/
2682 [65879]: https://github.com/rust-lang/rust/pull/65879/
2683 [65013]: https://github.com/rust-lang/rust/pull/65013/
2684 [64882]: https://github.com/rust-lang/rust/pull/64882/
2685 [64325]: https://github.com/rust-lang/rust/pull/64325/
2686 [cargo/7560]: https://github.com/rust-lang/cargo/pull/7560/
2687 [cargo/7579]: https://github.com/rust-lang/cargo/pull/7579/
2688 [cargo/7591]: https://github.com/rust-lang/cargo/pull/7591/
2689 [cargo/7593]: https://github.com/rust-lang/cargo/pull/7593/
2690 [`Result::map_or_else`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.map_or_else
2691 [`Result::map_or`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.map_or
2692 [`std::rc::Weak::weak_count`]: https://doc.rust-lang.org/std/rc/struct.Weak.html#method.weak_count
2693 [`std::rc::Weak::strong_count`]: https://doc.rust-lang.org/std/rc/struct.Weak.html#method.strong_count
2694 [`std::sync::Weak::weak_count`]: https://doc.rust-lang.org/std/sync/struct.Weak.html#method.weak_count
2695 [`std::sync::Weak::strong_count`]: https://doc.rust-lang.org/std/sync/struct.Weak.html#method.strong_count
2696 [apple-32bit-drop]: https://blog.rust-lang.org/2020/01/03/reducing-support-for-32-bit-apple-targets.html
2697
2698 Version 1.40.0 (2019-12-19)
2699 ===========================
2700
2701 Language
2702 --------
2703 - [You can now use tuple `struct`s and tuple `enum` variant's constructors in
2704   `const` contexts.][65188] e.g.
2705
2706   ```rust
2707   pub struct Point(i32, i32);
2708
2709   const ORIGIN: Point = {
2710       let constructor = Point;
2711
2712       constructor(0, 0)
2713   };
2714   ```
2715
2716 - [You can now mark `struct`s, `enum`s, and `enum` variants with the `#[non_exhaustive]` attribute to
2717   indicate that there may be variants or fields added in the future.][64639]
2718   For example this requires adding a wild-card branch (`_ => {}`) to any match
2719   statements on a non-exhaustive `enum`. [(RFC 2008)]
2720 - [You can now use function-like procedural macros in `extern` blocks and in
2721   type positions.][63931] e.g. `type Generated = macro!();`
2722 - [Function-like and attribute procedural macros can now emit
2723   `macro_rules!` items, so you can now have your macros generate macros.][64035]
2724 - [The `meta` pattern matcher in `macro_rules!` now correctly matches the modern
2725   attribute syntax.][63674] For example `(#[$m:meta])` now matches `#[attr]`,
2726   `#[attr{tokens}]`, `#[attr[tokens]]`, and `#[attr(tokens)]`.
2727
2728 Compiler
2729 --------
2730 - [Added tier 3 support\* for the
2731   `thumbv7neon-unknown-linux-musleabihf` target.][66103]
2732 - [Added tier 3 support for the
2733   `aarch64-unknown-none-softfloat` target.][64589]
2734 - [Added tier 3 support for the `mips64-unknown-linux-muslabi64`, and
2735   `mips64el-unknown-linux-muslabi64` targets.][65843]
2736
2737 \* Refer to Rust's [platform support page][platform-support-doc] for more
2738   information on Rust's tiered platform support.
2739
2740 Libraries
2741 ---------
2742 - [The `is_power_of_two` method on unsigned numeric types is now a `const` function.][65092]
2743
2744 Stabilized APIs
2745 ---------------
2746 - [`BTreeMap::get_key_value`]
2747 - [`HashMap::get_key_value`]
2748 - [`Option::as_deref_mut`]
2749 - [`Option::as_deref`]
2750 - [`Option::flatten`]
2751 - [`UdpSocket::peer_addr`]
2752 - [`f32::to_be_bytes`]
2753 - [`f32::to_le_bytes`]
2754 - [`f32::to_ne_bytes`]
2755 - [`f64::to_be_bytes`]
2756 - [`f64::to_le_bytes`]
2757 - [`f64::to_ne_bytes`]
2758 - [`f32::from_be_bytes`]
2759 - [`f32::from_le_bytes`]
2760 - [`f32::from_ne_bytes`]
2761 - [`f64::from_be_bytes`]
2762 - [`f64::from_le_bytes`]
2763 - [`f64::from_ne_bytes`]
2764 - [`mem::take`]
2765 - [`slice::repeat`]
2766 - [`todo!`]
2767
2768 Cargo
2769 -----
2770 - [Cargo will now always display warnings, rather than only on
2771   fresh builds.][cargo/7450]
2772 - [Feature flags (except `--all-features`) passed to a virtual workspace will
2773   now produce an error.][cargo/7507] Previously these flags were ignored.
2774 - [You can now publish `dev-dependencies` without including
2775   a `version`.][cargo/7333]
2776
2777 Misc
2778 ----
2779 - [You can now specify the `#[cfg(doctest)]` attribute to include an item only
2780   when running documentation tests with `rustdoc`.][63803]
2781
2782 Compatibility Notes
2783 -------------------
2784 - [As previously announced, any previous NLL warnings in the 2015 edition are
2785   now hard errors.][64221]
2786 - [The `include!` macro will now warn if it failed to include the
2787   entire file.][64284] The `include!` macro unintentionally only includes the
2788   first _expression_ in a file, and this can be unintuitive. This will become
2789   either a hard error in a future release, or the behavior may be fixed to include all expressions as expected.
2790 - [Using `#[inline]` on function prototypes and consts now emits a warning under
2791   `unused_attribute` lint.][65294] Using `#[inline]` anywhere else inside traits
2792   or `extern` blocks now correctly emits a hard error.
2793
2794 [65294]: https://github.com/rust-lang/rust/pull/65294/
2795 [66103]: https://github.com/rust-lang/rust/pull/66103/
2796 [65843]: https://github.com/rust-lang/rust/pull/65843/
2797 [65188]: https://github.com/rust-lang/rust/pull/65188/
2798 [65092]: https://github.com/rust-lang/rust/pull/65092/
2799 [64589]: https://github.com/rust-lang/rust/pull/64589/
2800 [64639]: https://github.com/rust-lang/rust/pull/64639/
2801 [64221]: https://github.com/rust-lang/rust/pull/64221/
2802 [64284]: https://github.com/rust-lang/rust/pull/64284/
2803 [63931]: https://github.com/rust-lang/rust/pull/63931/
2804 [64035]: https://github.com/rust-lang/rust/pull/64035/
2805 [63674]: https://github.com/rust-lang/rust/pull/63674/
2806 [63803]: https://github.com/rust-lang/rust/pull/63803/
2807 [cargo/7450]: https://github.com/rust-lang/cargo/pull/7450/
2808 [cargo/7507]: https://github.com/rust-lang/cargo/pull/7507/
2809 [cargo/7525]: https://github.com/rust-lang/cargo/pull/7525/
2810 [cargo/7333]: https://github.com/rust-lang/cargo/pull/7333/
2811 [(rfc 2008)]: https://rust-lang.github.io/rfcs/2008-non-exhaustive.html
2812 [`f32::to_be_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_be_bytes
2813 [`f32::to_le_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_le_bytes
2814 [`f32::to_ne_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_ne_bytes
2815 [`f64::to_be_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_be_bytes
2816 [`f64::to_le_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_le_bytes
2817 [`f64::to_ne_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_ne_bytes
2818 [`f32::from_be_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.from_be_bytes
2819 [`f32::from_le_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.from_le_bytes
2820 [`f32::from_ne_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.from_ne_bytes
2821 [`f64::from_be_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.from_be_bytes
2822 [`f64::from_le_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.from_le_bytes
2823 [`f64::from_ne_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.from_ne_bytes
2824 [`option::flatten`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.flatten
2825 [`option::as_deref`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.as_deref
2826 [`option::as_deref_mut`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.as_deref_mut
2827 [`hashmap::get_key_value`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.get_key_value
2828 [`btreemap::get_key_value`]: https://doc.rust-lang.org/std/collections/struct.BTreeMap.html#method.get_key_value
2829 [`slice::repeat`]: https://doc.rust-lang.org/std/primitive.slice.html#method.repeat
2830 [`mem::take`]: https://doc.rust-lang.org/std/mem/fn.take.html
2831 [`udpsocket::peer_addr`]: https://doc.rust-lang.org/std/net/struct.UdpSocket.html#method.peer_addr
2832 [`todo!`]: https://doc.rust-lang.org/std/macro.todo.html
2833
2834
2835 Version 1.39.0 (2019-11-07)
2836 ===========================
2837
2838 Language
2839 --------
2840 - [You can now create `async` functions and blocks with `async fn`, `async move {}`, and
2841   `async {}` respectively, and you can now call `.await` on async expressions.][63209]
2842 - [You can now use certain attributes on function, closure, and function pointer
2843   parameters.][64010] These attributes include `cfg`, `cfg_attr`, `allow`, `warn`,
2844   `deny`, `forbid` as well as inert helper attributes used by procedural macro
2845   attributes applied to items. e.g.
2846   ```rust
2847   fn len(
2848       #[cfg(windows)] slice: &[u16],
2849       #[cfg(not(windows))] slice: &[u8],
2850   ) -> usize {
2851       slice.len()
2852   }
2853   ```
2854 - [You can now take shared references to bind-by-move patterns in the `if` guards
2855   of `match` arms.][63118] e.g.
2856   ```rust
2857   fn main() {
2858       let array: Box<[u8; 4]> = Box::new([1, 2, 3, 4]);
2859
2860       match array {
2861           nums
2862   //      ---- `nums` is bound by move.
2863               if nums.iter().sum::<u8>() == 10
2864   //                 ^------ `.iter()` implicitly takes a reference to `nums`.
2865           => {
2866               drop(nums);
2867   //          ----------- Legal as `nums` was bound by move and so we have ownership.
2868           }
2869           _ => unreachable!(),
2870       }
2871   }
2872   ```
2873
2874
2875
2876 Compiler
2877 --------
2878 - [Added tier 3\* support for the `i686-unknown-uefi` target.][64334]
2879 - [Added tier 3 support for the `sparc64-unknown-openbsd` target.][63595]
2880 - [rustc will now trim code snippets in diagnostics to fit in your terminal.][63402]
2881   **Note** Cargo currently doesn't use this feature. Refer to
2882   [cargo#7315][cargo/7315] to track this feature's progress.
2883 - [You can now pass `--show-output` argument to test binaries to print the
2884   output of successful tests.][62600]
2885
2886
2887 \* Refer to Rust's [platform support page][platform-support-doc] for more
2888 information on Rust's tiered platform support.
2889
2890 Libraries
2891 ---------
2892 - [`Vec::new` and `String::new` are now `const` functions.][64028]
2893 - [`LinkedList::new` is now a `const` function.][63684]
2894 - [`str::len`, `[T]::len` and `str::as_bytes` are now `const` functions.][63770]
2895 - [The `abs`, `wrapping_abs`, and `overflowing_abs` numeric functions are
2896   now `const`.][63786]
2897
2898 Stabilized APIs
2899 ---------------
2900 - [`Pin::into_inner`]
2901 - [`Instant::checked_duration_since`]
2902 - [`Instant::saturating_duration_since`]
2903
2904 Cargo
2905 -----
2906 - [You can now publish git dependencies if supplied with a `version`.][cargo/7237]
2907 - [The `--all` flag has been renamed to `--workspace`.][cargo/7241] Using
2908   `--all` is now deprecated.
2909
2910 Misc
2911 ----
2912 - [You can now pass `-Clinker` to rustdoc to control the linker used
2913   for compiling doctests.][63834]
2914
2915 Compatibility Notes
2916 -------------------
2917 - [Code that was previously accepted by the old borrow checker, but rejected by
2918   the NLL borrow checker is now a hard error in Rust 2018.][63565] This was
2919   previously a warning, and will also become a hard error in the Rust 2015
2920   edition in the 1.40.0 release.
2921 - [`rustdoc` now requires `rustc` to be installed and in the same directory to
2922   run tests.][63827] This should improve performance when running a large
2923   amount of doctests.
2924 - [The `try!` macro will now issue a deprecation warning.][62672] It is
2925   recommended to use the `?` operator instead.
2926 - [`asinh(-0.0)` now correctly returns `-0.0`.][63698] Previously this
2927   returned `0.0`.
2928
2929 [62600]: https://github.com/rust-lang/rust/pull/62600/
2930 [62672]: https://github.com/rust-lang/rust/pull/62672/
2931 [63118]: https://github.com/rust-lang/rust/pull/63118/
2932 [63209]: https://github.com/rust-lang/rust/pull/63209/
2933 [63402]: https://github.com/rust-lang/rust/pull/63402/
2934 [63565]: https://github.com/rust-lang/rust/pull/63565/
2935 [63595]: https://github.com/rust-lang/rust/pull/63595/
2936 [63684]: https://github.com/rust-lang/rust/pull/63684/
2937 [63698]: https://github.com/rust-lang/rust/pull/63698/
2938 [63770]: https://github.com/rust-lang/rust/pull/63770/
2939 [63786]: https://github.com/rust-lang/rust/pull/63786/
2940 [63827]: https://github.com/rust-lang/rust/pull/63827/
2941 [63834]: https://github.com/rust-lang/rust/pull/63834/
2942 [63927]: https://github.com/rust-lang/rust/pull/63927/
2943 [63933]: https://github.com/rust-lang/rust/pull/63933/
2944 [63934]: https://github.com/rust-lang/rust/pull/63934/
2945 [63938]: https://github.com/rust-lang/rust/pull/63938/
2946 [63940]: https://github.com/rust-lang/rust/pull/63940/
2947 [63941]: https://github.com/rust-lang/rust/pull/63941/
2948 [63945]: https://github.com/rust-lang/rust/pull/63945/
2949 [64010]: https://github.com/rust-lang/rust/pull/64010/
2950 [64028]: https://github.com/rust-lang/rust/pull/64028/
2951 [64334]: https://github.com/rust-lang/rust/pull/64334/
2952 [cargo/7237]: https://github.com/rust-lang/cargo/pull/7237/
2953 [cargo/7241]: https://github.com/rust-lang/cargo/pull/7241/
2954 [cargo/7315]: https://github.com/rust-lang/cargo/pull/7315/
2955 [`Pin::into_inner`]: https://doc.rust-lang.org/std/pin/struct.Pin.html#method.into_inner
2956 [`Instant::checked_duration_since`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.checked_duration_since
2957 [`Instant::saturating_duration_since`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.saturating_duration_since
2958
2959 Version 1.38.0 (2019-09-26)
2960 ==========================
2961
2962 Language
2963 --------
2964 - [The `#[global_allocator]` attribute can now be used in submodules.][62735]
2965 - [The `#[deprecated]` attribute can now be used on macros.][62042]
2966
2967 Compiler
2968 --------
2969 - [Added pipelined compilation support to `rustc`.][62766] This will
2970   improve compilation times in some cases. For further information please refer
2971   to the [_"Evaluating pipelined rustc compilation"_][pipeline-internals] thread.
2972 - [Added tier 3\* support for the `aarch64-uwp-windows-msvc`, `i686-uwp-windows-gnu`,
2973   `i686-uwp-windows-msvc`, `x86_64-uwp-windows-gnu`, and
2974   `x86_64-uwp-windows-msvc` targets.][60260]
2975 - [Added tier 3 support for the `armv7-unknown-linux-gnueabi` and
2976   `armv7-unknown-linux-musleabi` targets.][63107]
2977 - [Added tier 3 support for the `hexagon-unknown-linux-musl` target.][62814]
2978 - [Added tier 3 support for the `riscv32i-unknown-none-elf` target.][62784]
2979 - [Upgraded to LLVM 9.][62592]
2980
2981 \* Refer to Rust's [platform support page][platform-support-doc] for more
2982 information on Rust's tiered platform support.
2983
2984 Libraries
2985 ---------
2986 - [`ascii::EscapeDefault` now implements `Clone` and `Display`.][63421]
2987 - [Derive macros for prelude traits (e.g. `Clone`, `Debug`, `Hash`) are now
2988   available at the same path as the trait.][63056] (e.g. The `Clone` derive macro
2989   is available at `std::clone::Clone`). This also makes all built-in macros
2990   available in `std`/`core` root. e.g. `std::include_bytes!`.
2991 - [`str::Chars` now implements `Debug`.][63000]
2992 - [`slice::{concat, connect, join}` now accepts `&[T]` in addition to `&T`.][62528]
2993 - [`*const T` and `*mut T` now implement `marker::Unpin`.][62583]
2994 - [`Arc<[T]>` and `Rc<[T]>` now implement `FromIterator<T>`.][61953]
2995 - [Added euclidean remainder and division operations (`div_euclid`,
2996   `rem_euclid`) to all numeric primitives.][61884] Additionally `checked`,
2997   `overflowing`, and `wrapping` versions are available for all
2998   integer primitives.
2999 - [`thread::AccessError` now implements `Clone`, `Copy`, `Eq`, `Error`, and
3000   `PartialEq`.][61491]
3001 - [`iter::{StepBy, Peekable, Take}` now implement `DoubleEndedIterator`.][61457]
3002
3003 Stabilized APIs
3004 ---------------
3005 - [`<*const T>::cast`]
3006 - [`<*mut T>::cast`]
3007 - [`Duration::as_secs_f32`]
3008 - [`Duration::as_secs_f64`]
3009 - [`Duration::div_f32`]
3010 - [`Duration::div_f64`]
3011 - [`Duration::from_secs_f32`]
3012 - [`Duration::from_secs_f64`]
3013 - [`Duration::mul_f32`]
3014 - [`Duration::mul_f64`]
3015 - [`any::type_name`]
3016
3017 Cargo
3018 -----
3019 - [Added pipelined compilation support to `cargo`.][cargo/7143]
3020 - [You can now pass the `--features` option multiple times to enable
3021   multiple features.][cargo/7084]
3022
3023 Rustdoc
3024 -------
3025
3026 - [Documentation on `pub use` statements is prepended to the documentation of the re-exported item][63048]
3027
3028 Misc
3029 ----
3030 - [`rustc` will now warn about some incorrect uses of
3031   `mem::{uninitialized, zeroed}` that are known to cause undefined behaviour.][63346]
3032
3033 Compatibility Notes
3034 -------------------
3035 - The [`x86_64-unknown-uefi` platform can not be built][62785] with rustc
3036   1.38.0.
3037 - The [`armv7-unknown-linux-gnueabihf` platform is known to have
3038   issues][62896] with certain crates such as libc.
3039
3040 [60260]: https://github.com/rust-lang/rust/pull/60260/
3041 [61457]: https://github.com/rust-lang/rust/pull/61457/
3042 [61491]: https://github.com/rust-lang/rust/pull/61491/
3043 [61884]: https://github.com/rust-lang/rust/pull/61884/
3044 [61953]: https://github.com/rust-lang/rust/pull/61953/
3045 [62042]: https://github.com/rust-lang/rust/pull/62042/
3046 [62528]: https://github.com/rust-lang/rust/pull/62528/
3047 [62583]: https://github.com/rust-lang/rust/pull/62583/
3048 [62735]: https://github.com/rust-lang/rust/pull/62735/
3049 [62766]: https://github.com/rust-lang/rust/pull/62766/
3050 [62784]: https://github.com/rust-lang/rust/pull/62784/
3051 [62592]: https://github.com/rust-lang/rust/pull/62592/
3052 [62785]: https://github.com/rust-lang/rust/issues/62785/
3053 [62814]: https://github.com/rust-lang/rust/pull/62814/
3054 [62896]: https://github.com/rust-lang/rust/issues/62896/
3055 [63000]: https://github.com/rust-lang/rust/pull/63000/
3056 [63056]: https://github.com/rust-lang/rust/pull/63056/
3057 [63107]: https://github.com/rust-lang/rust/pull/63107/
3058 [63346]: https://github.com/rust-lang/rust/pull/63346/
3059 [63421]: https://github.com/rust-lang/rust/pull/63421/
3060 [cargo/7084]: https://github.com/rust-lang/cargo/pull/7084/
3061 [cargo/7143]: https://github.com/rust-lang/cargo/pull/7143/
3062 [63048]: https://github.com/rust-lang/rust/pull/63048
3063 [`<*const T>::cast`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.cast
3064 [`<*mut T>::cast`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.cast
3065 [`Duration::as_secs_f32`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_secs_f32
3066 [`Duration::as_secs_f64`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_secs_f64
3067 [`Duration::div_f32`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.div_f32
3068 [`Duration::div_f64`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.div_f64
3069 [`Duration::from_secs_f32`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.from_secs_f32
3070 [`Duration::from_secs_f64`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.from_secs_f64
3071 [`Duration::mul_f32`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.mul_f32
3072 [`Duration::mul_f64`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.mul_f64
3073 [`any::type_name`]: https://doc.rust-lang.org/std/any/fn.type_name.html
3074 [platform-support-doc]: https://doc.rust-lang.org/nightly/rustc/platform-support.html
3075 [pipeline-internals]: https://internals.rust-lang.org/t/evaluating-pipelined-rustc-compilation/10199
3076
3077 Version 1.37.0 (2019-08-15)
3078 ==========================
3079
3080 Language
3081 --------
3082 - `#[must_use]` will now warn if the type is contained in a [tuple][61100],
3083   [`Box`][62228], or an [array][62235] and unused.
3084 - [You can now use the `cfg` and `cfg_attr` attributes on
3085   generic parameters.][61547]
3086 - [You can now use enum variants through type alias.][61682] e.g. You can
3087   write the following:
3088   ```rust
3089   type MyOption = Option<u8>;
3090
3091   fn increment_or_zero(x: MyOption) -> u8 {
3092       match x {
3093           MyOption::Some(y) => y + 1,
3094           MyOption::None => 0,
3095       }
3096   }
3097   ```
3098 - [You can now use `_` as an identifier for consts.][61347] e.g. You can write
3099   `const _: u32 = 5;`.
3100 - [You can now use `#[repr(align(X)]` on enums.][61229]
3101 - [The  `?` Kleene macro operator is now available in the
3102   2015 edition.][60932]
3103
3104 Compiler
3105 --------
3106 - [You can now enable Profile-Guided Optimization with the `-C profile-generate`
3107   and `-C profile-use` flags.][61268] For more information on how to use profile
3108   guided optimization, please refer to the [rustc book][rustc-book-pgo].
3109 - [The `rust-lldb` wrapper script should now work again.][61827]
3110
3111 Libraries
3112 ---------
3113 - [`mem::MaybeUninit<T>` is now ABI-compatible with `T`.][61802]
3114
3115 Stabilized APIs
3116 ---------------
3117 - [`BufReader::buffer`]
3118 - [`BufWriter::buffer`]
3119 - [`Cell::from_mut`]
3120 - [`Cell<[T]>::as_slice_of_cells`][`Cell<slice>::as_slice_of_cells`]
3121 - [`DoubleEndedIterator::nth_back`]
3122 - [`Option::xor`]
3123 - [`Wrapping::reverse_bits`]
3124 - [`i128::reverse_bits`]
3125 - [`i16::reverse_bits`]
3126 - [`i32::reverse_bits`]
3127 - [`i64::reverse_bits`]
3128 - [`i8::reverse_bits`]
3129 - [`isize::reverse_bits`]
3130 - [`slice::copy_within`]
3131 - [`u128::reverse_bits`]
3132 - [`u16::reverse_bits`]
3133 - [`u32::reverse_bits`]
3134 - [`u64::reverse_bits`]
3135 - [`u8::reverse_bits`]
3136 - [`usize::reverse_bits`]
3137
3138 Cargo
3139 -----
3140 - [`Cargo.lock` files are now included by default when publishing executable crates
3141   with executables.][cargo/7026]
3142 - [You can now specify `default-run="foo"` in `[package]` to specify the
3143   default executable to use for `cargo run`.][cargo/7056]
3144
3145 Misc
3146 ----
3147
3148 Compatibility Notes
3149 -------------------
3150 - [Using `...` for inclusive range patterns will now warn by default.][61342]
3151   Please transition your code to using the `..=` syntax for inclusive
3152   ranges instead.
3153 - [Using a trait object without the `dyn` will now warn by default.][61203]
3154   Please transition your code to use `dyn Trait` for trait objects instead.
3155
3156 [62228]: https://github.com/rust-lang/rust/pull/62228/
3157 [62235]: https://github.com/rust-lang/rust/pull/62235/
3158 [61802]: https://github.com/rust-lang/rust/pull/61802/
3159 [61827]: https://github.com/rust-lang/rust/pull/61827/
3160 [61547]: https://github.com/rust-lang/rust/pull/61547/
3161 [61682]: https://github.com/rust-lang/rust/pull/61682/
3162 [61268]: https://github.com/rust-lang/rust/pull/61268/
3163 [61342]: https://github.com/rust-lang/rust/pull/61342/
3164 [61347]: https://github.com/rust-lang/rust/pull/61347/
3165 [61100]: https://github.com/rust-lang/rust/pull/61100/
3166 [61203]: https://github.com/rust-lang/rust/pull/61203/
3167 [61229]: https://github.com/rust-lang/rust/pull/61229/
3168 [60932]: https://github.com/rust-lang/rust/pull/60932/
3169 [cargo/7026]: https://github.com/rust-lang/cargo/pull/7026/
3170 [cargo/7056]: https://github.com/rust-lang/cargo/pull/7056/
3171 [`BufReader::buffer`]: https://doc.rust-lang.org/std/io/struct.BufReader.html#method.buffer
3172 [`BufWriter::buffer`]: https://doc.rust-lang.org/std/io/struct.BufWriter.html#method.buffer
3173 [`Cell::from_mut`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.from_mut
3174 [`Cell<slice>::as_slice_of_cells`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.as_slice_of_cells
3175 [`DoubleEndedIterator::nth_back`]: https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html#method.nth_back
3176 [`Option::xor`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.xor
3177 [`RefCell::try_borrow_unguarded`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.try_borrow_unguarded
3178 [`Wrapping::reverse_bits`]: https://doc.rust-lang.org/std/num/struct.Wrapping.html#method.reverse_bits
3179 [`i128::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i128.html#method.reverse_bits
3180 [`i16::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i16.html#method.reverse_bits
3181 [`i32::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i32.html#method.reverse_bits
3182 [`i64::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i64.html#method.reverse_bits
3183 [`i8::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i8.html#method.reverse_bits
3184 [`isize::reverse_bits`]: https://doc.rust-lang.org/std/primitive.isize.html#method.reverse_bits
3185 [`slice::copy_within`]: https://doc.rust-lang.org/std/primitive.slice.html#method.copy_within
3186 [`u128::reverse_bits`]: https://doc.rust-lang.org/std/primitive.u128.html#method.reverse_bits
3187 [`u16::reverse_bits`]: https://doc.rust-lang.org/std/primitive.u16.html#method.reverse_bits
3188 [`u32::reverse_bits`]: https://doc.rust-lang.org/std/primitive.u32.html#method.reverse_bits
3189 [`u64::reverse_bits`]: https://doc.rust-lang.org/std/primitive.u64.html#method.reverse_bits
3190 [`u8::reverse_bits`]: https://doc.rust-lang.org/std/primitive.u8.html#method.reverse_bits
3191 [`usize::reverse_bits`]: https://doc.rust-lang.org/std/primitive.usize.html#method.reverse_bits
3192 [rustc-book-pgo]: https://doc.rust-lang.org/rustc/profile-guided-optimization.html
3193
3194
3195 Version 1.36.0 (2019-07-04)
3196 ==========================
3197
3198 Language
3199 --------
3200 - [Non-Lexical Lifetimes are now enabled on the 2015 edition.][59114]
3201 - [The order of traits in trait objects no longer affects the semantics of that
3202   object.][59445] e.g. `dyn Send + fmt::Debug` is now equivalent to
3203   `dyn fmt::Debug + Send`, where this was previously not the case.
3204
3205 Libraries
3206 ---------
3207 - [`HashMap`'s implementation has been replaced with `hashbrown::HashMap` implementation.][58623]
3208 - [`TryFromSliceError` now implements `From<Infallible>`.][60318]
3209 - [`mem::needs_drop` is now available as a const fn.][60364]
3210 - [`alloc::Layout::from_size_align_unchecked` is now available as a const fn.][60370]
3211 - [`String` now implements `BorrowMut<str>`.][60404]
3212 - [`io::Cursor` now implements `Default`.][60234]
3213 - [Both `NonNull::{dangling, cast}` are now const fns.][60244]
3214 - [The `alloc` crate is now stable.][59675] `alloc` allows you to use a subset
3215   of `std` (e.g. `Vec`, `Box`, `Arc`) in `#![no_std]` environments if the
3216   environment has access to heap memory allocation.
3217 - [`String` now implements `From<&String>`.][59825]
3218 - [You can now pass multiple arguments to the `dbg!` macro.][59826] `dbg!` will
3219   return a tuple of each argument when there is multiple arguments.
3220 - [`Result::{is_err, is_ok}` are now `#[must_use]` and will produce a warning if
3221   not used.][59648]
3222
3223 Stabilized APIs
3224 ---------------
3225 - [`VecDeque::rotate_left`]
3226 - [`VecDeque::rotate_right`]
3227 - [`Iterator::copied`]
3228 - [`io::IoSlice`]
3229 - [`io::IoSliceMut`]
3230 - [`Read::read_vectored`]
3231 - [`Write::write_vectored`]
3232 - [`str::as_mut_ptr`]
3233 - [`mem::MaybeUninit`]
3234 - [`pointer::align_offset`]
3235 - [`future::Future`]
3236 - [`task::Context`]
3237 - [`task::RawWaker`]
3238 - [`task::RawWakerVTable`]
3239 - [`task::Waker`]
3240 - [`task::Poll`]
3241
3242 Cargo
3243 -----
3244 - [Cargo will now produce an error if you attempt to use the name of a required dependency as a feature.][cargo/6860]
3245 - [You can now pass the `--offline` flag to run cargo without accessing the network.][cargo/6934]
3246
3247 You can find further change's in [Cargo's 1.36.0 release notes][cargo-1-36-0].
3248
3249 Clippy
3250 ------
3251 There have been numerous additions and fixes to clippy, see [Clippy's 1.36.0 release notes][clippy-1-36-0] for more details.
3252
3253 Misc
3254 ----
3255
3256 Compatibility Notes
3257 -------------------
3258 - With the stabilisation of `mem::MaybeUninit`, `mem::uninitialized` use is no
3259   longer recommended, and will be deprecated in 1.39.0.
3260
3261 [60318]: https://github.com/rust-lang/rust/pull/60318/
3262 [60364]: https://github.com/rust-lang/rust/pull/60364/
3263 [60370]: https://github.com/rust-lang/rust/pull/60370/
3264 [60404]: https://github.com/rust-lang/rust/pull/60404/
3265 [60234]: https://github.com/rust-lang/rust/pull/60234/
3266 [60244]: https://github.com/rust-lang/rust/pull/60244/
3267 [58623]: https://github.com/rust-lang/rust/pull/58623/
3268 [59648]: https://github.com/rust-lang/rust/pull/59648/
3269 [59675]: https://github.com/rust-lang/rust/pull/59675/
3270 [59825]: https://github.com/rust-lang/rust/pull/59825/
3271 [59826]: https://github.com/rust-lang/rust/pull/59826/
3272 [59445]: https://github.com/rust-lang/rust/pull/59445/
3273 [59114]: https://github.com/rust-lang/rust/pull/59114/
3274 [cargo/6860]: https://github.com/rust-lang/cargo/pull/6860/
3275 [cargo/6934]: https://github.com/rust-lang/cargo/pull/6934/
3276 [`VecDeque::rotate_left`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.rotate_left
3277 [`VecDeque::rotate_right`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.rotate_right
3278 [`Iterator::copied`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#tymethod.copied
3279 [`io::IoSlice`]: https://doc.rust-lang.org/std/io/struct.IoSlice.html
3280 [`io::IoSliceMut`]: https://doc.rust-lang.org/std/io/struct.IoSliceMut.html
3281 [`Read::read_vectored`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_vectored
3282 [`Write::write_vectored`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_vectored
3283 [`str::as_mut_ptr`]: https://doc.rust-lang.org/std/primitive.str.html#method.as_mut_ptr
3284 [`mem::MaybeUninit`]: https://doc.rust-lang.org/std/mem/union.MaybeUninit.html
3285 [`pointer::align_offset`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.align_offset
3286 [`future::Future`]: https://doc.rust-lang.org/std/future/trait.Future.html
3287 [`task::Context`]: https://doc.rust-lang.org/beta/std/task/struct.Context.html
3288 [`task::RawWaker`]: https://doc.rust-lang.org/beta/std/task/struct.RawWaker.html
3289 [`task::RawWakerVTable`]: https://doc.rust-lang.org/beta/std/task/struct.RawWakerVTable.html
3290 [`task::Waker`]: https://doc.rust-lang.org/beta/std/task/struct.Waker.html
3291 [`task::Poll`]: https://doc.rust-lang.org/beta/std/task/enum.Poll.html
3292 [clippy-1-36-0]: https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-136
3293 [cargo-1-36-0]: https://github.com/rust-lang/cargo/blob/master/CHANGELOG.md#cargo-136-2019-07-04
3294
3295
3296 Version 1.35.0 (2019-05-23)
3297 ==========================
3298
3299 Language
3300 --------
3301 - [`FnOnce`, `FnMut`, and the `Fn` traits are now implemented for `Box<FnOnce>`,
3302   `Box<FnMut>`, and `Box<Fn>` respectively.][59500]
3303 - [You can now coerce closures into unsafe function pointers.][59580] e.g.
3304   ```rust
3305   unsafe fn call_unsafe(func: unsafe fn()) {
3306       func()
3307   }
3308
3309   pub fn main() {
3310       unsafe { call_unsafe(|| {}); }
3311   }
3312   ```
3313
3314
3315 Compiler
3316 --------
3317 - [Added the `armv6-unknown-freebsd-gnueabihf` and
3318   `armv7-unknown-freebsd-gnueabihf` targets.][58080]
3319 - [Added the `wasm32-unknown-wasi` target.][59464]
3320
3321
3322 Libraries
3323 ---------
3324 - [`Thread` will now show its ID in `Debug` output.][59460]
3325 - [`StdinLock`, `StdoutLock`, and `StderrLock` now implement `AsRawFd`.][59512]
3326 - [`alloc::System` now implements `Default`.][59451]
3327 - [Expanded `Debug` output (`{:#?}`) for structs now has a trailing comma on the
3328   last field.][59076]
3329 - [`char::{ToLowercase, ToUppercase}` now
3330   implement `ExactSizeIterator`.][58778]
3331 - [All `NonZero` numeric types now implement `FromStr`.][58717]
3332 - [Removed the `Read` trait bounds
3333   on the `BufReader::{get_ref, get_mut, into_inner}` methods.][58423]
3334 - [You can now call the `dbg!` macro without any parameters to print the file
3335   and line where it is called.][57847]
3336 - [In place ASCII case conversions are now up to 4× faster.][59283]
3337   e.g. `str::make_ascii_lowercase`
3338 - [`hash_map::{OccupiedEntry, VacantEntry}` now implement `Sync`
3339   and `Send`.][58369]
3340
3341 Stabilized APIs
3342 ---------------
3343 - [`f32::copysign`]
3344 - [`f64::copysign`]
3345 - [`RefCell::replace_with`]
3346 - [`RefCell::map_split`]
3347 - [`ptr::hash`]
3348 - [`Range::contains`]
3349 - [`RangeFrom::contains`]
3350 - [`RangeTo::contains`]
3351 - [`RangeInclusive::contains`]
3352 - [`RangeToInclusive::contains`]
3353 - [`Option::copied`]
3354
3355 Cargo
3356 -----
3357 - [You can now set `cargo:rustc-cdylib-link-arg` at build time to pass custom
3358   linker arguments when building a `cdylib`.][cargo/6298] Its usage is highly
3359   platform specific.
3360
3361 Misc
3362 ----
3363 - [The Rust toolchain is now available natively for musl based distros.][58575]
3364
3365 [59460]: https://github.com/rust-lang/rust/pull/59460/
3366 [59464]: https://github.com/rust-lang/rust/pull/59464/
3367 [59500]: https://github.com/rust-lang/rust/pull/59500/
3368 [59512]: https://github.com/rust-lang/rust/pull/59512/
3369 [59580]: https://github.com/rust-lang/rust/pull/59580/
3370 [59283]: https://github.com/rust-lang/rust/pull/59283/
3371 [59451]: https://github.com/rust-lang/rust/pull/59451/
3372 [59076]: https://github.com/rust-lang/rust/pull/59076/
3373 [58778]: https://github.com/rust-lang/rust/pull/58778/
3374 [58717]: https://github.com/rust-lang/rust/pull/58717/
3375 [58369]: https://github.com/rust-lang/rust/pull/58369/
3376 [58423]: https://github.com/rust-lang/rust/pull/58423/
3377 [58080]: https://github.com/rust-lang/rust/pull/58080/
3378 [57847]: https://github.com/rust-lang/rust/pull/57847/
3379 [58575]: https://github.com/rust-lang/rust/pull/58575
3380 [cargo/6298]: https://github.com/rust-lang/cargo/pull/6298/
3381 [`f32::copysign`]: https://doc.rust-lang.org/stable/std/primitive.f32.html#method.copysign
3382 [`f64::copysign`]: https://doc.rust-lang.org/stable/std/primitive.f64.html#method.copysign
3383 [`RefCell::replace_with`]: https://doc.rust-lang.org/stable/std/cell/struct.RefCell.html#method.replace_with
3384 [`RefCell::map_split`]: https://doc.rust-lang.org/stable/std/cell/struct.RefCell.html#method.map_split
3385 [`ptr::hash`]: https://doc.rust-lang.org/stable/std/ptr/fn.hash.html
3386 [`Range::contains`]: https://doc.rust-lang.org/std/ops/struct.Range.html#method.contains
3387 [`RangeFrom::contains`]: https://doc.rust-lang.org/std/ops/struct.RangeFrom.html#method.contains
3388 [`RangeTo::contains`]: https://doc.rust-lang.org/std/ops/struct.RangeTo.html#method.contains
3389 [`RangeInclusive::contains`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html#method.contains
3390 [`RangeToInclusive::contains`]: https://doc.rust-lang.org/std/ops/struct.RangeToInclusive.html#method.contains
3391 [`Option::copied`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.copied
3392
3393 Version 1.34.2 (2019-05-14)
3394 ===========================
3395
3396 * [Destabilize the `Error::type_id` function due to a security
3397    vulnerability][60785] ([CVE-2019-12083])
3398
3399 [60785]: https://github.com/rust-lang/rust/pull/60785
3400 [CVE-2019-12083]: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-12083
3401
3402 Version 1.34.1 (2019-04-25)
3403 ===========================
3404
3405 * [Fix false positives for the `redundant_closure` Clippy lint][clippy/3821]
3406 * [Fix false positives for the `missing_const_for_fn` Clippy lint][clippy/3844]
3407 * [Fix Clippy panic when checking some macros][clippy/3805]
3408
3409 [clippy/3821]: https://github.com/rust-lang/rust-clippy/pull/3821
3410 [clippy/3844]: https://github.com/rust-lang/rust-clippy/pull/3844
3411 [clippy/3805]: https://github.com/rust-lang/rust-clippy/pull/3805
3412
3413 Version 1.34.0 (2019-04-11)
3414 ==========================
3415
3416 Language
3417 --------
3418 - [You can now use `#[deprecated = "reason"]`][58166] as a shorthand for
3419   `#[deprecated(note = "reason")]`. This was previously allowed by mistake
3420   but had no effect.
3421 - [You can now accept token streams in `#[attr()]`,`#[attr[]]`, and
3422   `#[attr{}]` procedural macros.][57367]
3423 - [You can now write `extern crate self as foo;`][57407] to import your
3424   crate's root into the extern prelude.
3425
3426
3427 Compiler
3428 --------
3429 - [You can now target `riscv64imac-unknown-none-elf` and
3430   `riscv64gc-unknown-none-elf`.][58406]
3431 - [You can now enable linker plugin LTO optimisations with
3432   `-C linker-plugin-lto`.][58057] This allows rustc to compile your Rust code
3433   into LLVM bitcode allowing LLVM to perform LTO optimisations across C/C++ FFI
3434   boundaries.
3435 - [You can now target `powerpc64-unknown-freebsd`.][57809]
3436
3437
3438 Libraries
3439 ---------
3440 - [The trait bounds have been removed on some of `HashMap<K, V, S>`'s and
3441   `HashSet<T, S>`'s basic methods.][58370] Most notably you no longer require
3442   the `Hash` trait to create an iterator.
3443 - [The `Ord` trait bounds have been removed on some of `BinaryHeap<T>`'s basic
3444   methods.][58421] Most notably you no longer require the `Ord` trait to create
3445   an iterator.
3446 - [The methods `overflowing_neg` and `wrapping_neg` are now `const` functions
3447   for all numeric types.][58044]
3448 - [Indexing a `str` is now generic over all types that
3449   implement `SliceIndex<str>`.][57604]
3450 - [`str::trim`, `str::trim_matches`, `str::trim_{start, end}`, and
3451   `str::trim_{start, end}_matches` are now `#[must_use]`][57106] and will
3452   produce a warning if their returning type is unused.
3453 - [The methods `checked_pow`, `saturating_pow`, `wrapping_pow`, and
3454   `overflowing_pow` are now available for all numeric types.][57873] These are
3455   equivalent to methods such as `wrapping_add` for the `pow` operation.
3456
3457
3458 Stabilized APIs
3459 ---------------
3460
3461 #### std & core
3462 * [`Any::type_id`]
3463 * [`Error::type_id`]
3464 * [`atomic::AtomicI16`]
3465 * [`atomic::AtomicI32`]
3466 * [`atomic::AtomicI64`]
3467 * [`atomic::AtomicI8`]
3468 * [`atomic::AtomicU16`]
3469 * [`atomic::AtomicU32`]
3470 * [`atomic::AtomicU64`]
3471 * [`atomic::AtomicU8`]
3472 * [`convert::Infallible`]
3473 * [`convert::TryFrom`]
3474 * [`convert::TryInto`]
3475 * [`iter::from_fn`]
3476 * [`iter::successors`]
3477 * [`num::NonZeroI128`]
3478 * [`num::NonZeroI16`]
3479 * [`num::NonZeroI32`]
3480 * [`num::NonZeroI64`]
3481 * [`num::NonZeroI8`]
3482 * [`num::NonZeroIsize`]
3483 * [`slice::sort_by_cached_key`]
3484 * [`str::escape_debug`]
3485 * [`str::escape_default`]
3486 * [`str::escape_unicode`]
3487 * [`str::split_ascii_whitespace`]
3488
3489 #### std
3490 * [`Instant::checked_add`]
3491 * [`Instant::checked_sub`]
3492 * [`SystemTime::checked_add`]
3493 * [`SystemTime::checked_sub`]
3494
3495 Cargo
3496 -----
3497 - [You can now use alternative registries to crates.io.][cargo/6654]
3498
3499 Misc
3500 ----
3501 - [You can now use the `?` operator in your documentation tests without manually
3502   adding `fn main() -> Result<(), _> {}`.][56470]
3503
3504 Compatibility Notes
3505 -------------------
3506 - [`Command::before_exec` is being replaced by the unsafe method
3507   `Command::pre_exec`][58059] and will be deprecated with Rust 1.37.0.
3508 - [Use of `ATOMIC_{BOOL, ISIZE, USIZE}_INIT` is now deprecated][57425] as you
3509   can now use `const` functions in `static` variables.
3510
3511 [58370]: https://github.com/rust-lang/rust/pull/58370/
3512 [58406]: https://github.com/rust-lang/rust/pull/58406/
3513 [58421]: https://github.com/rust-lang/rust/pull/58421/
3514 [58166]: https://github.com/rust-lang/rust/pull/58166/
3515 [58044]: https://github.com/rust-lang/rust/pull/58044/
3516 [58057]: https://github.com/rust-lang/rust/pull/58057/
3517 [58059]: https://github.com/rust-lang/rust/pull/58059/
3518 [57809]: https://github.com/rust-lang/rust/pull/57809/
3519 [57873]: https://github.com/rust-lang/rust/pull/57873/
3520 [57604]: https://github.com/rust-lang/rust/pull/57604/
3521 [57367]: https://github.com/rust-lang/rust/pull/57367/
3522 [57407]: https://github.com/rust-lang/rust/pull/57407/
3523 [57425]: https://github.com/rust-lang/rust/pull/57425/
3524 [57106]: https://github.com/rust-lang/rust/pull/57106/
3525 [56470]: https://github.com/rust-lang/rust/pull/56470/
3526 [cargo/6654]: https://github.com/rust-lang/cargo/pull/6654/
3527 [`Any::type_id`]: https://doc.rust-lang.org/std/any/trait.Any.html#tymethod.type_id
3528 [`Error::type_id`]: https://doc.rust-lang.org/std/error/trait.Error.html#method.type_id
3529 [`atomic::AtomicI16`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicI16.html
3530 [`atomic::AtomicI32`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicI32.html
3531 [`atomic::AtomicI64`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicI64.html
3532 [`atomic::AtomicI8`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicI8.html
3533 [`atomic::AtomicU16`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU16.html
3534 [`atomic::AtomicU32`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU32.html
3535 [`atomic::AtomicU64`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU64.html
3536 [`atomic::AtomicU8`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU8.html
3537 [`convert::Infallible`]: https://doc.rust-lang.org/std/convert/enum.Infallible.html
3538 [`convert::TryFrom`]: https://doc.rust-lang.org/std/convert/trait.TryFrom.html
3539 [`convert::TryInto`]: https://doc.rust-lang.org/std/convert/trait.TryInto.html
3540 [`iter::from_fn`]: https://doc.rust-lang.org/std/iter/fn.from_fn.html
3541 [`iter::successors`]: https://doc.rust-lang.org/std/iter/fn.successors.html
3542 [`num::NonZeroI128`]: https://doc.rust-lang.org/std/num/struct.NonZeroI128.html
3543 [`num::NonZeroI16`]: https://doc.rust-lang.org/std/num/struct.NonZeroI16.html
3544 [`num::NonZeroI32`]: https://doc.rust-lang.org/std/num/struct.NonZeroI32.html
3545 [`num::NonZeroI64`]: https://doc.rust-lang.org/std/num/struct.NonZeroI64.html
3546 [`num::NonZeroI8`]: https://doc.rust-lang.org/std/num/struct.NonZeroI8.html
3547 [`num::NonZeroIsize`]: https://doc.rust-lang.org/std/num/struct.NonZeroIsize.html
3548 [`slice::sort_by_cached_key`]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_by_cached_key
3549 [`str::escape_debug`]: https://doc.rust-lang.org/std/primitive.str.html#method.escape_debug
3550 [`str::escape_default`]: https://doc.rust-lang.org/std/primitive.str.html#method.escape_default
3551 [`str::escape_unicode`]: https://doc.rust-lang.org/std/primitive.str.html#method.escape_unicode
3552 [`str::split_ascii_whitespace`]: https://doc.rust-lang.org/std/primitive.str.html#method.split_ascii_whitespace
3553 [`Instant::checked_add`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.checked_add
3554 [`Instant::checked_sub`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.checked_sub
3555 [`SystemTime::checked_add`]: https://doc.rust-lang.org/std/time/struct.SystemTime.html#method.checked_add
3556 [`SystemTime::checked_sub`]: https://doc.rust-lang.org/std/time/struct.SystemTime.html#method.checked_sub
3557
3558
3559 Version 1.33.0 (2019-02-28)
3560 ==========================
3561
3562 Language
3563 --------
3564 - [You can now use the `cfg(target_vendor)` attribute.][57465] E.g.
3565   `#[cfg(target_vendor="apple")] fn main() { println!("Hello Apple!"); }`
3566 - [Integer patterns such as in a match expression can now be exhaustive.][56362]
3567   E.g. You can have match statement on a `u8` that covers `0..=255` and
3568   you would no longer be required to have a `_ => unreachable!()` case.
3569 - [You can now have multiple patterns in `if let` and `while let`
3570   expressions.][57532] You can do this with the same syntax as a `match`
3571   expression. E.g.
3572   ```rust
3573   enum Creature {
3574       Crab(String),
3575       Lobster(String),
3576       Person(String),
3577   }
3578
3579   fn main() {
3580       let state = Creature::Crab("Ferris");
3581
3582       if let Creature::Crab(name) | Creature::Person(name) = state {
3583           println!("This creature's name is: {}", name);
3584       }
3585   }
3586   ```
3587 - [You can now have irrefutable `if let` and `while let` patterns.][57535] Using
3588   this feature will by default produce a warning as this behaviour can be
3589   unintuitive. E.g. `if let _ = 5 {}`
3590 - [You can now use `let` bindings, assignments, expression statements,
3591   and irrefutable pattern destructuring in const functions.][57175]
3592 - [You can now call unsafe const functions.][57067] E.g.
3593   ```rust
3594   const unsafe fn foo() -> i32 { 5 }
3595   const fn bar() -> i32 {
3596       unsafe { foo() }
3597   }
3598   ```
3599 - [You can now specify multiple attributes in a `cfg_attr` attribute.][57332]
3600   E.g. `#[cfg_attr(all(), must_use, optimize)]`
3601 - [You can now specify a specific alignment with the `#[repr(packed)]`
3602   attribute.][57049] E.g. `#[repr(packed(2))] struct Foo(i16, i32);` is a struct
3603   with an alignment of 2 bytes and a size of 6 bytes.
3604 - [You can now import an item from a module as an `_`.][56303] This allows you to
3605   import a trait's impls, and not have the name in the namespace. E.g.
3606   ```rust
3607   use std::io::Read as _;
3608
3609   // Allowed as there is only one `Read` in the module.
3610   pub trait Read {}
3611   ```
3612 - [You may now use `Rc`, `Arc`, and `Pin` as method receivers][56805].
3613
3614 Compiler
3615 --------
3616 - [You can now set a linker flavor for `rustc` with the `-Clinker-flavor`
3617   command line argument.][56351]
3618 - [The minimum required LLVM version has been bumped to 6.0.][56642]
3619 - [Added support for the PowerPC64 architecture on FreeBSD.][57615]
3620 - [The `x86_64-fortanix-unknown-sgx` target support has been upgraded to
3621   tier 2 support.][57130] Visit the [platform support][platform-support] page for
3622   information on Rust's platform support.
3623 - [Added support for the `thumbv7neon-linux-androideabi` and
3624   `thumbv7neon-unknown-linux-gnueabihf` targets.][56947]
3625 - [Added support for the `x86_64-unknown-uefi` target.][56769]
3626
3627 Libraries
3628 ---------
3629 - [The methods `overflowing_{add, sub, mul, shl, shr}` are now `const`
3630   functions for all numeric types.][57566]
3631 - [The methods `rotate_left`, `rotate_right`, and `wrapping_{add, sub, mul, shl, shr}`
3632   are now `const` functions for all numeric types.][57105]
3633 - [The methods `is_positive` and `is_negative` are now `const` functions for
3634   all signed numeric types.][57105]
3635 - [The `get` method for all `NonZero` types is now `const`.][57167]
3636 - [The methods `count_ones`, `count_zeros`, `leading_zeros`, `trailing_zeros`,
3637   `swap_bytes`, `from_be`, `from_le`, `to_be`, `to_le` are now `const` for all
3638   numeric types.][57234]
3639 - [`Ipv4Addr::new` is now a `const` function][57234]
3640
3641 Stabilized APIs
3642 ---------------
3643 - [`unix::FileExt::read_exact_at`]
3644 - [`unix::FileExt::write_all_at`]
3645 - [`Option::transpose`]
3646 - [`Result::transpose`]
3647 - [`convert::identity`]
3648 - [`pin::Pin`]
3649 - [`marker::Unpin`]
3650 - [`marker::PhantomPinned`]
3651 - [`Vec::resize_with`]
3652 - [`VecDeque::resize_with`]
3653 - [`Duration::as_millis`]
3654 - [`Duration::as_micros`]
3655 - [`Duration::as_nanos`]
3656
3657
3658 Cargo
3659 -----
3660 - [You can now publish crates that require a feature flag to compile with
3661   `cargo publish --features` or `cargo publish --all-features`.][cargo/6453]
3662 - [Cargo should now rebuild a crate if a file was modified during the initial
3663   build.][cargo/6484]
3664
3665 Compatibility Notes
3666 -------------------
3667 - The methods `str::{trim_left, trim_right, trim_left_matches, trim_right_matches}`
3668   are now deprecated in the standard library, and their usage will now produce a warning.
3669   Please use the `str::{trim_start, trim_end, trim_start_matches, trim_end_matches}`
3670   methods instead.
3671 - The `Error::cause` method has been deprecated in favor of `Error::source` which supports
3672   downcasting.
3673 - [Libtest no longer creates a new thread for each test when
3674   `--test-threads=1`.  It also runs the tests in deterministic order][56243]
3675
3676 [55982]: https://github.com/rust-lang/rust/pull/55982/
3677 [56243]: https://github.com/rust-lang/rust/pull/56243
3678 [56303]: https://github.com/rust-lang/rust/pull/56303/
3679 [56351]: https://github.com/rust-lang/rust/pull/56351/
3680 [56362]: https://github.com/rust-lang/rust/pull/56362
3681 [56642]: https://github.com/rust-lang/rust/pull/56642/
3682 [56769]: https://github.com/rust-lang/rust/pull/56769/
3683 [56805]: https://github.com/rust-lang/rust/pull/56805
3684 [56947]: https://github.com/rust-lang/rust/pull/56947/
3685 [57049]: https://github.com/rust-lang/rust/pull/57049/
3686 [57067]: https://github.com/rust-lang/rust/pull/57067/
3687 [57105]: https://github.com/rust-lang/rust/pull/57105
3688 [57130]: https://github.com/rust-lang/rust/pull/57130/
3689 [57167]: https://github.com/rust-lang/rust/pull/57167/
3690 [57175]: https://github.com/rust-lang/rust/pull/57175/
3691 [57234]: https://github.com/rust-lang/rust/pull/57234/
3692 [57332]: https://github.com/rust-lang/rust/pull/57332/
3693 [57465]: https://github.com/rust-lang/rust/pull/57465/
3694 [57532]: https://github.com/rust-lang/rust/pull/57532/
3695 [57535]: https://github.com/rust-lang/rust/pull/57535/
3696 [57566]: https://github.com/rust-lang/rust/pull/57566/
3697 [57615]: https://github.com/rust-lang/rust/pull/57615/
3698 [cargo/6453]: https://github.com/rust-lang/cargo/pull/6453/
3699 [cargo/6484]: https://github.com/rust-lang/cargo/pull/6484/
3700 [`unix::FileExt::read_exact_at`]: https://doc.rust-lang.org/std/os/unix/fs/trait.FileExt.html#method.read_exact_at
3701 [`unix::FileExt::write_all_at`]: https://doc.rust-lang.org/std/os/unix/fs/trait.FileExt.html#method.write_all_at
3702 [`Option::transpose`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.transpose
3703 [`Result::transpose`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.transpose
3704 [`convert::identity`]: https://doc.rust-lang.org/std/convert/fn.identity.html
3705 [`pin::Pin`]: https://doc.rust-lang.org/std/pin/struct.Pin.html
3706 [`marker::Unpin`]: https://doc.rust-lang.org/stable/std/marker/trait.Unpin.html
3707 [`marker::PhantomPinned`]: https://doc.rust-lang.org/nightly/std/marker/struct.PhantomPinned.html
3708 [`Vec::resize_with`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.resize_with
3709 [`VecDeque::resize_with`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.resize_with
3710 [`Duration::as_millis`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_millis
3711 [`Duration::as_micros`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_micros
3712 [`Duration::as_nanos`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_nanos
3713 [platform-support]: https://forge.rust-lang.org/platform-support.html
3714
3715 Version 1.32.0 (2019-01-17)
3716 ==========================
3717
3718 Language
3719 --------
3720 #### 2018 edition
3721 - [You can now use the `?` operator in macro definitions.][56245] The `?`
3722   operator allows you to specify zero or one repetitions similar to the `*` and
3723   `+` operators.
3724 - [Module paths with no leading keyword like `super`, `self`, or `crate`, will
3725   now always resolve to the item (`enum`, `struct`, etc.) available in the
3726   module if present, before resolving to a external crate or an item the prelude.][56759]
3727   E.g.
3728   ```rust
3729   enum Color { Red, Green, Blue }
3730
3731   use Color::*;
3732   ```
3733
3734 #### All editions
3735 - [You can now match against `PhantomData<T>` types.][55837]
3736 - [You can now match against literals in macros with the `literal`
3737   specifier.][56072] This will match against a literal of any type.
3738   E.g. `1`, `'A'`, `"Hello World"`
3739 - [Self can now be used as a constructor and pattern for unit and tuple structs.][56365] E.g.
3740   ```rust
3741   struct Point(i32, i32);
3742
3743   impl Point {
3744       pub fn new(x: i32, y: i32) -> Self {
3745           Self(x, y)
3746       }
3747
3748       pub fn is_origin(&self) -> bool {
3749           match self {
3750               Self(0, 0) => true,
3751               _ => false,
3752           }
3753       }
3754   }
3755   ```
3756 - [Self can also now be used in type definitions.][56366] E.g.
3757   ```rust
3758   enum List<T>
3759   where
3760       Self: PartialOrd<Self> // can write `Self` instead of `List<T>`
3761   {
3762       Nil,
3763       Cons(T, Box<Self>) // likewise here
3764   }
3765   ```
3766 - [You can now mark traits with `#[must_use]`.][55663] This provides a warning if
3767   a `impl Trait` or `dyn Trait` is returned and unused in the program.
3768
3769 Compiler
3770 --------
3771 - [The default allocator has changed from jemalloc to the default allocator on
3772   your system.][55238] The compiler itself on Linux & macOS will still use
3773   jemalloc, but programs compiled with it will use the system allocator.
3774 - [Added the `aarch64-pc-windows-msvc` target.][55702]
3775
3776 Libraries
3777 ---------
3778 - [`PathBuf` now implements `FromStr`.][55148]
3779 - [`Box<[T]>` now implements `FromIterator<T>`.][55843]
3780 - [The `dbg!` macro has been stabilized.][56395] This macro enables you to
3781   easily debug expressions in your rust program. E.g.
3782   ```rust
3783   let a = 2;
3784   let b = dbg!(a * 2) + 1;
3785   //      ^-- prints: [src/main.rs:4] a * 2 = 4
3786   assert_eq!(b, 5);
3787   ```
3788
3789 The following APIs are now `const` functions and can be used in a
3790 `const` context.
3791
3792 - [`Cell::as_ptr`]
3793 - [`UnsafeCell::get`]
3794 - [`char::is_ascii`]
3795 - [`iter::empty`]
3796 - [`ManuallyDrop::new`]
3797 - [`ManuallyDrop::into_inner`]
3798 - [`RangeInclusive::start`]
3799 - [`RangeInclusive::end`]
3800 - [`NonNull::as_ptr`]
3801 - [`slice::as_ptr`]
3802 - [`str::as_ptr`]
3803 - [`Duration::as_secs`]
3804 - [`Duration::subsec_millis`]
3805 - [`Duration::subsec_micros`]
3806 - [`Duration::subsec_nanos`]
3807 - [`CStr::as_ptr`]
3808 - [`Ipv4Addr::is_unspecified`]
3809 - [`Ipv6Addr::new`]
3810 - [`Ipv6Addr::octets`]
3811
3812 Stabilized APIs
3813 ---------------
3814 - [`i8::to_be_bytes`]
3815 - [`i8::to_le_bytes`]
3816 - [`i8::to_ne_bytes`]
3817 - [`i8::from_be_bytes`]
3818 - [`i8::from_le_bytes`]
3819 - [`i8::from_ne_bytes`]
3820 - [`i16::to_be_bytes`]
3821 - [`i16::to_le_bytes`]
3822 - [`i16::to_ne_bytes`]
3823 - [`i16::from_be_bytes`]
3824 - [`i16::from_le_bytes`]
3825 - [`i16::from_ne_bytes`]
3826 - [`i32::to_be_bytes`]
3827 - [`i32::to_le_bytes`]
3828 - [`i32::to_ne_bytes`]
3829 - [`i32::from_be_bytes`]
3830 - [`i32::from_le_bytes`]
3831 - [`i32::from_ne_bytes`]
3832 - [`i64::to_be_bytes`]
3833 - [`i64::to_le_bytes`]
3834 - [`i64::to_ne_bytes`]
3835 - [`i64::from_be_bytes`]
3836 - [`i64::from_le_bytes`]
3837 - [`i64::from_ne_bytes`]
3838 - [`i128::to_be_bytes`]
3839 - [`i128::to_le_bytes`]
3840 - [`i128::to_ne_bytes`]
3841 - [`i128::from_be_bytes`]
3842 - [`i128::from_le_bytes`]
3843 - [`i128::from_ne_bytes`]
3844 - [`isize::to_be_bytes`]
3845 - [`isize::to_le_bytes`]
3846 - [`isize::to_ne_bytes`]
3847 - [`isize::from_be_bytes`]
3848 - [`isize::from_le_bytes`]
3849 - [`isize::from_ne_bytes`]
3850 - [`u8::to_be_bytes`]
3851 - [`u8::to_le_bytes`]
3852 - [`u8::to_ne_bytes`]
3853 - [`u8::from_be_bytes`]
3854 - [`u8::from_le_bytes`]
3855 - [`u8::from_ne_bytes`]
3856 - [`u16::to_be_bytes`]
3857 - [`u16::to_le_bytes`]
3858 - [`u16::to_ne_bytes`]
3859 - [`u16::from_be_bytes`]
3860 - [`u16::from_le_bytes`]
3861 - [`u16::from_ne_bytes`]
3862 - [`u32::to_be_bytes`]
3863 - [`u32::to_le_bytes`]
3864 - [`u32::to_ne_bytes`]
3865 - [`u32::from_be_bytes`]
3866 - [`u32::from_le_bytes`]
3867 - [`u32::from_ne_bytes`]
3868 - [`u64::to_be_bytes`]
3869 - [`u64::to_le_bytes`]
3870 - [`u64::to_ne_bytes`]
3871 - [`u64::from_be_bytes`]
3872 - [`u64::from_le_bytes`]
3873 - [`u64::from_ne_bytes`]
3874 - [`u128::to_be_bytes`]
3875 - [`u128::to_le_bytes`]
3876 - [`u128::to_ne_bytes`]
3877 - [`u128::from_be_bytes`]
3878 - [`u128::from_le_bytes`]
3879 - [`u128::from_ne_bytes`]
3880 - [`usize::to_be_bytes`]
3881 - [`usize::to_le_bytes`]
3882 - [`usize::to_ne_bytes`]
3883 - [`usize::from_be_bytes`]
3884 - [`usize::from_le_bytes`]
3885 - [`usize::from_ne_bytes`]
3886
3887 Cargo
3888 -----
3889 - [You can now run `cargo c` as an alias for `cargo check`.][cargo/6218]
3890 - [Usernames are now allowed in alt registry URLs.][cargo/6242]
3891
3892 Misc
3893 ----
3894 - [`libproc_macro` has been added to the `rust-src` distribution.][55280]
3895
3896 Compatibility Notes
3897 -------------------
3898 - [The argument types for AVX's
3899   `_mm256_stream_si256`, `_mm256_stream_pd`, `_mm256_stream_ps`][55610] have
3900   been changed from `*const` to `*mut` as the previous implementation
3901   was unsound.
3902
3903
3904 [55148]: https://github.com/rust-lang/rust/pull/55148/
3905 [55238]: https://github.com/rust-lang/rust/pull/55238/
3906 [55280]: https://github.com/rust-lang/rust/pull/55280/
3907 [55610]: https://github.com/rust-lang/rust/pull/55610/
3908 [55663]: https://github.com/rust-lang/rust/pull/55663/
3909 [55702]: https://github.com/rust-lang/rust/pull/55702/
3910 [55837]: https://github.com/rust-lang/rust/pull/55837/
3911 [55843]: https://github.com/rust-lang/rust/pull/55843/
3912 [56072]: https://github.com/rust-lang/rust/pull/56072/
3913 [56245]: https://github.com/rust-lang/rust/pull/56245/
3914 [56365]: https://github.com/rust-lang/rust/pull/56365/
3915 [56366]: https://github.com/rust-lang/rust/pull/56366/
3916 [56395]: https://github.com/rust-lang/rust/pull/56395/
3917 [56759]: https://github.com/rust-lang/rust/pull/56759/
3918 [cargo/6218]: https://github.com/rust-lang/cargo/pull/6218/
3919 [cargo/6242]: https://github.com/rust-lang/cargo/pull/6242/
3920 [`CStr::as_ptr`]: https://doc.rust-lang.org/std/ffi/struct.CStr.html#method.as_ptr
3921 [`Cell::as_ptr`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.as_ptr
3922 [`Duration::as_secs`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_secs
3923 [`Duration::subsec_micros`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_micros
3924 [`Duration::subsec_millis`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_millis
3925 [`Duration::subsec_nanos`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_nanos
3926 [`Ipv4Addr::is_unspecified`]: https://doc.rust-lang.org/std/net/struct.Ipv4Addr.html#method.is_unspecified
3927 [`Ipv6Addr::new`]: https://doc.rust-lang.org/std/net/struct.Ipv6Addr.html#method.new
3928 [`Ipv6Addr::octets`]: https://doc.rust-lang.org/std/net/struct.Ipv6Addr.html#method.octets
3929 [`ManuallyDrop::into_inner`]: https://doc.rust-lang.org/std/mem/struct.ManuallyDrop.html#method.into_inner
3930 [`ManuallyDrop::new`]: https://doc.rust-lang.org/std/mem/struct.ManuallyDrop.html#method.new
3931 [`NonNull::as_ptr`]: https://doc.rust-lang.org/std/ptr/struct.NonNull.html#method.as_ptr
3932 [`RangeInclusive::end`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html#method.end
3933 [`RangeInclusive::start`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html#method.start
3934 [`UnsafeCell::get`]: https://doc.rust-lang.org/std/cell/struct.UnsafeCell.html#method.get
3935 [`slice::as_ptr`]: https://doc.rust-lang.org/std/primitive.slice.html#method.as_ptr
3936 [`char::is_ascii`]: https://doc.rust-lang.org/std/primitive.char.html#method.is_ascii
3937 [`i128::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.from_be_bytes
3938 [`i128::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.from_le_bytes
3939 [`i128::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.from_ne_bytes
3940 [`i128::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.to_be_bytes
3941 [`i128::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.to_le_bytes
3942 [`i128::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.to_ne_bytes
3943 [`i16::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_be_bytes
3944 [`i16::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_le_bytes
3945 [`i16::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_ne_bytes
3946 [`i16::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.to_be_bytes
3947 [`i16::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.to_le_bytes
3948 [`i16::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.to_ne_bytes
3949 [`i32::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.from_be_bytes
3950 [`i32::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.from_le_bytes
3951 [`i32::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.from_ne_bytes
3952 [`i32::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.to_be_bytes
3953 [`i32::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.to_le_bytes
3954 [`i32::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.to_ne_bytes
3955 [`i64::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.from_be_bytes
3956 [`i64::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.from_le_bytes
3957 [`i64::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.from_ne_bytes
3958 [`i64::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.to_be_bytes
3959 [`i64::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.to_le_bytes
3960 [`i64::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.to_ne_bytes
3961 [`i8::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.from_be_bytes
3962 [`i8::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.from_le_bytes
3963 [`i8::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.from_ne_bytes
3964 [`i8::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.to_be_bytes
3965 [`i8::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.to_le_bytes
3966 [`i8::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.to_ne_bytes
3967 [`isize::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.from_be_bytes
3968 [`isize::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.from_le_bytes
3969 [`isize::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.from_ne_bytes
3970 [`isize::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.to_be_bytes
3971 [`isize::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.to_le_bytes
3972 [`isize::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.to_ne_bytes
3973 [`iter::empty`]: https://doc.rust-lang.org/std/iter/fn.empty.html
3974 [`str::as_ptr`]: https://doc.rust-lang.org/std/primitive.str.html#method.as_ptr
3975 [`u128::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.from_be_bytes
3976 [`u128::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.from_le_bytes
3977 [`u128::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.from_ne_bytes
3978 [`u128::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.to_be_bytes
3979 [`u128::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.to_le_bytes
3980 [`u128::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.to_ne_bytes
3981 [`u16::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.from_be_bytes
3982 [`u16::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.from_le_bytes
3983 [`u16::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.from_ne_bytes
3984 [`u16::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.to_be_bytes
3985 [`u16::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.to_le_bytes
3986 [`u16::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.to_ne_bytes
3987 [`u32::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.from_be_bytes
3988 [`u32::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.from_le_bytes
3989 [`u32::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.from_ne_bytes
3990 [`u32::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.to_be_bytes
3991 [`u32::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.to_le_bytes
3992 [`u32::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.to_ne_bytes
3993 [`u64::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.from_be_bytes
3994 [`u64::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.from_le_bytes
3995 [`u64::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.from_ne_bytes
3996 [`u64::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.to_be_bytes
3997 [`u64::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.to_le_bytes
3998 [`u64::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.to_ne_bytes
3999 [`u8::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.from_be_bytes
4000 [`u8::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.from_le_bytes
4001 [`u8::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.from_ne_bytes
4002 [`u8::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.to_be_bytes
4003 [`u8::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.to_le_bytes
4004 [`u8::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.to_ne_bytes
4005 [`usize::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.from_be_bytes
4006 [`usize::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.from_le_bytes
4007 [`usize::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.from_ne_bytes
4008 [`usize::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.to_be_bytes
4009 [`usize::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.to_le_bytes
4010 [`usize::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.to_ne_bytes
4011
4012
4013 Version 1.31.1 (2018-12-20)
4014 ===========================
4015
4016 - [Fix Rust failing to build on `powerpc-unknown-netbsd`][56562]
4017 - [Fix broken go-to-definition in RLS][rls/1171]
4018 - [Fix infinite loop on hover in RLS][rls/1170]
4019
4020 [56562]: https://github.com/rust-lang/rust/pull/56562
4021 [rls/1171]: https://github.com/rust-lang/rls/issues/1171
4022 [rls/1170]: https://github.com/rust-lang/rls/pull/1170
4023
4024 Version 1.31.0 (2018-12-06)
4025 ==========================
4026
4027 Language
4028 --------
4029 - 🎉 [This version marks the release of the 2018 edition of Rust.][54057] 🎉
4030 - [New lifetime elision rules now allow for eliding lifetimes in functions and
4031   impl headers.][54778] E.g. `impl<'a> Reader for BufReader<'a> {}` can now be
4032   `impl Reader for BufReader<'_> {}`. Lifetimes are still required to be defined
4033   in structs.
4034 - [You can now define and use `const` functions.][54835] These are currently
4035   a strict minimal subset of the [const fn RFC][RFC-911]. Refer to the
4036   [language reference][const-reference] for what exactly is available.
4037 - [You can now use tool lints, which allow you to scope lints from external
4038   tools using attributes.][54870] E.g. `#[allow(clippy::filter_map)]`.
4039 - [`#[no_mangle]` and `#[export_name]` attributes can now be located anywhere in
4040   a crate, not just in exported functions.][54451]
4041 - [You can now use parentheses in pattern matches.][54497]
4042
4043 Compiler
4044 --------
4045 - [Updated musl to 1.1.20][54430]
4046
4047 Libraries
4048 ---------
4049 - [You can now convert `num::NonZero*` types to their raw equivalents using the
4050   `From` trait.][54240] E.g. `u8` now implements `From<NonZeroU8>`.
4051 - [You can now convert a `&Option<T>` into `Option<&T>` and `&mut Option<T>`
4052   into `Option<&mut T>` using the `From` trait.][53218]
4053 - [You can now multiply (`*`) a `time::Duration` by a `u32`.][52813]
4054
4055
4056 Stabilized APIs
4057 ---------------
4058 - [`slice::align_to`]
4059 - [`slice::align_to_mut`]
4060 - [`slice::chunks_exact`]
4061 - [`slice::chunks_exact_mut`]
4062 - [`slice::rchunks`]
4063 - [`slice::rchunks_mut`]
4064 - [`slice::rchunks_exact`]
4065 - [`slice::rchunks_exact_mut`]
4066 - [`Option::replace`]
4067
4068 Cargo
4069 -----
4070 - [Cargo will now download crates in parallel using HTTP/2.][cargo/6005]
4071 - [You can now rename packages in your Cargo.toml][cargo/6319] We have a guide
4072   on [how to use the `package` key in your dependencies.][cargo-rename-reference]
4073
4074 [52813]: https://github.com/rust-lang/rust/pull/52813/
4075 [53218]: https://github.com/rust-lang/rust/pull/53218/
4076 [53555]: https://github.com/rust-lang/rust/issues/53555/
4077 [54057]: https://github.com/rust-lang/rust/pull/54057/
4078 [54240]: https://github.com/rust-lang/rust/pull/54240/
4079 [54430]: https://github.com/rust-lang/rust/pull/54430/
4080 [54451]: https://github.com/rust-lang/rust/pull/54451/
4081 [54497]: https://github.com/rust-lang/rust/pull/54497/
4082 [54778]: https://github.com/rust-lang/rust/pull/54778/
4083 [54835]: https://github.com/rust-lang/rust/pull/54835/
4084 [54870]: https://github.com/rust-lang/rust/pull/54870/
4085 [RFC-911]: https://github.com/rust-lang/rfcs/pull/911
4086 [`Option::replace`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.replace
4087 [`slice::align_to_mut`]: https://doc.rust-lang.org/std/primitive.slice.html#method.align_to_mut
4088 [`slice::align_to`]: https://doc.rust-lang.org/std/primitive.slice.html#method.align_to
4089 [`slice::chunks_exact_mut`]: https://doc.rust-lang.org/std/primitive.slice.html#method.chunks_exact_mut
4090 [`slice::chunks_exact`]: https://doc.rust-lang.org/std/primitive.slice.html#method.chunks_exact
4091 [`slice::rchunks_exact_mut`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rchunks_mut
4092 [`slice::rchunks_exact`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rchunks_exact
4093 [`slice::rchunks_mut`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rchunks_mut
4094 [`slice::rchunks`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rchunks
4095 [cargo/6005]: https://github.com/rust-lang/cargo/pull/6005/
4096 [cargo/6319]: https://github.com/rust-lang/cargo/pull/6319/
4097 [cargo-rename-reference]: https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#renaming-dependencies-in-cargotoml
4098 [const-reference]: https://doc.rust-lang.org/reference/items/functions.html#const-functions
4099
4100 Version 1.30.1 (2018-11-08)
4101 ===========================
4102
4103 - [Fixed overflow ICE in rustdoc][54199]
4104 - [Cap Cargo progress bar width at 60 in MSYS terminals][cargo/6122]
4105
4106 [54199]: https://github.com/rust-lang/rust/pull/54199
4107 [cargo/6122]: https://github.com/rust-lang/cargo/pull/6122
4108
4109 Version 1.30.0 (2018-10-25)
4110 ==========================
4111
4112 Language
4113 --------
4114 - [Procedural macros are now available.][52081] These kinds of macros allow for
4115   more powerful code generation. There is a [new chapter available][proc-macros]
4116   in the Rust Programming Language book that goes further in depth.
4117 - [You can now use keywords as identifiers using the raw identifiers
4118   syntax (`r#`),][53236] e.g. `let r#for = true;`
4119 - [Using anonymous parameters in traits is now deprecated with a warning and
4120   will be a hard error in the 2018 edition.][53272]
4121 - [You can now use `crate` in paths.][54404] This allows you to refer to the
4122   crate root in the path, e.g. `use crate::foo;` refers to `foo` in `src/lib.rs`.
4123 - [Using a external crate no longer requires being prefixed with `::`.][54404]
4124   Previously, using a external crate in a module without a use statement
4125   required `let json = ::serde_json::from_str(foo);` but can now be written
4126   as `let json = serde_json::from_str(foo);`.
4127 - [You can now apply the `#[used]` attribute to static items to prevent the
4128   compiler from optimising them away, even if they appear to be unused,][51363]
4129   e.g. `#[used] static FOO: u32 = 1;`
4130 - [You can now import and reexport macros from other crates with the `use`
4131   syntax.][50911] Macros exported with `#[macro_export]` are now placed into
4132   the root module of the crate. If your macro relies on calling other local
4133   macros, it is recommended to export with the
4134   `#[macro_export(local_inner_macros)]` attribute so users won't have to import
4135   those macros.
4136 - [You can now catch visibility keywords (e.g. `pub`, `pub(crate)`) in macros
4137   using the `vis` specifier.][53370]
4138 - [Non-macro attributes now allow all forms of literals, not just
4139   strings.][53044] Previously, you would write `#[attr("true")]`, and you can now
4140   write `#[attr(true)]`.
4141 - [You can now specify a function to handle a panic in the Rust runtime with the
4142   `#[panic_handler]` attribute.][51366]
4143
4144 Compiler
4145 --------
4146 - [Added the `riscv32imc-unknown-none-elf` target.][53822]
4147 - [Added the `aarch64-unknown-netbsd` target][53165]
4148 - [Upgraded to LLVM 8.][53611]
4149
4150 Libraries
4151 ---------
4152 - [`ManuallyDrop` now allows the inner type to be unsized.][53033]
4153
4154 Stabilized APIs
4155 ---------------
4156 - [`Ipv4Addr::BROADCAST`]
4157 - [`Ipv4Addr::LOCALHOST`]
4158 - [`Ipv4Addr::UNSPECIFIED`]
4159 - [`Ipv6Addr::LOCALHOST`]
4160 - [`Ipv6Addr::UNSPECIFIED`]
4161 - [`Iterator::find_map`]
4162
4163   The following methods are replacement methods for `trim_left`, `trim_right`,
4164   `trim_left_matches`, and `trim_right_matches`, which will be deprecated
4165   in 1.33.0:
4166 - [`str::trim_end_matches`]
4167 - [`str::trim_end`]
4168 - [`str::trim_start_matches`]
4169 - [`str::trim_start`]
4170
4171 Cargo
4172 ----
4173 - [`cargo run` doesn't require specifying a package in workspaces.][cargo/5877]
4174 - [`cargo doc` now supports `--message-format=json`.][cargo/5878] This is
4175   equivalent to calling `rustdoc --error-format=json`.
4176 - [Cargo will now provide a progress bar for builds.][cargo/5995]
4177
4178 Misc
4179 ----
4180 - [`rustdoc` allows you to specify what edition to treat your code as with the
4181   `--edition` option.][54057]
4182 - [`rustdoc` now has the `--color` (specify whether to output color) and
4183   `--error-format` (specify error format, e.g. `json`) options.][53003]
4184 - [We now distribute a `rust-gdbgui` script that invokes `gdbgui` with Rust
4185   debug symbols.][53774]
4186 - [Attributes from Rust tools such as `rustfmt` or `clippy` are now
4187   available,][53459] e.g. `#[rustfmt::skip]` will skip formatting the next item.
4188
4189 [50911]: https://github.com/rust-lang/rust/pull/50911/
4190 [51363]: https://github.com/rust-lang/rust/pull/51363/
4191 [51366]: https://github.com/rust-lang/rust/pull/51366/
4192 [52081]: https://github.com/rust-lang/rust/pull/52081/
4193 [53003]: https://github.com/rust-lang/rust/pull/53003/
4194 [53033]: https://github.com/rust-lang/rust/pull/53033/
4195 [53044]: https://github.com/rust-lang/rust/pull/53044/
4196 [53165]: https://github.com/rust-lang/rust/pull/53165/
4197 [53611]: https://github.com/rust-lang/rust/pull/53611/
4198 [53213]: https://github.com/rust-lang/rust/pull/53213/
4199 [53236]: https://github.com/rust-lang/rust/pull/53236/
4200 [53272]: https://github.com/rust-lang/rust/pull/53272/
4201 [53370]: https://github.com/rust-lang/rust/pull/53370/
4202 [53459]: https://github.com/rust-lang/rust/pull/53459/
4203 [53774]: https://github.com/rust-lang/rust/pull/53774/
4204 [53822]: https://github.com/rust-lang/rust/pull/53822/
4205 [54057]: https://github.com/rust-lang/rust/pull/54057/
4206 [54146]: https://github.com/rust-lang/rust/pull/54146/
4207 [54404]: https://github.com/rust-lang/rust/pull/54404/
4208 [cargo/5877]: https://github.com/rust-lang/cargo/pull/5877/
4209 [cargo/5878]: https://github.com/rust-lang/cargo/pull/5878/
4210 [cargo/5995]: https://github.com/rust-lang/cargo/pull/5995/
4211 [proc-macros]: https://doc.rust-lang.org/nightly/book/2018-edition/ch19-06-macros.html
4212
4213 [`Ipv4Addr::BROADCAST`]: https://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#associatedconstant.BROADCAST
4214 [`Ipv4Addr::LOCALHOST`]: https://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#associatedconstant.LOCALHOST
4215 [`Ipv4Addr::UNSPECIFIED`]: https://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#associatedconstant.UNSPECIFIED
4216 [`Ipv6Addr::LOCALHOST`]: https://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#associatedconstant.LOCALHOST
4217 [`Ipv6Addr::UNSPECIFIED`]: https://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#associatedconstant.UNSPECIFIED
4218 [`Iterator::find_map`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.find_map
4219 [`str::trim_end_matches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.trim_end_matches
4220 [`str::trim_end`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.trim_end
4221 [`str::trim_start_matches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.trim_start_matches
4222 [`str::trim_start`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.trim_start
4223
4224
4225 Version 1.29.2 (2018-10-11)
4226 ===========================
4227
4228 - [Workaround for an aliasing-related LLVM bug, which caused miscompilation.][54639]
4229 - The `rls-preview` component on the windows-gnu targets has been restored.
4230
4231 [54639]: https://github.com/rust-lang/rust/pull/54639
4232
4233
4234 Version 1.29.1 (2018-09-25)
4235 ===========================
4236
4237 Security Notes
4238 --------------
4239
4240 - The standard library's `str::repeat` function contained an out of bounds write
4241   caused by an integer overflow. This has been fixed by deterministically
4242   panicking when an overflow happens.
4243
4244   Thank you to Scott McMurray for responsibly disclosing this vulnerability to
4245   us.
4246
4247
4248 Version 1.29.0 (2018-09-13)
4249 ==========================
4250
4251 Compiler
4252 --------
4253 - [Bumped minimum LLVM version to 5.0.][51899]
4254 - [Added `powerpc64le-unknown-linux-musl` target.][51619]
4255 - [Added `aarch64-unknown-hermit` and `x86_64-unknown-hermit` targets.][52861]
4256 - [Upgraded to LLVM 7.][51966]
4257
4258 Libraries
4259 ---------
4260 - [`Once::call_once` no longer requires `Once` to be `'static`.][52239]
4261 - [`BuildHasherDefault` now implements `PartialEq` and `Eq`.][52402]
4262 - [`Box<CStr>`, `Box<OsStr>`, and `Box<Path>` now implement `Clone`.][51912]
4263 - [Implemented `PartialEq<&str>` for `OsString` and `PartialEq<OsString>`
4264   for `&str`.][51178]
4265 - [`Cell<T>` now allows `T` to be unsized.][50494]
4266 - [`SocketAddr` is now stable on Redox.][52656]
4267
4268 Stabilized APIs
4269 ---------------
4270 - [`Arc::downcast`]
4271 - [`Iterator::flatten`]
4272 - [`Rc::downcast`]
4273
4274 Cargo
4275 -----
4276 - [Cargo can silently fix some bad lockfiles.][cargo/5831] You can use
4277   `--locked` to disable this behavior.
4278 - [`cargo-install` will now allow you to cross compile an install
4279   using `--target`.][cargo/5614]
4280 - [Added the `cargo-fix` subcommand to automatically move project code from
4281   2015 edition to 2018.][cargo/5723]
4282 - [`cargo doc` can now optionally document private types using the
4283   `--document-private-items` flag.][cargo/5543]
4284
4285 Misc
4286 ----
4287 - [`rustdoc` now has the `--cap-lints` option which demotes all lints above
4288   the specified level to that level.][52354] For example `--cap-lints warn`
4289   will demote `deny` and `forbid` lints to `warn`.
4290 - [`rustc` and `rustdoc` will now have the exit code of `1` if compilation
4291   fails and `101` if there is a panic.][52197]
4292 - [A preview of clippy has been made available through rustup.][51122]
4293   You can install the preview with `rustup component add clippy-preview`.
4294
4295 Compatibility Notes
4296 -------------------
4297 - [`str::{slice_unchecked, slice_unchecked_mut}` are now deprecated.][51807]
4298   Use `str::get_unchecked(begin..end)` instead.
4299 - [`std::env::home_dir` is now deprecated for its unintuitive behavior.][51656]
4300   Consider using the `home_dir` function from
4301   https://crates.io/crates/dirs instead.
4302 - [`rustc` will no longer silently ignore invalid data in target spec.][52330]
4303 - [`cfg` attributes and `--cfg` command line flags are now more
4304   strictly validated.][53893]
4305
4306 [53893]: https://github.com/rust-lang/rust/pull/53893/
4307 [52861]: https://github.com/rust-lang/rust/pull/52861/
4308 [51966]: https://github.com/rust-lang/rust/pull/51966/
4309 [52656]: https://github.com/rust-lang/rust/pull/52656/
4310 [52239]: https://github.com/rust-lang/rust/pull/52239/
4311 [52330]: https://github.com/rust-lang/rust/pull/52330/
4312 [52354]: https://github.com/rust-lang/rust/pull/52354/
4313 [52402]: https://github.com/rust-lang/rust/pull/52402/
4314 [52103]: https://github.com/rust-lang/rust/pull/52103/
4315 [52197]: https://github.com/rust-lang/rust/pull/52197/
4316 [51807]: https://github.com/rust-lang/rust/pull/51807/
4317 [51899]: https://github.com/rust-lang/rust/pull/51899/
4318 [51912]: https://github.com/rust-lang/rust/pull/51912/
4319 [51511]: https://github.com/rust-lang/rust/pull/51511/
4320 [51619]: https://github.com/rust-lang/rust/pull/51619/
4321 [51656]: https://github.com/rust-lang/rust/pull/51656/
4322 [51178]: https://github.com/rust-lang/rust/pull/51178/
4323 [51122]: https://github.com/rust-lang/rust/pull/51122
4324 [50494]: https://github.com/rust-lang/rust/pull/50494/
4325 [cargo/5543]: https://github.com/rust-lang/cargo/pull/5543
4326 [cargo/5614]: https://github.com/rust-lang/cargo/pull/5614/
4327 [cargo/5723]: https://github.com/rust-lang/cargo/pull/5723/
4328 [cargo/5831]: https://github.com/rust-lang/cargo/pull/5831/
4329 [`Arc::downcast`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.downcast
4330 [`Iterator::flatten`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.flatten
4331 [`Rc::downcast`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.downcast
4332
4333
4334 Version 1.28.0 (2018-08-02)
4335 ===========================
4336
4337 Language
4338 --------
4339 - [The `#[repr(transparent)]` attribute is now stable.][51562] This attribute
4340   allows a Rust newtype wrapper (`struct NewType<T>(T);`) to be represented as
4341   the inner type across Foreign Function Interface (FFI) boundaries.
4342 - [The keywords `pure`, `sizeof`, `alignof`, and `offsetof` have been unreserved
4343   and can now be used as identifiers.][51196]
4344 - [The `GlobalAlloc` trait and `#[global_allocator]` attribute are now
4345   stable.][51241] This will allow users to specify a global allocator for
4346   their program.
4347 - [Unit test functions marked with the `#[test]` attribute can now return
4348   `Result<(), E: Debug>` in addition to `()`.][51298]
4349 - [The `lifetime` specifier for `macro_rules!` is now stable.][50385] This
4350   allows macros to easily target lifetimes.
4351
4352 Compiler
4353 --------
4354 - [The `s` and `z` optimisation levels are now stable.][50265] These optimisations
4355   prioritise making smaller binary sizes. `z` is the same as `s` with the
4356   exception that it does not vectorise loops, which typically results in an even
4357   smaller binary.
4358 - [The short error format is now stable.][49546] Specified with
4359   `--error-format=short` this option will provide a more compressed output of
4360   rust error messages.
4361 - [Added a lint warning when you have duplicated `macro_export`s.][50143]
4362 - [Reduced the number of allocations in the macro parser.][50855] This can
4363   improve compile times of macro heavy crates on average by 5%.
4364
4365 Libraries
4366 ---------
4367 - [Implemented `Default` for `&mut str`.][51306]
4368 - [Implemented `From<bool>` for all integer and unsigned number types.][50554]
4369 - [Implemented `Extend` for `()`.][50234]
4370 - [The `Debug` implementation of `time::Duration` should now be more easily
4371   human readable.][50364] Previously a `Duration` of one second would printed as
4372   `Duration { secs: 1, nanos: 0 }` and will now be printed as `1s`.
4373 - [Implemented `From<&String>` for `Cow<str>`, `From<&Vec<T>>` for `Cow<[T]>`,
4374   `From<Cow<CStr>>` for `CString`, `From<CString>, From<CStr>, From<&CString>`
4375   for `Cow<CStr>`, `From<OsString>, From<OsStr>, From<&OsString>` for
4376   `Cow<OsStr>`, `From<&PathBuf>` for `Cow<Path>`, and `From<Cow<Path>>`
4377   for `PathBuf`.][50170]
4378 - [Implemented `Shl` and `Shr` for `Wrapping<u128>`
4379   and `Wrapping<i128>`.][50465]
4380 - [`DirEntry::metadata` now uses `fstatat` instead of `lstat` when
4381   possible.][51050] This can provide up to a 40% speed increase.
4382 - [Improved error messages when using `format!`.][50610]
4383
4384 Stabilized APIs
4385 ---------------
4386 - [`Iterator::step_by`]
4387 - [`Path::ancestors`]
4388 - [`SystemTime::UNIX_EPOCH`]
4389 - [`alloc::GlobalAlloc`]
4390 - [`alloc::Layout`]
4391 - [`alloc::LayoutErr`]
4392 - [`alloc::System`]
4393 - [`alloc::alloc`]
4394 - [`alloc::alloc_zeroed`]
4395 - [`alloc::dealloc`]
4396 - [`alloc::realloc`]
4397 - [`alloc::handle_alloc_error`]
4398 - [`btree_map::Entry::or_default`]
4399 - [`fmt::Alignment`]
4400 - [`hash_map::Entry::or_default`]
4401 - [`iter::repeat_with`]
4402 - [`num::NonZeroUsize`]
4403 - [`num::NonZeroU128`]
4404 - [`num::NonZeroU16`]
4405 - [`num::NonZeroU32`]
4406 - [`num::NonZeroU64`]
4407 - [`num::NonZeroU8`]
4408 - [`ops::RangeBounds`]
4409 - [`slice::SliceIndex`]
4410 - [`slice::from_mut`]
4411 - [`slice::from_ref`]
4412 - [`{Any + Send + Sync}::downcast_mut`]
4413 - [`{Any + Send + Sync}::downcast_ref`]
4414 - [`{Any + Send + Sync}::is`]
4415
4416 Cargo
4417 -----
4418 - [Cargo will now no longer allow you to publish crates with build scripts that
4419   modify the `src` directory.][cargo/5584] The `src` directory in a crate should be
4420   considered to be immutable.
4421
4422 Misc
4423 ----
4424 - [The `suggestion_applicability` field in `rustc`'s json output is now
4425   stable.][50486] This will allow dev tools to check whether a code suggestion
4426   would apply to them.
4427
4428 Compatibility Notes
4429 -------------------
4430 - [Rust will consider trait objects with duplicated constraints to be the same
4431   type as without the duplicated constraint.][51276] For example the below code will
4432   now fail to compile.
4433   ```rust
4434   trait Trait {}
4435
4436   impl Trait + Send {
4437       fn test(&self) { println!("one"); } //~ ERROR duplicate definitions with name `test`
4438   }
4439
4440   impl Trait + Send + Send {
4441       fn test(&self) { println!("two"); }
4442   }
4443   ```
4444
4445 [49546]: https://github.com/rust-lang/rust/pull/49546/
4446 [50143]: https://github.com/rust-lang/rust/pull/50143/
4447 [50170]: https://github.com/rust-lang/rust/pull/50170/
4448 [50234]: https://github.com/rust-lang/rust/pull/50234/
4449 [50265]: https://github.com/rust-lang/rust/pull/50265/
4450 [50364]: https://github.com/rust-lang/rust/pull/50364/
4451 [50385]: https://github.com/rust-lang/rust/pull/50385/
4452 [50465]: https://github.com/rust-lang/rust/pull/50465/
4453 [50486]: https://github.com/rust-lang/rust/pull/50486/
4454 [50554]: https://github.com/rust-lang/rust/pull/50554/
4455 [50610]: https://github.com/rust-lang/rust/pull/50610/
4456 [50855]: https://github.com/rust-lang/rust/pull/50855/
4457 [51050]: https://github.com/rust-lang/rust/pull/51050/
4458 [51196]: https://github.com/rust-lang/rust/pull/51196/
4459 [51200]: https://github.com/rust-lang/rust/pull/51200/
4460 [51241]: https://github.com/rust-lang/rust/pull/51241/
4461 [51276]: https://github.com/rust-lang/rust/pull/51276/
4462 [51298]: https://github.com/rust-lang/rust/pull/51298/
4463 [51306]: https://github.com/rust-lang/rust/pull/51306/
4464 [51562]: https://github.com/rust-lang/rust/pull/51562/
4465 [cargo/5584]: https://github.com/rust-lang/cargo/pull/5584/
4466 [`Iterator::step_by`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.step_by
4467 [`Path::ancestors`]: https://doc.rust-lang.org/std/path/struct.Path.html#method.ancestors
4468 [`SystemTime::UNIX_EPOCH`]: https://doc.rust-lang.org/std/time/struct.SystemTime.html#associatedconstant.UNIX_EPOCH
4469 [`alloc::GlobalAlloc`]: https://doc.rust-lang.org/std/alloc/trait.GlobalAlloc.html
4470 [`alloc::Layout`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html
4471 [`alloc::LayoutErr`]: https://doc.rust-lang.org/std/alloc/struct.LayoutErr.html
4472 [`alloc::System`]: https://doc.rust-lang.org/std/alloc/struct.System.html
4473 [`alloc::alloc`]: https://doc.rust-lang.org/std/alloc/fn.alloc.html
4474 [`alloc::alloc_zeroed`]: https://doc.rust-lang.org/std/alloc/fn.alloc_zeroed.html
4475 [`alloc::dealloc`]: https://doc.rust-lang.org/std/alloc/fn.dealloc.html
4476 [`alloc::realloc`]: https://doc.rust-lang.org/std/alloc/fn.realloc.html
4477 [`alloc::handle_alloc_error`]: https://doc.rust-lang.org/std/alloc/fn.handle_alloc_error.html
4478 [`btree_map::Entry::or_default`]: https://doc.rust-lang.org/std/collections/btree_map/enum.Entry.html#method.or_default
4479 [`fmt::Alignment`]: https://doc.rust-lang.org/std/fmt/enum.Alignment.html
4480 [`hash_map::Entry::or_default`]: https://doc.rust-lang.org/std/collections/hash_map/enum.Entry.html#method.or_default
4481 [`iter::repeat_with`]: https://doc.rust-lang.org/std/iter/fn.repeat_with.html
4482 [`num::NonZeroUsize`]: https://doc.rust-lang.org/std/num/struct.NonZeroUsize.html
4483 [`num::NonZeroU128`]: https://doc.rust-lang.org/std/num/struct.NonZeroU128.html
4484 [`num::NonZeroU16`]: https://doc.rust-lang.org/std/num/struct.NonZeroU16.html
4485 [`num::NonZeroU32`]: https://doc.rust-lang.org/std/num/struct.NonZeroU32.html
4486 [`num::NonZeroU64`]: https://doc.rust-lang.org/std/num/struct.NonZeroU64.html
4487 [`num::NonZeroU8`]: https://doc.rust-lang.org/std/num/struct.NonZeroU8.html
4488 [`ops::RangeBounds`]: https://doc.rust-lang.org/std/ops/trait.RangeBounds.html
4489 [`slice::SliceIndex`]: https://doc.rust-lang.org/std/slice/trait.SliceIndex.html
4490 [`slice::from_mut`]: https://doc.rust-lang.org/std/slice/fn.from_mut.html
4491 [`slice::from_ref`]: https://doc.rust-lang.org/std/slice/fn.from_ref.html
4492 [`{Any + Send + Sync}::downcast_mut`]: https://doc.rust-lang.org/std/any/trait.Any.html#method.downcast_mut-2
4493 [`{Any + Send + Sync}::downcast_ref`]: https://doc.rust-lang.org/std/any/trait.Any.html#method.downcast_ref-2
4494 [`{Any + Send + Sync}::is`]: https://doc.rust-lang.org/std/any/trait.Any.html#method.is-2
4495
4496 Version 1.27.2 (2018-07-20)
4497 ===========================
4498
4499 Compatibility Notes
4500 -------------------
4501
4502 - The borrow checker was fixed to avoid potential unsoundness when using
4503   match ergonomics: [#52213][52213].
4504
4505 [52213]: https://github.com/rust-lang/rust/issues/52213
4506
4507 Version 1.27.1 (2018-07-10)
4508 ===========================
4509
4510 Security Notes
4511 --------------
4512
4513 - rustdoc would execute plugins in the /tmp/rustdoc/plugins directory
4514   when running, which enabled executing code as some other user on a
4515   given machine. This release fixes that vulnerability; you can read
4516   more about this on the [blog][rustdoc-sec]. The associated CVE is [CVE-2018-1000622].
4517
4518   Thank you to Red Hat for responsibly disclosing this vulnerability to us.
4519
4520 Compatibility Notes
4521 -------------------
4522
4523 - The borrow checker was fixed to avoid an additional potential unsoundness when using
4524   match ergonomics: [#51415][51415], [#49534][49534].
4525
4526 [51415]: https://github.com/rust-lang/rust/issues/51415
4527 [49534]: https://github.com/rust-lang/rust/issues/49534
4528 [rustdoc-sec]: https://blog.rust-lang.org/2018/07/06/security-advisory-for-rustdoc.html
4529 [CVE-2018-1000622]: https://cve.mitre.org/cgi-bin/cvename.cgi?name=%20CVE-2018-1000622
4530
4531 Version 1.27.0 (2018-06-21)
4532 ==========================
4533
4534 Language
4535 --------
4536 - [Removed 'proc' from the reserved keywords list.][49699] This allows `proc` to
4537   be used as an identifier.
4538 - [The dyn syntax is now available.][49968] This syntax is equivalent to the
4539   bare `Trait` syntax, and should make it clearer when being used in tandem with
4540   `impl Trait` because it is equivalent to the following syntax:
4541   `&Trait == &dyn Trait`, `&mut Trait == &mut dyn Trait`, and
4542   `Box<Trait> == Box<dyn Trait>`.
4543 - [Attributes on generic parameters such as types and lifetimes are
4544   now stable.][48851] e.g.
4545   `fn foo<#[lifetime_attr] 'a, #[type_attr] T: 'a>() {}`
4546 - [The `#[must_use]` attribute can now also be used on functions as well as
4547   types.][48925] It provides a lint that by default warns users when the
4548   value returned by a function has not been used.
4549
4550 Compiler
4551 --------
4552 - [Added the `armv5te-unknown-linux-musleabi` target.][50423]
4553
4554 Libraries
4555 ---------
4556 - [SIMD (Single Instruction Multiple Data) on x86/x86_64 is now stable.][49664]
4557   This includes [`arch::x86`] & [`arch::x86_64`] modules which contain
4558   SIMD intrinsics, a new macro called `is_x86_feature_detected!`, the
4559   `#[target_feature(enable="")]` attribute, and adding `target_feature = ""` to
4560   the `cfg` attribute.
4561 - [A lot of methods for `[u8]`, `f32`, and `f64` previously only available in
4562   std are now available in core.][49896]
4563 - [The generic `Rhs` type parameter on `ops::{Shl, ShlAssign, Shr}` now defaults
4564   to `Self`.][49630]
4565 - [`std::str::replace` now has the `#[must_use]` attribute][50177] to clarify
4566   that the operation isn't done in place.
4567 - [`Clone::clone`, `Iterator::collect`, and `ToOwned::to_owned` now have
4568   the `#[must_use]` attribute][49533] to warn about unused potentially
4569   expensive allocations.
4570
4571 Stabilized APIs
4572 ---------------
4573 - [`DoubleEndedIterator::rfind`]
4574 - [`DoubleEndedIterator::rfold`]
4575 - [`DoubleEndedIterator::try_rfold`]
4576 - [`Duration::from_micros`]
4577 - [`Duration::from_nanos`]
4578 - [`Duration::subsec_micros`]
4579 - [`Duration::subsec_millis`]
4580 - [`HashMap::remove_entry`]
4581 - [`Iterator::try_fold`]
4582 - [`Iterator::try_for_each`]
4583 - [`NonNull::cast`]
4584 - [`Option::filter`]
4585 - [`String::replace_range`]
4586 - [`Take::set_limit`]
4587 - [`hint::unreachable_unchecked`]
4588 - [`os::unix::process::parent_id`]
4589 - [`ptr::swap_nonoverlapping`]
4590 - [`slice::rsplit_mut`]
4591 - [`slice::rsplit`]
4592 - [`slice::swap_with_slice`]
4593
4594 Cargo
4595 -----
4596 - [`cargo-metadata` now includes `authors`, `categories`, `keywords`,
4597   `readme`, and `repository` fields.][cargo/5386]
4598 - [`cargo-metadata` now includes a package's `metadata` table.][cargo/5360]
4599 - [Added the `--target-dir` optional argument.][cargo/5393] This allows you to specify
4600   a different directory than `target` for placing compilation artifacts.
4601 - [Cargo will be adding automatic target inference for binaries, benchmarks,
4602   examples, and tests in the Rust 2018 edition.][cargo/5335] If your project specifies
4603   specific targets, e.g. using `[[bin]]`, and have other binaries in locations
4604   where cargo would infer a binary, Cargo will produce a warning. You can
4605   disable this feature ahead of time by setting any of the following to false:
4606   `autobins`, `autobenches`, `autoexamples`, `autotests`.
4607 - [Cargo will now cache compiler information.][cargo/5359] This can be disabled by
4608   setting `CARGO_CACHE_RUSTC_INFO=0` in your environment.
4609
4610 Misc
4611 ----
4612 - [Added “The Rustc book” into the official documentation.][49707]
4613   [“The Rustc book”] documents and teaches how to use the rustc compiler.
4614 - [All books available on `doc.rust-lang.org` are now searchable.][49623]
4615
4616 Compatibility Notes
4617 -------------------
4618 - [Calling a `CharExt` or `StrExt` method directly on core will no longer
4619   work.][49896] e.g. `::core::prelude::v1::StrExt::is_empty("")` will not
4620   compile, `"".is_empty()` will still compile.
4621 - [`Debug` output on `atomic::{AtomicBool, AtomicIsize, AtomicPtr, AtomicUsize}`
4622   will only print the inner type.][48553] E.g.
4623   `print!("{:?}", AtomicBool::new(true))` will print `true`,
4624   not `AtomicBool(true)`.
4625 - [The maximum number for `repr(align(N))` is now 2²⁹.][50378] Previously you
4626   could enter higher numbers but they were not supported by LLVM. Up to 512MB
4627   alignment should cover all use cases.
4628 - The `.description()` method on the `std::error::Error` trait
4629   [has been soft-deprecated][50163]. It is no longer required to implement it.
4630
4631 [48553]: https://github.com/rust-lang/rust/pull/48553/
4632 [48851]: https://github.com/rust-lang/rust/pull/48851/
4633 [48925]: https://github.com/rust-lang/rust/pull/48925/
4634 [49533]: https://github.com/rust-lang/rust/pull/49533/
4635 [49623]: https://github.com/rust-lang/rust/pull/49623/
4636 [49630]: https://github.com/rust-lang/rust/pull/49630/
4637 [49664]: https://github.com/rust-lang/rust/pull/49664/
4638 [49699]: https://github.com/rust-lang/rust/pull/49699/
4639 [49707]: https://github.com/rust-lang/rust/pull/49707/
4640 [49719]: https://github.com/rust-lang/rust/pull/49719/
4641 [49896]: https://github.com/rust-lang/rust/pull/49896/
4642 [49968]: https://github.com/rust-lang/rust/pull/49968/
4643 [50163]: https://github.com/rust-lang/rust/pull/50163
4644 [50177]: https://github.com/rust-lang/rust/pull/50177/
4645 [50378]: https://github.com/rust-lang/rust/pull/50378/
4646 [50398]: https://github.com/rust-lang/rust/pull/50398/
4647 [50423]: https://github.com/rust-lang/rust/pull/50423/
4648 [cargo/5203]: https://github.com/rust-lang/cargo/pull/5203/
4649 [cargo/5335]: https://github.com/rust-lang/cargo/pull/5335/
4650 [cargo/5359]: https://github.com/rust-lang/cargo/pull/5359/
4651 [cargo/5360]: https://github.com/rust-lang/cargo/pull/5360/
4652 [cargo/5386]: https://github.com/rust-lang/cargo/pull/5386/
4653 [cargo/5393]: https://github.com/rust-lang/cargo/pull/5393/
4654 [`DoubleEndedIterator::rfind`]: https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html#method.rfind
4655 [`DoubleEndedIterator::rfold`]: https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html#method.rfold
4656 [`DoubleEndedIterator::try_rfold`]: https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html#method.try_rfold
4657 [`Duration::from_micros`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.from_micros
4658 [`Duration::from_nanos`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.from_nanos
4659 [`Duration::subsec_micros`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_micros
4660 [`Duration::subsec_millis`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_millis
4661 [`HashMap::remove_entry`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.remove_entry
4662 [`Iterator::try_fold`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.try_fold
4663 [`Iterator::try_for_each`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.try_for_each
4664 [`NonNull::cast`]: https://doc.rust-lang.org/std/ptr/struct.NonNull.html#method.cast
4665 [`Option::filter`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.filter
4666 [`String::replace_range`]: https://doc.rust-lang.org/std/string/struct.String.html#method.replace_range
4667 [`Take::set_limit`]: https://doc.rust-lang.org/std/io/struct.Take.html#method.set_limit
4668 [`hint::unreachable_unchecked`]: https://doc.rust-lang.org/std/hint/fn.unreachable_unchecked.html
4669 [`os::unix::process::parent_id`]: https://doc.rust-lang.org/std/os/unix/process/fn.parent_id.html
4670 [`process::id`]: https://doc.rust-lang.org/std/process/fn.id.html
4671 [`ptr::swap_nonoverlapping`]: https://doc.rust-lang.org/std/ptr/fn.swap_nonoverlapping.html
4672 [`slice::rsplit_mut`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rsplit_mut
4673 [`slice::rsplit`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rsplit
4674 [`slice::swap_with_slice`]: https://doc.rust-lang.org/std/primitive.slice.html#method.swap_with_slice
4675 [`arch::x86_64`]: https://doc.rust-lang.org/std/arch/x86_64/index.html
4676 [`arch::x86`]: https://doc.rust-lang.org/std/arch/x86/index.html
4677 [“The Rustc book”]: https://doc.rust-lang.org/rustc
4678
4679
4680 Version 1.26.2 (2018-06-05)
4681 ==========================
4682
4683 Compatibility Notes
4684 -------------------
4685
4686 - [The borrow checker was fixed to avoid unsoundness when using match ergonomics.][51117]
4687
4688 [51117]: https://github.com/rust-lang/rust/issues/51117
4689
4690
4691 Version 1.26.1 (2018-05-29)
4692 ==========================
4693
4694 Tools
4695 -----
4696
4697 - [RLS now works on Windows.][50646]
4698 - [Rustfmt stopped badly formatting text in some cases.][rustfmt/2695]
4699
4700
4701 Compatibility Notes
4702 --------
4703
4704 - [`fn main() -> impl Trait` no longer works for non-Termination
4705   trait.][50656]
4706   This reverts an accidental stabilization.
4707 - [`NaN > NaN` no longer returns true in const-fn contexts.][50812]
4708 - [Prohibit using turbofish for `impl Trait` in method arguments.][50950]
4709
4710 [50646]: https://github.com/rust-lang/rust/issues/50646
4711 [50656]: https://github.com/rust-lang/rust/pull/50656
4712 [50812]: https://github.com/rust-lang/rust/pull/50812
4713 [50950]: https://github.com/rust-lang/rust/issues/50950
4714 [rustfmt/2695]: https://github.com/rust-lang-nursery/rustfmt/issues/2695
4715
4716 Version 1.26.0 (2018-05-10)
4717 ==========================
4718
4719 Language
4720 --------
4721 - [Closures now implement `Copy` and/or `Clone` if all captured variables
4722   implement either or both traits.][49299]
4723 - [The inclusive range syntax e.g. `for x in 0..=10` is now stable.][47813]
4724 - [The `'_` lifetime is now stable. The underscore lifetime can be used anywhere a
4725   lifetime can be elided.][49458]
4726 - [`impl Trait` is now stable allowing you to have abstract types in returns
4727    or in function parameters.][49255] E.g. `fn foo() -> impl Iterator<Item=u8>` or
4728   `fn open(path: impl AsRef<Path>)`.
4729 - [Pattern matching will now automatically apply dereferences.][49394]
4730 - [128-bit integers in the form of `u128` and `i128` are now stable.][49101]
4731 - [`main` can now return `Result<(), E: Debug>`][49162] in addition to `()`.
4732 - [A lot of operations are now available in a const context.][46882] E.g. You
4733   can now index into constant arrays, reference and dereference into constants,
4734   and use tuple struct constructors.
4735 - [Fixed entry slice patterns are now stable.][48516] E.g.
4736   ```rust
4737   let points = [1, 2, 3, 4];
4738   match points {
4739       [1, 2, 3, 4] => println!("All points were sequential."),
4740       _ => println!("Not all points were sequential."),
4741   }
4742   ```
4743
4744
4745 Compiler
4746 --------
4747 - [LLD is now used as the default linker for `wasm32-unknown-unknown`.][48125]
4748 - [Fixed exponential projection complexity on nested types.][48296]
4749   This can provide up to a ~12% reduction in compile times for certain crates.
4750 - [Added the `--remap-path-prefix` option to rustc.][48359] Allowing you
4751   to remap path prefixes outputted by the compiler.
4752 - [Added `powerpc-unknown-netbsd` target.][48281]
4753
4754 Libraries
4755 ---------
4756 - [Implemented `From<u16> for usize` & `From<{u8, i16}> for isize`.][49305]
4757 - [Added hexadecimal formatting for integers with fmt::Debug][48978]
4758   e.g. `assert!(format!("{:02x?}", b"Foo\0") == "[46, 6f, 6f, 00]")`
4759 - [Implemented `Default, Hash` for `cmp::Reverse`.][48628]
4760 - [Optimized `str::repeat` being 8x faster in large cases.][48657]
4761 - [`ascii::escape_default` is now available in libcore.][48735]
4762 - [Trailing commas are now supported in std and core macros.][48056]
4763 - [Implemented `Copy, Clone` for `cmp::Reverse`][47379]
4764 - [Implemented `Clone` for `char::{ToLowercase, ToUppercase}`.][48629]
4765
4766 Stabilized APIs
4767 ---------------
4768 - [`*const T::add`]
4769 - [`*const T::copy_to_nonoverlapping`]
4770 - [`*const T::copy_to`]
4771 - [`*const T::read_unaligned`]
4772 - [`*const T::read_volatile`]
4773 - [`*const T::read`]
4774 - [`*const T::sub`]
4775 - [`*const T::wrapping_add`]
4776 - [`*const T::wrapping_sub`]
4777 - [`*mut T::add`]
4778 - [`*mut T::copy_to_nonoverlapping`]
4779 - [`*mut T::copy_to`]
4780 - [`*mut T::read_unaligned`]
4781 - [`*mut T::read_volatile`]
4782 - [`*mut T::read`]
4783 - [`*mut T::replace`]
4784 - [`*mut T::sub`]
4785 - [`*mut T::swap`]
4786 - [`*mut T::wrapping_add`]
4787 - [`*mut T::wrapping_sub`]
4788 - [`*mut T::write_bytes`]
4789 - [`*mut T::write_unaligned`]
4790 - [`*mut T::write_volatile`]
4791 - [`*mut T::write`]
4792 - [`Box::leak`]
4793 - [`FromUtf8Error::as_bytes`]
4794 - [`LocalKey::try_with`]
4795 - [`Option::cloned`]
4796 - [`btree_map::Entry::and_modify`]
4797 - [`fs::read_to_string`]
4798 - [`fs::read`]
4799 - [`fs::write`]
4800 - [`hash_map::Entry::and_modify`]
4801 - [`iter::FusedIterator`]
4802 - [`ops::RangeInclusive`]
4803 - [`ops::RangeToInclusive`]
4804 - [`process::id`]
4805 - [`slice::rotate_left`]
4806 - [`slice::rotate_right`]
4807 - [`String::retain`]
4808
4809
4810 Cargo
4811 -----
4812 - [Cargo will now output path to custom commands when `-v` is
4813   passed with `--list`][cargo/5041]
4814 - [The Cargo binary version is now the same as the Rust version][cargo/5083]
4815
4816 Misc
4817 ----
4818 - [The second edition of "The Rust Programming Language" book is now recommended
4819   over the first.][48404]
4820
4821 Compatibility Notes
4822 -------------------
4823
4824 - [aliasing a `Fn` trait as `dyn` no longer works.][48481] E.g. the following
4825   syntax is now invalid.
4826   ```
4827   use std::ops::Fn as dyn;
4828   fn g(_: Box<dyn(std::fmt::Debug)>) {}
4829   ```
4830 - [The result of dereferences are no longer promoted to `'static`.][47408]
4831   e.g.
4832   ```rust
4833   fn main() {
4834       const PAIR: &(i32, i32) = &(0, 1);
4835       let _reversed_pair: &'static _ = &(PAIR.1, PAIR.0); // Doesn't work
4836   }
4837   ```
4838 - [Deprecate `AsciiExt` trait in favor of inherent methods.][49109]
4839 - [`".e0"` will now no longer parse as `0.0` and will instead cause
4840   an error.][48235]
4841 - [Removed hoedown from rustdoc.][48274]
4842 - [Bounds on higher-kinded lifetimes a hard error.][48326]
4843
4844 [46882]: https://github.com/rust-lang/rust/pull/46882
4845 [47379]: https://github.com/rust-lang/rust/pull/47379
4846 [47408]: https://github.com/rust-lang/rust/pull/47408
4847 [47813]: https://github.com/rust-lang/rust/pull/47813
4848 [48056]: https://github.com/rust-lang/rust/pull/48056
4849 [48125]: https://github.com/rust-lang/rust/pull/48125
4850 [48166]: https://github.com/rust-lang/rust/pull/48166
4851 [48235]: https://github.com/rust-lang/rust/pull/48235
4852 [48274]: https://github.com/rust-lang/rust/pull/48274
4853 [48281]: https://github.com/rust-lang/rust/pull/48281
4854 [48296]: https://github.com/rust-lang/rust/pull/48296
4855 [48326]: https://github.com/rust-lang/rust/pull/48326
4856 [48359]: https://github.com/rust-lang/rust/pull/48359
4857 [48404]: https://github.com/rust-lang/rust/pull/48404
4858 [48481]: https://github.com/rust-lang/rust/pull/48481
4859 [48516]: https://github.com/rust-lang/rust/pull/48516
4860 [48628]: https://github.com/rust-lang/rust/pull/48628
4861 [48629]: https://github.com/rust-lang/rust/pull/48629
4862 [48657]: https://github.com/rust-lang/rust/pull/48657
4863 [48735]: https://github.com/rust-lang/rust/pull/48735
4864 [48978]: https://github.com/rust-lang/rust/pull/48978
4865 [49101]: https://github.com/rust-lang/rust/pull/49101
4866 [49109]: https://github.com/rust-lang/rust/pull/49109
4867 [49121]: https://github.com/rust-lang/rust/pull/49121
4868 [49162]: https://github.com/rust-lang/rust/pull/49162
4869 [49184]: https://github.com/rust-lang/rust/pull/49184
4870 [49234]: https://github.com/rust-lang/rust/pull/49234
4871 [49255]: https://github.com/rust-lang/rust/pull/49255
4872 [49299]: https://github.com/rust-lang/rust/pull/49299
4873 [49305]: https://github.com/rust-lang/rust/pull/49305
4874 [49394]: https://github.com/rust-lang/rust/pull/49394
4875 [49458]: https://github.com/rust-lang/rust/pull/49458
4876 [`*const T::add`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.add
4877 [`*const T::copy_to_nonoverlapping`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.copy_to_nonoverlapping
4878 [`*const T::copy_to`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.copy_to
4879 [`*const T::read_unaligned`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read_unaligned
4880 [`*const T::read_volatile`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read_volatile
4881 [`*const T::read`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read
4882 [`*const T::sub`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.sub
4883 [`*const T::wrapping_add`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_add
4884 [`*const T::wrapping_sub`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_sub
4885 [`*mut T::add`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.add-1
4886 [`*mut T::copy_to_nonoverlapping`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.copy_to_nonoverlapping-1
4887 [`*mut T::copy_to`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.copy_to-1
4888 [`*mut T::read_unaligned`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read_unaligned-1
4889 [`*mut T::read_volatile`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read_volatile-1
4890 [`*mut T::read`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read-1
4891 [`*mut T::replace`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.replace
4892 [`*mut T::sub`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.sub-1
4893 [`*mut T::swap`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.swap
4894 [`*mut T::wrapping_add`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_add-1
4895 [`*mut T::wrapping_sub`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_sub-1
4896 [`*mut T::write_bytes`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write_bytes
4897 [`*mut T::write_unaligned`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write_unaligned
4898 [`*mut T::write_volatile`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write_volatile
4899 [`*mut T::write`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write
4900 [`Box::leak`]: https://doc.rust-lang.org/std/boxed/struct.Box.html#method.leak
4901 [`FromUtf8Error::as_bytes`]: https://doc.rust-lang.org/std/string/struct.FromUtf8Error.html#method.as_bytes
4902 [`LocalKey::try_with`]: https://doc.rust-lang.org/std/thread/struct.LocalKey.html#method.try_with
4903 [`Option::cloned`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.cloned
4904 [`btree_map::Entry::and_modify`]: https://doc.rust-lang.org/std/collections/btree_map/enum.Entry.html#method.and_modify
4905 [`fs::read_to_string`]: https://doc.rust-lang.org/std/fs/fn.read_to_string.html
4906 [`fs::read`]: https://doc.rust-lang.org/std/fs/fn.read.html
4907 [`fs::write`]: https://doc.rust-lang.org/std/fs/fn.write.html
4908 [`hash_map::Entry::and_modify`]: https://doc.rust-lang.org/std/collections/hash_map/enum.Entry.html#method.and_modify
4909 [`iter::FusedIterator`]: https://doc.rust-lang.org/std/iter/trait.FusedIterator.html
4910 [`ops::RangeInclusive`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html
4911 [`ops::RangeToInclusive`]: https://doc.rust-lang.org/std/ops/struct.RangeToInclusive.html
4912 [`process::id`]: https://doc.rust-lang.org/std/process/fn.id.html
4913 [`slice::rotate_left`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rotate_left
4914 [`slice::rotate_right`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rotate_right
4915 [`String::retain`]: https://doc.rust-lang.org/std/string/struct.String.html#method.retain
4916 [cargo/5041]: https://github.com/rust-lang/cargo/pull/5041
4917 [cargo/5083]: https://github.com/rust-lang/cargo/pull/5083
4918
4919
4920 Version 1.25.0 (2018-03-29)
4921 ==========================
4922
4923 Language
4924 --------
4925 - [The `#[repr(align(x))]` attribute is now stable.][47006] [RFC 1358]
4926 - [You can now use nested groups of imports.][47948]
4927   e.g. `use std::{fs::File, io::Read, path::{Path, PathBuf}};`
4928 - [You can now have `|` at the start of a match arm.][47947] e.g.
4929 ```rust
4930 enum Foo { A, B, C }
4931
4932 fn main() {
4933     let x = Foo::A;
4934     match x {
4935         | Foo::A
4936         | Foo::B => println!("AB"),
4937         | Foo::C => println!("C"),
4938     }
4939 }
4940 ```
4941
4942 Compiler
4943 --------
4944 - [Upgraded to LLVM 6.][47828]
4945 - [Added `-C lto=val` option.][47521]
4946 - [Added `i586-unknown-linux-musl` target][47282]
4947
4948 Libraries
4949 ---------
4950 - [Impl Send for `process::Command` on Unix.][47760]
4951 - [Impl PartialEq and Eq for `ParseCharError`.][47790]
4952 - [`UnsafeCell::into_inner` is now safe.][47204]
4953 - [Implement libstd for CloudABI.][47268]
4954 - [`Float::{from_bits, to_bits}` is now available in libcore.][46931]
4955 - [Implement `AsRef<Path>` for Component][46985]
4956 - [Implemented `Write` for `Cursor<&mut Vec<u8>>`][46830]
4957 - [Moved `Duration` to libcore.][46666]
4958
4959 Stabilized APIs
4960 ---------------
4961 - [`Location::column`]
4962 - [`ptr::NonNull`]
4963
4964 The following functions can now be used in a constant expression.
4965 eg. `static MINUTE: Duration = Duration::from_secs(60);`
4966 - [`Duration::new`][47300]
4967 - [`Duration::from_secs`][47300]
4968 - [`Duration::from_millis`][47300]
4969
4970 Cargo
4971 -----
4972 - [`cargo new` no longer removes `rust` or `rs` prefixs/suffixs.][cargo/5013]
4973 - [`cargo new` now defaults to creating a binary crate, instead of a
4974   library crate.][cargo/5029]
4975
4976 Misc
4977 ----
4978 - [Rust by example is now shipped with new releases][46196]
4979
4980 Compatibility Notes
4981 -------------------
4982 - [Deprecated `net::lookup_host`.][47510]
4983 - [`rustdoc` has switched to pulldown as the default markdown renderer.][47398]
4984 - The borrow checker was sometimes incorrectly permitting overlapping borrows
4985   around indexing operations (see [#47349][47349]). This has been fixed (which also
4986   enabled some correct code that used to cause errors (e.g. [#33903][33903] and [#46095][46095]).
4987 - [Removed deprecated unstable attribute `#[simd]`.][47251]
4988
4989 [33903]: https://github.com/rust-lang/rust/pull/33903
4990 [47947]: https://github.com/rust-lang/rust/pull/47947
4991 [47948]: https://github.com/rust-lang/rust/pull/47948
4992 [47760]: https://github.com/rust-lang/rust/pull/47760
4993 [47790]: https://github.com/rust-lang/rust/pull/47790
4994 [47828]: https://github.com/rust-lang/rust/pull/47828
4995 [47398]: https://github.com/rust-lang/rust/pull/47398
4996 [47510]: https://github.com/rust-lang/rust/pull/47510
4997 [47521]: https://github.com/rust-lang/rust/pull/47521
4998 [47204]: https://github.com/rust-lang/rust/pull/47204
4999 [47251]: https://github.com/rust-lang/rust/pull/47251
5000 [47268]: https://github.com/rust-lang/rust/pull/47268
5001 [47282]: https://github.com/rust-lang/rust/pull/47282
5002 [47300]: https://github.com/rust-lang/rust/pull/47300
5003 [47349]: https://github.com/rust-lang/rust/pull/47349
5004 [46931]: https://github.com/rust-lang/rust/pull/46931
5005 [46985]: https://github.com/rust-lang/rust/pull/46985
5006 [47006]: https://github.com/rust-lang/rust/pull/47006
5007 [46830]: https://github.com/rust-lang/rust/pull/46830
5008 [46095]: https://github.com/rust-lang/rust/pull/46095
5009 [46666]: https://github.com/rust-lang/rust/pull/46666
5010 [46196]: https://github.com/rust-lang/rust/pull/46196
5011 [cargo/5013]: https://github.com/rust-lang/cargo/pull/5013
5012 [cargo/5029]: https://github.com/rust-lang/cargo/pull/5029
5013 [RFC 1358]: https://github.com/rust-lang/rfcs/pull/1358
5014 [`Location::column`]: https://doc.rust-lang.org/std/panic/struct.Location.html#method.column
5015 [`ptr::NonNull`]: https://doc.rust-lang.org/std/ptr/struct.NonNull.html
5016
5017
5018 Version 1.24.1 (2018-03-01)
5019 ==========================
5020
5021  - [Do not abort when unwinding through FFI][48251]
5022  - [Emit UTF-16 files for linker arguments on Windows][48318]
5023  - [Make the error index generator work again][48308]
5024  - [Cargo will warn on Windows 7 if an update is needed][cargo/5069].
5025
5026 [48251]: https://github.com/rust-lang/rust/issues/48251
5027 [48308]: https://github.com/rust-lang/rust/issues/48308
5028 [48318]: https://github.com/rust-lang/rust/issues/48318
5029 [cargo/5069]: https://github.com/rust-lang/cargo/pull/5069
5030
5031
5032 Version 1.24.0 (2018-02-15)
5033 ==========================
5034
5035 Language
5036 --------
5037 - [External `sysv64` ffi is now available.][46528]
5038   eg. `extern "sysv64" fn foo () {}`
5039
5040 Compiler
5041 --------
5042 - [rustc now uses 16 codegen units by default for release builds.][46910]
5043   For the fastest builds, utilize `codegen-units=1`.
5044 - [Added `armv4t-unknown-linux-gnueabi` target.][47018]
5045 - [Add `aarch64-unknown-openbsd` support][46760]
5046
5047 Libraries
5048 ---------
5049 - [`str::find::<char>` now uses memchr.][46735] This should lead to a 10x
5050   improvement in performance in the majority of cases.
5051 - [`OsStr`'s `Debug` implementation is now lossless and consistent
5052   with Windows.][46798]
5053 - [`time::{SystemTime, Instant}` now implement `Hash`.][46828]
5054 - [impl `From<bool>` for `AtomicBool`][46293]
5055 - [impl `From<{CString, &CStr}>` for `{Arc<CStr>, Rc<CStr>}`][45990]
5056 - [impl `From<{OsString, &OsStr}>` for `{Arc<OsStr>, Rc<OsStr>}`][45990]
5057 - [impl `From<{PathBuf, &Path}>` for `{Arc<Path>, Rc<Path>}`][45990]
5058 - [float::from_bits now just uses transmute.][46012] This provides
5059   some optimisations from LLVM.
5060 - [Copied `AsciiExt` methods onto `char`][46077]
5061 - [Remove `T: Sized` requirement on `ptr::is_null()`][46094]
5062 - [impl `From<RecvError>` for `{TryRecvError, RecvTimeoutError}`][45506]
5063 - [Optimised `f32::{min, max}` to generate more efficient x86 assembly][47080]
5064 - [`[u8]::contains` now uses memchr which provides a 3x speed improvement][46713]
5065
5066 Stabilized APIs
5067 ---------------
5068 - [`RefCell::replace`]
5069 - [`RefCell::swap`]
5070 - [`atomic::spin_loop_hint`]
5071
5072 The following functions can now be used in a constant expression.
5073 eg. `let buffer: [u8; size_of::<usize>()];`, `static COUNTER: AtomicUsize = AtomicUsize::new(1);`
5074
5075 - [`AtomicBool::new`][46287]
5076 - [`AtomicUsize::new`][46287]
5077 - [`AtomicIsize::new`][46287]
5078 - [`AtomicPtr::new`][46287]
5079 - [`Cell::new`][46287]
5080 - [`{integer}::min_value`][46287]
5081 - [`{integer}::max_value`][46287]
5082 - [`mem::size_of`][46287]
5083 - [`mem::align_of`][46287]
5084 - [`ptr::null`][46287]
5085 - [`ptr::null_mut`][46287]
5086 - [`RefCell::new`][46287]
5087 - [`UnsafeCell::new`][46287]
5088
5089 Cargo
5090 -----
5091 - [Added a `workspace.default-members` config that
5092   overrides implied `--all` in virtual workspaces.][cargo/4743]
5093 - [Enable incremental by default on development builds.][cargo/4817] Also added
5094   configuration keys to `Cargo.toml` and `.cargo/config` to disable on a
5095   per-project or global basis respectively.
5096
5097 Misc
5098 ----
5099
5100 Compatibility Notes
5101 -------------------
5102 - [Floating point types `Debug` impl now always prints a decimal point.][46831]
5103 - [`Ipv6Addr` now rejects superfluous `::`'s in IPv6 addresses][46671] This is
5104   in accordance with IETF RFC 4291 §2.2.
5105 - [Unwinding will no longer go past FFI boundaries, and will instead abort.][46833]
5106 - [`Formatter::flags` method is now deprecated.][46284] The `sign_plus`,
5107   `sign_minus`, `alternate`, and `sign_aware_zero_pad` should be used instead.
5108 - [Leading zeros in tuple struct members is now an error][47084]
5109 - [`column!()` macro is one-based instead of zero-based][46977]
5110 - [`fmt::Arguments` can no longer be shared across threads][45198]
5111 - [Access to `#[repr(packed)]` struct fields is now unsafe][44884]
5112 - [Cargo sets a different working directory for the compiler][cargo/4788]
5113
5114 [44884]: https://github.com/rust-lang/rust/pull/44884
5115 [45198]: https://github.com/rust-lang/rust/pull/45198
5116 [45506]: https://github.com/rust-lang/rust/pull/45506
5117 [45904]: https://github.com/rust-lang/rust/pull/45904
5118 [45990]: https://github.com/rust-lang/rust/pull/45990
5119 [46012]: https://github.com/rust-lang/rust/pull/46012
5120 [46077]: https://github.com/rust-lang/rust/pull/46077
5121 [46094]: https://github.com/rust-lang/rust/pull/46094
5122 [46284]: https://github.com/rust-lang/rust/pull/46284
5123 [46287]: https://github.com/rust-lang/rust/pull/46287
5124 [46293]: https://github.com/rust-lang/rust/pull/46293
5125 [46528]: https://github.com/rust-lang/rust/pull/46528
5126 [46671]: https://github.com/rust-lang/rust/pull/46671
5127 [46713]: https://github.com/rust-lang/rust/pull/46713
5128 [46735]: https://github.com/rust-lang/rust/pull/46735
5129 [46749]: https://github.com/rust-lang/rust/pull/46749
5130 [46760]: https://github.com/rust-lang/rust/pull/46760
5131 [46798]: https://github.com/rust-lang/rust/pull/46798
5132 [46828]: https://github.com/rust-lang/rust/pull/46828
5133 [46831]: https://github.com/rust-lang/rust/pull/46831
5134 [46833]: https://github.com/rust-lang/rust/pull/46833
5135 [46910]: https://github.com/rust-lang/rust/pull/46910
5136 [46977]: https://github.com/rust-lang/rust/pull/46977
5137 [47018]: https://github.com/rust-lang/rust/pull/47018
5138 [47080]: https://github.com/rust-lang/rust/pull/47080
5139 [47084]: https://github.com/rust-lang/rust/pull/47084
5140 [cargo/4743]: https://github.com/rust-lang/cargo/pull/4743
5141 [cargo/4788]: https://github.com/rust-lang/cargo/pull/4788
5142 [cargo/4817]: https://github.com/rust-lang/cargo/pull/4817
5143 [`RefCell::replace`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.replace
5144 [`RefCell::swap`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.swap
5145 [`atomic::spin_loop_hint`]: https://doc.rust-lang.org/std/sync/atomic/fn.spin_loop_hint.html
5146
5147
5148 Version 1.23.0 (2018-01-04)
5149 ==========================
5150
5151 Language
5152 --------
5153 - [Arbitrary `auto` traits are now permitted in trait objects.][45772]
5154 - [rustc now uses subtyping on the left hand side of binary operations.][45435]
5155   Which should fix some confusing errors in some operations.
5156
5157 Compiler
5158 --------
5159 - [Enabled `TrapUnreachable` in LLVM which should mitigate the impact of
5160   undefined behavior.][45920]
5161 - [rustc now suggests renaming import if names clash.][45660]
5162 - [Display errors/warnings correctly when there are zero-width or
5163   wide characters.][45711]
5164 - [rustc now avoids unnecessary copies of arguments that are
5165   simple bindings][45380] This should improve memory usage on average by 5-10%.
5166 - [Updated musl used to build musl rustc to 1.1.17][45393]
5167
5168 Libraries
5169 ---------
5170 - [Allow a trailing comma in `assert_eq/ne` macro][45887]
5171 - [Implement Hash for raw pointers to unsized types][45483]
5172 - [impl `From<*mut T>` for `AtomicPtr<T>`][45610]
5173 - [impl `From<usize/isize>` for `AtomicUsize/AtomicIsize`.][45610]
5174 - [Removed the `T: Sync` requirement for `RwLock<T>: Send`][45267]
5175 - [Removed `T: Sized` requirement for `{<*const T>, <*mut T>}::as_ref`
5176   and `<*mut T>::as_mut`][44932]
5177 - [Optimized `Thread::{park, unpark}` implementation][45524]
5178 - [Improved `SliceExt::binary_search` performance.][45333]
5179 - [impl `FromIterator<()>` for `()`][45379]
5180 - [Copied `AsciiExt` trait methods to primitive types.][44042] Use of `AsciiExt`
5181   is now deprecated.
5182
5183 Stabilized APIs
5184 ---------------
5185
5186 Cargo
5187 -----
5188 - [Cargo now supports uninstallation of multiple packages][cargo/4561]
5189   eg. `cargo uninstall foo bar` uninstalls `foo` and `bar`.
5190 - [Added unit test checking to `cargo check`][cargo/4592]
5191 - [Cargo now lets you install a specific version
5192   using `cargo install --version`][cargo/4637]
5193
5194 Misc
5195 ----
5196 - [Releases now ship with the Cargo book documentation.][45692]
5197 - [rustdoc now prints rendering warnings on every run.][45324]
5198
5199 Compatibility Notes
5200 -------------------
5201 - [Changes have been made to type equality to make it more correct,
5202   in rare cases this could break some code.][45853] [Tracking issue for
5203   further information][45852]
5204 - [`char::escape_debug` now uses Unicode 10 over 9.][45571]
5205 - [Upgraded Android SDK to 27, and NDK to r15c.][45580] This drops support for
5206   Android 9, the minimum supported version is Android 14.
5207 - [Bumped the minimum LLVM to 3.9][45326]
5208
5209 [44042]: https://github.com/rust-lang/rust/pull/44042
5210 [44932]: https://github.com/rust-lang/rust/pull/44932
5211 [45267]: https://github.com/rust-lang/rust/pull/45267
5212 [45324]: https://github.com/rust-lang/rust/pull/45324
5213 [45326]: https://github.com/rust-lang/rust/pull/45326
5214 [45333]: https://github.com/rust-lang/rust/pull/45333
5215 [45379]: https://github.com/rust-lang/rust/pull/45379
5216 [45380]: https://github.com/rust-lang/rust/pull/45380
5217 [45393]: https://github.com/rust-lang/rust/pull/45393
5218 [45435]: https://github.com/rust-lang/rust/pull/45435
5219 [45483]: https://github.com/rust-lang/rust/pull/45483
5220 [45524]: https://github.com/rust-lang/rust/pull/45524
5221 [45571]: https://github.com/rust-lang/rust/pull/45571
5222 [45580]: https://github.com/rust-lang/rust/pull/45580
5223 [45610]: https://github.com/rust-lang/rust/pull/45610
5224 [45660]: https://github.com/rust-lang/rust/pull/45660
5225 [45692]: https://github.com/rust-lang/rust/pull/45692
5226 [45711]: https://github.com/rust-lang/rust/pull/45711
5227 [45772]: https://github.com/rust-lang/rust/pull/45772
5228 [45852]: https://github.com/rust-lang/rust/issues/45852
5229 [45853]: https://github.com/rust-lang/rust/pull/45853
5230 [45887]: https://github.com/rust-lang/rust/pull/45887
5231 [45920]: https://github.com/rust-lang/rust/pull/45920
5232 [cargo/4561]: https://github.com/rust-lang/cargo/pull/4561
5233 [cargo/4592]: https://github.com/rust-lang/cargo/pull/4592
5234 [cargo/4637]: https://github.com/rust-lang/cargo/pull/4637
5235
5236
5237 Version 1.22.1 (2017-11-22)
5238 ==========================
5239
5240 - [Update Cargo to fix an issue with macOS 10.13 "High Sierra"][46183]
5241
5242 [46183]: https://github.com/rust-lang/rust/pull/46183
5243
5244 Version 1.22.0 (2017-11-22)
5245 ==========================
5246
5247 Language
5248 --------
5249 - [`non_snake_case` lint now allows extern no-mangle functions][44966]
5250 - [Now accepts underscores in unicode escapes][43716]
5251 - [`T op= &T` now works for numeric types.][44287] eg. `let mut x = 2; x += &8;`
5252 - [types that impl `Drop` are now allowed in `const` and `static` types][44456]
5253
5254 Compiler
5255 --------
5256 - [rustc now defaults to having 16 codegen units at debug on supported platforms.][45064]
5257 - [rustc will no longer inline in codegen units when compiling for debug][45075]
5258   This should decrease compile times for debug builds.
5259 - [strict memory alignment now enabled on ARMv6][45094]
5260 - [Remove support for the PNaCl target `le32-unknown-nacl`][45041]
5261
5262 Libraries
5263 ---------
5264 - [Allow atomic operations up to 32 bits
5265   on `armv5te_unknown_linux_gnueabi`][44978]
5266 - [`Box<Error>` now impls `From<Cow<str>>`][44466]
5267 - [`std::mem::Discriminant` is now guaranteed to be `Send + Sync`][45095]
5268 - [`fs::copy` now returns the length of the main stream on NTFS.][44895]
5269 - [Properly detect overflow in `Instant += Duration`.][44220]
5270 - [impl `Hasher` for `{&mut Hasher, Box<Hasher>}`][44015]
5271 - [impl `fmt::Debug` for `SplitWhitespace`.][44303]
5272 - [`Option<T>` now impls `Try`][42526] This allows for using `?` with `Option` types.
5273
5274 Stabilized APIs
5275 ---------------
5276
5277 Cargo
5278 -----
5279 - [Cargo will now build multi file examples in subdirectories of the `examples`
5280   folder that have a `main.rs` file.][cargo/4496]
5281 - [Changed `[root]` to `[package]` in `Cargo.lock`][cargo/4571] Packages with
5282   the old format will continue to work and can be updated with `cargo update`.
5283 - [Now supports vendoring git repositories][cargo/3992]
5284
5285 Misc
5286 ----
5287 - [`libbacktrace` is now available on Apple platforms.][44251]
5288 - [Stabilised the `compile_fail` attribute for code fences in doc-comments.][43949]
5289   This now lets you specify that a given code example will fail to compile.
5290
5291 Compatibility Notes
5292 -------------------
5293 - [The minimum Android version that rustc can build for has been bumped
5294   to `4.0` from `2.3`][45656]
5295 - [Allowing `T op= &T` for numeric types has broken some type
5296   inference cases][45480]
5297
5298
5299 [42526]: https://github.com/rust-lang/rust/pull/42526
5300 [43017]: https://github.com/rust-lang/rust/pull/43017
5301 [43716]: https://github.com/rust-lang/rust/pull/43716
5302 [43949]: https://github.com/rust-lang/rust/pull/43949
5303 [44015]: https://github.com/rust-lang/rust/pull/44015
5304 [44220]: https://github.com/rust-lang/rust/pull/44220
5305 [44251]: https://github.com/rust-lang/rust/pull/44251
5306 [44287]: https://github.com/rust-lang/rust/pull/44287
5307 [44303]: https://github.com/rust-lang/rust/pull/44303
5308 [44456]: https://github.com/rust-lang/rust/pull/44456
5309 [44466]: https://github.com/rust-lang/rust/pull/44466
5310 [44895]: https://github.com/rust-lang/rust/pull/44895
5311 [44966]: https://github.com/rust-lang/rust/pull/44966
5312 [44978]: https://github.com/rust-lang/rust/pull/44978
5313 [45041]: https://github.com/rust-lang/rust/pull/45041
5314 [45064]: https://github.com/rust-lang/rust/pull/45064
5315 [45075]: https://github.com/rust-lang/rust/pull/45075
5316 [45094]: https://github.com/rust-lang/rust/pull/45094
5317 [45095]: https://github.com/rust-lang/rust/pull/45095
5318 [45480]: https://github.com/rust-lang/rust/issues/45480
5319 [45656]: https://github.com/rust-lang/rust/pull/45656
5320 [cargo/3992]: https://github.com/rust-lang/cargo/pull/3992
5321 [cargo/4496]: https://github.com/rust-lang/cargo/pull/4496
5322 [cargo/4571]: https://github.com/rust-lang/cargo/pull/4571
5323
5324
5325
5326
5327
5328
5329 Version 1.21.0 (2017-10-12)
5330 ==========================
5331
5332 Language
5333 --------
5334 - [You can now use static references for literals.][43838]
5335   Example:
5336   ```rust
5337   fn main() {
5338       let x: &'static u32 = &0;
5339   }
5340   ```
5341 - [Relaxed path syntax. Optional `::` before `<` is now allowed in all contexts.][43540]
5342   Example:
5343   ```rust
5344   my_macro!(Vec<i32>::new); // Always worked
5345   my_macro!(Vec::<i32>::new); // Now works
5346   ```
5347
5348 Compiler
5349 --------
5350 - [Upgraded jemalloc to 4.5.0][43911]
5351 - [Enabled unwinding panics on Redox][43917]
5352 - [Now runs LLVM in parallel during translation phase.][43506]
5353   This should reduce peak memory usage.
5354
5355 Libraries
5356 ---------
5357 - [Generate builtin impls for `Clone` for all arrays and tuples that
5358   are `T: Clone`][43690]
5359 - [`Stdin`, `Stdout`, and `Stderr` now implement `AsRawFd`.][43459]
5360 - [`Rc` and `Arc` now implement `From<&[T]> where T: Clone`, `From<str>`,
5361   `From<String>`, `From<Box<T>> where T: ?Sized`, and `From<Vec<T>>`.][42565]
5362
5363 Stabilized APIs
5364 ---------------
5365
5366 [`std::mem::discriminant`]
5367
5368 Cargo
5369 -----
5370 - [You can now call `cargo install` with multiple package names][cargo/4216]
5371 - [Cargo commands inside a virtual workspace will now implicitly
5372   pass `--all`][cargo/4335]
5373 - [Added a `[patch]` section to `Cargo.toml` to handle
5374   prepublication dependencies][cargo/4123] [RFC 1969]
5375 - [`include` & `exclude` fields in `Cargo.toml` now accept gitignore
5376   like patterns][cargo/4270]
5377 - [Added the `--all-targets` option][cargo/4400]
5378 - [Using required dependencies as a feature is now deprecated and emits
5379   a warning][cargo/4364]
5380
5381
5382 Misc
5383 ----
5384 - [Cargo docs are moving][43916]
5385   to [doc.rust-lang.org/cargo](https://doc.rust-lang.org/cargo)
5386 - [The rustdoc book is now available][43863]
5387   at [doc.rust-lang.org/rustdoc](https://doc.rust-lang.org/rustdoc)
5388 - [Added a preview of RLS has been made available through rustup][44204]
5389   Install with `rustup component add rls-preview`
5390 - [`std::os` documentation for Unix, Linux, and Windows now appears on doc.rust-lang.org][43348]
5391   Previously only showed `std::os::unix`.
5392
5393 Compatibility Notes
5394 -------------------
5395 - [Changes in method matching against higher-ranked types][43880] This may cause
5396   breakage in subtyping corner cases. [A more in-depth explanation is available.][info/43880]
5397 - [rustc's JSON error output's byte position start at top of file.][42973]
5398   Was previously relative to the rustc's internal `CodeMap` struct which
5399   required the unstable library `libsyntax` to correctly use.
5400 - [`unused_results` lint no longer ignores booleans][43728]
5401
5402 [42565]: https://github.com/rust-lang/rust/pull/42565
5403 [42973]: https://github.com/rust-lang/rust/pull/42973
5404 [43348]: https://github.com/rust-lang/rust/pull/43348
5405 [43459]: https://github.com/rust-lang/rust/pull/43459
5406 [43506]: https://github.com/rust-lang/rust/pull/43506
5407 [43540]: https://github.com/rust-lang/rust/pull/43540
5408 [43690]: https://github.com/rust-lang/rust/pull/43690
5409 [43728]: https://github.com/rust-lang/rust/pull/43728
5410 [43838]: https://github.com/rust-lang/rust/pull/43838
5411 [43863]: https://github.com/rust-lang/rust/pull/43863
5412 [43880]: https://github.com/rust-lang/rust/pull/43880
5413 [43911]: https://github.com/rust-lang/rust/pull/43911
5414 [43916]: https://github.com/rust-lang/rust/pull/43916
5415 [43917]: https://github.com/rust-lang/rust/pull/43917
5416 [44204]: https://github.com/rust-lang/rust/pull/44204
5417 [cargo/4123]: https://github.com/rust-lang/cargo/pull/4123
5418 [cargo/4216]: https://github.com/rust-lang/cargo/pull/4216
5419 [cargo/4270]: https://github.com/rust-lang/cargo/pull/4270
5420 [cargo/4335]: https://github.com/rust-lang/cargo/pull/4335
5421 [cargo/4364]: https://github.com/rust-lang/cargo/pull/4364
5422 [cargo/4400]: https://github.com/rust-lang/cargo/pull/4400
5423 [RFC 1969]: https://github.com/rust-lang/rfcs/pull/1969
5424 [info/43880]: https://github.com/rust-lang/rust/issues/44224#issuecomment-330058902
5425 [`std::mem::discriminant`]: https://doc.rust-lang.org/std/mem/fn.discriminant.html
5426
5427 Version 1.20.0 (2017-08-31)
5428 ===========================
5429
5430 Language
5431 --------
5432 - [Associated constants are now stabilised.][42809]
5433 - [A lot of macro bugs are now fixed.][42913]
5434
5435 Compiler
5436 --------
5437
5438 - [Struct fields are now properly coerced to the expected field type.][42807]
5439 - [Enabled wasm LLVM backend][42571] WASM can now be built with the
5440   `wasm32-experimental-emscripten` target.
5441 - [Changed some of the error messages to be more helpful.][42033]
5442 - [Add support for RELRO(RELocation Read-Only) for platforms that support
5443   it.][43170]
5444 - [rustc now reports the total number of errors on compilation failure][43015]
5445   previously this was only the number of errors in the pass that failed.
5446 - [Expansion in rustc has been sped up 29x.][42533]
5447 - [added `msp430-none-elf` target.][43099]
5448 - [rustc will now suggest one-argument enum variant to fix type mismatch when
5449   applicable][43178]
5450 - [Fixes backtraces on Redox][43228]
5451 - [rustc now identifies different versions of same crate when absolute paths of
5452   different types match in an error message.][42826]
5453
5454 Libraries
5455 ---------
5456
5457
5458 - [Relaxed Debug constraints on `{HashMap,BTreeMap}::{Keys,Values}`.][42854]
5459 - [Impl `PartialEq`, `Eq`, `PartialOrd`, `Ord`, `Debug`, `Hash` for unsized
5460   tuples.][43011]
5461 - [Impl `fmt::{Display, Debug}` for `Ref`, `RefMut`, `MutexGuard`,
5462   `RwLockReadGuard`, `RwLockWriteGuard`][42822]
5463 - [Impl `Clone` for `DefaultHasher`.][42799]
5464 - [Impl `Sync` for `SyncSender`.][42397]
5465 - [Impl `FromStr` for `char`][42271]
5466 - [Fixed how `{f32, f64}::{is_sign_negative, is_sign_positive}` handles
5467   NaN.][42431]
5468 - [allow messages in the `unimplemented!()` macro.][42155]
5469   ie. `unimplemented!("Waiting for 1.21 to be stable")`
5470 - [`pub(restricted)` is now supported in the `thread_local!` macro.][43185]
5471 - [Upgrade to Unicode 10.0.0][42999]
5472 - [Reimplemented `{f32, f64}::{min, max}` in Rust instead of using CMath.][42430]
5473 - [Skip the main thread's manual stack guard on Linux][43072]
5474 - [Iterator::nth for `ops::{Range, RangeFrom}` is now done in *O*(1) time][43077]
5475 - [`#[repr(align(N))]` attribute max number is now 2^31 - 1.][43097] This was
5476   previously 2^15.
5477 - [`{OsStr, Path}::Display` now avoids allocations where possible][42613]
5478
5479 Stabilized APIs
5480 ---------------
5481
5482 - [`CStr::into_c_string`]
5483 - [`CString::as_c_str`]
5484 - [`CString::into_boxed_c_str`]
5485 - [`Chain::get_mut`]
5486 - [`Chain::get_ref`]
5487 - [`Chain::into_inner`]
5488 - [`Option::get_or_insert_with`]
5489 - [`Option::get_or_insert`]
5490 - [`OsStr::into_os_string`]
5491 - [`OsString::into_boxed_os_str`]
5492 - [`Take::get_mut`]
5493 - [`Take::get_ref`]
5494 - [`Utf8Error::error_len`]
5495 - [`char::EscapeDebug`]
5496 - [`char::escape_debug`]
5497 - [`compile_error!`]
5498 - [`f32::from_bits`]
5499 - [`f32::to_bits`]
5500 - [`f64::from_bits`]
5501 - [`f64::to_bits`]
5502 - [`mem::ManuallyDrop`]
5503 - [`slice::sort_unstable_by_key`]
5504 - [`slice::sort_unstable_by`]
5505 - [`slice::sort_unstable`]
5506 - [`str::from_boxed_utf8_unchecked`]
5507 - [`str::as_bytes_mut`]
5508 - [`str::as_bytes_mut`]
5509 - [`str::from_utf8_mut`]
5510 - [`str::from_utf8_unchecked_mut`]
5511 - [`str::get_mut`]
5512 - [`str::get_unchecked_mut`]
5513 - [`str::get_unchecked`]
5514 - [`str::get`]
5515 - [`str::into_boxed_bytes`]
5516
5517
5518 Cargo
5519 -----
5520 - [Cargo API token location moved from `~/.cargo/config` to
5521   `~/.cargo/credentials`.][cargo/3978]
5522 - [Cargo will now build `main.rs` binaries that are in sub-directories of
5523   `src/bin`.][cargo/4214] ie. Having `src/bin/server/main.rs` and
5524   `src/bin/client/main.rs` generates `target/debug/server` and `target/debug/client`
5525 - [You can now specify version of a binary when installed through
5526   `cargo install` using `--vers`.][cargo/4229]
5527 - [Added `--no-fail-fast` flag to cargo to run all benchmarks regardless of
5528   failure.][cargo/4248]
5529 - [Changed the convention around which file is the crate root.][cargo/4259]
5530 - [The `include`/`exclude` property in `Cargo.toml` now accepts gitignore paths
5531   instead of glob patterns][cargo/4270]. Glob patterns are now deprecated.
5532
5533 Compatibility Notes
5534 -------------------
5535
5536 - [Functions with `'static` in their return types will now not be as usable as
5537   if they were using lifetime parameters instead.][42417]
5538 - [The reimplementation of `{f32, f64}::is_sign_{negative, positive}` now
5539   takes the sign of NaN into account where previously didn't.][42430]
5540
5541 [42033]: https://github.com/rust-lang/rust/pull/42033
5542 [42155]: https://github.com/rust-lang/rust/pull/42155
5543 [42271]: https://github.com/rust-lang/rust/pull/42271
5544 [42397]: https://github.com/rust-lang/rust/pull/42397
5545 [42417]: https://github.com/rust-lang/rust/pull/42417
5546 [42430]: https://github.com/rust-lang/rust/pull/42430
5547 [42431]: https://github.com/rust-lang/rust/pull/42431
5548 [42533]: https://github.com/rust-lang/rust/pull/42533
5549 [42571]: https://github.com/rust-lang/rust/pull/42571
5550 [42613]: https://github.com/rust-lang/rust/pull/42613
5551 [42799]: https://github.com/rust-lang/rust/pull/42799
5552 [42807]: https://github.com/rust-lang/rust/pull/42807
5553 [42809]: https://github.com/rust-lang/rust/pull/42809
5554 [42822]: https://github.com/rust-lang/rust/pull/42822
5555 [42826]: https://github.com/rust-lang/rust/pull/42826
5556 [42854]: https://github.com/rust-lang/rust/pull/42854
5557 [42913]: https://github.com/rust-lang/rust/pull/42913
5558 [42999]: https://github.com/rust-lang/rust/pull/42999
5559 [43011]: https://github.com/rust-lang/rust/pull/43011
5560 [43015]: https://github.com/rust-lang/rust/pull/43015
5561 [43072]: https://github.com/rust-lang/rust/pull/43072
5562 [43077]: https://github.com/rust-lang/rust/pull/43077
5563 [43097]: https://github.com/rust-lang/rust/pull/43097
5564 [43099]: https://github.com/rust-lang/rust/pull/43099
5565 [43170]: https://github.com/rust-lang/rust/pull/43170
5566 [43178]: https://github.com/rust-lang/rust/pull/43178
5567 [43185]: https://github.com/rust-lang/rust/pull/43185
5568 [43228]: https://github.com/rust-lang/rust/pull/43228
5569 [cargo/3978]: https://github.com/rust-lang/cargo/pull/3978
5570 [cargo/4214]: https://github.com/rust-lang/cargo/pull/4214
5571 [cargo/4229]: https://github.com/rust-lang/cargo/pull/4229
5572 [cargo/4248]: https://github.com/rust-lang/cargo/pull/4248
5573 [cargo/4259]: https://github.com/rust-lang/cargo/pull/4259
5574 [cargo/4270]: https://github.com/rust-lang/cargo/pull/4270
5575 [`CStr::into_c_string`]: https://doc.rust-lang.org/std/ffi/struct.CStr.html#method.into_c_string
5576 [`CString::as_c_str`]: https://doc.rust-lang.org/std/ffi/struct.CString.html#method.as_c_str
5577 [`CString::into_boxed_c_str`]: https://doc.rust-lang.org/std/ffi/struct.CString.html#method.into_boxed_c_str
5578 [`Chain::get_mut`]: https://doc.rust-lang.org/std/io/struct.Chain.html#method.get_mut
5579 [`Chain::get_ref`]: https://doc.rust-lang.org/std/io/struct.Chain.html#method.get_ref
5580 [`Chain::into_inner`]: https://doc.rust-lang.org/std/io/struct.Chain.html#method.into_inner
5581 [`Option::get_or_insert_with`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.get_or_insert_with
5582 [`Option::get_or_insert`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.get_or_insert
5583 [`OsStr::into_os_string`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html#method.into_os_string
5584 [`OsString::into_boxed_os_str`]: https://doc.rust-lang.org/std/ffi/struct.OsString.html#method.into_boxed_os_str
5585 [`Take::get_mut`]: https://doc.rust-lang.org/std/io/struct.Take.html#method.get_mut
5586 [`Take::get_ref`]: https://doc.rust-lang.org/std/io/struct.Take.html#method.get_ref
5587 [`Utf8Error::error_len`]: https://doc.rust-lang.org/std/str/struct.Utf8Error.html#method.error_len
5588 [`char::EscapeDebug`]: https://doc.rust-lang.org/std/char/struct.EscapeDebug.html
5589 [`char::escape_debug`]: https://doc.rust-lang.org/std/primitive.char.html#method.escape_debug
5590 [`compile_error!`]: https://doc.rust-lang.org/std/macro.compile_error.html
5591 [`f32::from_bits`]: https://doc.rust-lang.org/std/primitive.f32.html#method.from_bits
5592 [`f32::to_bits`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_bits
5593 [`f64::from_bits`]: https://doc.rust-lang.org/std/primitive.f64.html#method.from_bits
5594 [`f64::to_bits`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_bits
5595 [`mem::ManuallyDrop`]: https://doc.rust-lang.org/std/mem/union.ManuallyDrop.html
5596 [`slice::sort_unstable_by_key`]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_unstable_by_key
5597 [`slice::sort_unstable_by`]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_unstable_by
5598 [`slice::sort_unstable`]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_unstable
5599 [`str::from_boxed_utf8_unchecked`]: https://doc.rust-lang.org/std/str/fn.from_boxed_utf8_unchecked.html
5600 [`str::as_bytes_mut`]: https://doc.rust-lang.org/std/primitive.str.html#method.as_bytes_mut
5601 [`str::from_utf8_mut`]: https://doc.rust-lang.org/std/str/fn.from_utf8_mut.html
5602 [`str::from_utf8_unchecked_mut`]: https://doc.rust-lang.org/std/str/fn.from_utf8_unchecked_mut.html
5603 [`str::get_mut`]: https://doc.rust-lang.org/std/primitive.str.html#method.get_mut
5604 [`str::get_unchecked_mut`]: https://doc.rust-lang.org/std/primitive.str.html#method.get_unchecked_mut
5605 [`str::get_unchecked`]: https://doc.rust-lang.org/std/primitive.str.html#method.get_unchecked
5606 [`str::get`]: https://doc.rust-lang.org/std/primitive.str.html#method.get
5607 [`str::into_boxed_bytes`]: https://doc.rust-lang.org/std/primitive.str.html#method.into_boxed_bytes
5608
5609
5610 Version 1.19.0 (2017-07-20)
5611 ===========================
5612
5613 Language
5614 --------
5615
5616 - [Numeric fields can now be used for creating tuple structs.][41145] [RFC 1506]
5617   For example `struct Point(u32, u32); let x = Point { 0: 7, 1: 0 };`.
5618 - [Macro recursion limit increased to 1024 from 64.][41676]
5619 - [Added lint for detecting unused macros.][41907]
5620 - [`loop` can now return a value with `break`.][42016] [RFC 1624]
5621   For example: `let x = loop { break 7; };`
5622 - [C compatible `union`s are now available.][42068] [RFC 1444] They can only
5623   contain `Copy` types and cannot have a `Drop` implementation.
5624   Example: `union Foo { bar: u8, baz: usize }`
5625 - [Non capturing closures can now be coerced into `fn`s,][42162] [RFC 1558]
5626   Example: `let foo: fn(u8) -> u8 = |v: u8| { v };`
5627
5628 Compiler
5629 --------
5630
5631 - [Add support for bootstrapping the Rust compiler toolchain on Android.][41370]
5632 - [Change `arm-linux-androideabi` to correspond to the `armeabi`
5633   official ABI.][41656] If you wish to continue targeting the `armeabi-v7a` ABI
5634   you should use `--target armv7-linux-androideabi`.
5635 - [Fixed ICE when removing a source file between compilation sessions.][41873]
5636 - [Minor optimisation of string operations.][42037]
5637 - [Compiler error message is now `aborting due to previous error(s)` instead of
5638   `aborting due to N previous errors`][42150] This was previously inaccurate and
5639   would only count certain kinds of errors.
5640 - [The compiler now supports Visual Studio 2017][42225]
5641 - [The compiler is now built against LLVM 4.0.1 by default][42948]
5642 - [Added a lot][42264] of [new error codes][42302]
5643 - [Added `target-feature=+crt-static` option][37406] [RFC 1721] Which allows
5644   libraries with C Run-time Libraries(CRT) to be statically linked.
5645 - [Fixed various ARM codegen bugs][42740]
5646
5647 Libraries
5648 ---------
5649
5650 - [`String` now implements `FromIterator<Cow<'a, str>>` and
5651   `Extend<Cow<'a, str>>`][41449]
5652 - [`Vec` now implements `From<&mut [T]>`][41530]
5653 - [`Box<[u8]>` now implements `From<Box<str>>`][41258]
5654 - [`SplitWhitespace` now implements `Clone`][41659]
5655 - [`[u8]::reverse` is now 5x faster and `[u16]::reverse` is now
5656   1.5x faster][41764]
5657 - [`eprint!` and `eprintln!` macros added to prelude.][41192] Same as the `print!`
5658   macros, but for printing to stderr.
5659
5660 Stabilized APIs
5661 ---------------
5662
5663 - [`OsString::shrink_to_fit`]
5664 - [`cmp::Reverse`]
5665 - [`Command::envs`]
5666 - [`thread::ThreadId`]
5667
5668 Cargo
5669 -----
5670
5671 - [Build scripts can now add environment variables to the environment
5672   the crate is being compiled in.
5673   Example: `println!("cargo:rustc-env=FOO=bar");`][cargo/3929]
5674 - [Subcommands now replace the current process rather than spawning a new
5675   child process][cargo/3970]
5676 - [Workspace members can now accept glob file patterns][cargo/3979]
5677 - [Added `--all` flag to the `cargo bench` subcommand to run benchmarks of all
5678   the members in a given workspace.][cargo/3988]
5679 - [Updated `libssh2-sys` to 0.2.6][cargo/4008]
5680 - [Target directory path is now in the cargo metadata][cargo/4022]
5681 - [Cargo no longer checks out a local working directory for the
5682   crates.io index][cargo/4026] This should provide smaller file size for the
5683   registry, and improve cloning times, especially on Windows machines.
5684 - [Added an `--exclude` option for excluding certain packages when using the
5685   `--all` option][cargo/4031]
5686 - [Cargo will now automatically retry when receiving a 5xx error
5687   from crates.io][cargo/4032]
5688 - [The `--features` option now accepts multiple comma or space
5689   delimited values.][cargo/4084]
5690 - [Added support for custom target specific runners][cargo/3954]
5691
5692 Misc
5693 ----
5694
5695 - [Added `rust-windbg.cmd`][39983] for loading rust `.natvis` files in the
5696   Windows Debugger.
5697 - [Rust will now release XZ compressed packages][rust-installer/57]
5698 - [rustup will now prefer to download rust packages with
5699   XZ compression][rustup/1100] over GZip packages.
5700 - [Added the ability to escape `#` in rust documentation][41785] By adding
5701   additional `#`'s ie. `##` is now `#`
5702
5703 Compatibility Notes
5704 -------------------
5705
5706 - [`MutexGuard<T>` may only be `Sync` if `T` is `Sync`.][41624]
5707 - [`-Z` flags are now no longer allowed to be used on the stable
5708   compiler.][41751] This has been a warning for a year previous to this.
5709 - [As a result of the `-Z` flag change, the `cargo-check` plugin no
5710   longer works][42844]. Users should migrate to the built-in `check`
5711   command, which has been available since 1.16.
5712 - [Ending a float literal with `._` is now a hard error.
5713   Example: `42._` .][41946]
5714 - [Any use of a private `extern crate` outside of its module is now a
5715   hard error.][36886] This was previously a warning.
5716 - [`use ::self::foo;` is now a hard error.][36888] `self` paths are always
5717   relative while the `::` prefix makes a path absolute, but was ignored and the
5718   path was relative regardless.
5719 - [Floating point constants in match patterns is now a hard error][36890]
5720   This was previously a warning.
5721 - [Struct or enum constants that don't derive `PartialEq` & `Eq` used
5722   match patterns is now a hard error][36891] This was previously a warning.
5723 - [Lifetimes named `'_` are no longer allowed.][36892] This was previously
5724   a warning.
5725 - [From the pound escape, lines consisting of multiple `#`s are
5726   now visible][41785]
5727 - [It is an error to re-export private enum variants][42460]. This is
5728   known to break a number of crates that depend on an older version of
5729   mustache.
5730 - [On Windows, if `VCINSTALLDIR` is set incorrectly, `rustc` will try
5731   to use it to find the linker, and the build will fail where it did
5732   not previously][42607]
5733
5734 [36886]: https://github.com/rust-lang/rust/issues/36886
5735 [36888]: https://github.com/rust-lang/rust/issues/36888
5736 [36890]: https://github.com/rust-lang/rust/issues/36890
5737 [36891]: https://github.com/rust-lang/rust/issues/36891
5738 [36892]: https://github.com/rust-lang/rust/issues/36892
5739 [37406]: https://github.com/rust-lang/rust/issues/37406
5740 [39983]: https://github.com/rust-lang/rust/pull/39983
5741 [41145]: https://github.com/rust-lang/rust/pull/41145
5742 [41192]: https://github.com/rust-lang/rust/pull/41192
5743 [41258]: https://github.com/rust-lang/rust/pull/41258
5744 [41370]: https://github.com/rust-lang/rust/pull/41370
5745 [41449]: https://github.com/rust-lang/rust/pull/41449
5746 [41530]: https://github.com/rust-lang/rust/pull/41530
5747 [41624]: https://github.com/rust-lang/rust/pull/41624
5748 [41656]: https://github.com/rust-lang/rust/pull/41656
5749 [41659]: https://github.com/rust-lang/rust/pull/41659
5750 [41676]: https://github.com/rust-lang/rust/pull/41676
5751 [41751]: https://github.com/rust-lang/rust/pull/41751
5752 [41764]: https://github.com/rust-lang/rust/pull/41764
5753 [41785]: https://github.com/rust-lang/rust/pull/41785
5754 [41873]: https://github.com/rust-lang/rust/pull/41873
5755 [41907]: https://github.com/rust-lang/rust/pull/41907
5756 [41946]: https://github.com/rust-lang/rust/pull/41946
5757 [42016]: https://github.com/rust-lang/rust/pull/42016
5758 [42037]: https://github.com/rust-lang/rust/pull/42037
5759 [42068]: https://github.com/rust-lang/rust/pull/42068
5760 [42150]: https://github.com/rust-lang/rust/pull/42150
5761 [42162]: https://github.com/rust-lang/rust/pull/42162
5762 [42225]: https://github.com/rust-lang/rust/pull/42225
5763 [42264]: https://github.com/rust-lang/rust/pull/42264
5764 [42302]: https://github.com/rust-lang/rust/pull/42302
5765 [42460]: https://github.com/rust-lang/rust/issues/42460
5766 [42607]: https://github.com/rust-lang/rust/issues/42607
5767 [42740]: https://github.com/rust-lang/rust/pull/42740
5768 [42844]: https://github.com/rust-lang/rust/issues/42844
5769 [42948]: https://github.com/rust-lang/rust/pull/42948
5770 [RFC 1444]: https://github.com/rust-lang/rfcs/pull/1444
5771 [RFC 1506]: https://github.com/rust-lang/rfcs/pull/1506
5772 [RFC 1558]: https://github.com/rust-lang/rfcs/pull/1558
5773 [RFC 1624]: https://github.com/rust-lang/rfcs/pull/1624
5774 [RFC 1721]: https://github.com/rust-lang/rfcs/pull/1721
5775 [`Command::envs`]: https://doc.rust-lang.org/std/process/struct.Command.html#method.envs
5776 [`OsString::shrink_to_fit`]: https://doc.rust-lang.org/std/ffi/struct.OsString.html#method.shrink_to_fit
5777 [`cmp::Reverse`]: https://doc.rust-lang.org/std/cmp/struct.Reverse.html
5778 [`thread::ThreadId`]: https://doc.rust-lang.org/std/thread/struct.ThreadId.html
5779 [cargo/3929]: https://github.com/rust-lang/cargo/pull/3929
5780 [cargo/3954]: https://github.com/rust-lang/cargo/pull/3954
5781 [cargo/3970]: https://github.com/rust-lang/cargo/pull/3970
5782 [cargo/3979]: https://github.com/rust-lang/cargo/pull/3979
5783 [cargo/3988]: https://github.com/rust-lang/cargo/pull/3988
5784 [cargo/4008]: https://github.com/rust-lang/cargo/pull/4008
5785 [cargo/4022]: https://github.com/rust-lang/cargo/pull/4022
5786 [cargo/4026]: https://github.com/rust-lang/cargo/pull/4026
5787 [cargo/4031]: https://github.com/rust-lang/cargo/pull/4031
5788 [cargo/4032]: https://github.com/rust-lang/cargo/pull/4032
5789 [cargo/4084]: https://github.com/rust-lang/cargo/pull/4084
5790 [rust-installer/57]: https://github.com/rust-lang/rust-installer/pull/57
5791 [rustup/1100]: https://github.com/rust-lang-nursery/rustup.rs/pull/1100
5792
5793
5794 Version 1.18.0 (2017-06-08)
5795 ===========================
5796
5797 Language
5798 --------
5799
5800 - [Stabilize pub(restricted)][40556] `pub` can now accept a module path to
5801   make the item visible to just that module tree. Also accepts the keyword
5802   `crate` to make something public to the whole crate but not users of the
5803   library. Example: `pub(crate) mod utils;`. [RFC 1422].
5804 - [Stabilize `#![windows_subsystem]` attribute][40870] conservative exposure of the
5805   `/SUBSYSTEM` linker flag on Windows platforms. [RFC 1665].
5806 - [Refactor of trait object type parsing][40043] Now `ty` in macros can accept
5807   types like `Write + Send`, trailing `+` are now supported in trait objects,
5808   and better error reporting for trait objects starting with `?Sized`.
5809 - [0e+10 is now a valid floating point literal][40589]
5810 - [Now warns if you bind a lifetime parameter to 'static][40734]
5811 - [Tuples, Enum variant fields, and structs with no `repr` attribute or with
5812   `#[repr(Rust)]` are reordered to minimize padding and produce a smaller
5813   representation in some cases.][40377]
5814
5815 Compiler
5816 --------
5817
5818 - [rustc can now emit mir with `--emit mir`][39891]
5819 - [Improved LLVM IR for trivial functions][40367]
5820 - [Added explanation for E0090(Wrong number of lifetimes are supplied)][40723]
5821 - [rustc compilation is now 15%-20% faster][41469] Thanks to optimisation
5822   opportunities found through profiling
5823 - [Improved backtrace formatting when panicking][38165]
5824
5825 Libraries
5826 ---------
5827
5828 - [Specialized `Vec::from_iter` being passed `vec::IntoIter`][40731] if the
5829   iterator hasn't been advanced the original `Vec` is reassembled with no actual
5830   iteration or reallocation.
5831 - [Simplified HashMap Bucket interface][40561] provides performance
5832   improvements for iterating and cloning.
5833 - [Specialize Vec::from_elem to use calloc][40409]
5834 - [Fixed Race condition in fs::create_dir_all][39799]
5835 - [No longer caching stdio on Windows][40516]
5836 - [Optimized insertion sort in slice][40807] insertion sort in some cases
5837   2.50%~ faster and in one case now 12.50% faster.
5838 - [Optimized `AtomicBool::fetch_nand`][41143]
5839
5840 Stabilized APIs
5841 ---------------
5842
5843 - [`Child::try_wait`]
5844 - [`HashMap::retain`]
5845 - [`HashSet::retain`]
5846 - [`PeekMut::pop`]
5847 - [`TcpStream::peek`]
5848 - [`UdpSocket::peek`]
5849 - [`UdpSocket::peek_from`]
5850
5851 Cargo
5852 -----
5853
5854 - [Added partial Pijul support][cargo/3842] Pijul is a version control system in Rust.
5855   You can now create new cargo projects with Pijul using `cargo new --vcs pijul`
5856 - [Now always emits build script warnings for crates that fail to build][cargo/3847]
5857 - [Added Android build support][cargo/3885]
5858 - [Added `--bins` and `--tests` flags][cargo/3901] now you can build all programs
5859   of a certain type, for example `cargo build --bins` will build all
5860   binaries.
5861 - [Added support for haiku][cargo/3952]
5862
5863 Misc
5864 ----
5865
5866 - [rustdoc can now use pulldown-cmark with the `--enable-commonmark` flag][40338]
5867 - [Added rust-windbg script for better debugging on Windows][39983]
5868 - [Rust now uses the official cross compiler for NetBSD][40612]
5869 - [rustdoc now accepts `#` at the start of files][40828]
5870 - [Fixed jemalloc support for musl][41168]
5871
5872 Compatibility Notes
5873 -------------------
5874
5875 - [Changes to how the `0` flag works in format!][40241] Padding zeroes are now
5876   always placed after the sign if it exists and before the digits. With the `#`
5877   flag the zeroes are placed after the prefix and before the digits.
5878 - [Due to the struct field optimisation][40377], using `transmute` on structs
5879   that have no `repr` attribute or `#[repr(Rust)]` will no longer work. This has
5880   always been undefined behavior, but is now more likely to break in practice.
5881 - [The refactor of trait object type parsing][40043] fixed a bug where `+` was
5882   receiving the wrong priority parsing things like `&for<'a> Tr<'a> + Send` as
5883   `&(for<'a> Tr<'a> + Send)` instead of `(&for<'a> Tr<'a>) + Send`
5884 - [Overlapping inherent `impl`s are now a hard error][40728]
5885 - [`PartialOrd` and `Ord` must agree on the ordering.][41270]
5886 - [`rustc main.rs -o out --emit=asm,llvm-ir`][41085] Now will output
5887   `out.asm` and `out.ll` instead of only one of the filetypes.
5888 - [ calling a function that returns `Self` will no longer work][41805] when
5889   the size of `Self` cannot be statically determined.
5890 - [rustc now builds with a "pthreads" flavour of MinGW for Windows GNU][40805]
5891   this has caused a few regressions namely:
5892
5893   - Changed the link order of local static/dynamic libraries (respecting the
5894     order on given rather than having the compiler reorder).
5895   - Changed how MinGW is linked, native code linked to dynamic libraries
5896     may require manually linking to the gcc support library (for the native
5897     code itself)
5898
5899 [38165]: https://github.com/rust-lang/rust/pull/38165
5900 [39799]: https://github.com/rust-lang/rust/pull/39799
5901 [39891]: https://github.com/rust-lang/rust/pull/39891
5902 [39983]: https://github.com/rust-lang/rust/pull/39983
5903 [40043]: https://github.com/rust-lang/rust/pull/40043
5904 [40241]: https://github.com/rust-lang/rust/pull/40241
5905 [40338]: https://github.com/rust-lang/rust/pull/40338
5906 [40367]: https://github.com/rust-lang/rust/pull/40367
5907 [40377]: https://github.com/rust-lang/rust/pull/40377
5908 [40409]: https://github.com/rust-lang/rust/pull/40409
5909 [40516]: https://github.com/rust-lang/rust/pull/40516
5910 [40556]: https://github.com/rust-lang/rust/pull/40556
5911 [40561]: https://github.com/rust-lang/rust/pull/40561
5912 [40589]: https://github.com/rust-lang/rust/pull/40589
5913 [40612]: https://github.com/rust-lang/rust/pull/40612
5914 [40723]: https://github.com/rust-lang/rust/pull/40723
5915 [40728]: https://github.com/rust-lang/rust/pull/40728
5916 [40731]: https://github.com/rust-lang/rust/pull/40731
5917 [40734]: https://github.com/rust-lang/rust/pull/40734
5918 [40805]: https://github.com/rust-lang/rust/pull/40805
5919 [40807]: https://github.com/rust-lang/rust/pull/40807
5920 [40828]: https://github.com/rust-lang/rust/pull/40828
5921 [40870]: https://github.com/rust-lang/rust/pull/40870
5922 [41085]: https://github.com/rust-lang/rust/pull/41085
5923 [41143]: https://github.com/rust-lang/rust/pull/41143
5924 [41168]: https://github.com/rust-lang/rust/pull/41168
5925 [41270]: https://github.com/rust-lang/rust/issues/41270
5926 [41469]: https://github.com/rust-lang/rust/pull/41469
5927 [41805]: https://github.com/rust-lang/rust/issues/41805
5928 [RFC 1422]: https://github.com/rust-lang/rfcs/blob/master/text/1422-pub-restricted.md
5929 [RFC 1665]: https://github.com/rust-lang/rfcs/blob/master/text/1665-windows-subsystem.md
5930 [`Child::try_wait`]: https://doc.rust-lang.org/std/process/struct.Child.html#method.try_wait
5931 [`HashMap::retain`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.retain
5932 [`HashSet::retain`]: https://doc.rust-lang.org/std/collections/struct.HashSet.html#method.retain
5933 [`PeekMut::pop`]: https://doc.rust-lang.org/std/collections/binary_heap/struct.PeekMut.html#method.pop
5934 [`TcpStream::peek`]: https://doc.rust-lang.org/std/net/struct.TcpStream.html#method.peek
5935 [`UdpSocket::peek_from`]: https://doc.rust-lang.org/std/net/struct.UdpSocket.html#method.peek_from
5936 [`UdpSocket::peek`]: https://doc.rust-lang.org/std/net/struct.UdpSocket.html#method.peek
5937 [cargo/3842]: https://github.com/rust-lang/cargo/pull/3842
5938 [cargo/3847]: https://github.com/rust-lang/cargo/pull/3847
5939 [cargo/3885]: https://github.com/rust-lang/cargo/pull/3885
5940 [cargo/3901]: https://github.com/rust-lang/cargo/pull/3901
5941 [cargo/3952]: https://github.com/rust-lang/cargo/pull/3952
5942
5943
5944 Version 1.17.0 (2017-04-27)
5945 ===========================
5946
5947 Language
5948 --------
5949
5950 * [The lifetime of statics and consts defaults to `'static`][39265]. [RFC 1623]
5951 * [Fields of structs may be initialized without duplicating the field/variable
5952   names][39761]. [RFC 1682]
5953 * [`Self` may be included in the `where` clause of `impls`][38864]. [RFC 1647]
5954 * [When coercing to an unsized type lifetimes must be equal][40319]. That is,
5955   there is no subtyping between `T` and `U` when `T: Unsize<U>`. For example,
5956   coercing `&mut [&'a X; N]` to `&mut [&'b X]` requires `'a` be equal to
5957   `'b`. Soundness fix.
5958 * [Values passed to the indexing operator, `[]`, automatically coerce][40166]
5959 * [Static variables may contain references to other statics][40027]
5960
5961 Compiler
5962 --------
5963
5964 * [Exit quickly on only `--emit dep-info`][40336]
5965 * [Make `-C relocation-model` more correctly determine whether the linker
5966   creates a position-independent executable][40245]
5967 * [Add `-C overflow-checks` to directly control whether integer overflow
5968   panics][40037]
5969 * [The rustc type checker now checks items on demand instead of in a single
5970   in-order pass][40008]. This is mostly an internal refactoring in support of
5971   future work, including incremental type checking, but also resolves [RFC
5972   1647], allowing `Self` to appear in `impl` `where` clauses.
5973 * [Optimize vtable loads][39995]
5974 * [Turn off vectorization for Emscripten targets][39990]
5975 * [Provide suggestions for unknown macros imported with `use`][39953]
5976 * [Fix ICEs in path resolution][39939]
5977 * [Strip exception handling code on Emscripten when `panic=abort`][39193]
5978 * [Add clearer error message using `&str + &str`][39116]
5979
5980 Stabilized APIs
5981 ---------------
5982
5983 * [`Arc::into_raw`]
5984 * [`Arc::from_raw`]
5985 * [`Arc::ptr_eq`]
5986 * [`Rc::into_raw`]
5987 * [`Rc::from_raw`]
5988 * [`Rc::ptr_eq`]
5989 * [`Ordering::then`]
5990 * [`Ordering::then_with`]
5991 * [`BTreeMap::range`]
5992 * [`BTreeMap::range_mut`]
5993 * [`collections::Bound`]
5994 * [`process::abort`]
5995 * [`ptr::read_unaligned`]
5996 * [`ptr::write_unaligned`]
5997 * [`Result::expect_err`]
5998 * [`Cell::swap`]
5999 * [`Cell::replace`]
6000 * [`Cell::into_inner`]
6001 * [`Cell::take`]
6002
6003 Libraries
6004 ---------
6005
6006 * [`BTreeMap` and `BTreeSet` can iterate over ranges][27787]
6007 * [`Cell` can store non-`Copy` types][39793]. [RFC 1651]
6008 * [`String` implements `FromIterator<&char>`][40028]
6009 * `Box` [implements][40009] a number of new conversions:
6010   `From<Box<str>> for String`,
6011   `From<Box<[T]>> for Vec<T>`,
6012   `From<Box<CStr>> for CString`,
6013   `From<Box<OsStr>> for OsString`,
6014   `From<Box<Path>> for PathBuf`,
6015   `Into<Box<str>> for String`,
6016   `Into<Box<[T]>> for Vec<T>`,
6017   `Into<Box<CStr>> for CString`,
6018   `Into<Box<OsStr>> for OsString`,
6019   `Into<Box<Path>> for PathBuf`,
6020   `Default for Box<str>`,
6021   `Default for Box<CStr>`,
6022   `Default for Box<OsStr>`,
6023   `From<&CStr> for Box<CStr>`,
6024   `From<&OsStr> for Box<OsStr>`,
6025   `From<&Path> for Box<Path>`
6026 * [`ffi::FromBytesWithNulError` implements `Error` and `Display`][39960]
6027 * [Specialize `PartialOrd<A> for [A] where A: Ord`][39642]
6028 * [Slightly optimize `slice::sort`][39538]
6029 * [Add `ToString` trait specialization for `Cow<'a, str>` and `String`][39440]
6030 * [`Box<[T]>` implements `From<&[T]> where T: Copy`,
6031   `Box<str>` implements `From<&str>`][39438]
6032 * [`IpAddr` implements `From` for various arrays. `SocketAddr` implements
6033   `From<(I, u16)> where I: Into<IpAddr>`][39372]
6034 * [`format!` estimates the needed capacity before writing a string][39356]
6035 * [Support unprivileged symlink creation in Windows][38921]
6036 * [`PathBuf` implements `Default`][38764]
6037 * [Implement `PartialEq<[A]>` for `VecDeque<A>`][38661]
6038 * [`HashMap` resizes adaptively][38368] to guard against DOS attacks
6039   and poor hash functions.
6040
6041 Cargo
6042 -----
6043
6044 * [Add `cargo check --all`][cargo/3731]
6045 * [Add an option to ignore SSL revocation checking][cargo/3699]
6046 * [Add `cargo run --package`][cargo/3691]
6047 * [Add `required_features`][cargo/3667]
6048 * [Assume `build.rs` is a build script][cargo/3664]
6049 * [Find workspace via `workspace_root` link in containing member][cargo/3562]
6050
6051 Misc
6052 ----
6053
6054 * [Documentation is rendered with mdbook instead of the obsolete, in-tree
6055   `rustbook`][39633]
6056 * [The "Unstable Book" documents nightly-only features][ubook]
6057 * [Improve the style of the sidebar in rustdoc output][40265]
6058 * [Configure build correctly on 64-bit CPU's with the armhf ABI][40261]
6059 * [Fix MSP430 breakage due to `i128`][40257]
6060 * [Preliminary Solaris/SPARCv9 support][39903]
6061 * [`rustc` is linked statically on Windows MSVC targets][39837], allowing it to
6062   run without installing the MSVC runtime.
6063 * [`rustdoc --test` includes file names in test names][39788]
6064 * This release includes builds of `std` for `sparc64-unknown-linux-gnu`,
6065   `aarch64-unknown-linux-fuchsia`, and `x86_64-unknown-linux-fuchsia`.
6066 * [Initial support for `aarch64-unknown-freebsd`][39491]
6067 * [Initial support for `i686-unknown-netbsd`][39426]
6068 * [This release no longer includes the old makefile build system][39431]. Rust
6069   is built with a custom build system, written in Rust, and with Cargo.
6070 * [Add Debug implementations for libcollection structs][39002]
6071 * [`TypeId` implements `PartialOrd` and `Ord`][38981]
6072 * [`--test-threads=0` produces an error][38945]
6073 * [`rustup` installs documentation by default][40526]
6074 * [The Rust source includes NatVis visualizations][39843]. These can be used by
6075   WinDbg and Visual Studio to improve the debugging experience.
6076
6077 Compatibility Notes
6078 -------------------
6079
6080 * [Rust 1.17 does not correctly detect the MSVC 2017 linker][38584]. As a
6081   workaround, either use MSVC 2015 or run vcvars.bat.
6082 * [When coercing to an unsized type lifetimes must be equal][40319]. That is,
6083   disallow subtyping between `T` and `U` when `T: Unsize<U>`, e.g. coercing
6084   `&mut [&'a X; N]` to `&mut [&'b X]` requires `'a` be equal to `'b`. Soundness
6085   fix.
6086 * [`format!` and `Display::to_string` panic if an underlying formatting
6087   implementation returns an error][40117]. Previously the error was silently
6088   ignored. It is incorrect for `write_fmt` to return an error when writing
6089   to a string.
6090 * [In-tree crates are verified to be unstable][39851]. Previously, some minor
6091   crates were marked stable and could be accessed from the stable toolchain.
6092 * [Rust git source no longer includes vendored crates][39728]. Those that need
6093   to build with vendored crates should build from release tarballs.
6094 * [Fix inert attributes from `proc_macro_derives`][39572]
6095 * [During crate resolution, rustc prefers a crate in the sysroot if two crates
6096   are otherwise identical][39518]. Unlikely to be encountered outside the Rust
6097   build system.
6098 * [Fixed bugs around how type inference interacts with dead-code][39485]. The
6099   existing code generally ignores the type of dead-code unless a type-hint is
6100   provided; this can cause surprising inference interactions particularly around
6101   defaulting. The new code uniformly ignores the result type of dead-code.
6102 * [Tuple-struct constructors with private fields are no longer visible][38932]
6103 * [Lifetime parameters that do not appear in the arguments are now considered
6104   early-bound][38897], resolving a soundness bug (#[32330]). The
6105   `hr_lifetime_in_assoc_type` future-compatibility lint has been in effect since
6106   April of 2016.
6107 * [rustdoc: fix doctests with non-feature crate attributes][38161]
6108 * [Make transmuting from fn item types to pointer-sized types a hard
6109   error][34198]
6110
6111 [27787]: https://github.com/rust-lang/rust/issues/27787
6112 [32330]: https://github.com/rust-lang/rust/issues/32330
6113 [34198]: https://github.com/rust-lang/rust/pull/34198
6114 [38161]: https://github.com/rust-lang/rust/pull/38161
6115 [38368]: https://github.com/rust-lang/rust/pull/38368
6116 [38584]: https://github.com/rust-lang/rust/issues/38584
6117 [38661]: https://github.com/rust-lang/rust/pull/38661
6118 [38764]: https://github.com/rust-lang/rust/pull/38764
6119 [38864]: https://github.com/rust-lang/rust/issues/38864
6120 [38897]: https://github.com/rust-lang/rust/pull/38897
6121 [38921]: https://github.com/rust-lang/rust/pull/38921
6122 [38932]: https://github.com/rust-lang/rust/pull/38932
6123 [38945]: https://github.com/rust-lang/rust/pull/38945
6124 [38981]: https://github.com/rust-lang/rust/pull/38981
6125 [39002]: https://github.com/rust-lang/rust/pull/39002
6126 [39116]: https://github.com/rust-lang/rust/pull/39116
6127 [39193]: https://github.com/rust-lang/rust/pull/39193
6128 [39265]: https://github.com/rust-lang/rust/pull/39265
6129 [39356]: https://github.com/rust-lang/rust/pull/39356
6130 [39372]: https://github.com/rust-lang/rust/pull/39372
6131 [39426]: https://github.com/rust-lang/rust/pull/39426
6132 [39431]: https://github.com/rust-lang/rust/pull/39431
6133 [39438]: https://github.com/rust-lang/rust/pull/39438
6134 [39440]: https://github.com/rust-lang/rust/pull/39440
6135 [39485]: https://github.com/rust-lang/rust/pull/39485
6136 [39491]: https://github.com/rust-lang/rust/pull/39491
6137 [39518]: https://github.com/rust-lang/rust/pull/39518
6138 [39538]: https://github.com/rust-lang/rust/pull/39538
6139 [39572]: https://github.com/rust-lang/rust/pull/39572
6140 [39633]: https://github.com/rust-lang/rust/pull/39633
6141 [39642]: https://github.com/rust-lang/rust/pull/39642
6142 [39728]: https://github.com/rust-lang/rust/pull/39728
6143 [39761]: https://github.com/rust-lang/rust/pull/39761
6144 [39788]: https://github.com/rust-lang/rust/pull/39788
6145 [39793]: https://github.com/rust-lang/rust/pull/39793
6146 [39837]: https://github.com/rust-lang/rust/pull/39837
6147 [39843]: https://github.com/rust-lang/rust/pull/39843
6148 [39851]: https://github.com/rust-lang/rust/pull/39851
6149 [39903]: https://github.com/rust-lang/rust/pull/39903
6150 [39939]: https://github.com/rust-lang/rust/pull/39939
6151 [39953]: https://github.com/rust-lang/rust/pull/39953
6152 [39960]: https://github.com/rust-lang/rust/pull/39960
6153 [39990]: https://github.com/rust-lang/rust/pull/39990
6154 [39995]: https://github.com/rust-lang/rust/pull/39995
6155 [40008]: https://github.com/rust-lang/rust/pull/40008
6156 [40009]: https://github.com/rust-lang/rust/pull/40009
6157 [40027]: https://github.com/rust-lang/rust/pull/40027
6158 [40028]: https://github.com/rust-lang/rust/pull/40028
6159 [40037]: https://github.com/rust-lang/rust/pull/40037
6160 [40117]: https://github.com/rust-lang/rust/pull/40117
6161 [40166]: https://github.com/rust-lang/rust/pull/40166
6162 [40245]: https://github.com/rust-lang/rust/pull/40245
6163 [40257]: https://github.com/rust-lang/rust/pull/40257
6164 [40261]: https://github.com/rust-lang/rust/pull/40261
6165 [40265]: https://github.com/rust-lang/rust/pull/40265
6166 [40319]: https://github.com/rust-lang/rust/pull/40319
6167 [40336]: https://github.com/rust-lang/rust/pull/40336
6168 [40526]: https://github.com/rust-lang/rust/pull/40526
6169 [RFC 1623]: https://github.com/rust-lang/rfcs/blob/master/text/1623-static.md
6170 [RFC 1647]: https://github.com/rust-lang/rfcs/blob/master/text/1647-allow-self-in-where-clauses.md
6171 [RFC 1651]: https://github.com/rust-lang/rfcs/blob/master/text/1651-movecell.md
6172 [RFC 1682]: https://github.com/rust-lang/rfcs/blob/master/text/1682-field-init-shorthand.md
6173 [`Arc::from_raw`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.from_raw
6174 [`Arc::into_raw`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.into_raw
6175 [`Arc::ptr_eq`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.ptr_eq
6176 [`BTreeMap::range_mut`]: https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.range_mut
6177 [`BTreeMap::range`]: https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.range
6178 [`Cell::into_inner`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.into_inner
6179 [`Cell::replace`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.replace
6180 [`Cell::swap`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.swap
6181 [`Cell::take`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.take
6182 [`Ordering::then_with`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.then_with
6183 [`Ordering::then`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.then
6184 [`Rc::from_raw`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.from_raw
6185 [`Rc::into_raw`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.into_raw
6186 [`Rc::ptr_eq`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.ptr_eq
6187 [`Result::expect_err`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.expect_err
6188 [`collections::Bound`]: https://doc.rust-lang.org/std/collections/enum.Bound.html
6189 [`process::abort`]: https://doc.rust-lang.org/std/process/fn.abort.html
6190 [`ptr::read_unaligned`]: https://doc.rust-lang.org/std/ptr/fn.read_unaligned.html
6191 [`ptr::write_unaligned`]: https://doc.rust-lang.org/std/ptr/fn.write_unaligned.html
6192 [cargo/3562]: https://github.com/rust-lang/cargo/pull/3562
6193 [cargo/3664]: https://github.com/rust-lang/cargo/pull/3664
6194 [cargo/3667]: https://github.com/rust-lang/cargo/pull/3667
6195 [cargo/3691]: https://github.com/rust-lang/cargo/pull/3691
6196 [cargo/3699]: https://github.com/rust-lang/cargo/pull/3699
6197 [cargo/3731]: https://github.com/rust-lang/cargo/pull/3731
6198 [mdbook]: https://crates.io/crates/mdbook
6199 [ubook]: https://doc.rust-lang.org/unstable-book/
6200
6201
6202 Version 1.16.0 (2017-03-16)
6203 ===========================
6204
6205 Language
6206 --------
6207
6208 * [The compiler's `dead_code` lint now accounts for type aliases][38051].
6209 * [Uninhabitable enums (those without any variants) no longer permit wildcard
6210   match patterns][38069]
6211 * [Clean up semantics of `self` in an import list][38313]
6212 * [`Self` may appear in `impl` headers][38920]
6213 * [`Self` may appear in struct expressions][39282]
6214
6215 Compiler
6216 --------
6217
6218 * [`rustc` now supports `--emit=metadata`, which causes rustc to emit
6219   a `.rmeta` file containing only crate metadata][38571]. This can be
6220   used by tools like the Rust Language Service to perform
6221   metadata-only builds.
6222 * [Levenshtein based typo suggestions now work in most places, while
6223   previously they worked only for fields and sometimes for local
6224   variables][38927]. Together with the overhaul of "no
6225   resolution"/"unexpected resolution" errors (#[38154]) they result in
6226   large and systematic improvement in resolution diagnostics.
6227 * [Fix `transmute::<T, U>` where `T` requires a bigger alignment than
6228   `U`][38670]
6229 * [rustc: use -Xlinker when specifying an rpath with ',' in it][38798]
6230 * [`rustc` no longer attempts to provide "consider using an explicit
6231   lifetime" suggestions][37057]. They were inaccurate.
6232
6233 Stabilized APIs
6234 ---------------
6235
6236 * [`VecDeque::truncate`]
6237 * [`VecDeque::resize`]
6238 * [`String::insert_str`]
6239 * [`Duration::checked_add`]
6240 * [`Duration::checked_sub`]
6241 * [`Duration::checked_div`]
6242 * [`Duration::checked_mul`]
6243 * [`str::replacen`]
6244 * [`str::repeat`]
6245 * [`SocketAddr::is_ipv4`]
6246 * [`SocketAddr::is_ipv6`]
6247 * [`IpAddr::is_ipv4`]
6248 * [`IpAddr::is_ipv6`]
6249 * [`Vec::dedup_by`]
6250 * [`Vec::dedup_by_key`]
6251 * [`Result::unwrap_or_default`]
6252 * [`<*const T>::wrapping_offset`]
6253 * [`<*mut T>::wrapping_offset`]
6254 * `CommandExt::creation_flags`
6255 * [`File::set_permissions`]
6256 * [`String::split_off`]
6257
6258 Libraries
6259 ---------
6260
6261 * [`[T]::binary_search` and `[T]::binary_search_by_key` now take
6262   their argument by `Borrow` parameter][37761]
6263 * [All public types in std implement `Debug`][38006]
6264 * [`IpAddr` implements `From<Ipv4Addr>` and `From<Ipv6Addr>`][38327]
6265 * [`Ipv6Addr` implements `From<[u16; 8]>`][38131]
6266 * [Ctrl-Z returns from `Stdin.read()` when reading from the console on
6267   Windows][38274]
6268 * [std: Fix partial writes in `LineWriter`][38062]
6269 * [std: Clamp max read/write sizes on Unix][38062]
6270 * [Use more specific panic message for `&str` slicing errors][38066]
6271 * [`TcpListener::set_only_v6` is deprecated][38304]. This
6272   functionality cannot be achieved in std currently.
6273 * [`writeln!`, like `println!`, now accepts a form with no string
6274   or formatting arguments, to just print a newline][38469]
6275 * [Implement `iter::Sum` and `iter::Product` for `Result`][38580]
6276 * [Reduce the size of static data in `std_unicode::tables`][38781]
6277 * [`char::EscapeDebug`, `EscapeDefault`, `EscapeUnicode`,
6278   `CaseMappingIter`, `ToLowercase`, `ToUppercase`, implement
6279   `Display`][38909]
6280 * [`Duration` implements `Sum`][38712]
6281 * [`String` implements `ToSocketAddrs`][39048]
6282
6283 Cargo
6284 -----
6285
6286 * [The `cargo check` command does a type check of a project without
6287   building it][cargo/3296]
6288 * [crates.io will display CI badges from Travis and AppVeyor, if
6289   specified in Cargo.toml][cargo/3546]
6290 * [crates.io will display categories listed in Cargo.toml][cargo/3301]
6291 * [Compilation profiles accept integer values for `debug`, in addition
6292   to `true` and `false`. These are passed to `rustc` as the value to
6293   `-C debuginfo`][cargo/3534]
6294 * [Implement `cargo --version --verbose`][cargo/3604]
6295 * [All builds now output 'dep-info' build dependencies compatible with
6296   make and ninja][cargo/3557]
6297 * [Build all workspace members with `build --all`][cargo/3511]
6298 * [Document all workspace members with `doc --all`][cargo/3515]
6299 * [Path deps outside workspace are not members][cargo/3443]
6300
6301 Misc
6302 ----
6303
6304 * [`rustdoc` has a `--sysroot` argument that, like `rustc`, specifies
6305   the path to the Rust implementation][38589]
6306 * [The `armv7-linux-androideabi` target no longer enables NEON
6307   extensions, per Google's ABI guide][38413]
6308 * [The stock standard library can be compiled for Redox OS][38401]
6309 * [Rust has initial SPARC support][38726]. Tier 3. No builds
6310   available.
6311 * [Rust has experimental support for Nvidia PTX][38559]. Tier 3. No
6312   builds available.
6313 * [Fix backtraces on i686-pc-windows-gnu by disabling FPO][39379]
6314
6315 Compatibility Notes
6316 -------------------
6317
6318 * [Uninhabitable enums (those without any variants) no longer permit wildcard
6319   match patterns][38069]
6320 * In this release, references to uninhabited types can not be
6321   pattern-matched. This was accidentally allowed in 1.15.
6322 * [The compiler's `dead_code` lint now accounts for type aliases][38051].
6323 * [Ctrl-Z returns from `Stdin.read()` when reading from the console on
6324   Windows][38274]
6325 * [Clean up semantics of `self` in an import list][38313]
6326 * Reimplemented lifetime elision. This change was almost entirely compatible
6327   with existing code, but it did close a number of small bugs and loopholes,
6328   as well as being more accepting in some other [cases][41105].
6329
6330 [37057]: https://github.com/rust-lang/rust/pull/37057
6331 [37761]: https://github.com/rust-lang/rust/pull/37761
6332 [38006]: https://github.com/rust-lang/rust/pull/38006
6333 [38051]: https://github.com/rust-lang/rust/pull/38051
6334 [38062]: https://github.com/rust-lang/rust/pull/38062
6335 [38062]: https://github.com/rust-lang/rust/pull/38622
6336 [38066]: https://github.com/rust-lang/rust/pull/38066
6337 [38069]: https://github.com/rust-lang/rust/pull/38069
6338 [38131]: https://github.com/rust-lang/rust/pull/38131
6339 [38154]: https://github.com/rust-lang/rust/pull/38154
6340 [38274]: https://github.com/rust-lang/rust/pull/38274
6341 [38304]: https://github.com/rust-lang/rust/pull/38304
6342 [38313]: https://github.com/rust-lang/rust/pull/38313
6343 [38314]: https://github.com/rust-lang/rust/pull/38314
6344 [38327]: https://github.com/rust-lang/rust/pull/38327
6345 [38401]: https://github.com/rust-lang/rust/pull/38401
6346 [38413]: https://github.com/rust-lang/rust/pull/38413
6347 [38469]: https://github.com/rust-lang/rust/pull/38469
6348 [38559]: https://github.com/rust-lang/rust/pull/38559
6349 [38571]: https://github.com/rust-lang/rust/pull/38571
6350 [38580]: https://github.com/rust-lang/rust/pull/38580
6351 [38589]: https://github.com/rust-lang/rust/pull/38589
6352 [38670]: https://github.com/rust-lang/rust/pull/38670
6353 [38712]: https://github.com/rust-lang/rust/pull/38712
6354 [38726]: https://github.com/rust-lang/rust/pull/38726
6355 [38781]: https://github.com/rust-lang/rust/pull/38781
6356 [38798]: https://github.com/rust-lang/rust/pull/38798
6357 [38909]: https://github.com/rust-lang/rust/pull/38909
6358 [38920]: https://github.com/rust-lang/rust/pull/38920
6359 [38927]: https://github.com/rust-lang/rust/pull/38927
6360 [39048]: https://github.com/rust-lang/rust/pull/39048
6361 [39282]: https://github.com/rust-lang/rust/pull/39282
6362 [39379]: https://github.com/rust-lang/rust/pull/39379
6363 [41105]: https://github.com/rust-lang/rust/issues/41105
6364 [`<*const T>::wrapping_offset`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_offset
6365 [`<*mut T>::wrapping_offset`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_offset
6366 [`Duration::checked_add`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_add
6367 [`Duration::checked_div`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_div
6368 [`Duration::checked_mul`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_mul
6369 [`Duration::checked_sub`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_sub
6370 [`File::set_permissions`]: https://doc.rust-lang.org/std/fs/struct.File.html#method.set_permissions
6371 [`IpAddr::is_ipv4`]: https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_ipv4
6372 [`IpAddr::is_ipv6`]: https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_ipv6
6373 [`Result::unwrap_or_default`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.unwrap_or_default
6374 [`SocketAddr::is_ipv4`]: https://doc.rust-lang.org/std/net/enum.SocketAddr.html#method.is_ipv4
6375 [`SocketAddr::is_ipv6`]: https://doc.rust-lang.org/std/net/enum.SocketAddr.html#method.is_ipv6
6376 [`String::insert_str`]: https://doc.rust-lang.org/std/string/struct.String.html#method.insert_str
6377 [`String::split_off`]: https://doc.rust-lang.org/std/string/struct.String.html#method.split_off
6378 [`Vec::dedup_by_key`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.dedup_by_key
6379 [`Vec::dedup_by`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.dedup_by
6380 [`VecDeque::resize`]:  https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.resize
6381 [`VecDeque::truncate`]: https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.truncate
6382 [`str::repeat`]: https://doc.rust-lang.org/std/primitive.str.html#method.repeat
6383 [`str::replacen`]: https://doc.rust-lang.org/std/primitive.str.html#method.replacen
6384 [cargo/3296]: https://github.com/rust-lang/cargo/pull/3296
6385 [cargo/3301]: https://github.com/rust-lang/cargo/pull/3301
6386 [cargo/3443]: https://github.com/rust-lang/cargo/pull/3443
6387 [cargo/3511]: https://github.com/rust-lang/cargo/pull/3511
6388 [cargo/3515]: https://github.com/rust-lang/cargo/pull/3515
6389 [cargo/3534]: https://github.com/rust-lang/cargo/pull/3534
6390 [cargo/3546]: https://github.com/rust-lang/cargo/pull/3546
6391 [cargo/3557]: https://github.com/rust-lang/cargo/pull/3557
6392 [cargo/3604]: https://github.com/rust-lang/cargo/pull/3604
6393 [RFC 1623]: https://github.com/rust-lang/rfcs/blob/master/text/1623-static.md
6394
6395
6396 Version 1.15.1 (2017-02-09)
6397 ===========================
6398
6399 * [Fix IntoIter::as_mut_slice's signature][39466]
6400 * [Compile compiler builtins with `-fPIC` on 32-bit platforms][39523]
6401
6402 [39466]: https://github.com/rust-lang/rust/pull/39466
6403 [39523]: https://github.com/rust-lang/rust/pull/39523
6404
6405
6406 Version 1.15.0 (2017-02-02)
6407 ===========================
6408
6409 Language
6410 --------
6411
6412 * Basic procedural macros allowing custom `#[derive]`, aka "macros 1.1", are
6413   stable. This allows popular code-generating crates like Serde and Diesel to
6414   work ergonomically. [RFC 1681].
6415 * [Tuple structs may be empty. Unary and empty tuple structs may be instantiated
6416   with curly braces][36868]. Part of [RFC 1506].
6417 * [A number of minor changes to name resolution have been activated][37127].
6418   They add up to more consistent semantics, allowing for future evolution of
6419   Rust macros. Specified in [RFC 1560], see its section on ["changes"] for
6420   details of what is different. The breaking changes here have been transitioned
6421   through the [`legacy_imports`] lint since 1.14, with no known regressions.
6422 * [In `macro_rules`, `path` fragments can now be parsed as type parameter
6423   bounds][38279]
6424 * [`?Sized` can be used in `where` clauses][37791]
6425 * [There is now a limit on the size of monomorphized types and it can be
6426   modified with the `#![type_size_limit]` crate attribute, similarly to
6427   the `#![recursion_limit]` attribute][37789]
6428
6429 Compiler
6430 --------
6431
6432 * [On Windows, the compiler will apply dllimport attributes when linking to
6433   extern functions][37973]. Additional attributes and flags can control which
6434   library kind is linked and its name. [RFC 1717].
6435 * [Rust-ABI symbols are no longer exported from cdylibs][38117]
6436 * [The `--test` flag works with procedural macro crates][38107]
6437 * [Fix `extern "aapcs" fn` ABI][37814]
6438 * [The `-C no-stack-check` flag is deprecated][37636]. It does nothing.
6439 * [The `format!` expander recognizes incorrect `printf` and shell-style
6440   formatting directives and suggests the correct format][37613].
6441 * [Only report one error for all unused imports in an import list][37456]
6442
6443 Compiler Performance
6444 --------------------
6445
6446 * [Avoid unnecessary `mk_ty` calls in `Ty::super_fold_with`][37705]
6447 * [Avoid more unnecessary `mk_ty` calls in `Ty::super_fold_with`][37979]
6448 * [Don't clone in `UnificationTable::probe`][37848]
6449 * [Remove `scope_auxiliary` to cut RSS by 10%][37764]
6450 * [Use small vectors in type walker][37760]
6451 * [Macro expansion performance was improved][37701]
6452 * [Change `HirVec<P<T>>` to `HirVec<T>` in `hir::Expr`][37642]
6453 * [Replace FNV with a faster hash function][37229]
6454
6455 Stabilized APIs
6456 ---------------
6457
6458 * [`std::iter::Iterator::min_by`]
6459 * [`std::iter::Iterator::max_by`]
6460 * [`std::os::*::fs::FileExt`]
6461 * [`std::sync::atomic::Atomic*::get_mut`]
6462 * [`std::sync::atomic::Atomic*::into_inner`]
6463 * [`std::vec::IntoIter::as_slice`]
6464 * [`std::vec::IntoIter::as_mut_slice`]
6465 * [`std::sync::mpsc::Receiver::try_iter`]
6466 * [`std::os::unix::process::CommandExt::before_exec`]
6467 * [`std::rc::Rc::strong_count`]
6468 * [`std::rc::Rc::weak_count`]
6469 * [`std::sync::Arc::strong_count`]
6470 * [`std::sync::Arc::weak_count`]
6471 * [`std::char::encode_utf8`]
6472 * [`std::char::encode_utf16`]
6473 * [`std::cell::Ref::clone`]
6474 * [`std::io::Take::into_inner`]
6475
6476 Libraries
6477 ---------
6478
6479 * [The standard sorting algorithm has been rewritten for dramatic performance
6480   improvements][38192]. It is a hybrid merge sort, drawing influences from
6481   Timsort. Previously it was a naive merge sort.
6482 * [`Iterator::nth` no longer has a `Sized` bound][38134]
6483 * [`Extend<&T>` is specialized for `Vec` where `T: Copy`][38182] to improve
6484   performance.
6485 * [`chars().count()` is much faster][37888] and so are [`chars().last()`
6486   and `char_indices().last()`][37882]
6487 * [Fix ARM Objective-C ABI in `std::env::args`][38146]
6488 * [Chinese characters display correctly in `fmt::Debug`][37855]
6489 * [Derive `Default` for `Duration`][37699]
6490 * [Support creation of anonymous pipes on WinXP/2k][37677]
6491 * [`mpsc::RecvTimeoutError` implements `Error`][37527]
6492 * [Don't pass overlapped handles to processes][38835]
6493
6494 Cargo
6495 -----
6496
6497 * [In this release, Cargo build scripts no longer have access to the `OUT_DIR`
6498   environment variable at build time via `env!("OUT_DIR")`][cargo/3368]. They
6499   should instead check the variable at runtime with `std::env`. That the value
6500   was set at build time was a bug, and incorrect when cross-compiling. This
6501   change is known to cause breakage.
6502 * [Add `--all` flag to `cargo test`][cargo/3221]
6503 * [Compile statically against the MSVC CRT][cargo/3363]
6504 * [Mix feature flags into fingerprint/metadata shorthash][cargo/3102]
6505 * [Link OpenSSL statically on OSX][cargo/3311]
6506 * [Apply new fingerprinting to build dir outputs][cargo/3310]
6507 * [Test for bad path overrides with summaries][cargo/3336]
6508 * [Require `cargo install --vers` to take a semver version][cargo/3338]
6509 * [Fix retrying crate downloads for network errors][cargo/3348]
6510 * [Implement string lookup for `build.rustflags` config key][cargo/3356]
6511 * [Emit more info on --message-format=json][cargo/3319]
6512 * [Assume `build.rs` in the same directory as `Cargo.toml` is a build script][cargo/3361]
6513 * [Don't ignore errors in workspace manifest][cargo/3409]
6514 * [Fix `--message-format JSON` when rustc emits non-JSON warnings][cargo/3410]
6515
6516 Tooling
6517 -------
6518
6519 * [Test runners (binaries built with `--test`) now support a `--list` argument
6520   that lists the tests it contains][38185]
6521 * [Test runners now support a `--exact` argument that makes the test filter
6522   match exactly, instead of matching only a substring of the test name][38181]
6523 * [rustdoc supports a `--playground-url` flag][37763]
6524 * [rustdoc provides more details about `#[should_panic]` errors][37749]
6525
6526 Misc
6527 ----
6528
6529 * [The Rust build system is now written in Rust][37817]. The Makefiles may
6530   continue to be used in this release by passing `--disable-rustbuild` to the
6531   configure script, but they will be deleted soon. Note that the new build
6532   system uses a different on-disk layout that will likely affect any scripts
6533   building Rust.
6534 * [Rust supports i686-unknown-openbsd][38086]. Tier 3 support. No testing or
6535   releases.
6536 * [Rust supports the MSP430][37627]. Tier 3 support. No testing or releases.
6537 * [Rust supports the ARMv5TE architecture][37615]. Tier 3 support. No testing or
6538   releases.
6539
6540 Compatibility Notes
6541 -------------------
6542
6543 * [A number of minor changes to name resolution have been activated][37127].
6544   They add up to more consistent semantics, allowing for future evolution of
6545   Rust macros. Specified in [RFC 1560], see its section on ["changes"] for
6546   details of what is different. The breaking changes here have been transitioned
6547   through the [`legacy_imports`] lint since 1.14, with no known regressions.
6548 * [In this release, Cargo build scripts no longer have access to the `OUT_DIR`
6549   environment variable at build time via `env!("OUT_DIR")`][cargo/3368]. They
6550   should instead check the variable at runtime with `std::env`. That the value
6551   was set at build time was a bug, and incorrect when cross-compiling. This
6552   change is known to cause breakage.
6553 * [Higher-ranked lifetimes are no longer allowed to appear _only_ in associated
6554   types][33685]. The [`hr_lifetime_in_assoc_type` lint] has been a warning since
6555   1.10 and is now an error by default. It will become a hard error in the near
6556   future.
6557 * [The semantics relating modules to file system directories are changing in
6558   minor ways][37602]. This is captured in the new `legacy_directory_ownership`
6559   lint, which is a warning in this release, and will become a hard error in the
6560   future.
6561 * [Rust-ABI symbols are no longer exported from cdylibs][38117]
6562 * [Once `Peekable` peeks a `None` it will return that `None` without re-querying
6563   the underlying iterator][37834]
6564
6565 ["changes"]: https://github.com/rust-lang/rfcs/blob/master/text/1560-name-resolution.md#changes-to-name-resolution-rules
6566 [33685]: https://github.com/rust-lang/rust/issues/33685
6567 [36868]: https://github.com/rust-lang/rust/pull/36868
6568 [37127]: https://github.com/rust-lang/rust/pull/37127
6569 [37229]: https://github.com/rust-lang/rust/pull/37229
6570 [37456]: https://github.com/rust-lang/rust/pull/37456
6571 [37527]: https://github.com/rust-lang/rust/pull/37527
6572 [37602]: https://github.com/rust-lang/rust/pull/37602
6573 [37613]: https://github.com/rust-lang/rust/pull/37613
6574 [37615]: https://github.com/rust-lang/rust/pull/37615
6575 [37636]: https://github.com/rust-lang/rust/pull/37636
6576 [37627]: https://github.com/rust-lang/rust/pull/37627
6577 [37642]: https://github.com/rust-lang/rust/pull/37642
6578 [37677]: https://github.com/rust-lang/rust/pull/37677
6579 [37699]: https://github.com/rust-lang/rust/pull/37699
6580 [37701]: https://github.com/rust-lang/rust/pull/37701
6581 [37705]: https://github.com/rust-lang/rust/pull/37705
6582 [37749]: https://github.com/rust-lang/rust/pull/37749
6583 [37760]: https://github.com/rust-lang/rust/pull/37760
6584 [37763]: https://github.com/rust-lang/rust/pull/37763
6585 [37764]: https://github.com/rust-lang/rust/pull/37764
6586 [37789]: https://github.com/rust-lang/rust/pull/37789
6587 [37791]: https://github.com/rust-lang/rust/pull/37791
6588 [37814]: https://github.com/rust-lang/rust/pull/37814
6589 [37817]: https://github.com/rust-lang/rust/pull/37817
6590 [37834]: https://github.com/rust-lang/rust/pull/37834
6591 [37848]: https://github.com/rust-lang/rust/pull/37848
6592 [37855]: https://github.com/rust-lang/rust/pull/37855
6593 [37882]: https://github.com/rust-lang/rust/pull/37882
6594 [37888]: https://github.com/rust-lang/rust/pull/37888
6595 [37973]: https://github.com/rust-lang/rust/pull/37973
6596 [37979]: https://github.com/rust-lang/rust/pull/37979
6597 [38086]: https://github.com/rust-lang/rust/pull/38086
6598 [38107]: https://github.com/rust-lang/rust/pull/38107
6599 [38117]: https://github.com/rust-lang/rust/pull/38117
6600 [38134]: https://github.com/rust-lang/rust/pull/38134
6601 [38146]: https://github.com/rust-lang/rust/pull/38146
6602 [38181]: https://github.com/rust-lang/rust/pull/38181
6603 [38182]: https://github.com/rust-lang/rust/pull/38182
6604 [38185]: https://github.com/rust-lang/rust/pull/38185
6605 [38192]: https://github.com/rust-lang/rust/pull/38192
6606 [38279]: https://github.com/rust-lang/rust/pull/38279
6607 [38835]: https://github.com/rust-lang/rust/pull/38835
6608 [RFC 1492]: https://github.com/rust-lang/rfcs/blob/master/text/1492-dotdot-in-patterns.md
6609 [RFC 1506]: https://github.com/rust-lang/rfcs/blob/master/text/1506-adt-kinds.md
6610 [RFC 1560]: https://github.com/rust-lang/rfcs/blob/master/text/1560-name-resolution.md
6611 [RFC 1681]: https://github.com/rust-lang/rfcs/blob/master/text/1681-macros-1.1.md
6612 [RFC 1717]: https://github.com/rust-lang/rfcs/blob/master/text/1717-dllimport.md
6613 [`hr_lifetime_in_assoc_type` lint]: https://github.com/rust-lang/rust/issues/33685
6614 [`legacy_imports`]: https://github.com/rust-lang/rust/pull/38271
6615 [cargo/3102]: https://github.com/rust-lang/cargo/pull/3102
6616 [cargo/3221]: https://github.com/rust-lang/cargo/pull/3221
6617 [cargo/3310]: https://github.com/rust-lang/cargo/pull/3310
6618 [cargo/3311]: https://github.com/rust-lang/cargo/pull/3311
6619 [cargo/3319]: https://github.com/rust-lang/cargo/pull/3319
6620 [cargo/3336]: https://github.com/rust-lang/cargo/pull/3336
6621 [cargo/3338]: https://github.com/rust-lang/cargo/pull/3338
6622 [cargo/3348]: https://github.com/rust-lang/cargo/pull/3348
6623 [cargo/3356]: https://github.com/rust-lang/cargo/pull/3356
6624 [cargo/3361]: https://github.com/rust-lang/cargo/pull/3361
6625 [cargo/3363]: https://github.com/rust-lang/cargo/pull/3363
6626 [cargo/3368]: https://github.com/rust-lang/cargo/issues/3368
6627 [cargo/3409]: https://github.com/rust-lang/cargo/pull/3409
6628 [cargo/3410]: https://github.com/rust-lang/cargo/pull/3410
6629 [`std::iter::Iterator::min_by`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.min_by
6630 [`std::iter::Iterator::max_by`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.max_by
6631 [`std::os::*::fs::FileExt`]: https://doc.rust-lang.org/std/os/unix/fs/trait.FileExt.html
6632 [`std::sync::atomic::Atomic*::get_mut`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU8.html#method.get_mut
6633 [`std::sync::atomic::Atomic*::into_inner`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU8.html#method.into_inner
6634 [`std::vec::IntoIter::as_slice`]: https://doc.rust-lang.org/std/vec/struct.IntoIter.html#method.as_slice
6635 [`std::vec::IntoIter::as_mut_slice`]: https://doc.rust-lang.org/std/vec/struct.IntoIter.html#method.as_mut_slice
6636 [`std::sync::mpsc::Receiver::try_iter`]: https://doc.rust-lang.org/std/sync/mpsc/struct.Receiver.html#method.try_iter
6637 [`std::os::unix::process::CommandExt::before_exec`]: https://doc.rust-lang.org/std/os/unix/process/trait.CommandExt.html#tymethod.before_exec
6638 [`std::rc::Rc::strong_count`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.strong_count
6639 [`std::rc::Rc::weak_count`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.weak_count
6640 [`std::sync::Arc::strong_count`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.strong_count
6641 [`std::sync::Arc::weak_count`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.weak_count
6642 [`std::char::encode_utf8`]: https://doc.rust-lang.org/std/primitive.char.html#method.encode_utf8
6643 [`std::char::encode_utf16`]: https://doc.rust-lang.org/std/primitive.char.html#method.encode_utf16
6644 [`std::cell::Ref::clone`]: https://doc.rust-lang.org/std/cell/struct.Ref.html#method.clone
6645 [`std::io::Take::into_inner`]: https://doc.rust-lang.org/std/io/struct.Take.html#method.into_inner
6646
6647
6648 Version 1.14.0 (2016-12-22)
6649 ===========================
6650
6651 Language
6652 --------
6653
6654 * [`..` matches multiple tuple fields in enum variants, structs
6655   and tuples][36843]. [RFC 1492].
6656 * [Safe `fn` items can be coerced to `unsafe fn` pointers][37389]
6657 * [`use *` and `use ::*` both glob-import from the crate root][37367]
6658 * [It's now possible to call a `Vec<Box<Fn()>>` without explicit
6659   dereferencing][36822]
6660
6661 Compiler
6662 --------
6663
6664 * [Mark enums with non-zero discriminant as non-zero][37224]
6665 * [Lower-case `static mut` names are linted like other
6666   statics and consts][37162]
6667 * [Fix ICE on some macros in const integer positions
6668    (e.g. `[u8; m!()]`)][36819]
6669 * [Improve error message and snippet for "did you mean `x`"][36798]
6670 * [Add a panic-strategy field to the target specification][36794]
6671 * [Include LLVM version in `--version --verbose`][37200]
6672
6673 Compile-time Optimizations
6674 --------------------------
6675
6676 * [Improve macro expansion performance][37569]
6677 * [Shrink `Expr_::ExprInlineAsm`][37445]
6678 * [Replace all uses of SHA-256 with BLAKE2b][37439]
6679 * [Reduce the number of bytes hashed by `IchHasher`][37427]
6680 * [Avoid more allocations when compiling html5ever][37373]
6681 * [Use `SmallVector` in `CombineFields::instantiate`][37322]
6682 * [Avoid some allocations in the macro parser][37318]
6683 * [Use a faster deflate setting][37298]
6684 * [Add `ArrayVec` and `AccumulateVec` to reduce heap allocations
6685   during interning of slices][37270]
6686 * [Optimize `write_metadata`][37267]
6687 * [Don't process obligation forest cycles when stalled][37231]
6688 * [Avoid many `CrateConfig` clones][37161]
6689 * [Optimize `Substs::super_fold_with`][37108]
6690 * [Optimize `ObligationForest`'s `NodeState` handling][36993]
6691 * [Speed up `plug_leaks`][36917]
6692
6693 Libraries
6694 ---------
6695
6696 * [`println!()`, with no arguments, prints newline][36825].
6697   Previously, an empty string was required to achieve the same.
6698 * [`Wrapping` impls standard binary and unary operators, as well as
6699    the `Sum` and `Product` iterators][37356]
6700 * [Implement `From<Cow<str>> for String` and `From<Cow<[T]>> for
6701   Vec<T>`][37326]
6702 * [Improve `fold` performance for `chain`, `cloned`, `map`, and
6703   `VecDeque` iterators][37315]
6704 * [Improve `SipHasher` performance on small values][37312]
6705 * [Add Iterator trait TrustedLen to enable better FromIterator /
6706   Extend][37306]
6707 * [Expand `.zip()` specialization to `.map()` and `.cloned()`][37230]
6708 * [`ReadDir` implements `Debug`][37221]
6709 * [Implement `RefUnwindSafe` for atomic types][37178]
6710 * [Specialize `Vec::extend` to `Vec::extend_from_slice`][37094]
6711 * [Avoid allocations in `Decoder::read_str`][37064]
6712 * [`io::Error` implements `From<io::ErrorKind>`][37037]
6713 * [Impl `Debug` for raw pointers to unsized data][36880]
6714 * [Don't reuse `HashMap` random seeds][37470]
6715 * [The internal memory layout of `HashMap` is more cache-friendly, for
6716   significant improvements in some operations][36692]
6717 * [`HashMap` uses less memory on 32-bit architectures][36595]
6718 * [Impl `Add<{str, Cow<str>}>` for `Cow<str>`][36430]
6719
6720 Cargo
6721 -----
6722
6723 * [Expose rustc cfg values to build scripts][cargo/3243]
6724 * [Allow cargo to work with read-only `CARGO_HOME`][cargo/3259]
6725 * [Fix passing --features when testing multiple packages][cargo/3280]
6726 * [Use a single profile set per workspace][cargo/3249]
6727 * [Load `replace` sections from lock files][cargo/3220]
6728 * [Ignore `panic` configuration for test/bench profiles][cargo/3175]
6729
6730 Tooling
6731 -------
6732
6733 * [rustup is the recommended Rust installation method][1.14rustup]
6734 * This release includes host (rustc) builds for Linux on MIPS, PowerPC, and
6735   S390x. These are [tier 2] platforms and may have major defects. Follow the
6736   instructions on the website to install, or add the targets to an existing
6737   installation with `rustup target add`. The new target triples are:
6738   - `mips-unknown-linux-gnu`
6739   - `mipsel-unknown-linux-gnu`
6740   - `mips64-unknown-linux-gnuabi64`
6741   - `mips64el-unknown-linux-gnuabi64 `
6742   - `powerpc-unknown-linux-gnu`
6743   - `powerpc64-unknown-linux-gnu`
6744   - `powerpc64le-unknown-linux-gnu`
6745   - `s390x-unknown-linux-gnu `
6746 * This release includes target (std) builds for ARM Linux running MUSL
6747   libc. These are [tier 2] platforms and may have major defects. Add the
6748   following triples to an existing rustup installation with `rustup target add`:
6749   - `arm-unknown-linux-musleabi`
6750   - `arm-unknown-linux-musleabihf`
6751   - `armv7-unknown-linux-musleabihf`
6752 * This release includes [experimental support for WebAssembly][1.14wasm], via
6753   the `wasm32-unknown-emscripten` target. This target is known to have major
6754   defects. Please test, report, and fix.
6755 * rustup no longer installs documentation by default. Run `rustup
6756   component add rust-docs` to install.
6757 * [Fix line stepping in debugger][37310]
6758 * [Enable line number debuginfo in releases][37280]
6759
6760 Misc
6761 ----
6762
6763 * [Disable jemalloc on aarch64/powerpc/mips][37392]
6764 * [Add support for Fuchsia OS][37313]
6765 * [Detect local-rebuild by only MAJOR.MINOR version][37273]
6766
6767 Compatibility Notes
6768 -------------------
6769
6770 * [A number of forward-compatibility lints used by the compiler
6771   to gradually introduce language changes have been converted
6772   to deny by default][36894]:
6773   - ["use of inaccessible extern crate erroneously allowed"][36886]
6774   - ["type parameter default erroneously allowed in invalid location"][36887]
6775   - ["detects super or self keywords at the beginning of global path"][36888]
6776   - ["two overlapping inherent impls define an item with the same name
6777     were erroneously allowed"][36889]
6778   - ["floating-point constants cannot be used in patterns"][36890]
6779   - ["constants of struct or enum type can only be used in a pattern if
6780      the struct or enum has `#[derive(PartialEq, Eq)]`"][36891]
6781   - ["lifetimes or labels named `'_` were erroneously allowed"][36892]
6782 * [Prohibit patterns in trait methods without bodies][37378]
6783 * [The atomic `Ordering` enum may not be matched exhaustively][37351]
6784 * [Future-proofing `#[no_link]` breaks some obscure cases][37247]
6785 * [The `$crate` macro variable is accepted in fewer locations][37213]
6786 * [Impls specifying extra region requirements beyond the trait
6787   they implement are rejected][37167]
6788 * [Enums may not be unsized][37111]. Unsized enums are intended to
6789   work but never have. For now they are forbidden.
6790 * [Enforce the shadowing restrictions from RFC 1560 for today's macros][36767]
6791
6792 [tier 2]: https://forge.rust-lang.org/platform-support.html
6793 [1.14rustup]: https://internals.rust-lang.org/t/beta-testing-rustup-rs/3316/204
6794 [1.14wasm]: https://users.rust-lang.org/t/compiling-to-the-web-with-rust-and-emscripten/7627
6795 [36430]: https://github.com/rust-lang/rust/pull/36430
6796 [36595]: https://github.com/rust-lang/rust/pull/36595
6797 [36595]: https://github.com/rust-lang/rust/pull/36595
6798 [36692]: https://github.com/rust-lang/rust/pull/36692
6799 [36767]: https://github.com/rust-lang/rust/pull/36767
6800 [36794]: https://github.com/rust-lang/rust/pull/36794
6801 [36798]: https://github.com/rust-lang/rust/pull/36798
6802 [36819]: https://github.com/rust-lang/rust/pull/36819
6803 [36822]: https://github.com/rust-lang/rust/pull/36822
6804 [36825]: https://github.com/rust-lang/rust/pull/36825
6805 [36843]: https://github.com/rust-lang/rust/pull/36843
6806 [36880]: https://github.com/rust-lang/rust/pull/36880
6807 [36886]: https://github.com/rust-lang/rust/issues/36886
6808 [36887]: https://github.com/rust-lang/rust/issues/36887
6809 [36888]: https://github.com/rust-lang/rust/issues/36888
6810 [36889]: https://github.com/rust-lang/rust/issues/36889
6811 [36890]: https://github.com/rust-lang/rust/issues/36890
6812 [36891]: https://github.com/rust-lang/rust/issues/36891
6813 [36892]: https://github.com/rust-lang/rust/issues/36892
6814 [36894]: https://github.com/rust-lang/rust/pull/36894
6815 [36917]: https://github.com/rust-lang/rust/pull/36917
6816 [36993]: https://github.com/rust-lang/rust/pull/36993
6817 [37037]: https://github.com/rust-lang/rust/pull/37037
6818 [37064]: https://github.com/rust-lang/rust/pull/37064
6819 [37094]: https://github.com/rust-lang/rust/pull/37094
6820 [37108]: https://github.com/rust-lang/rust/pull/37108
6821 [37111]: https://github.com/rust-lang/rust/pull/37111
6822 [37161]: https://github.com/rust-lang/rust/pull/37161
6823 [37162]: https://github.com/rust-lang/rust/pull/37162
6824 [37167]: https://github.com/rust-lang/rust/pull/37167
6825 [37178]: https://github.com/rust-lang/rust/pull/37178
6826 [37200]: https://github.com/rust-lang/rust/pull/37200
6827 [37213]: https://github.com/rust-lang/rust/pull/37213
6828 [37221]: https://github.com/rust-lang/rust/pull/37221
6829 [37224]: https://github.com/rust-lang/rust/pull/37224
6830 [37230]: https://github.com/rust-lang/rust/pull/37230
6831 [37231]: https://github.com/rust-lang/rust/pull/37231
6832 [37247]: https://github.com/rust-lang/rust/pull/37247
6833 [37267]: https://github.com/rust-lang/rust/pull/37267
6834 [37270]: https://github.com/rust-lang/rust/pull/37270
6835 [37273]: https://github.com/rust-lang/rust/pull/37273
6836 [37280]: https://github.com/rust-lang/rust/pull/37280
6837 [37298]: https://github.com/rust-lang/rust/pull/37298
6838 [37306]: https://github.com/rust-lang/rust/pull/37306
6839 [37310]: https://github.com/rust-lang/rust/pull/37310
6840 [37312]: https://github.com/rust-lang/rust/pull/37312
6841 [37313]: https://github.com/rust-lang/rust/pull/37313
6842 [37315]: https://github.com/rust-lang/rust/pull/37315
6843 [37318]: https://github.com/rust-lang/rust/pull/37318
6844 [37322]: https://github.com/rust-lang/rust/pull/37322
6845 [37326]: https://github.com/rust-lang/rust/pull/37326
6846 [37351]: https://github.com/rust-lang/rust/pull/37351
6847 [37356]: https://github.com/rust-lang/rust/pull/37356
6848 [37367]: https://github.com/rust-lang/rust/pull/37367
6849 [37373]: https://github.com/rust-lang/rust/pull/37373
6850 [37378]: https://github.com/rust-lang/rust/pull/37378
6851 [37389]: https://github.com/rust-lang/rust/pull/37389
6852 [37392]: https://github.com/rust-lang/rust/pull/37392
6853 [37427]: https://github.com/rust-lang/rust/pull/37427
6854 [37439]: https://github.com/rust-lang/rust/pull/37439
6855 [37445]: https://github.com/rust-lang/rust/pull/37445
6856 [37470]: https://github.com/rust-lang/rust/pull/37470
6857 [37569]: https://github.com/rust-lang/rust/pull/37569
6858 [RFC 1492]: https://github.com/rust-lang/rfcs/blob/master/text/1492-dotdot-in-patterns.md
6859 [cargo/3175]: https://github.com/rust-lang/cargo/pull/3175
6860 [cargo/3220]: https://github.com/rust-lang/cargo/pull/3220
6861 [cargo/3243]: https://github.com/rust-lang/cargo/pull/3243
6862 [cargo/3249]: https://github.com/rust-lang/cargo/pull/3249
6863 [cargo/3259]: https://github.com/rust-lang/cargo/pull/3259
6864 [cargo/3280]: https://github.com/rust-lang/cargo/pull/3280
6865
6866
6867 Version 1.13.0 (2016-11-10)
6868 ===========================
6869
6870 Language
6871 --------
6872
6873 * [Stabilize the `?` operator][36995]. `?` is a simple way to propagate
6874   errors, like the `try!` macro, described in [RFC 0243].
6875 * [Stabilize macros in type position][36014]. Described in [RFC 873].
6876 * [Stabilize attributes on statements][36995]. Described in [RFC 0016].
6877 * [Fix `#[derive]` for empty tuple structs/variants][35728]
6878 * [Fix lifetime rules for 'if' conditions][36029]
6879 * [Avoid loading and parsing unconfigured non-inline modules][36482]
6880
6881 Compiler
6882 --------
6883
6884 * [Add the `-C link-arg` argument][36574]
6885 * [Remove the old AST-based backend from rustc_trans][35764]
6886 * [Don't enable NEON by default on armv7 Linux][35814]
6887 * [Fix debug line number info for macro expansions][35238]
6888 * [Do not emit "class method" debuginfo for types that are not
6889   DICompositeType][36008]
6890 * [Warn about multiple conflicting #[repr] hints][34623]
6891 * [When sizing DST, don't double-count nested struct prefixes][36351]
6892 * [Default RUST_MIN_STACK to 16MiB for now][36505]
6893 * [Improve rlib metadata format][36551]. Reduces rlib size significantly.
6894 * [Reject macros with empty repetitions to avoid infinite loop][36721]
6895 * [Expand macros without recursing to avoid stack overflows][36214]
6896
6897 Diagnostics
6898 -----------
6899
6900 * [Replace macro backtraces with labeled local uses][35702]
6901 * [Improve error message for misplaced doc comments][33922]
6902 * [Buffer unix and lock windows to prevent message interleaving][35975]
6903 * [Update lifetime errors to specifically note temporaries][36171]
6904 * [Special case a few colors for Windows][36178]
6905 * [Suggest `use self` when such an import resolves][36289]
6906 * [Be more specific when type parameter shadows primitive type][36338]
6907 * Many minor improvements
6908
6909 Compile-time Optimizations
6910 --------------------------
6911
6912 * [Compute and cache HIR hashes at beginning][35854]
6913 * [Don't hash types in loan paths][36004]
6914 * [Cache projections in trans][35761]
6915 * [Optimize the parser's last token handling][36527]
6916 * [Only instantiate #[inline] functions in codegen units referencing
6917   them][36524]. This leads to big improvements in cases where crates export
6918   define many inline functions without using them directly.
6919 * [Lazily allocate TypedArena's first chunk][36592]
6920 * [Don't allocate during default HashSet creation][36734]
6921
6922 Stabilized APIs
6923 ---------------
6924
6925 * [`checked_abs`]
6926 * [`wrapping_abs`]
6927 * [`overflowing_abs`]
6928 * [`RefCell::try_borrow`]
6929 * [`RefCell::try_borrow_mut`]
6930
6931 Libraries
6932 ---------
6933
6934 * [Add `assert_ne!` and `debug_assert_ne!`][35074]
6935 * [Make `vec_deque::Drain`, `hash_map::Drain`, and `hash_set::Drain`
6936   covariant][35354]
6937 * [Implement `AsRef<[T]>` for `std::slice::Iter`][35559]
6938 * [Implement `Debug` for `std::vec::IntoIter`][35707]
6939 * [`CString`: avoid excessive growth just to 0-terminate][35871]
6940 * [Implement `CoerceUnsized` for `{Cell, RefCell, UnsafeCell}`][35627]
6941 * [Use arc4rand on FreeBSD][35884]
6942 * [memrchr: Correct aligned offset computation][35969]
6943 * [Improve Demangling of Rust Symbols][36059]
6944 * [Use monotonic time in condition variables][35048]
6945 * [Implement `Debug` for `std::path::{Components,Iter}`][36101]
6946 * [Implement conversion traits for `char`][35755]
6947 * [Fix illegal instruction caused by overflow in channel cloning][36104]
6948 * [Zero first byte of CString on drop][36264]
6949 * [Inherit overflow checks for sum and product][36372]
6950 * [Add missing Eq implementations][36423]
6951 * [Implement `Debug` for `DirEntry`][36631]
6952 * [When `getaddrinfo` returns `EAI_SYSTEM` retrieve actual error from
6953   `errno`][36754]
6954 * [`SipHasher`] is deprecated. Use [`DefaultHasher`].
6955 * [Implement more traits for `std::io::ErrorKind`][35911]
6956 * [Optimize BinaryHeap bounds checking][36072]
6957 * [Work around pointer aliasing issue in `Vec::extend_from_slice`,
6958   `extend_with_element`][36355]
6959 * [Fix overflow checking in unsigned pow()][34942]
6960
6961 Cargo
6962 -----
6963
6964 * This release includes security fixes to both curl and OpenSSL.
6965 * [Fix transitive doctests when panic=abort][cargo/3021]
6966 * [Add --all-features flag to cargo][cargo/3038]
6967 * [Reject path-based dependencies in `cargo package`][cargo/3060]
6968 * [Don't parse the home directory more than once][cargo/3078]
6969 * [Don't try to generate Cargo.lock on empty workspaces][cargo/3092]
6970 * [Update OpenSSL to 1.0.2j][cargo/3121]
6971 * [Add license and license_file to cargo metadata output][cargo/3110]
6972 * [Make crates-io registry URL optional in config; ignore all changes to
6973   source.crates-io][cargo/3089]
6974 * [Don't download dependencies from other platforms][cargo/3123]
6975 * [Build transitive dev-dependencies when needed][cargo/3125]
6976 * [Add support for per-target rustflags in .cargo/config][cargo/3157]
6977 * [Avoid updating registry when adding existing deps][cargo/3144]
6978 * [Warn about path overrides that won't work][cargo/3136]
6979 * [Use workspaces during `cargo install`][cargo/3146]
6980 * [Leak mspdbsrv.exe processes on Windows][cargo/3162]
6981 * [Add --message-format flag][cargo/3000]
6982 * [Pass target environment for rustdoc][cargo/3205]
6983 * [Use `CommandExt::exec` for `cargo run` on Unix][cargo/2818]
6984 * [Update curl and curl-sys][cargo/3241]
6985 * [Call rustdoc test with the correct cfg flags of a package][cargo/3242]
6986
6987 Tooling
6988 -------
6989
6990 * [rustdoc: Add the `--sysroot` argument][36586]
6991 * [rustdoc: Fix a couple of issues with the search results][35655]
6992 * [rustdoc: remove the `!` from macro URLs and titles][35234]
6993 * [gdb: Fix pretty-printing special-cased Rust types][35585]
6994 * [rustdoc: Filter more incorrect methods inherited through Deref][36266]
6995
6996 Misc
6997 ----
6998
6999 * [Remove unmaintained style guide][35124]
7000 * [Add s390x support][36369]
7001 * [Initial work at Haiku OS support][36727]
7002 * [Add mips-uclibc targets][35734]
7003 * [Crate-ify compiler-rt into compiler-builtins][35021]
7004 * [Add rustc version info (git hash + date) to dist tarball][36213]
7005 * Many documentation improvements
7006
7007 Compatibility Notes
7008 -------------------
7009
7010 * [`SipHasher`] is deprecated. Use [`DefaultHasher`].
7011 * [Deny (by default) transmuting from fn item types to pointer-sized
7012   types][34923]. Continuing the long transition to zero-sized fn items,
7013   per [RFC 401].
7014 * [Fix `#[derive]` for empty tuple structs/variants][35728].
7015   Part of [RFC 1506].
7016 * [Issue deprecation warnings for safe accesses to extern statics][36173]
7017 * [Fix lifetime rules for 'if' conditions][36029].
7018 * [Inherit overflow checks for sum and product][36372].
7019 * [Forbid user-defined macros named "macro_rules"][36730].
7020
7021 [33922]: https://github.com/rust-lang/rust/pull/33922
7022 [34623]: https://github.com/rust-lang/rust/pull/34623
7023 [34923]: https://github.com/rust-lang/rust/pull/34923
7024 [34942]: https://github.com/rust-lang/rust/pull/34942
7025 [34982]: https://github.com/rust-lang/rust/pull/34982
7026 [35021]: https://github.com/rust-lang/rust/pull/35021
7027 [35048]: https://github.com/rust-lang/rust/pull/35048
7028 [35074]: https://github.com/rust-lang/rust/pull/35074
7029 [35124]: https://github.com/rust-lang/rust/pull/35124
7030 [35234]: https://github.com/rust-lang/rust/pull/35234
7031 [35238]: https://github.com/rust-lang/rust/pull/35238
7032 [35354]: https://github.com/rust-lang/rust/pull/35354
7033 [35559]: https://github.com/rust-lang/rust/pull/35559
7034 [35585]: https://github.com/rust-lang/rust/pull/35585
7035 [35627]: https://github.com/rust-lang/rust/pull/35627
7036 [35655]: https://github.com/rust-lang/rust/pull/35655
7037 [35702]: https://github.com/rust-lang/rust/pull/35702
7038 [35707]: https://github.com/rust-lang/rust/pull/35707
7039 [35728]: https://github.com/rust-lang/rust/pull/35728
7040 [35734]: https://github.com/rust-lang/rust/pull/35734
7041 [35755]: https://github.com/rust-lang/rust/pull/35755
7042 [35761]: https://github.com/rust-lang/rust/pull/35761
7043 [35764]: https://github.com/rust-lang/rust/pull/35764
7044 [35814]: https://github.com/rust-lang/rust/pull/35814
7045 [35854]: https://github.com/rust-lang/rust/pull/35854
7046 [35871]: https://github.com/rust-lang/rust/pull/35871
7047 [35884]: https://github.com/rust-lang/rust/pull/35884
7048 [35911]: https://github.com/rust-lang/rust/pull/35911
7049 [35969]: https://github.com/rust-lang/rust/pull/35969
7050 [35975]: https://github.com/rust-lang/rust/pull/35975
7051 [36004]: https://github.com/rust-lang/rust/pull/36004
7052 [36008]: https://github.com/rust-lang/rust/pull/36008
7053 [36014]: https://github.com/rust-lang/rust/pull/36014
7054 [36029]: https://github.com/rust-lang/rust/pull/36029
7055 [36059]: https://github.com/rust-lang/rust/pull/36059
7056 [36072]: https://github.com/rust-lang/rust/pull/36072
7057 [36101]: https://github.com/rust-lang/rust/pull/36101
7058 [36104]: https://github.com/rust-lang/rust/pull/36104
7059 [36171]: https://github.com/rust-lang/rust/pull/36171
7060 [36173]: https://github.com/rust-lang/rust/pull/36173
7061 [36178]: https://github.com/rust-lang/rust/pull/36178
7062 [36213]: https://github.com/rust-lang/rust/pull/36213
7063 [36214]: https://github.com/rust-lang/rust/pull/36214
7064 [36264]: https://github.com/rust-lang/rust/pull/36264
7065 [36266]: https://github.com/rust-lang/rust/pull/36266
7066 [36289]: https://github.com/rust-lang/rust/pull/36289
7067 [36338]: https://github.com/rust-lang/rust/pull/36338
7068 [36351]: https://github.com/rust-lang/rust/pull/36351
7069 [36355]: https://github.com/rust-lang/rust/pull/36355
7070 [36369]: https://github.com/rust-lang/rust/pull/36369
7071 [36372]: https://github.com/rust-lang/rust/pull/36372
7072 [36423]: https://github.com/rust-lang/rust/pull/36423
7073 [36482]: https://github.com/rust-lang/rust/pull/36482
7074 [36505]: https://github.com/rust-lang/rust/pull/36505
7075 [36524]: https://github.com/rust-lang/rust/pull/36524
7076 [36527]: https://github.com/rust-lang/rust/pull/36527
7077 [36551]: https://github.com/rust-lang/rust/pull/36551
7078 [36574]: https://github.com/rust-lang/rust/pull/36574
7079 [36586]: https://github.com/rust-lang/rust/pull/36586
7080 [36592]: https://github.com/rust-lang/rust/pull/36592
7081 [36631]: https://github.com/rust-lang/rust/pull/36631
7082 [36639]: https://github.com/rust-lang/rust/pull/36639
7083 [36721]: https://github.com/rust-lang/rust/pull/36721
7084 [36727]: https://github.com/rust-lang/rust/pull/36727
7085 [36730]: https://github.com/rust-lang/rust/pull/36730
7086 [36734]: https://github.com/rust-lang/rust/pull/36734
7087 [36754]: https://github.com/rust-lang/rust/pull/36754
7088 [36995]: https://github.com/rust-lang/rust/pull/36995
7089 [RFC 0016]: https://github.com/rust-lang/rfcs/blob/master/text/0016-more-attributes.md
7090 [RFC 0243]: https://github.com/rust-lang/rfcs/blob/master/text/0243-trait-based-exception-handling.md
7091 [RFC 1506]: https://github.com/rust-lang/rfcs/blob/master/text/1506-adt-kinds.md
7092 [RFC 401]: https://github.com/rust-lang/rfcs/blob/master/text/0401-coercions.md
7093 [RFC 873]: https://github.com/rust-lang/rfcs/blob/master/text/0873-type-macros.md
7094 [cargo/2818]: https://github.com/rust-lang/cargo/pull/2818
7095 [cargo/3000]: https://github.com/rust-lang/cargo/pull/3000
7096 [cargo/3021]: https://github.com/rust-lang/cargo/pull/3021
7097 [cargo/3038]: https://github.com/rust-lang/cargo/pull/3038
7098 [cargo/3060]: https://github.com/rust-lang/cargo/pull/3060
7099 [cargo/3078]: https://github.com/rust-lang/cargo/pull/3078
7100 [cargo/3089]: https://github.com/rust-lang/cargo/pull/3089
7101 [cargo/3092]: https://github.com/rust-lang/cargo/pull/3092
7102 [cargo/3110]: https://github.com/rust-lang/cargo/pull/3110
7103 [cargo/3121]: https://github.com/rust-lang/cargo/pull/3121
7104 [cargo/3123]: https://github.com/rust-lang/cargo/pull/3123
7105 [cargo/3125]: https://github.com/rust-lang/cargo/pull/3125
7106 [cargo/3136]: https://github.com/rust-lang/cargo/pull/3136
7107 [cargo/3144]: https://github.com/rust-lang/cargo/pull/3144
7108 [cargo/3146]: https://github.com/rust-lang/cargo/pull/3146
7109 [cargo/3157]: https://github.com/rust-lang/cargo/pull/3157
7110 [cargo/3162]: https://github.com/rust-lang/cargo/pull/3162
7111 [cargo/3205]: https://github.com/rust-lang/cargo/pull/3205
7112 [cargo/3241]: https://github.com/rust-lang/cargo/pull/3241
7113 [cargo/3242]: https://github.com/rust-lang/cargo/pull/3242
7114 [rustup]: https://www.rustup.rs
7115 [`checked_abs`]: https://doc.rust-lang.org/std/primitive.i32.html#method.checked_abs
7116 [`wrapping_abs`]: https://doc.rust-lang.org/std/primitive.i32.html#method.wrapping_abs
7117 [`overflowing_abs`]: https://doc.rust-lang.org/std/primitive.i32.html#method.overflowing_abs
7118 [`RefCell::try_borrow`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.try_borrow
7119 [`RefCell::try_borrow_mut`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.try_borrow_mut
7120 [`SipHasher`]: https://doc.rust-lang.org/std/hash/struct.SipHasher.html
7121 [`DefaultHasher`]: https://doc.rust-lang.org/std/collections/hash_map/struct.DefaultHasher.html
7122
7123
7124 Version 1.12.1 (2016-10-20)
7125 ===========================
7126
7127 Regression Fixes
7128 ----------------
7129
7130 * [ICE: 'rustc' panicked at 'assertion failed: concrete_substs.is_normalized_for_trans()' #36381][36381]
7131 * [Confusion with double negation and booleans][36856]
7132 * [rustc 1.12.0 fails with SIGSEGV in release mode (syn crate 0.8.0)][36875]
7133 * [Rustc 1.12.0 Windows build of `ethcore` crate fails with LLVM error][36924]
7134 * [1.12.0: High memory usage when linking in release mode with debug info][36926]
7135 * [Corrupted memory after updated to 1.12][36936]
7136 * ["Let NullaryConstructor = something;" causes internal compiler error: "tried to overwrite interned AdtDef"][37026]
7137 * [Fix ICE: inject bitcast if types mismatch for invokes/calls/stores][37112]
7138 * [debuginfo: Handle spread_arg case in MIR-trans in a more stable way.][37153]
7139
7140 [36381]: https://github.com/rust-lang/rust/issues/36381
7141 [36856]: https://github.com/rust-lang/rust/issues/36856
7142 [36875]: https://github.com/rust-lang/rust/issues/36875
7143 [36924]: https://github.com/rust-lang/rust/issues/36924
7144 [36926]: https://github.com/rust-lang/rust/issues/36926
7145 [36936]: https://github.com/rust-lang/rust/issues/36936
7146 [37026]: https://github.com/rust-lang/rust/issues/37026
7147 [37112]: https://github.com/rust-lang/rust/issues/37112
7148 [37153]: https://github.com/rust-lang/rust/issues/37153
7149
7150
7151 Version 1.12.0 (2016-09-29)
7152 ===========================
7153
7154 Highlights
7155 ----------
7156
7157 * [`rustc` translates code to LLVM IR via its own "middle" IR (MIR)](https://github.com/rust-lang/rust/pull/34096).
7158   This translation pass is far simpler than the previous AST->LLVM pass, and
7159   creates opportunities to perform new optimizations directly on the MIR. It
7160   was previously described [on the Rust blog](https://blog.rust-lang.org/2016/04/19/MIR.html).
7161 * [`rustc` presents a new, more readable error format, along with
7162   machine-readable JSON error output for use by IDEs](https://github.com/rust-lang/rust/pull/35401).
7163   Most common editors supporting Rust have been updated to work with it. It was
7164   previously described [on the Rust blog](https://blog.rust-lang.org/2016/08/10/Shape-of-errors-to-come.html).
7165
7166 Compiler
7167 --------
7168
7169 * [`rustc` translates code to LLVM IR via its own "middle" IR (MIR)](https://github.com/rust-lang/rust/pull/34096).
7170   This translation pass is far simpler than the previous AST->LLVM pass, and
7171   creates opportunities to perform new optimizations directly on the MIR. It
7172   was previously described [on the Rust blog](https://blog.rust-lang.org/2016/04/19/MIR.html).
7173 * [Print the Rust target name, not the LLVM target name, with
7174   `--print target-list`](https://github.com/rust-lang/rust/pull/35489)
7175 * [The computation of `TypeId` is correct in some cases where it was previously
7176   producing inconsistent results](https://github.com/rust-lang/rust/pull/35267)
7177 * [The `mips-unknown-linux-gnu` target uses hardware floating point by default](https://github.com/rust-lang/rust/pull/34910)
7178 * [The `rustc` arguments, `--print target-cpus`, `--print target-features`,
7179   `--print relocation-models`, and `--print code-models` print the available
7180   options to the `-C target-cpu`, `-C target-feature`, `-C relocation-model` and
7181   `-C code-model` code generation arguments](https://github.com/rust-lang/rust/pull/34845)
7182 * [`rustc` supports three new MUSL targets on ARM: `arm-unknown-linux-musleabi`,
7183   `arm-unknown-linux-musleabihf`, and `armv7-unknown-linux-musleabihf`](https://github.com/rust-lang/rust/pull/35060).
7184   These targets produce statically-linked binaries. There are no binary release
7185   builds yet though.
7186
7187 Diagnostics
7188 -----------
7189
7190 * [`rustc` presents a new, more readable error format, along with
7191   machine-readable JSON error output for use by IDEs](https://github.com/rust-lang/rust/pull/35401).
7192   Most common editors supporting Rust have been updated to work with it. It was
7193   previously described [on the Rust blog](https://blog.rust-lang.org/2016/08/10/Shape-of-errors-to-come.html).
7194 * [In error descriptions, references are now described in plain English,
7195   instead of as "&-ptr"](https://github.com/rust-lang/rust/pull/35611)
7196 * [In error type descriptions, unknown numeric types are named `{integer}` or
7197   `{float}` instead of `_`](https://github.com/rust-lang/rust/pull/35080)
7198 * [`rustc` emits a clearer error when inner attributes follow a doc comment](https://github.com/rust-lang/rust/pull/34676)
7199
7200 Language
7201 --------
7202
7203 * [`macro_rules!` invocations can be made within `macro_rules!` invocations](https://github.com/rust-lang/rust/pull/34925)
7204 * [`macro_rules!` meta-variables are hygienic](https://github.com/rust-lang/rust/pull/35453)
7205 * [`macro_rules!` `tt` matchers can be reparsed correctly, making them much more
7206   useful](https://github.com/rust-lang/rust/pull/34908)
7207 * [`macro_rules!` `stmt` matchers correctly consume the entire contents when
7208   inside non-braces invocations](https://github.com/rust-lang/rust/pull/34886)
7209 * [Semicolons are properly required as statement delimiters inside
7210   `macro_rules!` invocations](https://github.com/rust-lang/rust/pull/34660)
7211 * [`cfg_attr` works on `path` attributes](https://github.com/rust-lang/rust/pull/34546)
7212
7213 Stabilized APIs
7214 ---------------
7215
7216 * [`Cell::as_ptr`](https://doc.rust-lang.org/std/cell/struct.Cell.html#method.as_ptr)
7217 * [`RefCell::as_ptr`](https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.as_ptr)
7218 * [`IpAddr::is_unspecified`](https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_unspecified)
7219 * [`IpAddr::is_loopback`](https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_loopback)
7220 * [`IpAddr::is_multicast`](https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_multicast)
7221 * [`Ipv4Addr::is_unspecified`](https://doc.rust-lang.org/std/net/struct.Ipv4Addr.html#method.is_unspecified)
7222 * [`Ipv6Addr::octets`](https://doc.rust-lang.org/std/net/struct.Ipv6Addr.html#method.octets)
7223 * [`LinkedList::contains`](https://doc.rust-lang.org/std/collections/linked_list/struct.LinkedList.html#method.contains)
7224 * [`VecDeque::contains`](https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.contains)
7225 * [`ExitStatusExt::from_raw`](https://doc.rust-lang.org/std/os/unix/process/trait.ExitStatusExt.html#tymethod.from_raw).
7226   Both on Unix and Windows.
7227 * [`Receiver::recv_timeout`](https://doc.rust-lang.org/std/sync/mpsc/struct.Receiver.html#method.recv_timeout)
7228 * [`RecvTimeoutError`](https://doc.rust-lang.org/std/sync/mpsc/enum.RecvTimeoutError.html)
7229 * [`BinaryHeap::peek_mut`](https://doc.rust-lang.org/std/collections/binary_heap/struct.BinaryHeap.html#method.peek_mut)
7230 * [`PeekMut`](https://doc.rust-lang.org/std/collections/binary_heap/struct.PeekMut.html)
7231 * [`iter::Product`](https://doc.rust-lang.org/std/iter/trait.Product.html)
7232 * [`iter::Sum`](https://doc.rust-lang.org/std/iter/trait.Sum.html)
7233 * [`OccupiedEntry::remove_entry`](https://doc.rust-lang.org/std/collections/btree_map/struct.OccupiedEntry.html#method.remove_entry)
7234 * [`VacantEntry::into_key`](https://doc.rust-lang.org/std/collections/btree_map/struct.VacantEntry.html#method.into_key)
7235
7236 Libraries
7237 ---------
7238
7239 * [The `format!` macro and friends now allow a single argument to be formatted
7240   in multiple styles](https://github.com/rust-lang/rust/pull/33642)
7241 * [The lifetime bounds on `[T]::binary_search_by` and
7242   `[T]::binary_search_by_key` have been adjusted to be more flexible](https://github.com/rust-lang/rust/pull/34762)
7243 * [`Option` implements `From` for its contained type](https://github.com/rust-lang/rust/pull/34828)
7244 * [`Cell`, `RefCell` and `UnsafeCell` implement `From` for their contained type](https://github.com/rust-lang/rust/pull/35392)
7245 * [`RwLock` panics if the reader count overflows](https://github.com/rust-lang/rust/pull/35378)
7246 * [`vec_deque::Drain`, `hash_map::Drain` and `hash_set::Drain` are covariant](https://github.com/rust-lang/rust/pull/35354)
7247 * [`vec::Drain` and `binary_heap::Drain` are covariant](https://github.com/rust-lang/rust/pull/34951)
7248 * [`Cow<str>` implements `FromIterator` for `char`, `&str` and `String`](https://github.com/rust-lang/rust/pull/35064)
7249 * [Sockets on Linux are correctly closed in subprocesses via `SOCK_CLOEXEC`](https://github.com/rust-lang/rust/pull/34946)
7250 * [`hash_map::Entry`, `hash_map::VacantEntry` and `hash_map::OccupiedEntry`
7251   implement `Debug`](https://github.com/rust-lang/rust/pull/34937)
7252 * [`btree_map::Entry`, `btree_map::VacantEntry` and `btree_map::OccupiedEntry`
7253   implement `Debug`](https://github.com/rust-lang/rust/pull/34885)
7254 * [`String` implements `AddAssign`](https://github.com/rust-lang/rust/pull/34890)
7255 * [Variadic `extern fn` pointers implement the `Clone`, `PartialEq`, `Eq`,
7256   `PartialOrd`, `Ord`, `Hash`, `fmt::Pointer`, and `fmt::Debug` traits](https://github.com/rust-lang/rust/pull/34879)
7257 * [`FileType` implements `Debug`](https://github.com/rust-lang/rust/pull/34757)
7258 * [References to `Mutex` and `RwLock` are unwind-safe](https://github.com/rust-lang/rust/pull/34756)
7259 * [`mpsc::sync_channel` `Receiver`s return any available message before
7260   reporting a disconnect](https://github.com/rust-lang/rust/pull/34731)
7261 * [Unicode definitions have been updated to 9.0](https://github.com/rust-lang/rust/pull/34599)
7262 * [`env` iterators implement `DoubleEndedIterator`](https://github.com/rust-lang/rust/pull/33312)
7263
7264 Cargo
7265 -----
7266
7267 * [Support local mirrors of registries](https://github.com/rust-lang/cargo/pull/2857)
7268 * [Add support for command aliases](https://github.com/rust-lang/cargo/pull/2679)
7269 * [Allow `opt-level="s"` / `opt-level="z"` in profile overrides](https://github.com/rust-lang/cargo/pull/3007)
7270 * [Make `cargo doc --open --target` work as expected](https://github.com/rust-lang/cargo/pull/2988)
7271 * [Speed up noop registry updates](https://github.com/rust-lang/cargo/pull/2974)
7272 * [Update OpenSSL](https://github.com/rust-lang/cargo/pull/2971)
7273 * [Fix `--panic=abort` with plugins](https://github.com/rust-lang/cargo/pull/2954)
7274 * [Always pass `-C metadata` to the compiler](https://github.com/rust-lang/cargo/pull/2946)
7275 * [Fix depending on git repos with workspaces](https://github.com/rust-lang/cargo/pull/2938)
7276 * [Add a `--lib` flag to `cargo new`](https://github.com/rust-lang/cargo/pull/2921)
7277 * [Add `http.cainfo` for custom certs](https://github.com/rust-lang/cargo/pull/2917)
7278 * [Indicate the compilation profile after compiling](https://github.com/rust-lang/cargo/pull/2909)
7279 * [Allow enabling features for dependencies with `--features`](https://github.com/rust-lang/cargo/pull/2876)
7280 * [Add `--jobs` flag to `cargo package`](https://github.com/rust-lang/cargo/pull/2867)
7281 * [Add `--dry-run` to `cargo publish`](https://github.com/rust-lang/cargo/pull/2849)
7282 * [Add support for `RUSTDOCFLAGS`](https://github.com/rust-lang/cargo/pull/2794)
7283
7284 Performance
7285 -----------
7286
7287 * [`panic::catch_unwind` is more optimized](https://github.com/rust-lang/rust/pull/35444)
7288 * [`panic::catch_unwind` no longer accesses thread-local storage on entry](https://github.com/rust-lang/rust/pull/34866)
7289
7290 Tooling
7291 -------
7292
7293 * [Test binaries now support a `--test-threads` argument to specify the number
7294   of threads used to run tests, and which acts the same as the
7295   `RUST_TEST_THREADS` environment variable](https://github.com/rust-lang/rust/pull/35414)
7296 * [The test runner now emits a warning when tests run over 60 seconds](https://github.com/rust-lang/rust/pull/35405)
7297 * [rustdoc: Fix methods in search results](https://github.com/rust-lang/rust/pull/34752)
7298 * [`rust-lldb` warns about unsupported versions of LLDB](https://github.com/rust-lang/rust/pull/34646)
7299 * [Rust releases now come with source packages that can be installed by rustup
7300   via `rustup component add rust-src`](https://github.com/rust-lang/rust/pull/34366).
7301   The resulting source code can be used by tools and IDES, located in the
7302   sysroot under `lib/rustlib/src`.
7303
7304 Misc
7305 ----
7306
7307 * [The compiler can now be built against LLVM 3.9](https://github.com/rust-lang/rust/pull/35594)
7308 * Many minor improvements to the documentation.
7309 * [The Rust exception handling "personality" routine is now written in Rust](https://github.com/rust-lang/rust/pull/34832)
7310
7311 Compatibility Notes
7312 -------------------
7313
7314 * [When printing Windows `OsStr`s, unpaired surrogate codepoints are escaped
7315   with the lowercase format instead of the uppercase](https://github.com/rust-lang/rust/pull/35084)
7316 * [When formatting strings, if "precision" is specified, the "fill",
7317   "align" and "width" specifiers are no longer ignored](https://github.com/rust-lang/rust/pull/34544)
7318 * [The `Debug` impl for strings no longer escapes all non-ASCII characters](https://github.com/rust-lang/rust/pull/34485)
7319
7320
7321 Version 1.11.0 (2016-08-18)
7322 ===========================
7323
7324 Language
7325 --------
7326
7327 * [Support nested `cfg_attr` attributes](https://github.com/rust-lang/rust/pull/34216)
7328 * [Allow statement-generating braced macro invocations at the end of blocks](https://github.com/rust-lang/rust/pull/34436)
7329 * [Macros can be expanded inside of trait definitions](https://github.com/rust-lang/rust/pull/34213)
7330 * [`#[macro_use]` works properly when it is itself expanded from a macro](https://github.com/rust-lang/rust/pull/34032)
7331
7332 Stabilized APIs
7333 ---------------
7334
7335 * [`BinaryHeap::append`](https://doc.rust-lang.org/std/collections/binary_heap/struct.BinaryHeap.html#method.append)
7336 * [`BTreeMap::append`](https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.append)
7337 * [`BTreeMap::split_off`](https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.split_off)
7338 * [`BTreeSet::append`](https://doc.rust-lang.org/std/collections/btree_set/struct.BTreeSet.html#method.append)
7339 * [`BTreeSet::split_off`](https://doc.rust-lang.org/std/collections/btree_set/struct.BTreeSet.html#method.split_off)
7340 * [`f32::to_degrees`](https://doc.rust-lang.org/std/primitive.f32.html#method.to_degrees)
7341   (in libcore - previously stabilized in libstd)
7342 * [`f32::to_radians`](https://doc.rust-lang.org/std/primitive.f32.html#method.to_radians)
7343   (in libcore - previously stabilized in libstd)
7344 * [`f64::to_degrees`](https://doc.rust-lang.org/std/primitive.f64.html#method.to_degrees)
7345   (in libcore - previously stabilized in libstd)
7346 * [`f64::to_radians`](https://doc.rust-lang.org/std/primitive.f64.html#method.to_radians)
7347   (in libcore - previously stabilized in libstd)
7348 * [`Iterator::sum`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.sum)
7349 * [`Iterator::product`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.sum)
7350 * [`Cell::get_mut`](https://doc.rust-lang.org/std/cell/struct.Cell.html#method.get_mut)
7351 * [`RefCell::get_mut`](https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.get_mut)
7352
7353 Libraries
7354 ---------
7355
7356 * [The `thread_local!` macro supports multiple definitions in a single
7357    invocation, and can apply attributes](https://github.com/rust-lang/rust/pull/34077)
7358 * [`Cow` implements `Default`](https://github.com/rust-lang/rust/pull/34305)
7359 * [`Wrapping` implements binary, octal, lower-hex and upper-hex
7360   `Display` formatting](https://github.com/rust-lang/rust/pull/34190)
7361 * [The range types implement `Hash`](https://github.com/rust-lang/rust/pull/34180)
7362 * [`lookup_host` ignores unknown address types](https://github.com/rust-lang/rust/pull/34067)
7363 * [`assert_eq!` accepts a custom error message, like `assert!` does](https://github.com/rust-lang/rust/pull/33976)
7364 * [The main thread is now called "main" instead of "&lt;main&gt;"](https://github.com/rust-lang/rust/pull/33803)
7365
7366 Cargo
7367 -----
7368
7369 * [Disallow specifying features of transitive deps](https://github.com/rust-lang/cargo/pull/2821)
7370 * [Add color support for Windows consoles](https://github.com/rust-lang/cargo/pull/2804)
7371 * [Fix `harness = false` on `[lib]` sections](https://github.com/rust-lang/cargo/pull/2795)
7372 * [Don't panic when `links` contains a '.'](https://github.com/rust-lang/cargo/pull/2787)
7373 * [Build scripts can emit warnings](https://github.com/rust-lang/cargo/pull/2630),
7374   and `-vv` prints warnings for all crates.
7375 * [Ignore file locks on OS X NFS mounts](https://github.com/rust-lang/cargo/pull/2720)
7376 * [Don't warn about `package.metadata` keys](https://github.com/rust-lang/cargo/pull/2668).
7377   This provides room for expansion by arbitrary tools.
7378 * [Add support for cdylib crate types](https://github.com/rust-lang/cargo/pull/2741)
7379 * [Prevent publishing crates when files are dirty](https://github.com/rust-lang/cargo/pull/2781)
7380 * [Don't fetch all crates on clean](https://github.com/rust-lang/cargo/pull/2704)
7381 * [Propagate --color option to rustc](https://github.com/rust-lang/cargo/pull/2779)
7382 * [Fix `cargo doc --open` on Windows](https://github.com/rust-lang/cargo/pull/2780)
7383 * [Improve autocompletion](https://github.com/rust-lang/cargo/pull/2772)
7384 * [Configure colors of stderr as well as stdout](https://github.com/rust-lang/cargo/pull/2739)
7385
7386 Performance
7387 -----------
7388
7389 * [Caching projections speeds up type check dramatically for some
7390   workloads](https://github.com/rust-lang/rust/pull/33816)
7391 * [The default `HashMap` hasher is SipHash 1-3 instead of SipHash 2-4](https://github.com/rust-lang/rust/pull/33940)
7392   This hasher is faster, but is believed to provide sufficient
7393   protection from collision attacks.
7394 * [Comparison of `Ipv4Addr` is 10x faster](https://github.com/rust-lang/rust/pull/33891)
7395
7396 Rustdoc
7397 -------
7398
7399 * [Fix empty implementation section on some module pages](https://github.com/rust-lang/rust/pull/34536)
7400 * [Fix inlined renamed re-exports in import lists](https://github.com/rust-lang/rust/pull/34479)
7401 * [Fix search result layout for enum variants and struct fields](https://github.com/rust-lang/rust/pull/34477)
7402 * [Fix issues with source links to external crates](https://github.com/rust-lang/rust/pull/34387)
7403 * [Fix redirect pages for renamed re-exports](https://github.com/rust-lang/rust/pull/34245)
7404
7405 Tooling
7406 -------
7407
7408 * [rustc is better at finding the MSVC toolchain](https://github.com/rust-lang/rust/pull/34492)
7409 * [When emitting debug info, rustc emits frame pointers for closures,
7410   shims and glue, as it does for all other functions](https://github.com/rust-lang/rust/pull/33909)
7411 * [rust-lldb warns about unsupported versions of LLDB](https://github.com/rust-lang/rust/pull/34646)
7412 * Many more errors have been given error codes and extended
7413   explanations
7414 * API documentation continues to be improved, with many new examples
7415
7416 Misc
7417 ----
7418
7419 * [rustc no longer hangs when dependencies recursively re-export
7420   submodules](https://github.com/rust-lang/rust/pull/34542)
7421 * [rustc requires LLVM 3.7+](https://github.com/rust-lang/rust/pull/34104)
7422 * [The 'How Safe and Unsafe Interact' chapter of The Rustonomicon was
7423   rewritten](https://github.com/rust-lang/rust/pull/33895)
7424 * [rustc support 16-bit pointer sizes](https://github.com/rust-lang/rust/pull/33460).
7425   No targets use this yet, but it works toward AVR support.
7426
7427 Compatibility Notes
7428 -------------------
7429
7430 * [`const`s and `static`s may not have unsized types](https://github.com/rust-lang/rust/pull/34443)
7431 * [The new follow-set rules that place restrictions on `macro_rules!`
7432   in order to ensure syntax forward-compatibility have been enabled](https://github.com/rust-lang/rust/pull/33982)
7433   This was an [amendment to RFC 550](https://github.com/rust-lang/rfcs/pull/1384),
7434   and has been a warning since 1.10.
7435 * [`cfg` attribute process has been refactored to fix various bugs](https://github.com/rust-lang/rust/pull/33706).
7436   This causes breakage in some corner cases.
7437
7438
7439 Version 1.10.0 (2016-07-07)
7440 ===========================
7441
7442 Language
7443 --------
7444
7445 * [`Copy` types are required to have a trivial implementation of `Clone`](https://github.com/rust-lang/rust/pull/33420).
7446   [RFC 1521](https://github.com/rust-lang/rfcs/blob/master/text/1521-copy-clone-semantics.md).
7447 * [Single-variant enums support the `#[repr(..)]` attribute](https://github.com/rust-lang/rust/pull/33355).
7448 * [Fix `#[derive(RustcEncodable)]` in the presence of other `encode` methods](https://github.com/rust-lang/rust/pull/32908).
7449 * [`panic!` can be converted to a runtime abort with the
7450   `-C panic=abort` flag](https://github.com/rust-lang/rust/pull/32900).
7451   [RFC 1513](https://github.com/rust-lang/rfcs/blob/master/text/1513-less-unwinding.md).
7452 * [Add a new crate type, 'cdylib'](https://github.com/rust-lang/rust/pull/33553).
7453   cdylibs are dynamic libraries suitable for loading by non-Rust hosts.
7454   [RFC 1510](https://github.com/rust-lang/rfcs/blob/master/text/1510-cdylib.md).
7455   Note that Cargo does not yet directly support cdylibs.
7456
7457 Stabilized APIs
7458 ---------------
7459
7460 * `os::windows::fs::OpenOptionsExt::access_mode`
7461 * `os::windows::fs::OpenOptionsExt::share_mode`
7462 * `os::windows::fs::OpenOptionsExt::custom_flags`
7463 * `os::windows::fs::OpenOptionsExt::attributes`
7464 * `os::windows::fs::OpenOptionsExt::security_qos_flags`
7465 * `os::unix::fs::OpenOptionsExt::custom_flags`
7466 * [`sync::Weak::new`](http://doc.rust-lang.org/alloc/arc/struct.Weak.html#method.new)
7467 * `Default for sync::Weak`
7468 * [`panic::set_hook`](http://doc.rust-lang.org/std/panic/fn.set_hook.html)
7469 * [`panic::take_hook`](http://doc.rust-lang.org/std/panic/fn.take_hook.html)
7470 * [`panic::PanicInfo`](http://doc.rust-lang.org/std/panic/struct.PanicInfo.html)
7471 * [`panic::PanicInfo::payload`](http://doc.rust-lang.org/std/panic/struct.PanicInfo.html#method.payload)
7472 * [`panic::PanicInfo::location`](http://doc.rust-lang.org/std/panic/struct.PanicInfo.html#method.location)
7473 * [`panic::Location`](http://doc.rust-lang.org/std/panic/struct.Location.html)
7474 * [`panic::Location::file`](http://doc.rust-lang.org/std/panic/struct.Location.html#method.file)
7475 * [`panic::Location::line`](http://doc.rust-lang.org/std/panic/struct.Location.html#method.line)
7476 * [`ffi::CStr::from_bytes_with_nul`](http://doc.rust-lang.org/std/ffi/struct.CStr.html#method.from_bytes_with_nul)
7477 * [`ffi::CStr::from_bytes_with_nul_unchecked`](http://doc.rust-lang.org/std/ffi/struct.CStr.html#method.from_bytes_with_nul_unchecked)
7478 * [`ffi::FromBytesWithNulError`](http://doc.rust-lang.org/std/ffi/struct.FromBytesWithNulError.html)
7479 * [`fs::Metadata::modified`](http://doc.rust-lang.org/std/fs/struct.Metadata.html#method.modified)
7480 * [`fs::Metadata::accessed`](http://doc.rust-lang.org/std/fs/struct.Metadata.html#method.accessed)
7481 * [`fs::Metadata::created`](http://doc.rust-lang.org/std/fs/struct.Metadata.html#method.created)
7482 * `sync::atomic::Atomic{Usize,Isize,Bool,Ptr}::compare_exchange`
7483 * `sync::atomic::Atomic{Usize,Isize,Bool,Ptr}::compare_exchange_weak`
7484 * `collections::{btree,hash}_map::{Occupied,Vacant,}Entry::key`
7485 * `os::unix::net::{UnixStream, UnixListener, UnixDatagram, SocketAddr}`
7486 * [`SocketAddr::is_unnamed`](http://doc.rust-lang.org/std/os/unix/net/struct.SocketAddr.html#method.is_unnamed)
7487 * [`SocketAddr::as_pathname`](http://doc.rust-lang.org/std/os/unix/net/struct.SocketAddr.html#method.as_pathname)
7488 * [`UnixStream::connect`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.connect)
7489 * [`UnixStream::pair`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.pair)
7490 * [`UnixStream::try_clone`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.try_clone)
7491 * [`UnixStream::local_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.local_addr)
7492 * [`UnixStream::peer_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.peer_addr)
7493 * [`UnixStream::set_read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.read_timeout)
7494 * [`UnixStream::set_write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.write_timeout)
7495 * [`UnixStream::read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.read_timeout)
7496 * [`UnixStream::write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.write_timeout)
7497 * [`UnixStream::set_nonblocking`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.set_nonblocking)
7498 * [`UnixStream::take_error`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.take_error)
7499 * [`UnixStream::shutdown`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.shutdown)
7500 * Read/Write/RawFd impls for `UnixStream`
7501 * [`UnixListener::bind`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.bind)
7502 * [`UnixListener::accept`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.accept)
7503 * [`UnixListener::try_clone`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.try_clone)
7504 * [`UnixListener::local_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.local_addr)
7505 * [`UnixListener::set_nonblocking`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.set_nonblocking)
7506 * [`UnixListener::take_error`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.take_error)
7507 * [`UnixListener::incoming`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.incoming)
7508 * RawFd impls for `UnixListener`
7509 * [`UnixDatagram::bind`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.bind)
7510 * [`UnixDatagram::unbound`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.unbound)
7511 * [`UnixDatagram::pair`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.pair)
7512 * [`UnixDatagram::connect`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.connect)
7513 * [`UnixDatagram::try_clone`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.try_clone)
7514 * [`UnixDatagram::local_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.local_addr)
7515 * [`UnixDatagram::peer_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.peer_addr)
7516 * [`UnixDatagram::recv_from`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.recv_from)
7517 * [`UnixDatagram::recv`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.recv)
7518 * [`UnixDatagram::send_to`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.send_to)
7519 * [`UnixDatagram::send`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.send)
7520 * [`UnixDatagram::set_read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.set_read_timeout)
7521 * [`UnixDatagram::set_write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.set_write_timeout)
7522 * [`UnixDatagram::read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.read_timeout)
7523 * [`UnixDatagram::write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.write_timeout)
7524 * [`UnixDatagram::set_nonblocking`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.set_nonblocking)
7525 * [`UnixDatagram::take_error`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.take_error)
7526 * [`UnixDatagram::shutdown`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.shutdown)
7527 * RawFd impls for `UnixDatagram`
7528 * `{BTree,Hash}Map::values_mut`
7529 * [`<[_]>::binary_search_by_key`](http://doc.rust-lang.org/std/primitive.slice.html#method.binary_search_by_key)
7530
7531 Libraries
7532 ---------
7533
7534 * [The `abs_sub` method of floats is deprecated](https://github.com/rust-lang/rust/pull/33664).
7535   The semantics of this minor method are subtle and probably not what
7536   most people want.
7537 * [Add implementation of Ord for Cell<T> and RefCell<T> where T: Ord](https://github.com/rust-lang/rust/pull/33306).
7538 * [On Linux, if `HashMap`s can't be initialized with `getrandom` they
7539   will fall back to `/dev/urandom` temporarily to avoid blocking
7540   during early boot](https://github.com/rust-lang/rust/pull/33086).
7541 * [Implemented negation for wrapping numerals](https://github.com/rust-lang/rust/pull/33067).
7542 * [Implement `Clone` for `binary_heap::IntoIter`](https://github.com/rust-lang/rust/pull/33050).
7543 * [Implement `Display` and `Hash` for `std::num::Wrapping`](https://github.com/rust-lang/rust/pull/33023).
7544 * [Add `Default` implementation for `&CStr`, `CString`](https://github.com/rust-lang/rust/pull/32990).
7545 * [Implement `From<Vec<T>>` and `Into<Vec<T>>` for `VecDeque<T>`](https://github.com/rust-lang/rust/pull/32866).
7546 * [Implement `Default` for `UnsafeCell`, `fmt::Error`, `Condvar`,
7547   `Mutex`, `RwLock`](https://github.com/rust-lang/rust/pull/32785).
7548
7549 Cargo
7550 -----
7551 * [Cargo.toml supports the `profile.*.panic` option](https://github.com/rust-lang/cargo/pull/2687).
7552   This controls the runtime behavior of the `panic!` macro
7553   and can be either "unwind" (the default), or "abort".
7554   [RFC 1513](https://github.com/rust-lang/rfcs/blob/master/text/1513-less-unwinding.md).
7555 * [Don't throw away errors with `-p` arguments](https://github.com/rust-lang/cargo/pull/2723).
7556 * [Report status to stderr instead of stdout](https://github.com/rust-lang/cargo/pull/2693).
7557 * [Build scripts are passed a `CARGO_MANIFEST_LINKS` environment
7558   variable that corresponds to the `links` field of the manifest](https://github.com/rust-lang/cargo/pull/2710).
7559 * [Ban keywords from crate names](https://github.com/rust-lang/cargo/pull/2707).
7560 * [Canonicalize `CARGO_HOME` on Windows](https://github.com/rust-lang/cargo/pull/2604).
7561 * [Retry network requests](https://github.com/rust-lang/cargo/pull/2396).
7562   By default they are retried twice, which can be customized with the
7563   `net.retry` value in `.cargo/config`.
7564 * [Don't print extra error info for failing subcommands](https://github.com/rust-lang/cargo/pull/2674).
7565 * [Add `--force` flag to `cargo install`](https://github.com/rust-lang/cargo/pull/2405).
7566 * [Don't use `flock` on NFS mounts](https://github.com/rust-lang/cargo/pull/2623).
7567 * [Prefer building `cargo install` artifacts in temporary directories](https://github.com/rust-lang/cargo/pull/2610).
7568   Makes it possible to install multiple crates in parallel.
7569 * [Add `cargo test --doc`](https://github.com/rust-lang/cargo/pull/2578).
7570 * [Add `cargo --explain`](https://github.com/rust-lang/cargo/pull/2551).
7571 * [Don't print warnings when `-q` is passed](https://github.com/rust-lang/cargo/pull/2576).
7572 * [Add `cargo doc --lib` and `--bin`](https://github.com/rust-lang/cargo/pull/2577).
7573 * [Don't require build script output to be UTF-8](https://github.com/rust-lang/cargo/pull/2560).
7574 * [Correctly attempt multiple git usernames](https://github.com/rust-lang/cargo/pull/2584).
7575
7576 Performance
7577 -----------
7578
7579 * [rustc memory usage was reduced by refactoring the context used for
7580   type checking](https://github.com/rust-lang/rust/pull/33425).
7581 * [Speed up creation of `HashMap`s by caching the random keys used
7582   to initialize the hash state](https://github.com/rust-lang/rust/pull/33318).
7583 * [The `find` implementation for `Chain` iterators is 2x faster](https://github.com/rust-lang/rust/pull/33289).
7584 * [Trait selection optimizations speed up type checking by 15%](https://github.com/rust-lang/rust/pull/33138).
7585 * [Efficient trie lookup for boolean Unicode properties](https://github.com/rust-lang/rust/pull/33098).
7586   10x faster than the previous lookup tables.
7587 * [Special case `#[derive(Copy, Clone)]` to avoid bloat](https://github.com/rust-lang/rust/pull/31414).
7588
7589 Usability
7590 ---------
7591
7592 * Many incremental improvements to documentation and rustdoc.
7593 * [rustdoc: List blanket trait impls](https://github.com/rust-lang/rust/pull/33514).
7594 * [rustdoc: Clean up ABI rendering](https://github.com/rust-lang/rust/pull/33151).
7595 * [Indexing with the wrong type produces a more informative error](https://github.com/rust-lang/rust/pull/33401).
7596 * [Improve diagnostics for constants being used in irrefutable patterns](https://github.com/rust-lang/rust/pull/33406).
7597 * [When many method candidates are in scope limit the suggestions to 10](https://github.com/rust-lang/rust/pull/33338).
7598 * [Remove confusing suggestion when calling a `fn` type](https://github.com/rust-lang/rust/pull/33325).
7599 * [Do not suggest changing `&mut self` to `&mut mut self`](https://github.com/rust-lang/rust/pull/33319).
7600
7601 Misc
7602 ----
7603
7604 * [Update i686-linux-android features to match Android ABI](https://github.com/rust-lang/rust/pull/33651).
7605 * [Update aarch64-linux-android features to match Android ABI](https://github.com/rust-lang/rust/pull/33500).
7606 * [`std` no longer prints backtraces on platforms where the running
7607   module must be loaded with `env::current_exe`, which can't be relied
7608   on](https://github.com/rust-lang/rust/pull/33554).
7609 * This release includes std binaries for the i586-unknown-linux-gnu,
7610   i686-unknown-linux-musl, and armv7-linux-androideabi targets. The
7611   i586 target is for old x86 hardware without SSE2, and the armv7
7612   target is for Android running on modern ARM architectures.
7613 * [The `rust-gdb` and `rust-lldb` scripts are distributed on all
7614   Unix platforms](https://github.com/rust-lang/rust/pull/32835).
7615 * [On Unix the runtime aborts by calling `libc::abort` instead of
7616   generating an illegal instruction](https://github.com/rust-lang/rust/pull/31457).
7617 * [Rust is now bootstrapped from the previous release of Rust,
7618   instead of a snapshot from an arbitrary commit](https://github.com/rust-lang/rust/pull/32942).
7619
7620 Compatibility Notes
7621 -------------------
7622
7623 * [`AtomicBool` is now bool-sized, not word-sized](https://github.com/rust-lang/rust/pull/33579).
7624 * [`target_env` for Linux ARM targets is just `gnu`, not
7625   `gnueabihf`, `gnueabi`, etc](https://github.com/rust-lang/rust/pull/33403).
7626 * [Consistently panic on overflow in `Duration::new`](https://github.com/rust-lang/rust/pull/33072).
7627 * [Change `String::truncate` to panic less](https://github.com/rust-lang/rust/pull/32977).
7628 * [Add `:block` to the follow set for `:ty` and `:path`](https://github.com/rust-lang/rust/pull/32945).
7629   Affects how macros are parsed.
7630 * [Fix macro hygiene bug](https://github.com/rust-lang/rust/pull/32923).
7631 * [Feature-gated attributes on macro-generated macro invocations are
7632   now rejected](https://github.com/rust-lang/rust/pull/32791).
7633 * [Suppress fallback and ambiguity errors during type inference](https://github.com/rust-lang/rust/pull/32258).
7634   This caused some minor changes to type inference.
7635
7636
7637 Version 1.9.0 (2016-05-26)
7638 ==========================
7639
7640 Language
7641 --------
7642
7643 * The `#[deprecated]` attribute when applied to an API will generate
7644   warnings when used. The warnings may be suppressed with
7645   `#[allow(deprecated)]`. [RFC 1270].
7646 * [`fn` item types are zero sized, and each `fn` names a unique
7647   type][1.9fn]. This will break code that transmutes `fn`s, so calling
7648   `transmute` on a `fn` type will generate a warning for a few cycles,
7649   then will be converted to an error.
7650 * [Field and method resolution understand visibility, so private
7651   fields and methods cannot prevent the proper use of public fields
7652   and methods][1.9fv].
7653 * [The parser considers unicode codepoints in the
7654   `PATTERN_WHITE_SPACE` category to be whitespace][1.9ws].
7655
7656 Stabilized APIs
7657 ---------------
7658
7659 * [`std::panic`]
7660 * [`std::panic::catch_unwind`] (renamed from `recover`)
7661 * [`std::panic::resume_unwind`] (renamed from `propagate`)
7662 * [`std::panic::AssertUnwindSafe`] (renamed from `AssertRecoverSafe`)
7663 * [`std::panic::UnwindSafe`] (renamed from `RecoverSafe`)
7664 * [`str::is_char_boundary`]
7665 * [`<*const T>::as_ref`]
7666 * [`<*mut T>::as_ref`]
7667 * [`<*mut T>::as_mut`]
7668 * [`AsciiExt::make_ascii_uppercase`]
7669 * [`AsciiExt::make_ascii_lowercase`]
7670 * [`char::decode_utf16`]
7671 * [`char::DecodeUtf16`]
7672 * [`char::DecodeUtf16Error`]
7673 * [`char::DecodeUtf16Error::unpaired_surrogate`]
7674 * [`BTreeSet::take`]
7675 * [`BTreeSet::replace`]
7676 * [`BTreeSet::get`]
7677 * [`HashSet::take`]
7678 * [`HashSet::replace`]
7679 * [`HashSet::get`]
7680 * [`OsString::with_capacity`]
7681 * [`OsString::clear`]
7682 * [`OsString::capacity`]
7683 * [`OsString::reserve`]
7684 * [`OsString::reserve_exact`]
7685 * [`OsStr::is_empty`]
7686 * [`OsStr::len`]
7687 * [`std::os::unix::thread`]
7688 * [`RawPthread`]
7689 * [`JoinHandleExt`]
7690 * [`JoinHandleExt::as_pthread_t`]
7691 * [`JoinHandleExt::into_pthread_t`]
7692 * [`HashSet::hasher`]
7693 * [`HashMap::hasher`]
7694 * [`CommandExt::exec`]
7695 * [`File::try_clone`]
7696 * [`SocketAddr::set_ip`]
7697 * [`SocketAddr::set_port`]
7698 * [`SocketAddrV4::set_ip`]
7699 * [`SocketAddrV4::set_port`]
7700 * [`SocketAddrV6::set_ip`]
7701 * [`SocketAddrV6::set_port`]
7702 * [`SocketAddrV6::set_flowinfo`]
7703 * [`SocketAddrV6::set_scope_id`]
7704 * [`slice::copy_from_slice`]
7705 * [`ptr::read_volatile`]
7706 * [`ptr::write_volatile`]
7707 * [`OpenOptions::create_new`]
7708 * [`TcpStream::set_nodelay`]
7709 * [`TcpStream::nodelay`]
7710 * [`TcpStream::set_ttl`]
7711 * [`TcpStream::ttl`]
7712 * [`TcpStream::set_only_v6`]
7713 * [`TcpStream::only_v6`]
7714 * [`TcpStream::take_error`]
7715 * [`TcpStream::set_nonblocking`]
7716 * [`TcpListener::set_ttl`]
7717 * [`TcpListener::ttl`]
7718 * [`TcpListener::set_only_v6`]
7719 * [`TcpListener::only_v6`]
7720 * [`TcpListener::take_error`]
7721 * [`TcpListener::set_nonblocking`]
7722 * [`UdpSocket::set_broadcast`]
7723 * [`UdpSocket::broadcast`]
7724 * [`UdpSocket::set_multicast_loop_v4`]
7725 * [`UdpSocket::multicast_loop_v4`]
7726 * [`UdpSocket::set_multicast_ttl_v4`]
7727 * [`UdpSocket::multicast_ttl_v4`]
7728 * [`UdpSocket::set_multicast_loop_v6`]
7729 * [`UdpSocket::multicast_loop_v6`]
7730 * [`UdpSocket::set_multicast_ttl_v6`]
7731 * [`UdpSocket::multicast_ttl_v6`]
7732 * [`UdpSocket::set_ttl`]
7733 * [`UdpSocket::ttl`]
7734 * [`UdpSocket::set_only_v6`]
7735 * [`UdpSocket::only_v6`]
7736 * [`UdpSocket::join_multicast_v4`]
7737 * [`UdpSocket::join_multicast_v6`]
7738 * [`UdpSocket::leave_multicast_v4`]
7739 * [`UdpSocket::leave_multicast_v6`]
7740 * [`UdpSocket::take_error`]
7741 * [`UdpSocket::connect`]
7742 * [`UdpSocket::send`]
7743 * [`UdpSocket::recv`]
7744 * [`UdpSocket::set_nonblocking`]
7745
7746 Libraries
7747 ---------
7748
7749 * [`std::sync::Once` is poisoned if its initialization function
7750   fails][1.9o].
7751 * [`cell::Ref` and `cell::RefMut` can contain unsized types][1.9cu].
7752 * [Most types implement `fmt::Debug`][1.9db].
7753 * [The default buffer size used by `BufReader` and `BufWriter` was
7754   reduced to 8K, from 64K][1.9bf]. This is in line with the buffer size
7755   used by other languages.
7756 * [`Instant`, `SystemTime` and `Duration` implement `+=` and `-=`.
7757   `Duration` additionally implements `*=` and `/=`][1.9ta].
7758 * [`Skip` is a `DoubleEndedIterator`][1.9sk].
7759 * [`From<[u8; 4]>` is implemented for `Ipv4Addr`][1.9fi].
7760 * [`Chain` implements `BufRead`][1.9ch].
7761 * [`HashMap`, `HashSet` and iterators are covariant][1.9hc].
7762
7763 Cargo
7764 -----
7765
7766 * [Cargo can now run concurrently][1.9cc].
7767 * [Top-level overrides allow specific revisions of crates to be
7768   overridden through the entire crate graph][1.9ct].  This is intended
7769   to make upgrades easier for large projects, by allowing crates to be
7770   forked temporarily until they've been upgraded and republished.
7771 * [Cargo exports a `CARGO_PKG_AUTHORS` environment variable][1.9cp].
7772 * [Cargo will pass the contents of the `RUSTFLAGS` variable to `rustc`
7773   on the commandline][1.9cf]. `rustc` arguments can also be specified
7774   in the `build.rustflags` configuration key.
7775
7776 Performance
7777 -----------
7778
7779 * [The time complexity of comparing variables for equivalence during type
7780   unification is reduced from _O_(_n_!) to _O_(_n_)][1.9tu]. This leads
7781   to major compilation time improvement in some scenarios.
7782 * [`ToString` is specialized for `str`, giving it the same performance
7783   as `to_owned`][1.9ts].
7784 * [Spawning processes with `Command::output` no longer creates extra
7785   threads][1.9sp].
7786 * [`#[derive(PartialEq)]` and `#[derive(PartialOrd)]` emit less code
7787   for C-like enums][1.9cl].
7788
7789 Misc
7790 ----
7791
7792 * [Passing the `--quiet` flag to a test runner will produce
7793   much-abbreviated output][1.9q].
7794 * The Rust Project now publishes std binaries for the
7795   `mips-unknown-linux-musl`, `mipsel-unknown-linux-musl`, and
7796   `i586-pc-windows-msvc` targets.
7797
7798 Compatibility Notes
7799 -------------------
7800
7801 * [`std::sync::Once` is poisoned if its initialization function
7802   fails][1.9o].
7803 * [It is illegal to define methods with the same name in overlapping
7804   inherent `impl` blocks][1.9sn].
7805 * [`fn` item types are zero sized, and each `fn` names a unique
7806   type][1.9fn]. This will break code that transmutes `fn`s, so calling
7807   `transmute` on a `fn` type will generate a warning for a few cycles,
7808   then will be converted to an error.
7809 * [Improvements to const evaluation may trigger new errors when integer
7810   literals are out of range][1.9ce].
7811
7812
7813 [1.9bf]: https://github.com/rust-lang/rust/pull/32695
7814 [1.9cc]: https://github.com/rust-lang/cargo/pull/2486
7815 [1.9ce]: https://github.com/rust-lang/rust/pull/30587
7816 [1.9cf]: https://github.com/rust-lang/cargo/pull/2241
7817 [1.9ch]: https://github.com/rust-lang/rust/pull/32541
7818 [1.9cl]: https://github.com/rust-lang/rust/pull/31977
7819 [1.9cp]: https://github.com/rust-lang/cargo/pull/2465
7820 [1.9ct]: https://github.com/rust-lang/cargo/pull/2385
7821 [1.9cu]: https://github.com/rust-lang/rust/pull/32652
7822 [1.9db]: https://github.com/rust-lang/rust/pull/32054
7823 [1.9fi]: https://github.com/rust-lang/rust/pull/32050
7824 [1.9fn]: https://github.com/rust-lang/rust/pull/31710
7825 [1.9fv]: https://github.com/rust-lang/rust/pull/31938
7826 [1.9hc]: https://github.com/rust-lang/rust/pull/32635
7827 [1.9o]: https://github.com/rust-lang/rust/pull/32325
7828 [1.9q]: https://github.com/rust-lang/rust/pull/31887
7829 [1.9sk]: https://github.com/rust-lang/rust/pull/31700
7830 [1.9sn]: https://github.com/rust-lang/rust/pull/31925
7831 [1.9sp]: https://github.com/rust-lang/rust/pull/31618
7832 [1.9ta]: https://github.com/rust-lang/rust/pull/32448
7833 [1.9ts]: https://github.com/rust-lang/rust/pull/32586
7834 [1.9tu]: https://github.com/rust-lang/rust/pull/32062
7835 [1.9ws]: https://github.com/rust-lang/rust/pull/29734
7836 [RFC 1270]: https://github.com/rust-lang/rfcs/blob/master/text/1270-deprecation.md
7837 [`<*const T>::as_ref`]: http://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.as_ref
7838 [`<*mut T>::as_mut`]: http://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.as_mut
7839 [`<*mut T>::as_ref`]: http://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.as_ref
7840 [`slice::copy_from_slice`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.copy_from_slice
7841 [`AsciiExt::make_ascii_lowercase`]: http://doc.rust-lang.org/nightly/std/ascii/trait.AsciiExt.html#tymethod.make_ascii_lowercase
7842 [`AsciiExt::make_ascii_uppercase`]: http://doc.rust-lang.org/nightly/std/ascii/trait.AsciiExt.html#tymethod.make_ascii_uppercase
7843 [`BTreeSet::get`]: http://doc.rust-lang.org/nightly/collections/btree/set/struct.BTreeSet.html#method.get
7844 [`BTreeSet::replace`]: http://doc.rust-lang.org/nightly/collections/btree/set/struct.BTreeSet.html#method.replace
7845 [`BTreeSet::take`]: http://doc.rust-lang.org/nightly/collections/btree/set/struct.BTreeSet.html#method.take
7846 [`CommandExt::exec`]: http://doc.rust-lang.org/nightly/std/os/unix/process/trait.CommandExt.html#tymethod.exec
7847 [`File::try_clone`]: http://doc.rust-lang.org/nightly/std/fs/struct.File.html#method.try_clone
7848 [`HashMap::hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashMap.html#method.hasher
7849 [`HashSet::get`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.get
7850 [`HashSet::hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.hasher
7851 [`HashSet::replace`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.replace
7852 [`HashSet::take`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.take
7853 [`JoinHandleExt::as_pthread_t`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/trait.JoinHandleExt.html#tymethod.as_pthread_t
7854 [`JoinHandleExt::into_pthread_t`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/trait.JoinHandleExt.html#tymethod.into_pthread_t
7855 [`JoinHandleExt`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/trait.JoinHandleExt.html
7856 [`OpenOptions::create_new`]: http://doc.rust-lang.org/nightly/std/fs/struct.OpenOptions.html#method.create_new
7857 [`OsStr::is_empty`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsStr.html#method.is_empty
7858 [`OsStr::len`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsStr.html#method.len
7859 [`OsString::capacity`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.capacity
7860 [`OsString::clear`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.clear
7861 [`OsString::reserve_exact`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.reserve_exact
7862 [`OsString::reserve`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.reserve
7863 [`OsString::with_capacity`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.with_capacity
7864 [`RawPthread`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/type.RawPthread.html
7865 [`SocketAddr::set_ip`]: http://doc.rust-lang.org/nightly/std/net/enum.SocketAddr.html#method.set_ip
7866 [`SocketAddr::set_port`]: http://doc.rust-lang.org/nightly/std/net/enum.SocketAddr.html#method.set_port
7867 [`SocketAddrV4::set_ip`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV4.html#method.set_ip
7868 [`SocketAddrV4::set_port`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV4.html#method.set_port
7869 [`SocketAddrV6::set_flowinfo`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_flowinfo
7870 [`SocketAddrV6::set_ip`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_ip
7871 [`SocketAddrV6::set_port`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_port
7872 [`SocketAddrV6::set_scope_id`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_scope_id
7873 [`TcpListener::only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.only_v6
7874 [`TcpListener::set_nonblocking`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_nonblocking
7875 [`TcpListener::set_only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_only_v6
7876 [`TcpListener::set_ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_ttl
7877 [`TcpListener::take_error`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.take_error
7878 [`TcpListener::ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.ttl
7879 [`TcpStream::nodelay`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.nodelay
7880 [`TcpStream::only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.only_v6
7881 [`TcpStream::set_nodelay`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_nodelay
7882 [`TcpStream::set_nonblocking`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_nonblocking
7883 [`TcpStream::set_only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_only_v6
7884 [`TcpStream::set_ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_ttl
7885 [`TcpStream::take_error`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.take_error
7886 [`TcpStream::ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.ttl
7887 [`UdpSocket::broadcast`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.broadcast
7888 [`UdpSocket::connect`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.connect
7889 [`UdpSocket::join_multicast_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.join_multicast_v4
7890 [`UdpSocket::join_multicast_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.join_multicast_v6
7891 [`UdpSocket::leave_multicast_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.leave_multicast_v4
7892 [`UdpSocket::leave_multicast_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.leave_multicast_v6
7893 [`UdpSocket::multicast_loop_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_loop_v4
7894 [`UdpSocket::multicast_loop_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_loop_v6
7895 [`UdpSocket::multicast_ttl_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_ttl_v4
7896 [`UdpSocket::multicast_ttl_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_ttl_v6
7897 [`UdpSocket::only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.only_v6
7898 [`UdpSocket::recv`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.recv
7899 [`UdpSocket::send`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.send
7900 [`UdpSocket::set_broadcast`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_broadcast
7901 [`UdpSocket::set_multicast_loop_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_loop_v4
7902 [`UdpSocket::set_multicast_loop_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_loop_v6
7903 [`UdpSocket::set_multicast_ttl_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_ttl_v4
7904 [`UdpSocket::set_multicast_ttl_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_ttl_v6
7905 [`UdpSocket::set_nonblocking`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_nonblocking
7906 [`UdpSocket::set_only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_only_v6
7907 [`UdpSocket::set_ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_ttl
7908 [`UdpSocket::take_error`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.take_error
7909 [`UdpSocket::ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.ttl
7910 [`char::DecodeUtf16Error::unpaired_surrogate`]: http://doc.rust-lang.org/nightly/std/char/struct.DecodeUtf16Error.html#method.unpaired_surrogate
7911 [`char::DecodeUtf16Error`]: http://doc.rust-lang.org/nightly/std/char/struct.DecodeUtf16Error.html
7912 [`char::DecodeUtf16`]: http://doc.rust-lang.org/nightly/std/char/struct.DecodeUtf16.html
7913 [`char::decode_utf16`]: http://doc.rust-lang.org/nightly/std/char/fn.decode_utf16.html
7914 [`ptr::read_volatile`]: http://doc.rust-lang.org/nightly/std/ptr/fn.read_volatile.html
7915 [`ptr::write_volatile`]: http://doc.rust-lang.org/nightly/std/ptr/fn.write_volatile.html
7916 [`std::os::unix::thread`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/index.html
7917 [`std::panic::AssertUnwindSafe`]: http://doc.rust-lang.org/nightly/std/panic/struct.AssertUnwindSafe.html
7918 [`std::panic::UnwindSafe`]: http://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html
7919 [`std::panic::catch_unwind`]: http://doc.rust-lang.org/nightly/std/panic/fn.catch_unwind.html
7920 [`std::panic::resume_unwind`]: http://doc.rust-lang.org/nightly/std/panic/fn.resume_unwind.html
7921 [`std::panic`]: http://doc.rust-lang.org/nightly/std/panic/index.html
7922 [`str::is_char_boundary`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.is_char_boundary
7923
7924
7925 Version 1.8.0 (2016-04-14)
7926 ==========================
7927
7928 Language
7929 --------
7930
7931 * Rust supports overloading of compound assignment statements like
7932   `+=` by implementing the [`AddAssign`], [`SubAssign`],
7933   [`MulAssign`], [`DivAssign`], [`RemAssign`], [`BitAndAssign`],
7934   [`BitOrAssign`], [`BitXorAssign`], [`ShlAssign`], or [`ShrAssign`]
7935   traits. [RFC 953].
7936 * Empty structs can be defined with braces, as in `struct Foo { }`, in
7937   addition to the non-braced form, `struct Foo;`. [RFC 218].
7938
7939 Libraries
7940 ---------
7941
7942 * Stabilized APIs:
7943   * [`str::encode_utf16`] (renamed from `utf16_units`)
7944   * [`str::EncodeUtf16`] (renamed from `Utf16Units`)
7945   * [`Ref::map`]
7946   * [`RefMut::map`]
7947   * [`ptr::drop_in_place`]
7948   * [`time::Instant`]
7949   * [`time::SystemTime`]
7950   * [`Instant::now`]
7951   * [`Instant::duration_since`] (renamed from `duration_from_earlier`)
7952   * [`Instant::elapsed`]
7953   * [`SystemTime::now`]
7954   * [`SystemTime::duration_since`] (renamed from `duration_from_earlier`)
7955   * [`SystemTime::elapsed`]
7956   * Various `Add`/`Sub` impls for `Time` and `SystemTime`
7957   * [`SystemTimeError`]
7958   * [`SystemTimeError::duration`]
7959   * Various impls for `SystemTimeError`
7960   * [`UNIX_EPOCH`]
7961   * [`AddAssign`], [`SubAssign`], [`MulAssign`], [`DivAssign`],
7962     [`RemAssign`], [`BitAndAssign`], [`BitOrAssign`],
7963     [`BitXorAssign`], [`ShlAssign`], [`ShrAssign`].
7964 * [The `write!` and `writeln!` macros correctly emit errors if any of
7965   their arguments can't be formatted][1.8w].
7966 * [Various I/O functions support large files on 32-bit Linux][1.8l].
7967 * [The Unix-specific `raw` modules, which contain a number of
7968   redefined C types are deprecated][1.8r], including `os::raw::unix`,
7969   `os::raw::macos`, and `os::raw::linux`. These modules defined types
7970   such as `ino_t` and `dev_t`. The inconsistency of these definitions
7971   across platforms was making it difficult to implement `std`
7972   correctly. Those that need these definitions should use the `libc`
7973   crate. [RFC 1415].
7974 * The Unix-specific `MetadataExt` traits, including
7975   `os::unix::fs::MetadataExt`, which expose values such as inode
7976   numbers [no longer return platform-specific types][1.8r], but
7977   instead return widened integers. [RFC 1415].
7978 * [`btree_set::{IntoIter, Iter, Range}` are covariant][1.8cv].
7979 * [Atomic loads and stores are not volatile][1.8a].
7980 * [All types in `sync::mpsc` implement `fmt::Debug`][1.8mp].
7981
7982 Performance
7983 -----------
7984
7985 * [Inlining hash functions lead to a 3% compile-time improvement in
7986   some workloads][1.8h].
7987 * When using jemalloc, its symbols are [unprefixed so that it
7988   overrides the libc malloc implementation][1.8h]. This means that for
7989   rustc, LLVM is now using jemalloc, which results in a 6%
7990   compile-time improvement on a specific workload.
7991 * [Avoid quadratic growth in function size due to cleanups][1.8cu].
7992
7993 Misc
7994 ----
7995
7996 * [32-bit MSVC builds finally implement unwinding][1.8ms].
7997   i686-pc-windows-msvc is now considered a tier-1 platform.
7998 * [The `--print targets` flag prints a list of supported targets][1.8t].
7999 * [The `--print cfg` flag prints the `cfg`s defined for the current
8000   target][1.8cf].
8001 * [`rustc` can be built with an new Cargo-based build system, written
8002   in Rust][1.8b].  It will eventually replace Rust's Makefile-based
8003   build system. To enable it configure with `configure --rustbuild`.
8004 * [Errors for non-exhaustive `match` patterns now list up to 3 missing
8005   variants while also indicating the total number of missing variants
8006   if more than 3][1.8m].
8007 * [Executable stacks are disabled on Linux and BSD][1.8nx].
8008 * The Rust Project now publishes binary releases of the standard
8009   library for a number of tier-2 targets:
8010   `armv7-unknown-linux-gnueabihf`, `powerpc-unknown-linux-gnu`,
8011   `powerpc64-unknown-linux-gnu`, `powerpc64le-unknown-linux-gnu`
8012   `x86_64-rumprun-netbsd`. These can be installed with
8013   tools such as [multirust][1.8mr].
8014
8015 Cargo
8016 -----
8017
8018 * [`cargo init` creates a new Cargo project in the current
8019   directory][1.8ci].  It is otherwise like `cargo new`.
8020 * [Cargo has configuration keys for `-v` and
8021   `--color`][1.8cc]. `verbose` and `color`, respectively, go in the
8022   `[term]` section of `.cargo/config`.
8023 * [Configuration keys that evaluate to strings or integers can be set
8024   via environment variables][1.8ce]. For example the `build.jobs` key
8025   can be set via `CARGO_BUILD_JOBS`. Environment variables take
8026   precedence over config files.
8027 * [Target-specific dependencies support Rust `cfg` syntax for
8028   describing targets][1.8cfg] so that dependencies for multiple
8029   targets can be specified together. [RFC 1361].
8030 * [The environment variables `CARGO_TARGET_ROOT`, `RUSTC`, and
8031   `RUSTDOC` take precedence over the `build.target-dir`,
8032   `build.rustc`, and `build.rustdoc` configuration values][1.8cv].
8033 * [The child process tree is killed on Windows when Cargo is
8034   killed][1.8ck].
8035 * [The `build.target` configuration value sets the target platform,
8036   like `--target`][1.8ct].
8037
8038 Compatibility Notes
8039 -------------------
8040
8041 * [Unstable compiler flags have been further restricted][1.8u]. Since
8042   1.0 `-Z` flags have been considered unstable, and other flags that
8043   were considered unstable additionally required passing `-Z
8044   unstable-options` to access. Unlike unstable language and library
8045   features though, these options have been accessible on the stable
8046   release channel. Going forward, *new unstable flags will not be
8047   available on the stable release channel*, and old unstable flags
8048   will warn about their usage. In the future, all unstable flags will
8049   be unavailable on the stable release channel.
8050 * [It is no longer possible to `match` on empty enum variants using
8051   the `Variant(..)` syntax][1.8v]. This has been a warning since 1.6.
8052 * The Unix-specific `MetadataExt` traits, including
8053   `os::unix::fs::MetadataExt`, which expose values such as inode
8054   numbers [no longer return platform-specific types][1.8r], but
8055   instead return widened integers. [RFC 1415].
8056 * [Modules sourced from the filesystem cannot appear within arbitrary
8057   blocks, but only within other modules][1.8mf].
8058 * [`--cfg` compiler flags are parsed strictly as identifiers][1.8c].
8059 * On Unix, [stack overflow triggers a runtime abort instead of a
8060   SIGSEGV][1.8so].
8061 * [`Command::spawn` and its equivalents return an error if any of
8062   its command-line arguments contain interior `NUL`s][1.8n].
8063 * [Tuple and unit enum variants from other crates are in the type
8064   namespace][1.8tn].
8065 * [On Windows `rustc` emits `.lib` files for the `staticlib` library
8066   type instead of `.a` files][1.8st]. Additionally, for the MSVC
8067   toolchain, `rustc` emits import libraries named `foo.dll.lib`
8068   instead of `foo.lib`.
8069
8070
8071 [1.8a]: https://github.com/rust-lang/rust/pull/30962
8072 [1.8b]: https://github.com/rust-lang/rust/pull/31123
8073 [1.8c]: https://github.com/rust-lang/rust/pull/31530
8074 [1.8cc]: https://github.com/rust-lang/cargo/pull/2397
8075 [1.8ce]: https://github.com/rust-lang/cargo/pull/2398
8076 [1.8cf]: https://github.com/rust-lang/rust/pull/31278
8077 [1.8cfg]: https://github.com/rust-lang/cargo/pull/2328
8078 [1.8ci]: https://github.com/rust-lang/cargo/pull/2081
8079 [1.8ck]: https://github.com/rust-lang/cargo/pull/2370
8080 [1.8ct]: https://github.com/rust-lang/cargo/pull/2335
8081 [1.8cu]: https://github.com/rust-lang/rust/pull/31390
8082 [1.8cv]: https://github.com/rust-lang/cargo/issues/2365
8083 [1.8cv]: https://github.com/rust-lang/rust/pull/30998
8084 [1.8h]: https://github.com/rust-lang/rust/pull/31460
8085 [1.8l]: https://github.com/rust-lang/rust/pull/31668
8086 [1.8m]: https://github.com/rust-lang/rust/pull/31020
8087 [1.8mf]: https://github.com/rust-lang/rust/pull/31534
8088 [1.8mp]: https://github.com/rust-lang/rust/pull/30894
8089 [1.8mr]: https://users.rust-lang.org/t/multirust-0-8-with-cross-std-installation/4901
8090 [1.8ms]: https://github.com/rust-lang/rust/pull/30448
8091 [1.8n]: https://github.com/rust-lang/rust/pull/31056
8092 [1.8nx]: https://github.com/rust-lang/rust/pull/30859
8093 [1.8r]: https://github.com/rust-lang/rust/pull/31551
8094 [1.8so]: https://github.com/rust-lang/rust/pull/31333
8095 [1.8st]: https://github.com/rust-lang/rust/pull/29520
8096 [1.8t]: https://github.com/rust-lang/rust/pull/31358
8097 [1.8tn]: https://github.com/rust-lang/rust/pull/30882
8098 [1.8u]: https://github.com/rust-lang/rust/pull/31793
8099 [1.8v]: https://github.com/rust-lang/rust/pull/31757
8100 [1.8w]: https://github.com/rust-lang/rust/pull/31904
8101 [RFC 1361]: https://github.com/rust-lang/rfcs/blob/master/text/1361-cargo-cfg-dependencies.md
8102 [RFC 1415]: https://github.com/rust-lang/rfcs/blob/master/text/1415-trim-std-os.md
8103 [RFC 218]: https://github.com/rust-lang/rfcs/blob/master/text/0218-empty-struct-with-braces.md
8104 [RFC 953]: https://github.com/rust-lang/rfcs/blob/master/text/0953-op-assign.md
8105 [`AddAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.AddAssign.html
8106 [`BitAndAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.BitAndAssign.html
8107 [`BitOrAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.BitOrAssign.html
8108 [`BitXorAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.BitXorAssign.html
8109 [`DivAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.DivAssign.html
8110 [`Instant::duration_since`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html#method.duration_since
8111 [`Instant::elapsed`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html#method.elapsed
8112 [`Instant::now`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html#method.now
8113 [`MulAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.MulAssign.html
8114 [`Ref::map`]: http://doc.rust-lang.org/nightly/std/cell/struct.Ref.html#method.map
8115 [`RefMut::map`]: http://doc.rust-lang.org/nightly/std/cell/struct.RefMut.html#method.map
8116 [`RemAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.RemAssign.html
8117 [`ShlAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.ShlAssign.html
8118 [`ShrAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.ShrAssign.html
8119 [`SubAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.SubAssign.html
8120 [`SystemTime::duration_since`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html#method.duration_since
8121 [`SystemTime::elapsed`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html#method.elapsed
8122 [`SystemTime::now`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html#method.now
8123 [`SystemTimeError::duration`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTimeError.html#method.duration
8124 [`SystemTimeError`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTimeError.html
8125 [`UNIX_EPOCH`]: http://doc.rust-lang.org/nightly/std/time/constant.UNIX_EPOCH.html
8126 [`ptr::drop_in_place`]: http://doc.rust-lang.org/nightly/std/ptr/fn.drop_in_place.html
8127 [`str::EncodeUtf16`]: http://doc.rust-lang.org/nightly/std/str/struct.EncodeUtf16.html
8128 [`str::encode_utf16`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.encode_utf16
8129 [`time::Instant`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html
8130 [`time::SystemTime`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html
8131
8132
8133 Version 1.7.0 (2016-03-03)
8134 ==========================
8135
8136 Libraries
8137 ---------
8138
8139 * Stabilized APIs
8140   * `Path`
8141     * [`Path::strip_prefix`] (renamed from relative_from)
8142     * [`path::StripPrefixError`] (new error type returned from strip_prefix)
8143   * `Ipv4Addr`
8144     * [`Ipv4Addr::is_loopback`]
8145     * [`Ipv4Addr::is_private`]
8146     * [`Ipv4Addr::is_link_local`]
8147     * [`Ipv4Addr::is_multicast`]
8148     * [`Ipv4Addr::is_broadcast`]
8149     * [`Ipv4Addr::is_documentation`]
8150   * `Ipv6Addr`
8151     * [`Ipv6Addr::is_unspecified`]
8152     * [`Ipv6Addr::is_loopback`]
8153     * [`Ipv6Addr::is_multicast`]
8154   * `Vec`
8155     * [`Vec::as_slice`]
8156     * [`Vec::as_mut_slice`]
8157   * `String`
8158     * [`String::as_str`]
8159     * [`String::as_mut_str`]
8160   * Slices
8161     * `<[T]>::`[`clone_from_slice`], which now requires the two slices to
8162     be the same length
8163     * `<[T]>::`[`sort_by_key`]
8164   * checked, saturated, and overflowing operations
8165     * [`i32::checked_rem`], [`i32::checked_neg`], [`i32::checked_shl`], [`i32::checked_shr`]
8166     * [`i32::saturating_mul`]
8167     * [`i32::overflowing_add`], [`i32::overflowing_sub`], [`i32::overflowing_mul`], [`i32::overflowing_div`]
8168     * [`i32::overflowing_rem`], [`i32::overflowing_neg`], [`i32::overflowing_shl`], [`i32::overflowing_shr`]
8169     * [`u32::checked_rem`], [`u32::checked_neg`], [`u32::checked_shl`], [`u32::checked_shl`]
8170     * [`u32::saturating_mul`]
8171     * [`u32::overflowing_add`], [`u32::overflowing_sub`], [`u32::overflowing_mul`], [`u32::overflowing_div`]
8172     * [`u32::overflowing_rem`], [`u32::overflowing_neg`], [`u32::overflowing_shl`], [`u32::overflowing_shr`]
8173     * and checked, saturated, and overflowing operations for other primitive types
8174   * FFI
8175     * [`ffi::IntoStringError`]
8176     * [`CString::into_string`]
8177     * [`CString::into_bytes`]
8178     * [`CString::into_bytes_with_nul`]
8179     * `From<CString> for Vec<u8>`
8180   * `IntoStringError`
8181     * [`IntoStringError::into_cstring`]
8182     * [`IntoStringError::utf8_error`]
8183     * `Error for IntoStringError`
8184   * Hashing
8185     * [`std::hash::BuildHasher`]
8186     * [`BuildHasher::Hasher`]
8187     * [`BuildHasher::build_hasher`]
8188     * [`std::hash::BuildHasherDefault`]
8189     * [`HashMap::with_hasher`]
8190     * [`HashMap::with_capacity_and_hasher`]
8191     * [`HashSet::with_hasher`]
8192     * [`HashSet::with_capacity_and_hasher`]
8193     * [`std::collections::hash_map::RandomState`]
8194     * [`RandomState::new`]
8195 * [Validating UTF-8 is faster by a factor of between 7 and 14x for
8196   ASCII input][1.7utf8]. This means that creating `String`s and `str`s
8197   from bytes is faster.
8198 * [The performance of `LineWriter` (and thus `io::stdout`) was
8199   improved by using `memchr` to search for newlines][1.7m].
8200 * [`f32::to_degrees` and `f32::to_radians` are stable][1.7f]. The
8201   `f64` variants were stabilized previously.
8202 * [`BTreeMap` was rewritten to use less memory and improve the performance
8203   of insertion and iteration, the latter by as much as 5x][1.7bm].
8204 * [`BTreeSet` and its iterators, `Iter`, `IntoIter`, and `Range` are
8205   covariant over their contained type][1.7bt].
8206 * [`LinkedList` and its iterators, `Iter` and `IntoIter` are covariant
8207   over their contained type][1.7ll].
8208 * [`str::replace` now accepts a `Pattern`][1.7rp], like other string
8209   searching methods.
8210 * [`Any` is implemented for unsized types][1.7a].
8211 * [`Hash` is implemented for `Duration`][1.7h].
8212
8213 Misc
8214 ----
8215
8216 * [When running tests with `--test`, rustdoc will pass `--cfg`
8217   arguments to the compiler][1.7dt].
8218 * [The compiler is built with RPATH information by default][1.7rpa].
8219   This means that it will be possible to run `rustc` when installed in
8220   unusual configurations without configuring the dynamic linker search
8221   path explicitly.
8222 * [`rustc` passes `--enable-new-dtags` to GNU ld][1.7dta]. This makes
8223   any RPATH entries (emitted with `-C rpath`) *not* take precedence
8224   over `LD_LIBRARY_PATH`.
8225
8226 Cargo
8227 -----
8228
8229 * [`cargo rustc` accepts a `--profile` flag that runs `rustc` under
8230   any of the compilation profiles, 'dev', 'bench', or 'test'][1.7cp].
8231 * [The `rerun-if-changed` build script directive no longer causes the
8232   build script to incorrectly run twice in certain scenarios][1.7rr].
8233
8234 Compatibility Notes
8235 -------------------
8236
8237 * Soundness fixes to the interactions between associated types and
8238   lifetimes, specified in [RFC 1214], [now generate errors][1.7sf] for
8239   code that violates the new rules. This is a significant change that
8240   is known to break existing code, so it has emitted warnings for the
8241   new error cases since 1.4 to give crate authors time to adapt. The
8242   details of what is changing are subtle; read the RFC for more.
8243 * [Several bugs in the compiler's visibility calculations were
8244   fixed][1.7v]. Since this was found to break significant amounts of
8245   code, the new errors will be emitted as warnings for several release
8246   cycles, under the `private_in_public` lint.
8247 * Defaulted type parameters were accidentally accepted in positions
8248   that were not intended. In this release, [defaulted type parameters
8249   appearing outside of type definitions will generate a
8250   warning][1.7d], which will become an error in future releases.
8251 * [Parsing "." as a float results in an error instead of 0][1.7p].
8252   That is, `".".parse::<f32>()` returns `Err`, not `Ok(0.0)`.
8253 * [Borrows of closure parameters may not outlive the closure][1.7bc].
8254
8255 [1.7a]: https://github.com/rust-lang/rust/pull/30928
8256 [1.7bc]: https://github.com/rust-lang/rust/pull/30341
8257 [1.7bm]: https://github.com/rust-lang/rust/pull/30426
8258 [1.7bt]: https://github.com/rust-lang/rust/pull/30998
8259 [1.7cp]: https://github.com/rust-lang/cargo/pull/2224
8260 [1.7d]: https://github.com/rust-lang/rust/pull/30724
8261 [1.7dt]: https://github.com/rust-lang/rust/pull/30372
8262 [1.7dta]: https://github.com/rust-lang/rust/pull/30394
8263 [1.7f]: https://github.com/rust-lang/rust/pull/30672
8264 [1.7h]: https://github.com/rust-lang/rust/pull/30818
8265 [1.7ll]: https://github.com/rust-lang/rust/pull/30663
8266 [1.7m]: https://github.com/rust-lang/rust/pull/30381
8267 [1.7p]: https://github.com/rust-lang/rust/pull/30681
8268 [1.7rp]: https://github.com/rust-lang/rust/pull/29498
8269 [1.7rpa]: https://github.com/rust-lang/rust/pull/30353
8270 [1.7rr]: https://github.com/rust-lang/cargo/pull/2279
8271 [1.7sf]: https://github.com/rust-lang/rust/pull/30389
8272 [1.7utf8]: https://github.com/rust-lang/rust/pull/30740
8273 [1.7v]: https://github.com/rust-lang/rust/pull/29973
8274 [RFC 1214]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
8275 [`BuildHasher::Hasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hasher.html
8276 [`BuildHasher::build_hasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.BuildHasher.html#tymethod.build_hasher
8277 [`CString::into_bytes_with_nul`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_bytes_with_nul
8278 [`CString::into_bytes`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_bytes
8279 [`CString::into_string`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_string
8280 [`HashMap::with_capacity_and_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashMap.html#method.with_capacity_and_hasher
8281 [`HashMap::with_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashMap.html#method.with_hasher
8282 [`HashSet::with_capacity_and_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.with_capacity_and_hasher
8283 [`HashSet::with_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.with_hasher
8284 [`IntoStringError::into_cstring`]: http://doc.rust-lang.org/nightly/std/ffi/struct.IntoStringError.html#method.into_cstring
8285 [`IntoStringError::utf8_error`]: http://doc.rust-lang.org/nightly/std/ffi/struct.IntoStringError.html#method.utf8_error
8286 [`Ipv4Addr::is_broadcast`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_broadcast
8287 [`Ipv4Addr::is_documentation`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_documentation
8288 [`Ipv4Addr::is_link_local`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_link_local
8289 [`Ipv4Addr::is_loopback`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_loopback
8290 [`Ipv4Addr::is_multicast`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_multicast
8291 [`Ipv4Addr::is_private`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_private
8292 [`Ipv6Addr::is_loopback`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_loopback
8293 [`Ipv6Addr::is_multicast`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_multicast
8294 [`Ipv6Addr::is_unspecified`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_unspecified
8295 [`Path::strip_prefix`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.strip_prefix
8296 [`RandomState::new`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.RandomState.html#method.new
8297 [`String::as_mut_str`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.as_mut_str
8298 [`String::as_str`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.as_str
8299 [`Vec::as_mut_slice`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.as_mut_slice
8300 [`Vec::as_slice`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.as_slice
8301 [`clone_from_slice`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.clone_from_slice
8302 [`ffi::IntoStringError`]: http://doc.rust-lang.org/nightly/std/ffi/struct.IntoStringError.html
8303 [`i32::checked_neg`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_neg
8304 [`i32::checked_rem`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_rem
8305 [`i32::checked_shl`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_shl
8306 [`i32::checked_shr`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_shr
8307 [`i32::overflowing_add`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_add
8308 [`i32::overflowing_div`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_div
8309 [`i32::overflowing_mul`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_mul
8310 [`i32::overflowing_neg`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_neg
8311 [`i32::overflowing_rem`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_rem
8312 [`i32::overflowing_shl`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_shl
8313 [`i32::overflowing_shr`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_shr
8314 [`i32::overflowing_sub`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_sub
8315 [`i32::saturating_mul`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.saturating_mul
8316 [`path::StripPrefixError`]: http://doc.rust-lang.org/nightly/std/path/struct.StripPrefixError.html
8317 [`sort_by_key`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.sort_by_key
8318 [`std::collections::hash_map::RandomState`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.RandomState.html
8319 [`std::hash::BuildHasherDefault`]: http://doc.rust-lang.org/nightly/std/hash/struct.BuildHasherDefault.html
8320 [`std::hash::BuildHasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.BuildHasher.html
8321 [`u32::checked_neg`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_neg
8322 [`u32::checked_rem`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_rem
8323 [`u32::checked_neg`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_neg
8324 [`u32::checked_shl`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_shl
8325 [`u32::overflowing_add`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_add
8326 [`u32::overflowing_div`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_div
8327 [`u32::overflowing_mul`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_mul
8328 [`u32::overflowing_neg`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_neg
8329 [`u32::overflowing_rem`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_rem
8330 [`u32::overflowing_shl`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_shl
8331 [`u32::overflowing_shr`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_shr
8332 [`u32::overflowing_sub`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_sub
8333 [`u32::saturating_mul`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.saturating_mul
8334
8335
8336 Version 1.6.0 (2016-01-21)
8337 ==========================
8338
8339 Language
8340 --------
8341
8342 * The `#![no_std]` attribute causes a crate to not be linked to the
8343   standard library, but only the [core library][1.6co], as described
8344   in [RFC 1184]. The core library defines common types and traits but
8345   has no platform dependencies whatsoever, and is the basis for Rust
8346   software in environments that cannot support a full port of the
8347   standard library, such as operating systems. Most of the core
8348   library is now stable.
8349
8350 Libraries
8351 ---------
8352
8353 * Stabilized APIs:
8354   [`Read::read_exact`],
8355   [`ErrorKind::UnexpectedEof`] (renamed from `UnexpectedEOF`),
8356   [`fs::DirBuilder`], [`fs::DirBuilder::new`],
8357   [`fs::DirBuilder::recursive`], [`fs::DirBuilder::create`],
8358   [`os::unix::fs::DirBuilderExt`],
8359   [`os::unix::fs::DirBuilderExt::mode`], [`vec::Drain`],
8360   [`vec::Vec::drain`], [`string::Drain`], [`string::String::drain`],
8361   [`vec_deque::Drain`], [`vec_deque::VecDeque::drain`],
8362   [`collections::hash_map::Drain`],
8363   [`collections::hash_map::HashMap::drain`],
8364   [`collections::hash_set::Drain`],
8365   [`collections::hash_set::HashSet::drain`],
8366   [`collections::binary_heap::Drain`],
8367   [`collections::binary_heap::BinaryHeap::drain`],
8368   [`Vec::extend_from_slice`] (renamed from `push_all`),
8369   [`Mutex::get_mut`], [`Mutex::into_inner`], [`RwLock::get_mut`],
8370   [`RwLock::into_inner`],
8371   [`Iterator::min_by_key`] (renamed from `min_by`),
8372   [`Iterator::max_by_key`] (renamed from `max_by`).
8373 * The [core library][1.6co] is stable, as are most of its APIs.
8374 * [The `assert_eq!` macro supports arguments that don't implement
8375   `Sized`][1.6ae], such as arrays. In this way it behaves more like
8376   `assert!`.
8377 * Several timer functions that take duration in milliseconds [are
8378   deprecated in favor of those that take `Duration`][1.6ms]. These
8379   include `Condvar::wait_timeout_ms`, `thread::sleep_ms`, and
8380   `thread::park_timeout_ms`.
8381 * The algorithm by which `Vec` reserves additional elements was
8382   [tweaked to not allocate excessive space][1.6a] while still growing
8383   exponentially.
8384 * `From` conversions are [implemented from integers to floats][1.6f]
8385   in cases where the conversion is lossless. Thus they are not
8386   implemented for 32-bit ints to `f32`, nor for 64-bit ints to `f32`
8387   or `f64`. They are also not implemented for `isize` and `usize`
8388   because the implementations would be platform-specific. `From` is
8389   also implemented from `f32` to `f64`.
8390 * `From<&Path>` and `From<PathBuf>` are implemented for `Cow<Path>`.
8391 * `From<T>` is implemented for `Box<T>`, `Rc<T>` and `Arc<T>`.
8392 * `IntoIterator` is implemented for `&PathBuf` and `&Path`.
8393 * [`BinaryHeap` was refactored][1.6bh] for modest performance
8394   improvements.
8395 * Sorting slices that are already sorted [is 50% faster in some
8396   cases][1.6s].
8397
8398 Cargo
8399 -----
8400
8401 * Cargo will look in `$CARGO_HOME/bin` for subcommands [by default][1.6c].
8402 * Cargo build scripts can specify their dependencies by emitting the
8403   [`rerun-if-changed`][1.6rr] key.
8404 * crates.io will reject publication of crates with dependencies that
8405   have a wildcard version constraint. Crates with wildcard
8406   dependencies were seen to cause a variety of problems, as described
8407   in [RFC 1241]. Since 1.5 publication of such crates has emitted a
8408   warning.
8409 * `cargo clean` [accepts a `--release` flag][1.6cc] to clean the
8410   release folder.  A variety of artifacts that Cargo failed to clean
8411   are now correctly deleted.
8412
8413 Misc
8414 ----
8415
8416 * The `unreachable_code` lint [warns when a function call's argument
8417   diverges][1.6dv].
8418 * The parser indicates [failures that may be caused by
8419   confusingly-similar Unicode characters][1.6uc]
8420 * Certain macro errors [are reported at definition time][1.6m], not
8421   expansion.
8422
8423 Compatibility Notes
8424 -------------------
8425
8426 * The compiler no longer makes use of the [`RUST_PATH`][1.6rp]
8427   environment variable when locating crates. This was a pre-cargo
8428   feature for integrating with the package manager that was
8429   accidentally never removed.
8430 * [A number of bugs were fixed in the privacy checker][1.6p] that
8431   could cause previously-accepted code to break.
8432 * [Modules and unit/tuple structs may not share the same name][1.6ts].
8433 * [Bugs in pattern matching unit structs were fixed][1.6us]. The tuple
8434   struct pattern syntax (`Foo(..)`) can no longer be used to match
8435   unit structs. This is a warning now, but will become an error in
8436   future releases. Patterns that share the same name as a const are
8437   now an error.
8438 * A bug was fixed that causes [rustc not to apply default type
8439   parameters][1.6xc] when resolving certain method implementations of
8440   traits defined in other crates.
8441
8442 [1.6a]: https://github.com/rust-lang/rust/pull/29454
8443 [1.6ae]: https://github.com/rust-lang/rust/pull/29770
8444 [1.6bh]: https://github.com/rust-lang/rust/pull/29811
8445 [1.6c]: https://github.com/rust-lang/cargo/pull/2192
8446 [1.6cc]: https://github.com/rust-lang/cargo/pull/2131
8447 [1.6co]: http://doc.rust-lang.org/core/index.html
8448 [1.6dv]: https://github.com/rust-lang/rust/pull/30000
8449 [1.6f]: https://github.com/rust-lang/rust/pull/29129
8450 [1.6m]: https://github.com/rust-lang/rust/pull/29828
8451 [1.6ms]: https://github.com/rust-lang/rust/pull/29604
8452 [1.6p]: https://github.com/rust-lang/rust/pull/29726
8453 [1.6rp]: https://github.com/rust-lang/rust/pull/30034
8454 [1.6rr]: https://github.com/rust-lang/cargo/pull/2134
8455 [1.6s]: https://github.com/rust-lang/rust/pull/29675
8456 [1.6ts]: https://github.com/rust-lang/rust/issues/21546
8457 [1.6uc]: https://github.com/rust-lang/rust/pull/29837
8458 [1.6us]: https://github.com/rust-lang/rust/pull/29383
8459 [1.6xc]: https://github.com/rust-lang/rust/issues/30123
8460 [RFC 1184]: https://github.com/rust-lang/rfcs/blob/master/text/1184-stabilize-no_std.md
8461 [RFC 1241]: https://github.com/rust-lang/rfcs/blob/master/text/1241-no-wildcard-deps.md
8462 [`ErrorKind::UnexpectedEof`]: http://doc.rust-lang.org/nightly/std/io/enum.ErrorKind.html#variant.UnexpectedEof
8463 [`Iterator::max_by_key`]: http://doc.rust-lang.org/nightly/std/iter/trait.Iterator.html#method.max_by_key
8464 [`Iterator::min_by_key`]: http://doc.rust-lang.org/nightly/std/iter/trait.Iterator.html#method.min_by_key
8465 [`Mutex::get_mut`]: http://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html#method.get_mut
8466 [`Mutex::into_inner`]: http://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html#method.into_inner
8467 [`Read::read_exact`]: http://doc.rust-lang.org/nightly/std/io/trait.Read.html#method.read_exact
8468 [`RwLock::get_mut`]: http://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html#method.get_mut
8469 [`RwLock::into_inner`]: http://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html#method.into_inner
8470 [`Vec::extend_from_slice`]: http://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html#method.extend_from_slice
8471 [`collections::binary_heap::BinaryHeap::drain`]: http://doc.rust-lang.org/nightly/std/collections/binary_heap/struct.BinaryHeap.html#method.drain
8472 [`collections::binary_heap::Drain`]: http://doc.rust-lang.org/nightly/std/collections/binary_heap/struct.Drain.html
8473 [`collections::hash_map::Drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.Drain.html
8474 [`collections::hash_map::HashMap::drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.HashMap.html#method.drain
8475 [`collections::hash_set::Drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_set/struct.Drain.html
8476 [`collections::hash_set::HashSet::drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_set/struct.HashSet.html#method.drain
8477 [`fs::DirBuilder::create`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html#method.create
8478 [`fs::DirBuilder::new`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html#method.new
8479 [`fs::DirBuilder::recursive`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html#method.recursive
8480 [`fs::DirBuilder`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html
8481 [`os::unix::fs::DirBuilderExt::mode`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.DirBuilderExt.html#tymethod.mode
8482 [`os::unix::fs::DirBuilderExt`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.DirBuilderExt.html
8483 [`string::Drain`]: http://doc.rust-lang.org/nightly/std/string/struct.Drain.html
8484 [`string::String::drain`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.drain
8485 [`vec::Drain`]: http://doc.rust-lang.org/nightly/std/vec/struct.Drain.html
8486 [`vec::Vec::drain`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.drain
8487 [`vec_deque::Drain`]: http://doc.rust-lang.org/nightly/std/collections/vec_deque/struct.Drain.html
8488 [`vec_deque::VecDeque::drain`]: http://doc.rust-lang.org/nightly/std/collections/vec_deque/struct.VecDeque.html#method.drain
8489
8490
8491 Version 1.5.0 (2015-12-10)
8492 ==========================
8493
8494 * ~700 changes, numerous bugfixes
8495
8496 Highlights
8497 ----------
8498
8499 * Stabilized APIs:
8500   [`BinaryHeap::from`], [`BinaryHeap::into_sorted_vec`],
8501   [`BinaryHeap::into_vec`], [`Condvar::wait_timeout`],
8502   [`FileTypeExt::is_block_device`], [`FileTypeExt::is_char_device`],
8503   [`FileTypeExt::is_fifo`], [`FileTypeExt::is_socket`],
8504   [`FileTypeExt`], [`Formatter::alternate`], [`Formatter::fill`],
8505   [`Formatter::precision`], [`Formatter::sign_aware_zero_pad`],
8506   [`Formatter::sign_minus`], [`Formatter::sign_plus`],
8507   [`Formatter::width`], [`Iterator::cmp`], [`Iterator::eq`],
8508   [`Iterator::ge`], [`Iterator::gt`], [`Iterator::le`],
8509   [`Iterator::lt`], [`Iterator::ne`], [`Iterator::partial_cmp`],
8510   [`Path::canonicalize`], [`Path::exists`], [`Path::is_dir`],
8511   [`Path::is_file`], [`Path::metadata`], [`Path::read_dir`],
8512   [`Path::read_link`], [`Path::symlink_metadata`],
8513   [`Utf8Error::valid_up_to`], [`Vec::resize`],
8514   [`VecDeque::as_mut_slices`], [`VecDeque::as_slices`],
8515   [`VecDeque::insert`], [`VecDeque::shrink_to_fit`],
8516   [`VecDeque::swap_remove_back`], [`VecDeque::swap_remove_front`],
8517   [`slice::split_first_mut`], [`slice::split_first`],
8518   [`slice::split_last_mut`], [`slice::split_last`],
8519   [`char::from_u32_unchecked`], [`fs::canonicalize`],
8520   [`str::MatchIndices`], [`str::RMatchIndices`],
8521   [`str::match_indices`], [`str::rmatch_indices`],
8522   [`str::slice_mut_unchecked`], [`string::ParseError`].
8523 * Rust applications hosted on crates.io can be installed locally to
8524   `~/.cargo/bin` with the [`cargo install`] command. Among other
8525   things this makes it easier to augment Cargo with new subcommands:
8526   when a binary named e.g. `cargo-foo` is found in `$PATH` it can be
8527   invoked as `cargo foo`.
8528 * Crates with wildcard (`*`) dependencies will [emit warnings when
8529   published][1.5w]. In 1.6 it will no longer be possible to publish
8530   crates with wildcard dependencies.
8531
8532 Breaking Changes
8533 ----------------
8534
8535 * The rules determining when a particular lifetime must outlive
8536   a particular value (known as '[dropck]') have been [modified
8537   to not rely on parametricity][1.5p].
8538 * [Implementations of `AsRef` and `AsMut` were added to `Box`, `Rc`,
8539   and `Arc`][1.5a]. Because these smart pointer types implement
8540   `Deref`, this causes breakage in cases where the interior type
8541   contains methods of the same name.
8542 * [Correct a bug in Rc/Arc][1.5c] that caused [dropck] to be unaware
8543   that they could drop their content. Soundness fix.
8544 * All method invocations are [properly checked][1.5wf1] for
8545   [well-formedness][1.5wf2]. Soundness fix.
8546 * Traits whose supertraits contain `Self` are [not object
8547   safe][1.5o]. Soundness fix.
8548 * Target specifications support a [`no_default_libraries`][1.5nd]
8549   setting that controls whether `-nodefaultlibs` is passed to the
8550   linker, and in turn the `is_like_windows` setting no longer affects
8551   the `-nodefaultlibs` flag.
8552 * `#[derive(Show)]`, long-deprecated, [has been removed][1.5ds].
8553 * The `#[inline]` and `#[repr]` attributes [can only appear
8554   in valid locations][1.5at].
8555 * Native libraries linked from the local crate are [passed to
8556   the linker before native libraries from upstream crates][1.5nl].
8557 * Two rarely-used attributes, `#[no_debug]` and
8558   `#[omit_gdb_pretty_printer_section]` [are feature gated][1.5fg].
8559 * Negation of unsigned integers, which has been a warning for
8560   several releases, [is now behind a feature gate and will
8561   generate errors][1.5nu].
8562 * The parser accidentally accepted visibility modifiers on
8563   enum variants, a bug [which has been fixed][1.5ev].
8564 * [A bug was fixed that allowed `use` statements to import unstable
8565   features][1.5use].
8566
8567 Language
8568 --------
8569
8570 * When evaluating expressions at compile-time that are not
8571   compile-time constants (const-evaluating expressions in non-const
8572   contexts), incorrect code such as overlong bitshifts and arithmetic
8573   overflow will [generate a warning instead of an error][1.5ce],
8574   delaying the error until runtime. This will allow the
8575   const-evaluator to be expanded in the future backwards-compatibly.
8576 * The `improper_ctypes` lint [no longer warns about using `isize` and
8577   `usize` in FFI][1.5ict].
8578
8579 Libraries
8580 ---------
8581
8582 * `Arc<T>` and `Rc<T>` are [covariant with respect to `T` instead of
8583   invariant][1.5c].
8584 * `Default` is [implemented for mutable slices][1.5d].
8585 * `FromStr` is [implemented for `SockAddrV4` and `SockAddrV6`][1.5s].
8586 * There are now `From` conversions [between floating point
8587   types][1.5f] where the conversions are lossless.
8588 * There are now `From` conversions [between integer types][1.5i] where
8589   the conversions are lossless.
8590 * [`fs::Metadata` implements `Clone`][1.5fs].
8591 * The `parse` method [accepts a leading "+" when parsing
8592   integers][1.5pi].
8593 * [`AsMut` is implemented for `Vec`][1.5am].
8594 * The `clone_from` implementations for `String` and `BinaryHeap` [have
8595   been optimized][1.5cf] and no longer rely on the default impl.
8596 * The `extern "Rust"`, `extern "C"`, `unsafe extern "Rust"` and
8597   `unsafe extern "C"` function types now [implement `Clone`,
8598   `PartialEq`, `Eq`, `PartialOrd`, `Ord`, `Hash`, `fmt::Pointer`, and
8599   `fmt::Debug` for up to 12 arguments][1.5fp].
8600 * [Dropping `Vec`s is much faster in unoptimized builds when the
8601   element types don't implement `Drop`][1.5dv].
8602 * A bug that caused in incorrect behavior when [combining `VecDeque`
8603   with zero-sized types][1.5vdz] was resolved.
8604 * [`PartialOrd` for slices is faster][1.5po].
8605
8606 Miscellaneous
8607 -------------
8608
8609 * [Crate metadata size was reduced by 20%][1.5md].
8610 * [Improvements to code generation reduced the size of libcore by 3.3
8611   MB and rustc's memory usage by 18MB][1.5m].
8612 * [Improvements to deref translation increased performance in
8613   unoptimized builds][1.5dr].
8614 * Various errors in trait resolution [are deduplicated to only be
8615   reported once][1.5te].
8616 * Rust has preliminary [support for rumprun kernels][1.5rr].
8617 * Rust has preliminary [support for NetBSD on amd64][1.5na].
8618
8619 [1.5use]: https://github.com/rust-lang/rust/pull/28364
8620 [1.5po]: https://github.com/rust-lang/rust/pull/28436
8621 [1.5ev]: https://github.com/rust-lang/rust/pull/28442
8622 [1.5nu]: https://github.com/rust-lang/rust/pull/28468
8623 [1.5dr]: https://github.com/rust-lang/rust/pull/28491
8624 [1.5vdz]: https://github.com/rust-lang/rust/pull/28494
8625 [1.5md]: https://github.com/rust-lang/rust/pull/28521
8626 [1.5fg]: https://github.com/rust-lang/rust/pull/28522
8627 [1.5dv]: https://github.com/rust-lang/rust/pull/28531
8628 [1.5na]: https://github.com/rust-lang/rust/pull/28543
8629 [1.5fp]: https://github.com/rust-lang/rust/pull/28560
8630 [1.5rr]: https://github.com/rust-lang/rust/pull/28593
8631 [1.5cf]: https://github.com/rust-lang/rust/pull/28602
8632 [1.5nl]: https://github.com/rust-lang/rust/pull/28605
8633 [1.5te]: https://github.com/rust-lang/rust/pull/28645
8634 [1.5at]: https://github.com/rust-lang/rust/pull/28650
8635 [1.5am]: https://github.com/rust-lang/rust/pull/28663
8636 [1.5m]: https://github.com/rust-lang/rust/pull/28778
8637 [1.5ict]: https://github.com/rust-lang/rust/pull/28779
8638 [1.5a]: https://github.com/rust-lang/rust/pull/28811
8639 [1.5pi]: https://github.com/rust-lang/rust/pull/28826
8640 [1.5ce]: https://github.com/rust-lang/rfcs/blob/master/text/1229-compile-time-asserts.md
8641 [1.5p]: https://github.com/rust-lang/rfcs/blob/master/text/1238-nonparametric-dropck.md
8642 [1.5i]: https://github.com/rust-lang/rust/pull/28921
8643 [1.5fs]: https://github.com/rust-lang/rust/pull/29021
8644 [1.5f]: https://github.com/rust-lang/rust/pull/29129
8645 [1.5ds]: https://github.com/rust-lang/rust/pull/29148
8646 [1.5s]: https://github.com/rust-lang/rust/pull/29190
8647 [1.5d]: https://github.com/rust-lang/rust/pull/29245
8648 [1.5o]: https://github.com/rust-lang/rust/pull/29259
8649 [1.5nd]: https://github.com/rust-lang/rust/pull/28578
8650 [1.5wf2]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
8651 [1.5wf1]: https://github.com/rust-lang/rust/pull/28669
8652 [dropck]: https://doc.rust-lang.org/nightly/nomicon/dropck.html
8653 [1.5c]: https://github.com/rust-lang/rust/pull/29110
8654 [1.5w]: https://github.com/rust-lang/rfcs/blob/master/text/1241-no-wildcard-deps.md
8655 [`cargo install`]: https://github.com/rust-lang/rfcs/blob/master/text/1200-cargo-install.md
8656 [`BinaryHeap::from`]: http://doc.rust-lang.org/nightly/std/convert/trait.From.html#method.from
8657 [`BinaryHeap::into_sorted_vec`]: http://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html#method.into_sorted_vec
8658 [`BinaryHeap::into_vec`]: http://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html#method.into_vec
8659 [`Condvar::wait_timeout`]: http://doc.rust-lang.org/nightly/std/sync/struct.Condvar.html#method.wait_timeout
8660 [`FileTypeExt::is_block_device`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_block_device
8661 [`FileTypeExt::is_char_device`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_char_device
8662 [`FileTypeExt::is_fifo`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_fifo
8663 [`FileTypeExt::is_socket`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_socket
8664 [`FileTypeExt`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html
8665 [`Formatter::alternate`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.alternate
8666 [`Formatter::fill`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.fill
8667 [`Formatter::precision`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.precision
8668 [`Formatter::sign_aware_zero_pad`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.sign_aware_zero_pad
8669 [`Formatter::sign_minus`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.sign_minus
8670 [`Formatter::sign_plus`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.sign_plus
8671 [`Formatter::width`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.width
8672 [`Iterator::cmp`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.cmp
8673 [`Iterator::eq`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.eq
8674 [`Iterator::ge`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.ge
8675 [`Iterator::gt`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.gt
8676 [`Iterator::le`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.le
8677 [`Iterator::lt`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.lt
8678 [`Iterator::ne`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.ne
8679 [`Iterator::partial_cmp`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.partial_cmp
8680 [`Path::canonicalize`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.canonicalize
8681 [`Path::exists`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.exists
8682 [`Path::is_dir`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.is_dir
8683 [`Path::is_file`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.is_file
8684 [`Path::metadata`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.metadata
8685 [`Path::read_dir`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.read_dir
8686 [`Path::read_link`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.read_link
8687 [`Path::symlink_metadata`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.symlink_metadata
8688 [`Utf8Error::valid_up_to`]: http://doc.rust-lang.org/nightly/core/str/struct.Utf8Error.html#method.valid_up_to
8689 [`Vec::resize`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.resize
8690 [`VecDeque::as_mut_slices`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.as_mut_slices
8691 [`VecDeque::as_slices`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.as_slices
8692 [`VecDeque::insert`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.insert
8693 [`VecDeque::shrink_to_fit`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.shrink_to_fit
8694 [`VecDeque::swap_remove_back`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.swap_remove_back
8695 [`VecDeque::swap_remove_front`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.swap_remove_front
8696 [`slice::split_first_mut`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_first_mut
8697 [`slice::split_first`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_first
8698 [`slice::split_last_mut`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_last_mut
8699 [`slice::split_last`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_last
8700 [`char::from_u32_unchecked`]: http://doc.rust-lang.org/nightly/std/char/fn.from_u32_unchecked.html
8701 [`fs::canonicalize`]: http://doc.rust-lang.org/nightly/std/fs/fn.canonicalize.html
8702 [`str::MatchIndices`]: http://doc.rust-lang.org/nightly/std/str/struct.MatchIndices.html
8703 [`str::RMatchIndices`]: http://doc.rust-lang.org/nightly/std/str/struct.RMatchIndices.html
8704 [`str::match_indices`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.match_indices
8705 [`str::rmatch_indices`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.rmatch_indices
8706 [`str::slice_mut_unchecked`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.slice_mut_unchecked
8707 [`string::ParseError`]: http://doc.rust-lang.org/nightly/std/string/enum.ParseError.html
8708
8709 Version 1.4.0 (2015-10-29)
8710 ==========================
8711
8712 * ~1200 changes, numerous bugfixes
8713
8714 Highlights
8715 ----------
8716
8717 * Windows builds targeting the 64-bit MSVC ABI and linker (instead of
8718   GNU) are now supported and recommended for use.
8719
8720 Breaking Changes
8721 ----------------
8722
8723 * [Several changes have been made to fix type soundness and improve
8724   the behavior of associated types][sound]. See [RFC 1214]. Although
8725   we have mostly introduced these changes as warnings this release, to
8726   become errors next release, there are still some scenarios that will
8727   see immediate breakage.
8728 * [The `str::lines` and `BufRead::lines` iterators treat `\r\n` as
8729   line breaks in addition to `\n`][crlf].
8730 * [Loans of `'static` lifetime extend to the end of a function][stat].
8731 * [`str::parse` no longer introduces avoidable rounding error when
8732   parsing floating point numbers. Together with earlier changes to
8733   float formatting/output, "round trips" like f.to_string().parse()
8734   now preserve the value of f exactly. Additionally, leading plus
8735   signs are now accepted][fp3].
8736
8737
8738 Language
8739 --------
8740
8741 * `use` statements that import multiple items [can now rename
8742   them][i], as in `use foo::{bar as kitten, baz as puppy}`.
8743 * [Binops work correctly on fat pointers][binfat].
8744 * `pub extern crate`, which does not behave as expected, [issues a
8745   warning][pec] until a better solution is found.
8746
8747 Libraries
8748 ---------
8749
8750 * [Many APIs were stabilized][stab]: `<Box<str>>::into_string`,
8751   [`Arc::downgrade`], [`Arc::get_mut`], [`Arc::make_mut`],
8752   [`Arc::try_unwrap`], [`Box::from_raw`], [`Box::into_raw`], [`CStr::to_str`],
8753   [`CStr::to_string_lossy`], [`CString::from_raw`], [`CString::into_raw`],
8754   [`IntoRawFd::into_raw_fd`], [`IntoRawFd`],
8755   `IntoRawHandle::into_raw_handle`, `IntoRawHandle`,
8756   `IntoRawSocket::into_raw_socket`, `IntoRawSocket`, [`Rc::downgrade`],
8757   [`Rc::get_mut`], [`Rc::make_mut`], [`Rc::try_unwrap`], [`Result::expect`],
8758   [`String::into_boxed_str`], [`TcpStream::read_timeout`],
8759   [`TcpStream::set_read_timeout`], [`TcpStream::set_write_timeout`],
8760   [`TcpStream::write_timeout`], [`UdpSocket::read_timeout`],
8761   [`UdpSocket::set_read_timeout`], [`UdpSocket::set_write_timeout`],
8762   [`UdpSocket::write_timeout`], `Vec::append`, `Vec::split_off`,
8763   [`VecDeque::append`], [`VecDeque::retain`], [`VecDeque::split_off`],
8764   [`rc::Weak::upgrade`], [`rc::Weak`], [`slice::Iter::as_slice`],
8765   [`slice::IterMut::into_slice`], [`str::CharIndices::as_str`],
8766   [`str::Chars::as_str`], [`str::split_at_mut`], [`str::split_at`],
8767   [`sync::Weak::upgrade`], [`sync::Weak`], [`thread::park_timeout`],
8768   [`thread::sleep`].
8769 * [Some APIs were deprecated][dep]: `BTreeMap::with_b`,
8770   `BTreeSet::with_b`, `Option::as_mut_slice`, `Option::as_slice`,
8771   `Result::as_mut_slice`, `Result::as_slice`, `f32::from_str_radix`,
8772   `f64::from_str_radix`.
8773 * [Reverse-searching strings is faster with the 'two-way'
8774   algorithm][s].
8775 * [`std::io::copy` allows `?Sized` arguments][cc].
8776 * The `Windows`, `Chunks`, and `ChunksMut` iterators over slices all
8777   [override `count`, `nth` and `last` with an *O*(1)
8778   implementation][it].
8779 * [`Default` is implemented for arrays up to `[T; 32]`][d].
8780 * [`IntoRawFd` has been added to the Unix-specific prelude,
8781   `IntoRawSocket` and `IntoRawHandle` to the Windows-specific
8782   prelude][pr].
8783 * [`Extend<String>` and `FromIterator<String` are both implemented for
8784   `String`][es].
8785 * [`IntoIterator` is implemented for references to `Option` and
8786   `Result`][into2].
8787 * [`HashMap` and `HashSet` implement `Extend<&T>` where `T:
8788   Copy`][ext] as part of [RFC 839]. This will cause type inference
8789   breakage in rare situations.
8790 * [`BinaryHeap` implements `Debug`][bh2].
8791 * [`Borrow` and `BorrowMut` are implemented for fixed-size
8792   arrays][bm].
8793 * [`extern fn`s with the "Rust" and "C" ABIs implement common
8794   traits including `Eq`, `Ord`, `Debug`, `Hash`][fp].
8795 * [String comparison is faster][faststr].
8796 * `&mut T` where `T: std::fmt::Write` [also implements
8797   `std::fmt::Write`][mutw].
8798 * [A stable regression in `VecDeque::push_back` and other
8799   capacity-altering methods that caused panics for zero-sized types
8800   was fixed][vd].
8801 * [Function pointers implement traits for up to 12 parameters][fp2].
8802
8803 Miscellaneous
8804 -------------
8805
8806 * The compiler [no longer uses the 'morestack' feature to prevent
8807   stack overflow][mm]. Instead it uses guard pages and stack
8808   probes (though stack probes are not yet implemented on any platform
8809   but Windows).
8810 * [The compiler matches traits faster when projections are involved][p].
8811 * The 'improper_ctypes' lint [no longer warns about use of `isize` and
8812   `usize`][ffi].
8813 * [Cargo now displays useful information about what its doing during
8814   `cargo update`][cu].
8815
8816 [`Arc::downgrade`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.downgrade
8817 [`Arc::make_mut`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.make_mut
8818 [`Arc::get_mut`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.get_mut
8819 [`Arc::try_unwrap`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.try_unwrap
8820 [`Box::from_raw`]: http://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html#method.from_raw
8821 [`Box::into_raw`]: http://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html#method.into_raw
8822 [`CStr::to_str`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html#method.to_str
8823 [`CStr::to_string_lossy`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html#method.to_string_lossy
8824 [`CString::from_raw`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.from_raw
8825 [`CString::into_raw`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_raw
8826 [`IntoRawFd::into_raw_fd`]: http://doc.rust-lang.org/nightly/std/os/unix/io/trait.IntoRawFd.html#tymethod.into_raw_fd
8827 [`IntoRawFd`]: http://doc.rust-lang.org/nightly/std/os/unix/io/trait.IntoRawFd.html
8828 [`Rc::downgrade`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.downgrade
8829 [`Rc::get_mut`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.get_mut
8830 [`Rc::make_mut`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.make_mut
8831 [`Rc::try_unwrap`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.try_unwrap
8832 [`Result::expect`]: http://doc.rust-lang.org/nightly/core/result/enum.Result.html#method.expect
8833 [`String::into_boxed_str`]: http://doc.rust-lang.org/nightly/collections/string/struct.String.html#method.into_boxed_str
8834 [`TcpStream::read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.read_timeout
8835 [`TcpStream::set_read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_read_timeout
8836 [`TcpStream::write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.write_timeout
8837 [`TcpStream::set_write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_write_timeout
8838 [`UdpSocket::read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.read_timeout
8839 [`UdpSocket::set_read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_read_timeout
8840 [`UdpSocket::write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.write_timeout
8841 [`UdpSocket::set_write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_write_timeout
8842 [`VecDeque::append`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.append
8843 [`VecDeque::retain`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.retain
8844 [`VecDeque::split_off`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.split_off
8845 [`rc::Weak::upgrade`]: http://doc.rust-lang.org/nightly/std/rc/struct.Weak.html#method.upgrade
8846 [`rc::Weak`]: http://doc.rust-lang.org/nightly/std/rc/struct.Weak.html
8847 [`slice::Iter::as_slice`]: http://doc.rust-lang.org/nightly/std/slice/struct.Iter.html#method.as_slice
8848 [`slice::IterMut::into_slice`]: http://doc.rust-lang.org/nightly/std/slice/struct.IterMut.html#method.into_slice
8849 [`str::CharIndices::as_str`]: http://doc.rust-lang.org/nightly/std/str/struct.CharIndices.html#method.as_str
8850 [`str::Chars::as_str`]: http://doc.rust-lang.org/nightly/std/str/struct.Chars.html#method.as_str
8851 [`str::split_at_mut`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_at_mut
8852 [`str::split_at`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_at
8853 [`sync::Weak::upgrade`]: http://doc.rust-lang.org/nightly/std/sync/struct.Weak.html#method.upgrade
8854 [`sync::Weak`]: http://doc.rust-lang.org/nightly/std/sync/struct.Weak.html
8855 [`thread::park_timeout`]: http://doc.rust-lang.org/nightly/std/thread/fn.park_timeout.html
8856 [`thread::sleep`]: http://doc.rust-lang.org/nightly/std/thread/fn.sleep.html
8857 [bh2]: https://github.com/rust-lang/rust/pull/28156
8858 [binfat]: https://github.com/rust-lang/rust/pull/28270
8859 [bm]: https://github.com/rust-lang/rust/pull/28197
8860 [cc]: https://github.com/rust-lang/rust/pull/27531
8861 [crlf]: https://github.com/rust-lang/rust/pull/28034
8862 [cu]: https://github.com/rust-lang/cargo/pull/1931
8863 [d]: https://github.com/rust-lang/rust/pull/27825
8864 [dep]: https://github.com/rust-lang/rust/pull/28339
8865 [es]: https://github.com/rust-lang/rust/pull/27956
8866 [ext]: https://github.com/rust-lang/rust/pull/28094
8867 [faststr]: https://github.com/rust-lang/rust/pull/28338
8868 [ffi]: https://github.com/rust-lang/rust/pull/28779
8869 [fp]: https://github.com/rust-lang/rust/pull/28268
8870 [fp2]: https://github.com/rust-lang/rust/pull/28560
8871 [fp3]: https://github.com/rust-lang/rust/pull/27307
8872 [i]: https://github.com/rust-lang/rust/pull/27451
8873 [into2]: https://github.com/rust-lang/rust/pull/28039
8874 [it]: https://github.com/rust-lang/rust/pull/27652
8875 [mm]: https://github.com/rust-lang/rust/pull/27338
8876 [mutw]: https://github.com/rust-lang/rust/pull/28368
8877 [sound]: https://github.com/rust-lang/rust/pull/27641
8878 [p]: https://github.com/rust-lang/rust/pull/27866
8879 [pec]: https://github.com/rust-lang/rust/pull/28486
8880 [pr]: https://github.com/rust-lang/rust/pull/27896
8881 [RFC 839]: https://github.com/rust-lang/rfcs/blob/master/text/0839-embrace-extend-extinguish.md
8882 [RFC 1214]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
8883 [s]: https://github.com/rust-lang/rust/pull/27474
8884 [stab]: https://github.com/rust-lang/rust/pull/28339
8885 [stat]: https://github.com/rust-lang/rust/pull/28321
8886 [vd]: https://github.com/rust-lang/rust/pull/28494
8887
8888 Version 1.3.0 (2015-09-17)
8889 ==============================
8890
8891 * ~900 changes, numerous bugfixes
8892
8893 Highlights
8894 ----------
8895
8896 * The [new object lifetime defaults][nold] have been [turned
8897   on][nold2] after a cycle of warnings about the change. Now types
8898   like `&'a Box<Trait>` (or `&'a Rc<Trait>`, etc) will change from
8899   being interpreted as `&'a Box<Trait+'a>` to `&'a
8900   Box<Trait+'static>`.
8901 * [The Rustonomicon][nom] is a new book in the official documentation
8902   that dives into writing unsafe Rust.
8903 * The [`Duration`] API, [has been stabilized][ds]. This basic unit of
8904   timekeeping is employed by other std APIs, as well as out-of-tree
8905   time crates.
8906
8907 Breaking Changes
8908 ----------------
8909
8910 * The [new object lifetime defaults][nold] have been [turned
8911   on][nold2] after a cycle of warnings about the change.
8912 * There is a known [regression][lr] in how object lifetime elision is
8913   interpreted, the proper solution for which is undetermined.
8914 * The `#[prelude_import]` attribute, an internal implementation
8915   detail, was accidentally stabilized previously. [It has been put
8916   behind the `prelude_import` feature gate][pi]. This change is
8917   believed to break no existing code.
8918 * The behavior of [`size_of_val`][dst1] and [`align_of_val`][dst2] is
8919   [more sane for dynamically sized types][dst3]. Code that relied on
8920   the previous behavior is thought to be broken.
8921 * The `dropck` rules, which checks that destructors can't access
8922   destroyed values, [have been updated][dropck] to match the
8923   [RFC][dropckrfc]. This fixes some soundness holes, and as such will
8924   cause some previously-compiling code to no longer build.
8925
8926 Language
8927 --------
8928
8929 * The [new object lifetime defaults][nold] have been [turned
8930   on][nold2] after a cycle of warnings about the change.
8931 * Semicolons may [now follow types and paths in
8932   macros](https://github.com/rust-lang/rust/pull/27000).
8933 * The behavior of [`size_of_val`][dst1] and [`align_of_val`][dst2] is
8934   [more sane for dynamically sized types][dst3]. Code that relied on
8935   the previous behavior is not known to exist, and suspected to be
8936   broken.
8937 * `'static` variables [may now be recursive][st].
8938 * `ref` bindings choose between [`Deref`] and [`DerefMut`]
8939   implementations correctly.
8940 * The `dropck` rules, which checks that destructors can't access
8941   destroyed values, [have been updated][dropck] to match the
8942   [RFC][dropckrfc].
8943
8944 Libraries
8945 ---------
8946
8947 * The [`Duration`] API, [has been stabilized][ds], as well as the
8948   `std::time` module, which presently contains only `Duration`.
8949 * `Box<str>` and `Box<[T]>` both implement `Clone`.
8950 * The owned C string, [`CString`], implements [`Borrow`] and the
8951   borrowed C string, [`CStr`], implements [`ToOwned`]. The two of
8952   these allow C strings to be borrowed and cloned in generic code.
8953 * [`CStr`] implements [`Debug`].
8954 * [`AtomicPtr`] implements [`Debug`].
8955 * [`Error`] trait objects [can be downcast to their concrete types][e]
8956   in many common configurations, using the [`is`], [`downcast`],
8957   [`downcast_ref`] and [`downcast_mut`] methods, similarly to the
8958   [`Any`] trait.
8959 * Searching for substrings now [employs the two-way algorithm][search]
8960   instead of doing a naive search. This gives major speedups to a
8961   number of methods, including [`contains`][sc], [`find`][sf],
8962   [`rfind`][srf], [`split`][ss]. [`starts_with`][ssw] and
8963   [`ends_with`][sew] are also faster.
8964 * The performance of `PartialEq` for slices is [much faster][ps].
8965 * The [`Hash`] trait offers the default method, [`hash_slice`], which
8966   is overridden and optimized by the implementations for scalars.
8967 * The [`Hasher`] trait now has a number of specialized `write_*`
8968   methods for primitive types, for efficiency.
8969 * The I/O-specific error type, [`std::io::Error`][ie], gained a set of
8970   methods for accessing the 'inner error', if any: [`get_ref`][iegr],
8971   [`get_mut`][iegm], [`into_inner`][ieii]. As well, the implementation
8972   of [`std::error::Error::cause`][iec] also delegates to the inner
8973   error.
8974 * [`process::Child`][pc] gained the [`id`] method, which returns a
8975   `u32` representing the platform-specific process identifier.
8976 * The [`connect`] method on slices is deprecated, replaced by the new
8977   [`join`] method (note that both of these are on the *unstable*
8978   [`SliceConcatExt`] trait, but through the magic of the prelude are
8979   available to stable code anyway).
8980 * The [`Div`] operator is implemented for [`Wrapping`] types.
8981 * [`DerefMut` is implemented for `String`][dms].
8982 * Performance of SipHash (the default hasher for `HashMap`) is
8983   [better for long data][sh].
8984 * [`AtomicPtr`] implements [`Send`].
8985 * The [`read_to_end`] implementations for [`Stdin`] and [`File`]
8986   are now [specialized to use uninitialized buffers for increased
8987   performance][rte].
8988 * Lifetime parameters of foreign functions [are now resolved
8989   properly][f].
8990
8991 Misc
8992 ----
8993
8994 * Rust can now, with some coercion, [produce programs that run on
8995   Windows XP][xp], though XP is not considered a supported platform.
8996 * Porting Rust on Windows from the GNU toolchain to MSVC continues
8997   ([1][win1], [2][win2], [3][win3], [4][win4]). It is still not
8998   recommended for use in 1.3, though should be fully-functional
8999   in the [64-bit 1.4 beta][b14].
9000 * On Fedora-based systems installation will [properly configure the
9001   dynamic linker][fl].
9002 * The compiler gained many new extended error descriptions, which can
9003   be accessed with the `--explain` flag.
9004 * The `dropck` pass, which checks that destructors can't access
9005   destroyed values, [has been rewritten][dropck]. This fixes some
9006   soundness holes, and as such will cause some previously-compiling
9007   code to no longer build.
9008 * `rustc` now uses [LLVM to write archive files where possible][ar].
9009   Eventually this will eliminate the compiler's dependency on the ar
9010   utility.
9011 * Rust has [preliminary support for i686 FreeBSD][fb] (it has long
9012   supported FreeBSD on x86_64).
9013 * The [`unused_mut`][lum], [`unconditional_recursion`][lur],
9014   [`improper_ctypes`][lic], and [`negate_unsigned`][lnu] lints are
9015   more strict.
9016 * If landing pads are disabled (with `-Z no-landing-pads`), [`panic!`
9017   will kill the process instead of leaking][nlp].
9018
9019 [`Any`]: http://doc.rust-lang.org/nightly/std/any/trait.Any.html
9020 [`AtomicPtr`]: http://doc.rust-lang.org/nightly/std/sync/atomic/struct.AtomicPtr.html
9021 [`Borrow`]: http://doc.rust-lang.org/nightly/std/borrow/trait.Borrow.html
9022 [`CStr`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html
9023 [`CString`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html
9024 [`Debug`]: http://doc.rust-lang.org/nightly/std/fmt/trait.Debug.html
9025 [`DerefMut`]: http://doc.rust-lang.org/nightly/std/ops/trait.DerefMut.html
9026 [`Deref`]: http://doc.rust-lang.org/nightly/std/ops/trait.Deref.html
9027 [`Div`]: http://doc.rust-lang.org/nightly/std/ops/trait.Div.html
9028 [`Duration`]: http://doc.rust-lang.org/nightly/std/time/struct.Duration.html
9029 [`Error`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html
9030 [`File`]: http://doc.rust-lang.org/nightly/std/fs/struct.File.html
9031 [`Hash`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html
9032 [`Hasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hasher.html
9033 [`Send`]: http://doc.rust-lang.org/nightly/std/marker/trait.Send.html
9034 [`SliceConcatExt`]: http://doc.rust-lang.org/nightly/std/slice/trait.SliceConcatExt.html
9035 [`Stdin`]: http://doc.rust-lang.org/nightly/std/io/struct.Stdin.html
9036 [`ToOwned`]: http://doc.rust-lang.org/nightly/std/borrow/trait.ToOwned.html
9037 [`Wrapping`]: http://doc.rust-lang.org/nightly/std/num/struct.Wrapping.html
9038 [`connect`]: http://doc.rust-lang.org/nightly/std/slice/trait.SliceConcatExt.html#method.connect
9039 [`downcast_mut`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.downcast_mut
9040 [`downcast_ref`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.downcast_ref
9041 [`downcast`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.downcast
9042 [`hash_slice`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html#method.hash_slice
9043 [`id`]: http://doc.rust-lang.org/nightly/std/process/struct.Child.html#method.id
9044 [`is`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.is
9045 [`join`]: http://doc.rust-lang.org/nightly/std/slice/trait.SliceConcatExt.html#method.join
9046 [`read_to_end`]: http://doc.rust-lang.org/nightly/std/io/trait.Read.html#method.read_to_end
9047 [ar]: https://github.com/rust-lang/rust/pull/26926
9048 [b14]: https://static.rust-lang.org/dist/rust-beta-x86_64-pc-windows-msvc.msi
9049 [dms]: https://github.com/rust-lang/rust/pull/26241
9050 [dropck]: https://github.com/rust-lang/rust/pull/27261
9051 [dropckrfc]: https://github.com/rust-lang/rfcs/blob/master/text/0769-sound-generic-drop.md
9052 [ds]: https://github.com/rust-lang/rust/pull/26818
9053 [dst1]: http://doc.rust-lang.org/nightly/std/mem/fn.size_of_val.html
9054 [dst2]: http://doc.rust-lang.org/nightly/std/mem/fn.align_of_val.html
9055 [dst3]: https://github.com/rust-lang/rust/pull/27351
9056 [e]: https://github.com/rust-lang/rust/pull/24793
9057 [f]: https://github.com/rust-lang/rust/pull/26588
9058 [fb]: https://github.com/rust-lang/rust/pull/26959
9059 [fl]: https://github.com/rust-lang/rust-installer/pull/41
9060 [hs]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html#method.hash_slice
9061 [ie]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html
9062 [iec]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.cause
9063 [iegm]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.get_mut
9064 [iegr]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.get_ref
9065 [ieii]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.into_inner
9066 [lic]: https://github.com/rust-lang/rust/pull/26583
9067 [lnu]: https://github.com/rust-lang/rust/pull/27026
9068 [lr]: https://github.com/rust-lang/rust/issues/27248
9069 [lum]: https://github.com/rust-lang/rust/pull/26378
9070 [lur]: https://github.com/rust-lang/rust/pull/26783
9071 [nlp]: https://github.com/rust-lang/rust/pull/27176
9072 [nold2]: https://github.com/rust-lang/rust/pull/27045
9073 [nold]: https://github.com/rust-lang/rfcs/blob/master/text/1156-adjust-default-object-bounds.md
9074 [nom]: http://doc.rust-lang.org/nightly/nomicon/
9075 [pc]: http://doc.rust-lang.org/nightly/std/process/struct.Child.html
9076 [pi]: https://github.com/rust-lang/rust/pull/26699
9077 [ps]: https://github.com/rust-lang/rust/pull/26884
9078 [rte]: https://github.com/rust-lang/rust/pull/26950
9079 [sc]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.contains
9080 [search]: https://github.com/rust-lang/rust/pull/26327
9081 [sew]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.ends_with
9082 [sf]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.find
9083 [sh]: https://github.com/rust-lang/rust/pull/27280
9084 [srf]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.rfind
9085 [ss]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split
9086 [ssw]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.starts_with
9087 [st]: https://github.com/rust-lang/rust/pull/26630
9088 [win1]: https://github.com/rust-lang/rust/pull/26569
9089 [win2]: https://github.com/rust-lang/rust/pull/26741
9090 [win3]: https://github.com/rust-lang/rust/pull/26741
9091 [win4]: https://github.com/rust-lang/rust/pull/27210
9092 [xp]: https://github.com/rust-lang/rust/pull/26569
9093
9094 Version 1.2.0 (2015-08-07)
9095 ==========================
9096
9097 * ~1200 changes, numerous bugfixes
9098
9099 Highlights
9100 ----------
9101
9102 * [Dynamically-sized-type coercions][dst] allow smart pointer types
9103   like `Rc` to contain types without a fixed size, arrays and trait
9104   objects, finally enabling use of `Rc<[T]>` and completing the
9105   implementation of DST.
9106 * [Parallel codegen][parcodegen] is now working again, which can
9107   substantially speed up large builds in debug mode; It also gets
9108   another ~33% speedup when bootstrapping on a 4 core machine (using 8
9109   jobs). It's not enabled by default, but will be "in the near
9110   future". It can be activated with the `-C codegen-units=N` flag to
9111   `rustc`.
9112 * This is the first release with [experimental support for linking
9113   with the MSVC linker and lib C on Windows (instead of using the GNU
9114   variants via MinGW)][win]. It is yet recommended only for the most
9115   intrepid Rustaceans.
9116 * Benchmark compilations are showing a 30% improvement in
9117   bootstrapping over 1.1.
9118
9119 Breaking Changes
9120 ----------------
9121
9122 * The [`to_uppercase`] and [`to_lowercase`] methods on `char` now do
9123   unicode case mapping, which is a previously-planned change in
9124   behavior and considered a bugfix.
9125 * [`mem::align_of`] now specifies [the *minimum alignment* for
9126   T][align], which is usually the alignment programs are interested
9127   in, and the same value reported by clang's
9128   `alignof`. [`mem::min_align_of`] is deprecated. This is not known to
9129   break real code.
9130 * [The `#[packed]` attribute is no longer silently accepted by the
9131   compiler][packed]. This attribute did nothing and code that
9132   mentioned it likely did not work as intended.
9133 * Associated type defaults are [now behind the
9134   `associated_type_defaults` feature gate][ad]. In 1.1 associated type
9135   defaults *did not work*, but could be mentioned syntactically. As
9136   such this breakage has minimal impact.
9137
9138 Language
9139 --------
9140
9141 * Patterns with `ref mut` now correctly invoke [`DerefMut`] when
9142   matching against dereferenceable values.
9143
9144 Libraries
9145 ---------
9146
9147 * The [`Extend`] trait, which grows a collection from an iterator, is
9148   implemented over iterators of references, for `String`, `Vec`,
9149   `LinkedList`, `VecDeque`, `EnumSet`, `BinaryHeap`, `VecMap`,
9150   `BTreeSet` and `BTreeMap`. [RFC][extend-rfc].
9151 * The [`iter::once`] function returns an iterator that yields a single
9152   element, and [`iter::empty`] returns an iterator that yields no
9153   elements.
9154 * The [`matches`] and [`rmatches`] methods on `str` return iterators
9155   over substring matches.
9156 * [`Cell`] and [`RefCell`] both implement `Eq`.
9157 * A number of methods for wrapping arithmetic are added to the
9158   integral types, [`wrapping_div`], [`wrapping_rem`],
9159   [`wrapping_neg`], [`wrapping_shl`], [`wrapping_shr`]. These are in
9160   addition to the existing [`wrapping_add`], [`wrapping_sub`], and
9161   [`wrapping_mul`] methods, and alternatives to the [`Wrapping`]
9162   type.. It is illegal for the default arithmetic operations in Rust
9163   to overflow; the desire to wrap must be explicit.
9164 * The `{:#?}` formatting specifier [displays the alternate,
9165   pretty-printed][debugfmt] form of the `Debug` formatter. This
9166   feature was actually introduced prior to 1.0 with little
9167   fanfare.
9168 * [`fmt::Formatter`] implements [`fmt::Write`], a `fmt`-specific trait
9169   for writing data to formatted strings, similar to [`io::Write`].
9170 * [`fmt::Formatter`] adds 'debug builder' methods, [`debug_struct`],
9171   [`debug_tuple`], [`debug_list`], [`debug_set`], [`debug_map`]. These
9172   are used by code generators to emit implementations of [`Debug`].
9173 * `str` has new [`to_uppercase`][strup] and [`to_lowercase`][strlow]
9174   methods that convert case, following Unicode case mapping.
9175 * It is now easier to handle poisoned locks. The [`PoisonError`]
9176   type, returned by failing lock operations, exposes `into_inner`,
9177   `get_ref`, and `get_mut`, which all give access to the inner lock
9178   guard, and allow the poisoned lock to continue to operate. The
9179   `is_poisoned` method of [`RwLock`] and [`Mutex`] can poll for a
9180   poisoned lock without attempting to take the lock.
9181 * On Unix the [`FromRawFd`] trait is implemented for [`Stdio`], and
9182   [`AsRawFd`] for [`ChildStdin`], [`ChildStdout`], [`ChildStderr`].
9183   On Windows the `FromRawHandle` trait is implemented for `Stdio`,
9184   and `AsRawHandle` for `ChildStdin`, `ChildStdout`,
9185   `ChildStderr`.
9186 * [`io::ErrorKind`] has a new variant, `InvalidData`, which indicates
9187   malformed input.
9188
9189 Misc
9190 ----
9191
9192 * `rustc` employs smarter heuristics for guessing at [typos].
9193 * `rustc` emits more efficient code for [no-op conversions between
9194   unsafe pointers][nop].
9195 * Fat pointers are now [passed in pairs of immediate arguments][fat],
9196   resulting in faster compile times and smaller code.
9197
9198 [`Extend`]: https://doc.rust-lang.org/nightly/std/iter/trait.Extend.html
9199 [extend-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0839-embrace-extend-extinguish.md
9200 [`iter::once`]: https://doc.rust-lang.org/nightly/std/iter/fn.once.html
9201 [`iter::empty`]: https://doc.rust-lang.org/nightly/std/iter/fn.empty.html
9202 [`matches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.matches
9203 [`rmatches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.rmatches
9204 [`Cell`]: https://doc.rust-lang.org/nightly/std/cell/struct.Cell.html
9205 [`RefCell`]: https://doc.rust-lang.org/nightly/std/cell/struct.RefCell.html
9206 [`wrapping_add`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_add
9207 [`wrapping_sub`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_sub
9208 [`wrapping_mul`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_mul
9209 [`wrapping_div`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_div
9210 [`wrapping_rem`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_rem
9211 [`wrapping_neg`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_neg
9212 [`wrapping_shl`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_shl
9213 [`wrapping_shr`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_shr
9214 [`Wrapping`]: https://doc.rust-lang.org/nightly/std/num/struct.Wrapping.html
9215 [`fmt::Formatter`]: https://doc.rust-lang.org/nightly/std/fmt/struct.Formatter.html
9216 [`fmt::Write`]: https://doc.rust-lang.org/nightly/std/fmt/trait.Write.html
9217 [`io::Write`]: https://doc.rust-lang.org/nightly/std/io/trait.Write.html
9218 [`debug_struct`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_struct
9219 [`debug_tuple`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_tuple
9220 [`debug_list`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_list
9221 [`debug_set`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_set
9222 [`debug_map`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_map
9223 [`Debug`]: https://doc.rust-lang.org/nightly/std/fmt/trait.Debug.html
9224 [strup]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.to_uppercase
9225 [strlow]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.to_lowercase
9226 [`to_uppercase`]: https://doc.rust-lang.org/nightly/std/primitive.char.html#method.to_uppercase
9227 [`to_lowercase`]: https://doc.rust-lang.org/nightly/std/primitive.char.html#method.to_lowercase
9228 [`PoisonError`]: https://doc.rust-lang.org/nightly/std/sync/struct.PoisonError.html
9229 [`RwLock`]: https://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html
9230 [`Mutex`]: https://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html
9231 [`FromRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.FromRawFd.html
9232 [`AsRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.AsRawFd.html
9233 [`Stdio`]: https://doc.rust-lang.org/nightly/std/process/struct.Stdio.html
9234 [`ChildStdin`]: https://doc.rust-lang.org/nightly/std/process/struct.ChildStdin.html
9235 [`ChildStdout`]: https://doc.rust-lang.org/nightly/std/process/struct.ChildStdout.html
9236 [`ChildStderr`]: https://doc.rust-lang.org/nightly/std/process/struct.ChildStderr.html
9237 [`io::ErrorKind`]: https://doc.rust-lang.org/nightly/std/io/enum.ErrorKind.html
9238 [debugfmt]: https://www.reddit.com/r/rust/comments/3ceaui/psa_produces_prettyprinted_debug_output/
9239 [`DerefMut`]: https://doc.rust-lang.org/nightly/std/ops/trait.DerefMut.html
9240 [`mem::align_of`]: https://doc.rust-lang.org/nightly/std/mem/fn.align_of.html
9241 [align]: https://github.com/rust-lang/rust/pull/25646
9242 [`mem::min_align_of`]: https://doc.rust-lang.org/nightly/std/mem/fn.min_align_of.html
9243 [typos]: https://github.com/rust-lang/rust/pull/26087
9244 [nop]: https://github.com/rust-lang/rust/pull/26336
9245 [fat]: https://github.com/rust-lang/rust/pull/26411
9246 [dst]: https://github.com/rust-lang/rfcs/blob/master/text/0982-dst-coercion.md
9247 [parcodegen]: https://github.com/rust-lang/rust/pull/26018
9248 [packed]: https://github.com/rust-lang/rust/pull/25541
9249 [ad]: https://github.com/rust-lang/rust/pull/27382
9250 [win]: https://github.com/rust-lang/rust/pull/25350
9251
9252 Version 1.1.0 (2015-06-25)
9253 =========================
9254
9255 * ~850 changes, numerous bugfixes
9256
9257 Highlights
9258 ----------
9259
9260 * The [`std::fs` module has been expanded][fs] to expand the set of
9261   functionality exposed:
9262   * `DirEntry` now supports optimizations like `file_type` and `metadata` which
9263     don't incur a syscall on some platforms.
9264   * A `symlink_metadata` function has been added.
9265   * The `fs::Metadata` structure now lowers to its OS counterpart, providing
9266     access to all underlying information.
9267 * The compiler now contains extended explanations of many errors. When an error
9268   with an explanation occurs the compiler suggests using the `--explain` flag
9269   to read the explanation. Error explanations are also [available online][err-index].
9270 * Thanks to multiple [improvements][sk] to [type checking][pre], as
9271   well as other work, the time to bootstrap the compiler decreased by
9272   32%.
9273
9274 Libraries
9275 ---------
9276
9277 * The [`str::split_whitespace`] method splits a string on unicode
9278   whitespace boundaries.
9279 * On both Windows and Unix, new extension traits provide conversion of
9280   I/O types to and from the underlying system handles. On Unix, these
9281   traits are [`FromRawFd`] and [`AsRawFd`], on Windows `FromRawHandle`
9282   and `AsRawHandle`. These are implemented for `File`, `TcpStream`,
9283   `TcpListener`, and `UpdSocket`. Further implementations for
9284   `std::process` will be stabilized later.
9285 * On Unix, [`std::os::unix::symlink`] creates symlinks. On
9286   Windows, symlinks can be created with
9287   `std::os::windows::symlink_dir` and
9288   `std::os::windows::symlink_file`.
9289 * The `mpsc::Receiver` type can now be converted into an iterator with
9290   `into_iter` on the [`IntoIterator`] trait.
9291 * `Ipv4Addr` can be created from `u32` with the `From<u32>`
9292   implementation of the [`From`] trait.
9293 * The `Debug` implementation for `RangeFull` [creates output that is
9294   more consistent with other implementations][rf].
9295 * [`Debug` is implemented for `File`][file].
9296 * The `Default` implementation for `Arc` [no longer requires `Sync +
9297   Send`][arc].
9298 * [The `Iterator` methods `count`, `nth`, and `last` have been
9299   overridden for slices to have *O*(1) performance instead of *O*(*n*)][si].
9300 * Incorrect handling of paths on Windows has been improved in both the
9301   compiler and the standard library.
9302 * [`AtomicPtr` gained a `Default` implementation][ap].
9303 * In accordance with Rust's policy on arithmetic overflow `abs` now
9304   [panics on overflow when debug assertions are enabled][abs].
9305 * The [`Cloned`] iterator, which was accidentally left unstable for
9306   1.0 [has been stabilized][c].
9307 * The [`Incoming`] iterator, which iterates over incoming TCP
9308   connections, and which was accidentally unnamable in 1.0, [is now
9309   properly exported][inc].
9310 * [`BinaryHeap`] no longer corrupts itself [when functions called by
9311   `sift_up` or `sift_down` panic][bh].
9312 * The [`split_off`] method of `LinkedList` [no longer corrupts
9313   the list in certain scenarios][ll].
9314
9315 Misc
9316 ----
9317
9318 * Type checking performance [has improved notably][sk] with
9319   [multiple improvements][pre].
9320 * The compiler [suggests code changes][ch] for more errors.
9321 * rustc and it's build system have experimental support for [building
9322   toolchains against MUSL][m] instead of glibc on Linux.
9323 * The compiler defines the `target_env` cfg value, which is used for
9324   distinguishing toolchains that are otherwise for the same
9325   platform. Presently this is set to `gnu` for common GNU Linux
9326   targets and for MinGW targets, and `musl` for MUSL Linux targets.
9327 * The [`cargo rustc`][crc] command invokes a build with custom flags
9328   to rustc.
9329 * [Android executables are always position independent][pie].
9330 * [The `drop_with_repr_extern` lint warns about mixing `repr(C)`
9331   with `Drop`][drop].
9332
9333 [`str::split_whitespace`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_whitespace
9334 [`FromRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.FromRawFd.html
9335 [`AsRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.AsRawFd.html
9336 [`std::os::unix::symlink`]: https://doc.rust-lang.org/nightly/std/os/unix/fs/fn.symlink.html
9337 [`IntoIterator`]: https://doc.rust-lang.org/nightly/std/iter/trait.IntoIterator.html
9338 [`From`]: https://doc.rust-lang.org/nightly/std/convert/trait.From.html
9339 [rf]: https://github.com/rust-lang/rust/pull/24491
9340 [err-index]: https://doc.rust-lang.org/error-index.html
9341 [sk]: https://github.com/rust-lang/rust/pull/24615
9342 [pre]: https://github.com/rust-lang/rust/pull/25323
9343 [file]: https://github.com/rust-lang/rust/pull/24598
9344 [ch]: https://github.com/rust-lang/rust/pull/24683
9345 [arc]: https://github.com/rust-lang/rust/pull/24695
9346 [si]: https://github.com/rust-lang/rust/pull/24701
9347 [ap]: https://github.com/rust-lang/rust/pull/24834
9348 [m]: https://github.com/rust-lang/rust/pull/24777
9349 [fs]: https://github.com/rust-lang/rfcs/blob/master/text/1044-io-fs-2.1.md
9350 [crc]: https://github.com/rust-lang/cargo/pull/1568
9351 [pie]: https://github.com/rust-lang/rust/pull/24953
9352 [abs]: https://github.com/rust-lang/rust/pull/25441
9353 [c]: https://github.com/rust-lang/rust/pull/25496
9354 [`Cloned`]: https://doc.rust-lang.org/nightly/std/iter/struct.Cloned.html
9355 [`Incoming`]: https://doc.rust-lang.org/nightly/std/net/struct.Incoming.html
9356 [inc]: https://github.com/rust-lang/rust/pull/25522
9357 [bh]: https://github.com/rust-lang/rust/pull/25856
9358 [`BinaryHeap`]: https://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html
9359 [ll]: https://github.com/rust-lang/rust/pull/26022
9360 [`split_off`]: https://doc.rust-lang.org/nightly/collections/linked_list/struct.LinkedList.html#method.split_off
9361 [drop]: https://github.com/rust-lang/rust/pull/24935
9362
9363 Version 1.0.0 (2015-05-15)
9364 ========================
9365
9366 * ~1500 changes, numerous bugfixes
9367
9368 Highlights
9369 ----------
9370
9371 * The vast majority of the standard library is now `#[stable]`. It is
9372   no longer possible to use unstable features with a stable build of
9373   the compiler.
9374 * Many popular crates on [crates.io] now work on the stable release
9375   channel.
9376 * Arithmetic on basic integer types now [checks for overflow in debug
9377   builds][overflow].
9378
9379 Language
9380 --------
9381
9382 * Several [restrictions have been added to trait coherence][coh] in
9383   order to make it easier for upstream authors to change traits
9384   without breaking downstream code.
9385 * Digits of binary and octal literals are [lexed more eagerly][lex] to
9386   improve error messages and macro behavior. For example, `0b1234` is
9387   now lexed as `0b1234` instead of two tokens, `0b1` and `234`.
9388 * Trait bounds [are always invariant][inv], eliminating the need for
9389   the `PhantomFn` and `MarkerTrait` lang items, which have been
9390   removed.
9391 * ["-" is no longer a valid character in crate names][cr], the `extern crate
9392   "foo" as bar` syntax has been replaced with `extern crate foo as
9393   bar`, and Cargo now automatically translates "-" in *package* names
9394   to underscore for the crate name.
9395 * [Lifetime shadowing is an error][lt].
9396 * [`Send` no longer implies `'static`][send-rfc].
9397 * [UFCS now supports trait-less associated paths][moar-ufcs] like
9398   `MyType::default()`.
9399 * Primitive types [now have inherent methods][prim-inherent],
9400   obviating the need for extension traits like `SliceExt`.
9401 * Methods with `Self: Sized` in their `where` clause are [considered
9402   object-safe][self-sized], allowing many extension traits like
9403   `IteratorExt` to be merged into the traits they extended.
9404 * You can now [refer to associated types][assoc-where] whose
9405   corresponding trait bounds appear only in a `where` clause.
9406 * The final bits of [OIBIT landed][oibit-final], meaning that traits
9407   like `Send` and `Sync` are now library-defined.
9408 * A [Reflect trait][reflect] was introduced, which means that
9409   downcasting via the `Any` trait is effectively limited to concrete
9410   types. This helps retain the potentially-important "parametricity"
9411   property: generic code cannot behave differently for different type
9412   arguments except in minor ways.
9413 * The `unsafe_destructor` feature is now deprecated in favor of the
9414   [new `dropck`][dropck]. This change is a major reduction in unsafe
9415   code.
9416
9417 Libraries
9418 ---------
9419
9420 * The `thread_local` module [has been renamed to `std::thread`][th].
9421 * The methods of `IteratorExt` [have been moved to the `Iterator`
9422   trait itself][ie].
9423 * Several traits that implement Rust's conventions for type
9424   conversions, `AsMut`, `AsRef`, `From`, and `Into` have been
9425   [centralized in the `std::convert` module][con].
9426 * The `FromError` trait [was removed in favor of `From`][fe].
9427 * The basic sleep function [has moved to
9428   `std::thread::sleep_ms`][slp].
9429 * The `splitn` function now takes an `n` parameter that represents the
9430   number of items yielded by the returned iterator [instead of the
9431   number of 'splits'][spl].
9432 * [On Unix, all file descriptors are `CLOEXEC` by default][clo].
9433 * [Derived implementations of `PartialOrd` now order enums according
9434   to their explicitly-assigned discriminants][po].
9435 * [Methods for searching strings are generic over `Pattern`s][pat],
9436   implemented presently by `&char`, `&str`, `FnMut(char) -> bool` and
9437   some others.
9438 * [In method resolution, object methods are resolved before inherent
9439   methods][meth].
9440 * [`String::from_str` has been deprecated in favor of the `From` impl,
9441   `String::from`][sf].
9442 * [`io::Error` implements `Sync`][ios].
9443 * [The `words` method on `&str` has been replaced with
9444   `split_whitespace`][sw], to avoid answering the tricky question, 'what is
9445   a word?'
9446 * The new path and IO modules are complete and `#[stable]`. This
9447   was the major library focus for this cycle.
9448 * The path API was [revised][path-normalize] to normalize `.`,
9449   adjusting the tradeoffs in favor of the most common usage.
9450 * A large number of remaining APIs in `std` were also stabilized
9451   during this cycle; about 75% of the non-deprecated API surface
9452   is now stable.
9453 * The new [string pattern API][string-pattern] landed, which makes
9454   the string slice API much more internally consistent and flexible.
9455 * A new set of [generic conversion traits][conversion] replaced
9456   many existing ad hoc traits.
9457 * Generic numeric traits were [completely removed][num-traits]. This
9458   was made possible thanks to inherent methods for primitive types,
9459   and the removal gives maximal flexibility for designing a numeric
9460   hierarchy in the future.
9461 * The `Fn` traits are now related via [inheritance][fn-inherit]
9462   and provide ergonomic [blanket implementations][fn-blanket].
9463 * The `Index` and `IndexMut` traits were changed to
9464   [take the index by value][index-value], enabling code like
9465   `hash_map["string"]` to work.
9466 * `Copy` now [inherits][copy-clone] from `Clone`, meaning that all
9467   `Copy` data is known to be `Clone` as well.
9468
9469 Misc
9470 ----
9471
9472 * Many errors now have extended explanations that can be accessed with
9473   the `--explain` flag to `rustc`.
9474 * Many new examples have been added to the standard library
9475   documentation.
9476 * rustdoc has received a number of improvements focused on completion
9477   and polish.
9478 * Metadata was tuned, shrinking binaries [by 27%][metadata-shrink].
9479 * Much headway was made on ecosystem-wide CI, making it possible
9480   to [compare builds for breakage][ci-compare].
9481
9482
9483 [crates.io]: http://crates.io
9484 [clo]: https://github.com/rust-lang/rust/pull/24034
9485 [coh]: https://github.com/rust-lang/rfcs/blob/master/text/1023-rebalancing-coherence.md
9486 [con]: https://github.com/rust-lang/rust/pull/23875
9487 [cr]: https://github.com/rust-lang/rust/pull/23419
9488 [fe]: https://github.com/rust-lang/rust/pull/23879
9489 [ie]: https://github.com/rust-lang/rust/pull/23300
9490 [inv]: https://github.com/rust-lang/rust/pull/23938
9491 [ios]: https://github.com/rust-lang/rust/pull/24133
9492 [lex]: https://github.com/rust-lang/rfcs/blob/master/text/0879-small-base-lexing.md
9493 [lt]: https://github.com/rust-lang/rust/pull/24057
9494 [meth]: https://github.com/rust-lang/rust/pull/24056
9495 [pat]: https://github.com/rust-lang/rfcs/blob/master/text/0528-string-patterns.md
9496 [po]: https://github.com/rust-lang/rust/pull/24270
9497 [sf]: https://github.com/rust-lang/rust/pull/24517
9498 [slp]: https://github.com/rust-lang/rust/pull/23949
9499 [spl]: https://github.com/rust-lang/rfcs/blob/master/text/0979-align-splitn-with-other-languages.md
9500 [sw]: https://github.com/rust-lang/rfcs/blob/master/text/1054-str-words.md
9501 [th]: https://github.com/rust-lang/rfcs/blob/master/text/0909-move-thread-local-to-std-thread.md
9502 [send-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0458-send-improvements.md
9503 [moar-ufcs]: https://github.com/rust-lang/rust/pull/22172
9504 [prim-inherent]: https://github.com/rust-lang/rust/pull/23104
9505 [overflow]: https://github.com/rust-lang/rfcs/blob/master/text/0560-integer-overflow.md
9506 [metadata-shrink]: https://github.com/rust-lang/rust/pull/22971
9507 [self-sized]: https://github.com/rust-lang/rust/pull/22301
9508 [assoc-where]: https://github.com/rust-lang/rust/pull/22512
9509 [string-pattern]: https://github.com/rust-lang/rust/pull/22466
9510 [oibit-final]: https://github.com/rust-lang/rust/pull/21689
9511 [reflect]: https://github.com/rust-lang/rust/pull/23712
9512 [conversion]: https://github.com/rust-lang/rfcs/pull/529
9513 [num-traits]: https://github.com/rust-lang/rust/pull/23549
9514 [index-value]: https://github.com/rust-lang/rust/pull/23601
9515 [dropck]: https://github.com/rust-lang/rfcs/pull/769
9516 [ci-compare]: https://gist.github.com/brson/a30a77836fbec057cbee
9517 [fn-inherit]: https://github.com/rust-lang/rust/pull/23282
9518 [fn-blanket]: https://github.com/rust-lang/rust/pull/23895
9519 [copy-clone]: https://github.com/rust-lang/rust/pull/23860
9520 [path-normalize]: https://github.com/rust-lang/rust/pull/23229
9521
9522
9523 Version 1.0.0-alpha.2 (2015-02-20)
9524 =====================================
9525
9526 * ~1300 changes, numerous bugfixes
9527
9528 * Highlights
9529
9530     * The various I/O modules were [overhauled][io-rfc] to reduce
9531       unnecessary abstractions and provide better interoperation with
9532       the underlying platform. The old `io` module remains temporarily
9533       at `std::old_io`.
9534     * The standard library now [participates in feature gating][feat],
9535       so use of unstable libraries now requires a `#![feature(...)]`
9536       attribute. The impact of this change is [described on the
9537       forum][feat-forum]. [RFC][feat-rfc].
9538
9539 * Language
9540
9541     * `for` loops [now operate on the `IntoIterator` trait][into],
9542       which eliminates the need to call `.iter()`, etc. to iterate
9543       over collections. There are some new subtleties to remember
9544       though regarding what sort of iterators various types yield, in
9545       particular that `for foo in bar { }` yields values from a move
9546       iterator, destroying the original collection. [RFC][into-rfc].
9547     * Objects now have [default lifetime bounds][obj], so you don't
9548       have to write `Box<Trait+'static>` when you don't care about
9549       storing references. [RFC][obj-rfc].
9550     * In types that implement `Drop`, [lifetimes must outlive the
9551       value][drop]. This will soon make it possible to safely
9552       implement `Drop` for types where `#[unsafe_destructor]` is now
9553       required. Read the [gorgeous RFC][drop-rfc] for details.
9554     * The fully qualified <T as Trait>::X syntax lets you set the Self
9555       type for a trait method or associated type. [RFC][ufcs-rfc].
9556     * References to types that implement `Deref<U>` now [automatically
9557       coerce to references][deref] to the dereferenced type `U`,
9558       e.g. `&T where T: Deref<U>` automatically coerces to `&U`. This
9559       should eliminate many unsightly uses of `&*`, as when converting
9560       from references to vectors into references to
9561       slices. [RFC][deref-rfc].
9562     * The explicit [closure kind syntax][close] (`|&:|`, `|&mut:|`,
9563       `|:|`) is obsolete and closure kind is inferred from context.
9564     * [`Self` is a keyword][Self].
9565
9566 * Libraries
9567
9568     * The `Show` and `String` formatting traits [have been
9569       renamed][fmt] to `Debug` and `Display` to more clearly reflect
9570       their related purposes. Automatically getting a string
9571       conversion to use with `format!("{:?}", something_to_debug)` is
9572       now written `#[derive(Debug)]`.
9573     * Abstract [OS-specific string types][osstr], `std::ff::{OsString,
9574       OsStr}`, provide strings in platform-specific encodings for easier
9575       interop with system APIs. [RFC][osstr-rfc].
9576     * The `boxed::into_raw` and `Box::from_raw` functions [convert
9577       between `Box<T>` and `*mut T`][boxraw], a common pattern for
9578       creating raw pointers.
9579
9580 * Tooling
9581
9582     * Certain long error messages of the form 'expected foo found bar'
9583       are now [split neatly across multiple
9584       lines][multiline]. Examples in the PR.
9585     * On Unix Rust can be [uninstalled][un] by running
9586       `/usr/local/lib/rustlib/uninstall.sh`.
9587     * The `#[rustc_on_unimplemented]` attribute, requiring the
9588       'on_unimplemented' feature, lets rustc [display custom error
9589       messages when a trait is expected to be implemented for a type
9590       but is not][onun].
9591
9592 * Misc
9593
9594     * Rust is tested against a [LALR grammar][lalr], which parses
9595       almost all the Rust files that rustc does.
9596
9597 [boxraw]: https://github.com/rust-lang/rust/pull/21318
9598 [close]: https://github.com/rust-lang/rust/pull/21843
9599 [deref]: https://github.com/rust-lang/rust/pull/21351
9600 [deref-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0241-deref-conversions.md
9601 [drop]: https://github.com/rust-lang/rust/pull/21972
9602 [drop-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0769-sound-generic-drop.md
9603 [feat]: https://github.com/rust-lang/rust/pull/21248
9604 [feat-forum]: https://users.rust-lang.org/t/psa-important-info-about-rustcs-new-feature-staging/82/5
9605 [feat-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0507-release-channels.md
9606 [fmt]: https://github.com/rust-lang/rust/pull/21457
9607 [into]: https://github.com/rust-lang/rust/pull/20790
9608 [into-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0235-collections-conventions.md#intoiterator-and-iterable
9609 [io-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0517-io-os-reform.md
9610 [lalr]: https://github.com/rust-lang/rust/pull/21452
9611 [multiline]: https://github.com/rust-lang/rust/pull/19870
9612 [obj]: https://github.com/rust-lang/rust/pull/22230
9613 [obj-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0599-default-object-bound.md
9614 [onun]: https://github.com/rust-lang/rust/pull/20889
9615 [osstr]: https://github.com/rust-lang/rust/pull/21488
9616 [osstr-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0517-io-os-reform.md
9617 [Self]: https://github.com/rust-lang/rust/pull/22158
9618 [ufcs-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0132-ufcs.md
9619 [un]: https://github.com/rust-lang/rust/pull/22256
9620
9621
9622 Version 1.0.0-alpha (2015-01-09)
9623 ==================================
9624
9625   * ~2400 changes, numerous bugfixes
9626
9627   * Highlights
9628
9629     * The language itself is considered feature complete for 1.0,
9630       though there will be many usability improvements and bugfixes
9631       before the final release.
9632     * Nearly 50% of the public API surface of the standard library has
9633       been declared 'stable'. Those interfaces are unlikely to change
9634       before 1.0.
9635     * The long-running debate over integer types has been
9636       [settled][ints]: Rust will ship with types named `isize` and
9637       `usize`, rather than `int` and `uint`, for pointer-sized
9638       integers. Guidelines will be rolled out during the alpha cycle.
9639     * Most crates that are not `std` have been moved out of the Rust
9640       distribution into the Cargo ecosystem so they can evolve
9641       separately and don't need to be stabilized as quickly, including
9642       'time', 'getopts', 'num', 'regex', and 'term'.
9643     * Documentation continues to be expanded with more API coverage, more
9644       examples, and more in-depth explanations. The guides have been
9645       consolidated into [The Rust Programming Language][trpl].
9646     * "[Rust By Example][rbe]" is now maintained by the Rust team.
9647     * All official Rust binary installers now come with [Cargo], the
9648       Rust package manager.
9649
9650 * Language
9651
9652     * Closures have been [completely redesigned][unboxed] to be
9653       implemented in terms of traits, can now be used as generic type
9654       bounds and thus monomorphized and inlined, or via an opaque
9655       pointer (boxed) as in the old system. The new system is often
9656       referred to as 'unboxed' closures.
9657     * Traits now support [associated types][assoc], allowing families
9658       of related types to be defined together and used generically in
9659       powerful ways.
9660     * Enum variants are [namespaced by their type names][enum].
9661     * [`where` clauses][where] provide a more versatile and attractive
9662       syntax for specifying generic bounds, though the previous syntax
9663       remains valid.
9664     * Rust again picks a [fallback][fb] (either i32 or f64) for uninferred
9665       numeric types.
9666     * Rust [no longer has a runtime][rt] of any description, and only
9667       supports OS threads, not green threads.
9668     * At long last, Rust has been overhauled for 'dynamically-sized
9669       types' ([DST]), which integrates 'fat pointers' (object types,
9670       arrays, and `str`) more deeply into the type system, making it
9671       more consistent.
9672     * Rust now has a general [range syntax][range], `i..j`, `i..`, and
9673       `..j` that produce range types and which, when combined with the
9674       `Index` operator and multidispatch, leads to a convenient slice
9675       notation, `[i..j]`.
9676     * The new range syntax revealed an ambiguity in the fixed-length
9677       array syntax, so now fixed length arrays [are written `[T;
9678       N]`][arrays].
9679     * The `Copy` trait is no longer implemented automatically. Unsafe
9680       pointers no longer implement `Sync` and `Send` so types
9681       containing them don't automatically either. `Sync` and `Send`
9682       are now 'unsafe traits' so one can "forcibly" implement them via
9683       `unsafe impl` if a type confirms to the requirements for them
9684       even though the internals do not (e.g. structs containing unsafe
9685       pointers like `Arc`). These changes are intended to prevent some
9686       footguns and are collectively known as [opt-in built-in
9687       traits][oibit] (though `Sync` and `Send` will soon become pure
9688       library types unknown to the compiler).
9689     * Operator traits now take their operands [by value][ops], and
9690       comparison traits can use multidispatch to compare one type
9691       against multiple other types, allowing e.g. `String` to be
9692       compared with `&str`.
9693     * `if let` and `while let` are no longer feature-gated.
9694     * Rust has adopted a more [uniform syntax for escaping unicode
9695       characters][unicode].
9696     * `macro_rules!` [has been declared stable][mac]. Though it is a
9697       flawed system it is sufficiently popular that it must be usable
9698       for 1.0. Effort has gone into [future-proofing][mac-future] it
9699       in ways that will allow other macro systems to be developed in
9700       parallel, and won't otherwise impact the evolution of the
9701       language.
9702     * The prelude has been [pared back significantly][prelude] such
9703       that it is the minimum necessary to support the most pervasive
9704       code patterns, and through [generalized where clauses][where]
9705       many of the prelude extension traits have been consolidated.
9706     * Rust's rudimentary reflection [has been removed][refl], as it
9707       incurred too much code generation for little benefit.
9708     * [Struct variants][structvars] are no longer feature-gated.
9709     * Trait bounds can be [polymorphic over lifetimes][hrtb]. Also
9710       known as 'higher-ranked trait bounds', this crucially allows
9711       unboxed closures to work.
9712     * Macros invocations surrounded by parens or square brackets and
9713       not terminated by a semicolon are [parsed as
9714       expressions][macros], which makes expressions like `vec![1i32,
9715       2, 3].len()` work as expected.
9716     * Trait objects now implement their traits automatically, and
9717       traits that can be coerced to objects now must be [object
9718       safe][objsafe].
9719     * Automatically deriving traits is now done with `#[derive(...)]`
9720       not `#[deriving(...)]` for [consistency with other naming
9721       conventions][derive].
9722     * Importing the containing module or enum at the same time as
9723       items or variants they contain is [now done with `self` instead
9724       of `mod`][self], as in use `foo::{self, bar}`
9725     * Glob imports are no longer feature-gated.
9726     * The `box` operator and `box` patterns have been feature-gated
9727       pending a redesign. For now unique boxes should be allocated
9728       like other containers, with `Box::new`.
9729
9730 * Libraries
9731
9732     * A [series][coll1] of [efforts][coll2] to establish
9733       [conventions][coll3] for collections types has resulted in API
9734       improvements throughout the standard library.
9735     * New [APIs for error handling][err] provide ergonomic interop
9736       between error types, and [new conventions][err-conv] describe
9737       more clearly the recommended error handling strategies in Rust.
9738     * The `fail!` macro has been renamed to [`panic!`][panic] so that
9739       it is easier to discuss failure in the context of error handling
9740       without making clarifications as to whether you are referring to
9741       the 'fail' macro or failure more generally.
9742     * On Linux, `OsRng` prefers the new, more reliable `getrandom`
9743       syscall when available.
9744     * The 'serialize' crate has been renamed 'rustc-serialize' and
9745       moved out of the distribution to Cargo. Although it is widely
9746       used now, it is expected to be superseded in the near future.
9747     * The `Show` formatter, typically implemented with
9748       `#[derive(Show)]` is [now requested with the `{:?}`
9749       specifier][show] and is intended for use by all types, for uses
9750       such as `println!` debugging. The new `String` formatter must be
9751       implemented by hand, uses the `{}` specifier, and is intended
9752       for full-fidelity conversions of things that can logically be
9753       represented as strings.
9754
9755 * Tooling
9756
9757     * [Flexible target specification][flex] allows rustc's code
9758       generation to be configured to support otherwise-unsupported
9759       platforms.
9760     * Rust comes with rust-gdb and rust-lldb scripts that launch their
9761       respective debuggers with Rust-appropriate pretty-printing.
9762     * The Windows installation of Rust is distributed with the
9763       MinGW components currently required to link binaries on that
9764       platform.
9765
9766 * Misc
9767
9768     * Nullable enum optimizations have been extended to more types so
9769       that e.g. `Option<Vec<T>>` and `Option<String>` take up no more
9770       space than the inner types themselves.
9771     * Work has begun on supporting AArch64.
9772
9773 [Cargo]: https://crates.io
9774 [unboxed]: http://smallcultfollowing.com/babysteps/blog/2014/11/26/purging-proc/
9775 [enum]: https://github.com/rust-lang/rfcs/blob/master/text/0390-enum-namespacing.md
9776 [flex]: https://github.com/rust-lang/rfcs/blob/master/text/0131-target-specification.md
9777 [err]: https://github.com/rust-lang/rfcs/blob/master/text/0201-error-chaining.md
9778 [err-conv]: https://github.com/rust-lang/rfcs/blob/master/text/0236-error-conventions.md
9779 [rt]: https://github.com/rust-lang/rfcs/blob/master/text/0230-remove-runtime.md
9780 [mac]: https://github.com/rust-lang/rfcs/blob/master/text/0453-macro-reform.md
9781 [mac-future]: https://github.com/rust-lang/rfcs/pull/550
9782 [DST]: http://smallcultfollowing.com/babysteps/blog/2014/01/05/dst-take-5/
9783 [coll1]: https://github.com/rust-lang/rfcs/blob/master/text/0235-collections-conventions.md
9784 [coll2]: https://github.com/rust-lang/rfcs/blob/master/text/0509-collections-reform-part-2.md
9785 [coll3]: https://github.com/rust-lang/rfcs/blob/master/text/0216-collection-views.md
9786 [ops]: https://github.com/rust-lang/rfcs/blob/master/text/0439-cmp-ops-reform.md
9787 [prelude]: https://github.com/rust-lang/rfcs/blob/master/text/0503-prelude-stabilization.md
9788 [where]: https://github.com/rust-lang/rfcs/blob/master/text/0135-where.md
9789 [refl]: https://github.com/rust-lang/rfcs/blob/master/text/0379-remove-reflection.md
9790 [panic]: https://github.com/rust-lang/rfcs/blob/master/text/0221-panic.md
9791 [structvars]: https://github.com/rust-lang/rfcs/blob/master/text/0418-struct-variants.md
9792 [hrtb]: https://github.com/rust-lang/rfcs/blob/master/text/0387-higher-ranked-trait-bounds.md
9793 [unicode]: https://github.com/rust-lang/rfcs/blob/master/text/0446-es6-unicode-escapes.md
9794 [oibit]: https://github.com/rust-lang/rfcs/blob/master/text/0019-opt-in-builtin-traits.md
9795 [macros]: https://github.com/rust-lang/rfcs/blob/master/text/0378-expr-macros.md
9796 [range]: https://github.com/rust-lang/rfcs/blob/master/text/0439-cmp-ops-reform.md#indexing-and-slicing
9797 [arrays]: https://github.com/rust-lang/rfcs/blob/master/text/0520-new-array-repeat-syntax.md
9798 [show]: https://github.com/rust-lang/rfcs/blob/master/text/0504-show-stabilization.md
9799 [derive]: https://github.com/rust-lang/rfcs/blob/master/text/0534-deriving2derive.md
9800 [self]: https://github.com/rust-lang/rfcs/blob/master/text/0532-self-in-use.md
9801 [fb]: https://github.com/rust-lang/rfcs/blob/master/text/0212-restore-int-fallback.md
9802 [objsafe]: https://github.com/rust-lang/rfcs/blob/master/text/0255-object-safety.md
9803 [assoc]: https://github.com/rust-lang/rfcs/blob/master/text/0195-associated-items.md
9804 [ints]: https://github.com/rust-lang/rfcs/pull/544#issuecomment-68760871
9805 [trpl]: https://doc.rust-lang.org/book/index.html
9806 [rbe]: http://rustbyexample.com/
9807
9808
9809 Version 0.12.0 (2014-10-09)
9810 =============================
9811
9812   * ~1900 changes, numerous bugfixes
9813
9814   * Highlights
9815
9816     * The introductory documentation (now called The Rust Guide) has
9817       been completely rewritten, as have a number of supplementary
9818       guides.
9819     * Rust's package manager, Cargo, continues to improve and is
9820       sometimes considered to be quite awesome.
9821     * Many API's in `std` have been reviewed and updated for
9822       consistency with the in-development Rust coding
9823       guidelines. The standard library documentation tracks
9824       stabilization progress.
9825     * Minor libraries have been moved out-of-tree to the rust-lang org
9826       on GitHub: uuid, semver, glob, num, hexfloat, fourcc. They can
9827       be installed with Cargo.
9828     * Lifetime elision allows lifetime annotations to be left off of
9829       function declarations in many common scenarios.
9830     * Rust now works on 64-bit Windows.
9831
9832   * Language
9833     * Indexing can be overloaded with the `Index` and `IndexMut`
9834       traits.
9835     * The `if let` construct takes a branch only if the `let` pattern
9836       matches, currently behind the 'if_let' feature gate.
9837     * 'where clauses', a more flexible syntax for specifying trait
9838       bounds that is more aesthetic, have been added for traits and
9839       free functions. Where clauses will in the future make it
9840       possible to constrain associated types, which would be
9841       impossible with the existing syntax.
9842     * A new slicing syntax (e.g. `[0..4]`) has been introduced behind
9843       the 'slicing_syntax' feature gate, and can be overloaded with
9844       the `Slice` or `SliceMut` traits.
9845     * The syntax for matching of sub-slices has been changed to use a
9846       postfix `..` instead of prefix (.e.g. `[a, b, c..]`), for
9847       consistency with other uses of `..` and to future-proof
9848       potential additional uses of the syntax.
9849     * The syntax for matching inclusive ranges in patterns has changed
9850       from `0..3` to `0...4` to be consistent with the exclusive range
9851       syntax for slicing.
9852     * Matching of sub-slices in non-tail positions (e.g.  `[a.., b,
9853       c]`) has been put behind the 'advanced_slice_patterns' feature
9854       gate and may be removed in the future.
9855     * Components of tuples and tuple structs can be extracted using
9856       the `value.0` syntax, currently behind the `tuple_indexing`
9857       feature gate.
9858     * The `#[crate_id]` attribute is no longer supported; versioning
9859       is handled by the package manager.
9860     * Renaming crate imports are now written `extern crate foo as bar`
9861       instead of `extern crate bar = foo`.
9862     * Renaming use statements are now written `use foo as bar` instead
9863       of `use bar = foo`.
9864     * `let` and `match` bindings and argument names in macros are now
9865       hygienic.
9866     * The new, more efficient, closure types ('unboxed closures') have
9867       been added under a feature gate, 'unboxed_closures'. These will
9868       soon replace the existing closure types, once higher-ranked
9869       trait lifetimes are added to the language.
9870     * `move` has been added as a keyword, for indicating closures
9871       that capture by value.
9872     * Mutation and assignment is no longer allowed in pattern guards.
9873     * Generic structs and enums can now have trait bounds.
9874     * The `Share` trait is now called `Sync` to free up the term
9875       'shared' to refer to 'shared reference' (the default reference
9876       type.
9877     * Dynamically-sized types have been mostly implemented,
9878       unifying the behavior of fat-pointer types with the rest of the
9879       type system.
9880     * As part of dynamically-sized types, the `Sized` trait has been
9881       introduced, which qualifying types implement by default, and
9882       which type parameters expect by default. To specify that a type
9883       parameter does not need to be sized, write `<Sized? T>`. Most
9884       types are `Sized`, notable exceptions being unsized arrays
9885       (`[T]`) and trait types.
9886     * Closures can return `!`, as in `|| -> !` or `proc() -> !`.
9887     * Lifetime bounds can now be applied to type parameters and object
9888       types.
9889     * The old, reference counted GC type, `Gc<T>` which was once
9890       denoted by the `@` sigil, has finally been removed. GC will be
9891       revisited in the future.
9892
9893   * Libraries
9894     * Library documentation has been improved for a number of modules.
9895     * Bit-vectors, collections::bitv has been modernized.
9896     * The url crate is deprecated in favor of
9897       http://github.com/servo/rust-url, which can be installed with
9898       Cargo.
9899     * Most I/O stream types can be cloned and subsequently closed from
9900       a different thread.
9901     * A `std::time::Duration` type has been added for use in I/O
9902       methods that rely on timers, as well as in the 'time' crate's
9903       `Timespec` arithmetic.
9904     * The runtime I/O abstraction layer that enabled the green thread
9905       scheduler to do non-thread-blocking I/O has been removed, along
9906       with the libuv-based implementation employed by the green thread
9907       scheduler. This will greatly simplify the future I/O work.
9908     * `collections::btree` has been rewritten to have a more
9909       idiomatic and efficient design.
9910
9911   * Tooling
9912     * rustdoc output now indicates the stability levels of API's.
9913     * The `--crate-name` flag can specify the name of the crate
9914       being compiled, like `#[crate_name]`.
9915     * The `-C metadata` specifies additional metadata to hash into
9916       symbol names, and `-C extra-filename` specifies additional
9917       information to put into the output filename, for use by the
9918       package manager for versioning.
9919     * debug info generation has continued to improve and should be
9920       more reliable under both gdb and lldb.
9921     * rustc has experimental support for compiling in parallel
9922       using the `-C codegen-units` flag.
9923     * rustc no longer encodes rpath information into binaries by
9924       default.
9925
9926   * Misc
9927     * Stack usage has been optimized with LLVM lifetime annotations.
9928     * Official Rust binaries on Linux are more compatible with older
9929       kernels and distributions, built on CentOS 5.10.
9930
9931
9932 Version 0.11.0 (2014-07-02)
9933 ==========================
9934
9935   * ~1700 changes, numerous bugfixes
9936
9937   * Language
9938     * ~[T] has been removed from the language. This type is superseded by
9939       the Vec<T> type.
9940     * ~str has been removed from the language. This type is superseded by
9941       the String type.
9942     * ~T has been removed from the language. This type is superseded by the
9943       Box<T> type.
9944     * @T has been removed from the language. This type is superseded by the
9945       standard library's std::gc::Gc<T> type.
9946     * Struct fields are now all private by default.
9947     * Vector indices and shift amounts are both required to be a `uint`
9948       instead of any integral type.
9949     * Byte character, byte string, and raw byte string literals are now all
9950       supported by prefixing the normal literal with a `b`.
9951     * Multiple ABIs are no longer allowed in an ABI string
9952     * The syntax for lifetimes on closures/procedures has been tweaked
9953       slightly: `<'a>|A, B|: 'b + K -> T`
9954     * Floating point modulus has been removed from the language; however it
9955       is still provided by a library implementation.
9956     * Private enum variants are now disallowed.
9957     * The `priv` keyword has been removed from the language.
9958     * A closure can no longer be invoked through a &-pointer.
9959     * The `use foo, bar, baz;` syntax has been removed from the language.
9960     * The transmute intrinsic no longer works on type parameters.
9961     * Statics now allow blocks/items in their definition.
9962     * Trait bounds are separated from objects with + instead of : now.
9963     * Objects can no longer be read while they are mutably borrowed.
9964     * The address of a static is now marked as insignificant unless the
9965       #[inline(never)] attribute is placed it.
9966     * The #[unsafe_destructor] attribute is now behind a feature gate.
9967     * Struct literals are no longer allowed in ambiguous positions such as
9968       if, while, match, and for..in.
9969     * Declaration of lang items and intrinsics are now feature-gated by
9970       default.
9971     * Integral literals no longer default to `int`, and floating point
9972       literals no longer default to `f64`. Literals must be suffixed with an
9973       appropriate type if inference cannot determine the type of the
9974       literal.
9975     * The Box<T> type is no longer implicitly borrowed to &mut T.
9976     * Procedures are now required to not capture borrowed references.
9977
9978   * Libraries
9979     * The standard library is now a "facade" over a number of underlying
9980       libraries. This means that development on the standard library should
9981       be speedier due to smaller crates, as well as a clearer line between
9982       all dependencies.
9983     * A new library, libcore, lives under the standard library's facade
9984       which is Rust's "0-assumption" library, suitable for embedded and
9985       kernel development for example.
9986     * A regex crate has been added to the standard distribution. This crate
9987       includes statically compiled regular expressions.
9988     * The unwrap/unwrap_err methods on Result require a Show bound for
9989       better error messages.
9990     * The return types of the std::comm primitives have been centralized
9991       around the Result type.
9992     * A number of I/O primitives have gained the ability to time out their
9993       operations.
9994     * A number of I/O primitives have gained the ability to close their
9995       reading/writing halves to cancel pending operations.
9996     * Reverse iterator methods have been removed in favor of `rev()` on
9997       their forward-iteration counterparts.
9998     * A bitflags! macro has been added to enable easy interop with C and
9999       management of bit flags.
10000     * A debug_assert! macro is now provided which is disabled when
10001       `--cfg ndebug` is passed to the compiler.
10002     * A graphviz crate has been added for creating .dot files.
10003     * The std::cast module has been migrated into std::mem.
10004     * The std::local_data api has been migrated from freestanding functions
10005       to being based on methods.
10006     * The Pod trait has been renamed to Copy.
10007     * jemalloc has been added as the default allocator for types.
10008     * The API for allocating memory has been changed to use proper alignment
10009       and sized deallocation
10010     * Connecting a TcpStream or binding a TcpListener is now based on a
10011       string address and a u16 port. This allows connecting to a hostname as
10012       opposed to an IP.
10013     * The Reader trait now contains a core method, read_at_least(), which
10014       correctly handles many repeated 0-length reads.
10015     * The process-spawning API is now centered around a builder-style
10016       Command struct.
10017     * The :? printing qualifier has been moved from the standard library to
10018       an external libdebug crate.
10019     * Eq/Ord have been renamed to PartialEq/PartialOrd. TotalEq/TotalOrd
10020       have been renamed to Eq/Ord.
10021     * The select/plural methods have been removed from format!. The escapes
10022       for { and } have also changed from \{ and \} to {{ and }},
10023       respectively.
10024     * The TaskBuilder API has been re-worked to be a true builder, and
10025       extension traits for spawning native/green tasks have been added.
10026
10027   * Tooling
10028     * All breaking changes to the language or libraries now have their
10029       commit message annotated with `[breaking-change]` to allow for easy
10030       discovery of breaking changes.
10031     * The compiler will now try to suggest how to annotate lifetimes if a
10032       lifetime-related error occurs.
10033     * Debug info continues to be improved greatly with general bug fixes and
10034       better support for situations like link time optimization (LTO).
10035     * Usage of syntax extensions when cross-compiling has been fixed.
10036     * Functionality equivalent to GCC & Clang's -ffunction-sections,
10037       -fdata-sections and --gc-sections has been enabled by default
10038     * The compiler is now stricter about where it will load module files
10039       from when a module is declared via `mod foo;`.
10040     * The #[phase(syntax)] attribute has been renamed to #[phase(plugin)].
10041       Syntax extensions are now discovered via a "plugin registrar" type
10042       which will be extended in the future to other various plugins.
10043     * Lints have been restructured to allow for dynamically loadable lints.
10044     * A number of rustdoc improvements:
10045       * The HTML output has been visually redesigned.
10046       * Markdown is now powered by hoedown instead of sundown.
10047       * Searching heuristics have been greatly improved.
10048       * The search index has been reduced in size by a great amount.
10049       * Cross-crate documentation via `pub use` has been greatly improved.
10050       * Primitive types are now hyperlinked and documented.
10051     * Documentation has been moved from static.rust-lang.org/doc to
10052       doc.rust-lang.org
10053     * A new sandbox, play.rust-lang.org, is available for running and
10054       sharing rust code examples on-line.
10055     * Unused attributes are now more robustly warned about.
10056     * The dead_code lint now warns about unused struct fields.
10057     * Cross-compiling to iOS is now supported.
10058     * Cross-compiling to mipsel is now supported.
10059     * Stability attributes are now inherited by default and no longer apply
10060       to intra-crate usage, only inter-crate usage.
10061     * Error message related to non-exhaustive match expressions have been
10062       greatly improved.
10063
10064
10065 Version 0.10 (2014-04-03)
10066 =========================
10067
10068   * ~1500 changes, numerous bugfixes
10069
10070   * Language
10071     * A new RFC process is now in place for modifying the language.
10072     * Patterns with `@`-pointers have been removed from the language.
10073     * Patterns with unique vectors (`~[T]`) have been removed from the
10074       language.
10075     * Patterns with unique strings (`~str`) have been removed from the
10076       language.
10077     * `@str` has been removed from the language.
10078     * `@[T]` has been removed from the language.
10079     * `@self` has been removed from the language.
10080     * `@Trait` has been removed from the language.
10081     * Headers on `~` allocations which contain `@` boxes inside the type for
10082       reference counting have been removed.
10083     * The semantics around the lifetimes of temporary expressions have changed,
10084       see #3511 and #11585 for more information.
10085     * Cross-crate syntax extensions are now possible, but feature gated. See
10086       #11151 for more information. This includes both `macro_rules!` macros as
10087       well as syntax extensions such as `format!`.
10088     * New lint modes have been added, and older ones have been turned on to be
10089       warn-by-default.
10090       * Unnecessary parentheses
10091       * Uppercase statics
10092       * Camel Case types
10093       * Uppercase variables
10094       * Publicly visible private types
10095       * `#[deriving]` with raw pointers
10096     * Unsafe functions can no longer be coerced to closures.
10097     * Various obscure macros such as `log_syntax!` are now behind feature gates.
10098     * The `#[simd]` attribute is now behind a feature gate.
10099     * Visibility is no longer allowed on `extern crate` statements, and
10100       unnecessary visibility (`priv`) is no longer allowed on `use` statements.
10101     * Trailing commas are now allowed in argument lists and tuple patterns.
10102     * The `do` keyword has been removed, it is now a reserved keyword.
10103     * Default type parameters have been implemented, but are feature gated.
10104     * Borrowed variables through captures in closures are now considered soundly.
10105     * `extern mod` is now `extern crate`
10106     * The `Freeze` trait has been removed.
10107     * The `Share` trait has been added for types that can be shared among
10108       threads.
10109     * Labels in macros are now hygienic.
10110     * Expression/statement macro invocations can be delimited with `{}` now.
10111     * Treatment of types allowed in `static mut` locations has been tweaked.
10112     * The `*` and `.` operators are now overloadable through the `Deref` and
10113       `DerefMut` traits.
10114     * `~Trait` and `proc` no longer have `Send` bounds by default.
10115     * Partial type hints are now supported with the `_` type marker.
10116     * An `Unsafe` type was introduced for interior mutability. It is now
10117       considered undefined to transmute from `&T` to `&mut T` without using the
10118       `Unsafe` type.
10119     * The #[linkage] attribute was implemented for extern statics/functions.
10120     * The inner attribute syntax has changed from `#[foo];` to `#![foo]`.
10121     * `Pod` was renamed to `Copy`.
10122
10123   * Libraries
10124     * The `libextra` library has been removed. It has now been decomposed into
10125       component libraries with smaller and more focused nuggets of
10126       functionality. The full list of libraries can be found on the
10127       documentation index page.
10128     * std: `std::condition` has been removed. All I/O errors are now propagated
10129       through the `Result` type. In order to assist with error handling, a
10130       `try!` macro for unwrapping errors with an early return and a lint for
10131       unused results has been added. See #12039 for more information.
10132     * std: The `vec` module has been renamed to `slice`.
10133     * std: A new vector type, `Vec<T>`, has been added in preparation for DST.
10134       This will become the only growable vector in the future.
10135     * std: `std::io` now has more public re-exports. Types such as `BufferedReader`
10136       are now found at `std::io::BufferedReader` instead of
10137       `std::io::buffered::BufferedReader`.
10138     * std: `print` and `println` are no longer in the prelude, the `print!` and
10139       `println!` macros are intended to be used instead.
10140     * std: `Rc` now has a `Weak` pointer for breaking cycles, and it no longer
10141       attempts to statically prevent cycles.
10142     * std: The standard distribution is adopting the policy of pushing failure
10143       to the user rather than failing in libraries. Many functions (such as
10144       `slice::last()`) now return `Option<T>` instead of `T` + failing.
10145     * std: `fmt::Default` has been renamed to `fmt::Show`, and it now has a new
10146       deriving mode: `#[deriving(Show)]`.
10147     * std: `ToStr` is now implemented for all types implementing `Show`.
10148     * std: The formatting trait methods now take `&self` instead of `&T`
10149     * std: The `invert()` method on iterators has been renamed to `rev()`
10150     * std: `std::num` has seen a reduction in the genericity of its traits,
10151       consolidating functionality into a few core traits.
10152     * std: Backtraces are now printed on task failure if the environment
10153       variable `RUST_BACKTRACE` is present.
10154     * std: Naming conventions for iterators have been standardized. More details
10155       can be found on the wiki's style guide.
10156     * std: `eof()` has been removed from the `Reader` trait. Specific types may
10157       still implement the function.
10158     * std: Networking types are now cloneable to allow simultaneous reads/writes.
10159     * std: `assert_approx_eq!` has been removed
10160     * std: The `e` and `E` formatting specifiers for floats have been added to
10161       print them in exponential notation.
10162     * std: The `Times` trait has been removed
10163     * std: Indications of variance and opting out of builtin bounds is done
10164       through marker types in `std::kinds::marker` now
10165     * std: `hash` has been rewritten, `IterBytes` has been removed, and
10166       `#[deriving(Hash)]` is now possible.
10167     * std: `SharedChan` has been removed, `Sender` is now cloneable.
10168     * std: `Chan` and `Port` were renamed to `Sender` and `Receiver`.
10169     * std: `Chan::new` is now `channel()`.
10170     * std: A new synchronous channel type has been implemented.
10171     * std: A `select!` macro is now provided for selecting over `Receiver`s.
10172     * std: `hashmap` and `trie` have been moved to `libcollections`
10173     * std: `run` has been rolled into `io::process`
10174     * std: `assert_eq!` now uses `{}` instead of `{:?}`
10175     * std: The equality and comparison traits have seen some reorganization.
10176     * std: `rand` has moved to `librand`.
10177     * std: `to_{lower,upper}case` has been implemented for `char`.
10178     * std: Logging has been moved to `liblog`.
10179     * collections: `HashMap` has been rewritten for higher performance and less
10180       memory usage.
10181     * native: The default runtime is now `libnative`. If `libgreen` is desired,
10182       it can be booted manually. The runtime guide has more information and
10183       examples.
10184     * native: All I/O functionality except signals has been implemented.
10185     * green: Task spawning with `libgreen` has been optimized with stack caching
10186       and various trimming of code.
10187     * green: Tasks spawned by `libgreen` now have an unmapped guard page.
10188     * sync: The `extra::sync` module has been updated to modern rust (and moved
10189       to the `sync` library), tweaking and improving various interfaces while
10190       dropping redundant functionality.
10191     * sync: A new `Barrier` type has been added to the `sync` library.
10192     * sync: An efficient mutex for native and green tasks has been implemented.
10193     * serialize: The `base64` module has seen some improvement. It treats
10194       newlines better, has non-string error values, and has seen general
10195       cleanup.
10196     * fourcc: A `fourcc!` macro was introduced
10197     * hexfloat: A `hexfloat!` macro was implemented for specifying floats via a
10198       hexadecimal literal.
10199
10200   * Tooling
10201     * `rustpkg` has been deprecated and removed from the main repository. Its
10202       replacement, `cargo`, is under development.
10203     * Nightly builds of rust are now available
10204     * The memory usage of rustc has been improved many times throughout this
10205       release cycle.
10206     * The build process supports disabling rpath support for the rustc binary
10207       itself.
10208     * Code generation has improved in some cases, giving more information to the
10209       LLVM optimization passes to enable more extensive optimizations.
10210     * Debuginfo compatibility with lldb on OSX has been restored.
10211     * The master branch is now gated on an android bot, making building for
10212       android much more reliable.
10213     * Output flags have been centralized into one `--emit` flag.
10214     * Crate type flags have been centralized into one `--crate-type` flag.
10215     * Codegen flags have been consolidated behind a `-C` flag.
10216     * Linking against outdated crates now has improved error messages.
10217     * Error messages with lifetimes will often suggest how to annotate the
10218       function to fix the error.
10219     * Many more types are documented in the standard library, and new guides
10220       were written.
10221     * Many `rustdoc` improvements:
10222       * code blocks are syntax highlighted.
10223       * render standalone markdown files.
10224       * the --test flag tests all code blocks by default.
10225       * exported macros are displayed.
10226       * re-exported types have their documentation inlined at the location of the
10227         first re-export.
10228       * search works across crates that have been rendered to the same output
10229         directory.
10230
10231
10232 Version 0.9 (2014-01-09)
10233 ==========================
10234
10235    * ~1800 changes, numerous bugfixes
10236
10237    * Language
10238       * The `float` type has been removed. Use `f32` or `f64` instead.
10239       * A new facility for enabling experimental features (feature gating) has
10240         been added, using the crate-level `#[feature(foo)]` attribute.
10241       * Managed boxes (@) are now behind a feature gate
10242         (`#[feature(managed_boxes)]`) in preparation for future removal. Use the
10243         standard library's `Gc` or `Rc` types instead.
10244       * `@mut` has been removed. Use `std::cell::{Cell, RefCell}` instead.
10245       * Jumping back to the top of a loop is now done with `continue` instead of
10246         `loop`.
10247       * Strings can no longer be mutated through index assignment.
10248       * Raw strings can be created via the basic `r"foo"` syntax or with matched
10249         hash delimiters, as in `r###"foo"###`.
10250       * `~fn` is now written `proc (args) -> retval { ... }` and may only be
10251         called once.
10252       * The `&fn` type is now written `|args| -> ret` to match the literal form.
10253       * `@fn`s have been removed.
10254       * `do` only works with procs in order to make it obvious what the cost
10255         of `do` is.
10256       * Single-element tuple-like structs can no longer be dereferenced to
10257         obtain the inner value. A more comprehensive solution for overloading
10258         the dereference operator will be provided in the future.
10259       * The `#[link(...)]` attribute has been replaced with
10260         `#[crate_id = "name#vers"]`.
10261       * Empty `impl`s must be terminated with empty braces and may not be
10262         terminated with a semicolon.
10263       * Keywords are no longer allowed as lifetime names; the `self` lifetime
10264         no longer has any special meaning.
10265       * The old `fmt!` string formatting macro has been removed.
10266       * `printf!` and `printfln!` (old-style formatting) removed in favor of
10267         `print!` and `println!`.
10268       * `mut` works in patterns now, as in `let (mut x, y) = (1, 2);`.
10269       * The `extern mod foo (name = "bar")` syntax has been removed. Use
10270         `extern mod foo = "bar"` instead.
10271       * New reserved keywords: `alignof`, `offsetof`, `sizeof`.
10272       * Macros can have attributes.
10273       * Macros can expand to items with attributes.
10274       * Macros can expand to multiple items.
10275       * The `asm!` macro is feature-gated (`#[feature(asm)]`).
10276       * Comments may be nested.
10277       * Values automatically coerce to trait objects they implement, without
10278         an explicit `as`.
10279       * Enum discriminants are no longer an entire word but as small as needed to
10280         contain all the variants. The `repr` attribute can be used to override
10281         the discriminant size, as in `#[repr(int)]` for integer-sized, and
10282         `#[repr(C)]` to match C enums.
10283       * Non-string literals are not allowed in attributes (they never worked).
10284       * The FFI now supports variadic functions.
10285       * Octal numeric literals, as in `0o7777`.
10286       * The `concat!` syntax extension performs compile-time string concatenation.
10287       * The `#[fixed_stack_segment]` and `#[rust_stack]` attributes have been
10288         removed as Rust no longer uses segmented stacks.
10289       * Non-ascii identifiers are feature-gated (`#[feature(non_ascii_idents)]`).
10290       * Ignoring all fields of an enum variant or tuple-struct is done with `..`,
10291         not `*`; ignoring remaining fields of a struct is also done with `..`,
10292         not `_`; ignoring a slice of a vector is done with `..`, not `.._`.
10293       * `rustc` supports the "win64" calling convention via `extern "win64"`.
10294       * `rustc` supports the "system" calling convention, which defaults to the
10295         preferred convention for the target platform, "stdcall" on 32-bit Windows,
10296         "C" elsewhere.
10297       * The `type_overflow` lint (default: warn) checks literals for overflow.
10298       * The `unsafe_block` lint (default: allow) checks for usage of `unsafe`.
10299       * The `attribute_usage` lint (default: warn) warns about unknown
10300         attributes.
10301       * The `unknown_features` lint (default: warn) warns about unknown
10302         feature gates.
10303       * The `dead_code` lint (default: warn) checks for dead code.
10304       * Rust libraries can be linked statically to one another
10305       * `#[link_args]` is behind the `link_args` feature gate.
10306       * Native libraries are now linked with `#[link(name = "foo")]`
10307       * Native libraries can be statically linked to a rust crate
10308         (`#[link(name = "foo", kind = "static")]`).
10309       * Native OS X frameworks are now officially supported
10310         (`#[link(name = "foo", kind = "framework")]`).
10311       * The `#[thread_local]` attribute creates thread-local (not task-local)
10312         variables. Currently behind the `thread_local` feature gate.
10313       * The `return` keyword may be used in closures.
10314       * Types that can be copied via a memcpy implement the `Pod` kind.
10315       * The `cfg` attribute can now be used on struct fields and enum variants.
10316
10317    * Libraries
10318       * std: The `option` and `result` API's have been overhauled to make them
10319         simpler, more consistent, and more composable.
10320       * std: The entire `std::io` module has been replaced with one that is
10321         more comprehensive and that properly interfaces with the underlying
10322         scheduler. File, TCP, UDP, Unix sockets, pipes, and timers are all
10323         implemented.
10324       * std: `io::util` contains a number of useful implementations of
10325         `Reader` and `Writer`, including `NullReader`, `NullWriter`,
10326         `ZeroReader`, `TeeReader`.
10327       * std: The reference counted pointer type `extra::rc` moved into std.
10328       * std: The `Gc` type in the `gc` module will replace `@` (it is currently
10329         just a wrapper around it).
10330       * std: The `Either` type has been removed.
10331       * std: `fmt::Default` can be implemented for any type to provide default
10332         formatting to the `format!` macro, as in `format!("{}", myfoo)`.
10333       * std: The `rand` API continues to be tweaked.
10334       * std: The `rust_begin_unwind` function, useful for inserting breakpoints
10335         on failure in gdb, is now named `rust_fail`.
10336       * std: The `each_key` and `each_value` methods on `HashMap` have been
10337         replaced by the `keys` and `values` iterators.
10338       * std: Functions dealing with type size and alignment have moved from the
10339         `sys` module to the `mem` module.
10340       * std: The `path` module was written and API changed.
10341       * std: `str::from_utf8` has been changed to cast instead of allocate.
10342       * std: `starts_with` and `ends_with` methods added to vectors via the
10343         `ImmutableEqVector` trait, which is in the prelude.
10344       * std: Vectors can be indexed with the `get_opt` method, which returns `None`
10345         if the index is out of bounds.
10346       * std: Task failure no longer propagates between tasks, as the model was
10347         complex, expensive, and incompatible with thread-based tasks.
10348       * std: The `Any` type can be used for dynamic typing.
10349       * std: `~Any` can be passed to the `fail!` macro and retrieved via
10350         `task::try`.
10351       * std: Methods that produce iterators generally do not have an `_iter`
10352         suffix now.
10353       * std: `cell::Cell` and `cell::RefCell` can be used to introduce mutability
10354         roots (mutable fields, etc.). Use instead of e.g. `@mut`.
10355       * std: `util::ignore` renamed to `prelude::drop`.
10356       * std: Slices have `sort` and `sort_by` methods via the `MutableVector`
10357         trait.
10358       * std: `vec::raw` has seen a lot of cleanup and API changes.
10359       * std: The standard library no longer includes any C++ code, and very
10360         minimal C, eliminating the dependency on libstdc++.
10361       * std: Runtime scheduling and I/O functionality has been factored out into
10362         extensible interfaces and is now implemented by two different crates:
10363         libnative, for native threading and I/O; and libgreen, for green threading
10364         and I/O. This paves the way for using the standard library in more limited
10365         embedded environments.
10366       * std: The `comm` module has been rewritten to be much faster, have a
10367         simpler, more consistent API, and to work for both native and green
10368         threading.
10369       * std: All libuv dependencies have been moved into the rustuv crate.
10370       * native: New implementations of runtime scheduling on top of OS threads.
10371       * native: New native implementations of TCP, UDP, file I/O, process spawning,
10372         and other I/O.
10373       * green: The green thread scheduler and message passing types are almost
10374         entirely lock-free.
10375       * extra: The `flatpipes` module had bitrotted and was removed.
10376       * extra: All crypto functions have been removed and Rust now has a policy of
10377         not reimplementing crypto in the standard library. In the future crypto
10378         will be provided by external crates with bindings to established libraries.
10379       * extra: `c_vec` has been modernized.
10380       * extra: The `sort` module has been removed. Use the `sort` method on
10381         mutable slices.
10382
10383    * Tooling
10384       * The `rust` and `rusti` commands have been removed, due to lack of
10385         maintenance.
10386       * `rustdoc` was completely rewritten.
10387       * `rustdoc` can test code examples in documentation.
10388       * `rustpkg` can test packages with the argument, 'test'.
10389       * `rustpkg` supports arbitrary dependencies, including C libraries.
10390       * `rustc`'s support for generating debug info is improved again.
10391       * `rustc` has better error reporting for unbalanced delimiters.
10392       * `rustc`'s JIT support was removed due to bitrot.
10393       * Executables and static libraries can be built with LTO (-Z lto)
10394       * `rustc` adds a `--dep-info` flag for communicating dependencies to
10395         build tools.
10396
10397
10398 Version 0.8 (2013-09-26)
10399 ============================
10400
10401    * ~2200 changes, numerous bugfixes
10402
10403    * Language
10404       * The `for` loop syntax has changed to work with the `Iterator` trait.
10405       * At long last, unwinding works on Windows.
10406       * Default methods are ready for use.
10407       * Many trait inheritance bugs fixed.
10408       * Owned and borrowed trait objects work more reliably.
10409       * `copy` is no longer a keyword. It has been replaced by the `Clone` trait.
10410       * rustc can omit emission of code for the `debug!` macro if it is passed
10411         `--cfg ndebug`
10412       * mod.rs is now "blessed". When loading `mod foo;`, rustc will now look
10413         for foo.rs, then foo/mod.rs, and will generate an error when both are
10414         present.
10415       * Strings no longer contain trailing nulls. The new `std::c_str` module
10416         provides new mechanisms for converting to C strings.
10417       * The type of foreign functions is now `extern "C" fn` instead of `*u8'.
10418       * The FFI has been overhauled such that foreign functions are called directly,
10419         instead of through a stack-switching wrapper.
10420       * Calling a foreign function must be done through a Rust function with the
10421         `#[fixed_stack_segment]` attribute.
10422       * The `externfn!` macro can be used to declare both a foreign function and
10423         a `#[fixed_stack_segment]` wrapper at once.
10424       * `pub` and `priv` modifiers on `extern` blocks are no longer parsed.
10425       * `unsafe` is no longer allowed on extern fns - they are all unsafe.
10426       * `priv` is disallowed everywhere except for struct fields and enum variants.
10427       * `&T` (besides `&'static T`) is no longer allowed in `@T`.
10428       * `ref` bindings in irrefutable patterns work correctly now.
10429       * `char` is now prevented from containing invalid code points.
10430       * Casting to `bool` is no longer allowed.
10431       * `\0` is now accepted as an escape in chars and strings.
10432       * `yield` is a reserved keyword.
10433       * `typeof` is a reserved keyword.
10434       * Crates may be imported by URL with `extern mod foo = "url";`.
10435       * Explicit enum discriminants may be given as uints as in `enum E { V = 0u }`
10436       * Static vectors can be initialized with repeating elements,
10437         e.g. `static foo: [u8, .. 100]: [0, .. 100];`.
10438       * Static structs can be initialized with functional record update,
10439         e.g. `static foo: Foo = Foo { a: 5, .. bar };`.
10440       * `cfg!` can be used to conditionally execute code based on the crate
10441         configuration, similarly to `#[cfg(...)]`.
10442       * The `unnecessary_qualification` lint detects unneeded module
10443         prefixes (default: allow).
10444       * Arithmetic operations have been implemented on the SIMD types in
10445         `std::unstable::simd`.
10446       * Exchange allocation headers were removed, reducing memory usage.
10447       * `format!` implements a completely new, extensible, and higher-performance
10448         string formatting system. It will replace `fmt!`.
10449       * `print!` and `println!` write formatted strings (using the `format!`
10450         extension) to stdout.
10451       * `write!` and `writeln!` write formatted strings (using the `format!`
10452         extension) to the new Writers in `std::rt::io`.
10453       * The library section in which a function or static is placed may
10454         be specified with `#[link_section = "..."]`.
10455       * The `proto!` syntax extension for defining bounded message protocols
10456         was removed.
10457       * `macro_rules!` is hygienic for `let` declarations.
10458       * The `#[export_name]` attribute specifies the name of a symbol.
10459       * `unreachable!` can be used to indicate unreachable code, and fails
10460         if executed.
10461
10462    * Libraries
10463       * std: Transitioned to the new runtime, written in Rust.
10464       * std: Added an experimental I/O library, `rt::io`, based on the new
10465         runtime.
10466       * std: A new generic `range` function was added to the prelude, replacing
10467         `uint::range` and friends.
10468       * std: `range_rev` no longer exists. Since range is an iterator it can be
10469         reversed with `range(lo, hi).invert()`.
10470       * std: The `chain` method on option renamed to `and_then`; `unwrap_or_default`
10471         renamed to `unwrap_or`.
10472       * std: The `iterator` module was renamed to `iter`.
10473       * std: Integral types now support the `checked_add`, `checked_sub`, and
10474         `checked_mul` operations for detecting overflow.
10475       * std: Many methods in `str`, `vec`, `option, `result` were renamed for
10476         consistency.
10477       * std: Methods are standardizing on conventions for casting methods:
10478         `to_foo` for copying, `into_foo` for moving, `as_foo` for temporary
10479         and cheap casts.
10480       * std: The `CString` type in `c_str` provides new ways to convert to and
10481         from C strings.
10482       * std: `DoubleEndedIterator` can yield elements in two directions.
10483       * std: The `mut_split` method on vectors partitions an `&mut [T]` into
10484         two splices.
10485       * std: `str::from_bytes` renamed to `str::from_utf8`.
10486       * std: `pop_opt` and `shift_opt` methods added to vectors.
10487       * std: The task-local data interface no longer uses @, and keys are
10488         no longer function pointers.
10489       * std: The `swap_unwrap` method of `Option` renamed to `take_unwrap`.
10490       * std: Added `SharedPort` to `comm`.
10491       * std: `Eq` has a default method for `ne`; only `eq` is required
10492         in implementations.
10493       * std: `Ord` has default methods for `le`, `gt` and `ge`; only `lt`
10494         is required in implementations.
10495       * std: `is_utf8` performance is improved, impacting many string functions.
10496       * std: `os::MemoryMap` provides cross-platform mmap.
10497       * std: `ptr::offset` is now unsafe, but also more optimized. Offsets that
10498         are not 'in-bounds' are considered undefined.
10499       * std: Many freestanding functions in `vec` removed in favor of methods.
10500       * std: Many freestanding functions on scalar types removed in favor of
10501         methods.
10502       * std: Many options to task builders were removed since they don't make
10503         sense in the new scheduler design.
10504       * std: More containers implement `FromIterator` so can be created by the
10505         `collect` method.
10506       * std: More complete atomic types in `unstable::atomics`.
10507       * std: `comm::PortSet` removed.
10508       * std: Mutating methods in the `Set` and `Map` traits have been moved into
10509         the `MutableSet` and `MutableMap` traits. `Container::is_empty`,
10510         `Map::contains_key`, `MutableMap::insert`, and `MutableMap::remove` have
10511         default implementations.
10512       * std: Various `from_str` functions were removed in favor of a generic
10513         `from_str` which is available in the prelude.
10514       * std: `util::unreachable` removed in favor of the `unreachable!` macro.
10515       * extra: `dlist`, the doubly-linked list was modernized.
10516       * extra: Added a `hex` module with `ToHex` and `FromHex` traits.
10517       * extra: Added `glob` module, replacing `std::os::glob`.
10518       * extra: `rope` was removed.
10519       * extra: `deque` was renamed to `ringbuf`. `RingBuf` implements `Deque`.
10520       * extra: `net`, and `timer` were removed. The experimental replacements
10521         are `std::rt::io::net` and `std::rt::io::timer`.
10522       * extra: Iterators implemented for `SmallIntMap`.
10523       * extra: Iterators implemented for `Bitv` and `BitvSet`.
10524       * extra: `SmallIntSet` removed. Use `BitvSet`.
10525       * extra: Performance of JSON parsing greatly improved.
10526       * extra: `semver` updated to SemVer 2.0.0.
10527       * extra: `term` handles more terminals correctly.
10528       * extra: `dbg` module removed.
10529       * extra: `par` module removed.
10530       * extra: `future` was cleaned up, with some method renames.
10531       * extra: Most free functions in `getopts` were converted to methods.
10532
10533    * Other
10534       * rustc's debug info generation (`-Z debug-info`) is greatly improved.
10535       * rustc accepts `--target-cpu` to compile to a specific CPU architecture,
10536         similarly to gcc's `--march` flag.
10537       * rustc's performance compiling small crates is much better.
10538       * rustpkg has received many improvements.
10539       * rustpkg supports git tags as package IDs.
10540       * rustpkg builds into target-specific directories so it can be used for
10541         cross-compiling.
10542       * The number of concurrent test tasks is controlled by the environment
10543         variable RUST_TEST_TASKS.
10544       * The test harness can now report metrics for benchmarks.
10545       * All tools have man pages.
10546       * Programs compiled with `--test` now support the `-h` and `--help` flags.
10547       * The runtime uses jemalloc for allocations.
10548       * Segmented stacks are temporarily disabled as part of the transition to
10549         the new runtime. Stack overflows are possible!
10550       * A new documentation backend, rustdoc_ng, is available for use. It is
10551         still invoked through the normal `rustdoc` command.
10552
10553
10554 Version 0.7 (2013-07-03)
10555 =======================
10556
10557    * ~2000 changes, numerous bugfixes
10558
10559    * Language
10560       * `impl`s no longer accept a visibility qualifier. Put them on methods
10561         instead.
10562       * The borrow checker has been rewritten with flow-sensitivity, fixing
10563         many bugs and inconveniences.
10564       * The `self` parameter no longer implicitly means `&'self self`,
10565         and can be explicitly marked with a lifetime.
10566       * Overloadable compound operators (`+=`, etc.) have been temporarily
10567         removed due to bugs.
10568       * The `for` loop protocol now requires `for`-iterators to return `bool`
10569         so they compose better.
10570       * The `Durable` trait is replaced with the `'static` bounds.
10571       * Trait default methods work more often.
10572       * Structs with the `#[packed]` attribute have byte alignment and
10573         no padding between fields.
10574       * Type parameters bound by `Copy` must now be copied explicitly with
10575         the `copy` keyword.
10576       * It is now illegal to move out of a dereferenced unsafe pointer.
10577       * `Option<~T>` is now represented as a nullable pointer.
10578       * `@mut` does dynamic borrow checks correctly.
10579       * The `main` function is only detected at the topmost level of the crate.
10580         The `#[main]` attribute is still valid anywhere.
10581       * Struct fields may no longer be mutable. Use inherited mutability.
10582       * The `#[no_send]` attribute makes a type that would otherwise be
10583         `Send`, not.
10584       * The `#[no_freeze]` attribute makes a type that would otherwise be
10585         `Freeze`, not.
10586       * Unbounded recursion will abort the process after reaching the limit
10587         specified by the `RUST_MAX_STACK` environment variable (default: 1GB).
10588       * The `vecs_implicitly_copyable` lint mode has been removed. Vectors
10589         are never implicitly copyable.
10590       * `#[static_assert]` makes compile-time assertions about static bools.
10591       * At long last, 'argument modes' no longer exist.
10592       * The rarely used `use mod` statement no longer exists.
10593
10594    * Syntax extensions
10595       * `fail!` and `assert!` accept `~str`, `&'static str` or `fmt!`-style
10596         argument list.
10597       * `Encodable`, `Decodable`, `Ord`, `TotalOrd`, `TotalEq`, `DeepClone`,
10598         `Rand`, `Zero` and `ToStr` can all be automatically derived with
10599         `#[deriving(...)]`.
10600       * The `bytes!` macro returns a vector of bytes for string, u8, char,
10601         and unsuffixed integer literals.
10602
10603    * Libraries
10604       * The `core` crate was renamed to `std`.
10605       * The `std` crate was renamed to `extra`.
10606       * More and improved documentation.
10607       * std: `iterator` module for external iterator objects.
10608       * Many old-style (internal, higher-order function) iterators replaced by
10609         implementations of `Iterator`.
10610       * std: Many old internal vector and string iterators,
10611         incl. `any`, `all`. removed.
10612       * std: The `finalize` method of `Drop` renamed to `drop`.
10613       * std: The `drop` method now takes `&mut self` instead of `&self`.
10614       * std: The prelude no longer re-exports any modules, only types and traits.
10615       * std: Prelude additions: `print`, `println`, `FromStr`, `ApproxEq`, `Equiv`,
10616         `Iterator`, `IteratorUtil`, many numeric traits, many tuple traits.
10617       * std: New numeric traits: `Fractional`, `Real`, `RealExt`, `Integer`, `Ratio`,
10618         `Algebraic`, `Trigonometric`, `Exponential`, `Primitive`.
10619       * std: Tuple traits and accessors defined for up to 12-tuples, e.g.
10620         `(0, 1, 2).n2()` or `(0, 1, 2).n2_ref()`.
10621       * std: Many types implement `Clone`.
10622       * std: `path` type renamed to `Path`.
10623       * std: `mut` module and `Mut` type removed.
10624       * std: Many standalone functions removed in favor of methods and iterators
10625         in `vec`, `str`. In the future methods will also work as functions.
10626       * std: `reinterpret_cast` removed. Use `transmute`.
10627       * std: ascii string handling in `std::ascii`.
10628       * std: `Rand` is implemented for ~/@.
10629       * std: `run` module for spawning processes overhauled.
10630       * std: Various atomic types added to `unstable::atomic`.
10631       * std: Various types implement `Zero`.
10632       * std: `LinearMap` and `LinearSet` renamed to `HashMap` and `HashSet`.
10633       * std: Borrowed pointer functions moved from `ptr` to `borrow`.
10634       * std: Added `os::mkdir_recursive`.
10635       * std: Added `os::glob` function performs filesystems globs.
10636       * std: `FuzzyEq` renamed to `ApproxEq`.
10637       * std: `Map` now defines `pop` and `swap` methods.
10638       * std: `Cell` constructors converted to static methods.
10639       * extra: `rc` module adds the reference counted pointers, `Rc` and `RcMut`.
10640       * extra: `flate` module moved from `std` to `extra`.
10641       * extra: `fileinput` module for iterating over a series of files.
10642       * extra: `Complex` number type and `complex` module.
10643       * extra: `Rational` number type and `rational` module.
10644       * extra: `BigInt`, `BigUint` implement numeric and comparison traits.
10645       * extra: `term` uses terminfo now, is more correct.
10646       * extra: `arc` functions converted to methods.
10647       * extra: Implementation of fixed output size variations of SHA-2.
10648
10649    * Tooling
10650       * `unused_variables` lint mode for unused variables (default: warn).
10651       * `unused_unsafe` lint mode for detecting unnecessary `unsafe` blocks
10652         (default: warn).
10653       * `unused_mut` lint mode for identifying unused `mut` qualifiers
10654         (default: warn).
10655       * `dead_assignment` lint mode for unread variables (default: warn).
10656       * `unnecessary_allocation` lint mode detects some heap allocations that are
10657         immediately borrowed so could be written without allocating (default: warn).
10658       * `missing_doc` lint mode (default: allow).
10659       * `unreachable_code` lint mode (default: warn).
10660       * The `rusti` command has been rewritten and a number of bugs addressed.
10661       * rustc outputs in color on more terminals.
10662       * rustc accepts a `--link-args` flag to pass arguments to the linker.
10663       * rustc accepts a `-Z print-link-args` flag for debugging linkage.
10664       * Compiling with `-g` will make the binary record information about
10665         dynamic borrowcheck failures for debugging.
10666       * rustdoc has a nicer stylesheet.
10667       * Various improvements to rustdoc.
10668       * Improvements to rustpkg (see the detailed release notes).
10669
10670
10671 Version 0.6 (2013-04-03)
10672 ========================
10673
10674    * ~2100 changes, numerous bugfixes
10675
10676    * Syntax changes
10677       * The self type parameter in traits is now spelled `Self`
10678       * The `self` parameter in trait and impl methods must now be explicitly
10679         named (for example: `fn f(&self) { }`). Implicit self is deprecated.
10680       * Static methods no longer require the `static` keyword and instead
10681         are distinguished by the lack of a `self` parameter
10682       * Replaced the `Durable` trait with the `'static` lifetime
10683       * The old closure type syntax with the trailing sigil has been
10684         removed in favor of the more consistent leading sigil
10685       * `super` is a keyword, and may be prefixed to paths
10686       * Trait bounds are separated with `+` instead of whitespace
10687       * Traits are implemented with `impl Trait for Type`
10688         instead of `impl Type: Trait`
10689       * Lifetime syntax is now `&'l foo` instead of `&l/foo`
10690       * The `export` keyword has finally been removed
10691       * The `move` keyword has been removed (see "Semantic changes")
10692       * The interior mutability qualifier on vectors, `[mut T]`, has been
10693         removed. Use `&mut [T]`, etc.
10694       * `mut` is no longer valid in `~mut T`. Use inherited mutability
10695       * `fail` is no longer a keyword. Use `fail!()`
10696       * `assert` is no longer a keyword. Use `assert!()`
10697       * `log` is no longer a keyword. use `debug!`, etc.
10698       * 1-tuples may be represented as `(T,)`
10699       * Struct fields may no longer be `mut`. Use inherited mutability,
10700         `@mut T`, `core::mut` or `core::cell`
10701       * `extern mod { ... }` is no longer valid syntax for foreign
10702         function modules. Use extern blocks: `extern { ... }`
10703       * Newtype enums removed. Use tuple-structs.
10704       * Trait implementations no longer support visibility modifiers
10705       * Pattern matching over vectors improved and expanded
10706       * `const` renamed to `static` to correspond to lifetime name,
10707         and make room for future `static mut` unsafe mutable globals.
10708       * Replaced `#[deriving_eq]` with `#[deriving(Eq)]`, etc.
10709       * `Clone` implementations can be automatically generated with
10710         `#[deriving(Clone)]`
10711       * Casts to traits must use a pointer sigil, e.g. `@foo as @Bar`
10712         instead of `foo as Bar`.
10713       * Fixed length vector types are now written as `[int, .. 3]`
10714         instead of `[int * 3]`.
10715       * Fixed length vector types can express the length as a constant
10716         expression. (ex: `[int, .. GL_BUFFER_SIZE - 2]`)
10717
10718    * Semantic changes
10719       * Types with owned pointers or custom destructors move by default,
10720         eliminating the `move` keyword
10721       * All foreign functions are considered unsafe
10722       * &mut is now unaliasable
10723       * Writes to borrowed @mut pointers are prevented dynamically
10724       * () has size 0
10725       * The name of the main function can be customized using #[main]
10726       * The default type of an inferred closure is &fn instead of @fn
10727       * `use` statements may no longer be "chained" - they cannot import
10728         identifiers imported by previous `use` statements
10729       * `use` statements are crate relative, importing from the "top"
10730         of the crate by default. Paths may be prefixed with `super::`
10731         or `self::` to change the search behavior.
10732       * Method visibility is inherited from the implementation declaration
10733       * Structural records have been removed
10734       * Many more types can be used in static items, including enums
10735         'static-lifetime pointers and vectors
10736       * Pattern matching over vectors improved and expanded
10737       * Typechecking of closure types has been overhauled to
10738         improve inference and eliminate unsoundness
10739       * Macros leave scope at the end of modules, unless that module is
10740         tagged with #[macro_escape]
10741
10742    * Libraries
10743       * Added big integers to `std::bigint`
10744       * Removed `core::oldcomm` module
10745       * Added pipe-based `core::comm` module
10746       * Numeric traits have been reorganized under `core::num`
10747       * `vec::slice` finally returns a slice
10748       * `debug!` and friends don't require a format string, e.g. `debug!(Foo)`
10749       * Containers reorganized around traits in `core::container`
10750       * `core::dvec` removed, `~[T]` is a drop-in replacement
10751       * `core::send_map` renamed to `core::hashmap`
10752       * `std::map` removed; replaced with `core::hashmap`
10753       * `std::treemap` reimplemented as an owned balanced tree
10754       * `std::deque` and `std::smallintmap` reimplemented as owned containers
10755       * `core::trie` added as a fast ordered map for integer keys
10756       * Set types added to `core::hashmap`, `core::trie` and `std::treemap`
10757       * `Ord` split into `Ord` and `TotalOrd`. `Ord` is still used to
10758         overload the comparison operators, whereas `TotalOrd` is used
10759         by certain container types
10760
10761    * Other
10762       * Replaced the 'cargo' package manager with 'rustpkg'
10763       * Added all-purpose 'rust' tool
10764       * `rustc --test` now supports benchmarks with the `#[bench]` attribute
10765       * rustc now *attempts* to offer spelling suggestions
10766       * Improved support for ARM and Android
10767       * Preliminary MIPS backend
10768       * Improved foreign function ABI implementation for x86, x86_64
10769       * Various memory usage improvements
10770       * Rust code may be embedded in foreign code under limited circumstances
10771       * Inline assembler supported by new asm!() syntax extension.
10772
10773
10774 Version 0.5 (2012-12-21)
10775 ===========================
10776
10777    * ~900 changes, numerous bugfixes
10778
10779    * Syntax changes
10780       * Removed `<-` move operator
10781       * Completed the transition from the `#fmt` extension syntax to `fmt!`
10782       * Removed old fixed length vector syntax - `[T]/N`
10783       * New token-based quasi-quoters, `quote_tokens!`, `quote_expr!`, etc.
10784       * Macros may now expand to items and statements
10785       * `a.b()` is always parsed as a method call, never as a field projection
10786       * `Eq` and `IterBytes` implementations can be automatically generated
10787         with `#[deriving_eq]` and `#[deriving_iter_bytes]` respectively
10788       * Removed the special crate language for `.rc` files
10789       * Function arguments may consist of any irrefutable pattern
10790
10791    * Semantic changes
10792       * `&` and `~` pointers may point to objects
10793       * Tuple structs - `struct Foo(Bar, Baz)`. Will replace newtype enums.
10794       * Enum variants may be structs
10795       * Destructors can be added to all nominal types with the Drop trait
10796       * Structs and nullary enum variants may be constants
10797       * Values that cannot be implicitly copied are now automatically moved
10798         without writing `move` explicitly
10799       * `&T` may now be coerced to `*T`
10800       * Coercions happen in `let` statements as well as function calls
10801       * `use` statements now take crate-relative paths
10802       * The module and type namespaces have been merged so that static
10803         method names can be resolved under the trait in which they are
10804         declared
10805
10806    * Improved support for language features
10807       * Trait inheritance works in many scenarios
10808       * More support for explicit self arguments in methods - `self`, `&self`
10809         `@self`, and `~self` all generally work as expected
10810       * Static methods work in more situations
10811       * Experimental: Traits may declare default methods for the implementations
10812         to use
10813
10814    * Libraries
10815       * New condition handling system in `core::condition`
10816       * Timsort added to `std::sort`
10817       * New priority queue, `std::priority_queue`
10818       * Pipes for serializable types, `std::flatpipes'
10819       * Serialization overhauled to be trait-based
10820       * Expanded `getopts` definitions
10821       * Moved futures to `std`
10822       * More functions are pure now
10823       * `core::comm` renamed to `oldcomm`. Still deprecated
10824       * `rustdoc` and `cargo` are libraries now
10825
10826    * Misc
10827       * Added a preliminary REPL, `rusti`
10828       * License changed from MIT to dual MIT/APL2
10829
10830
10831 Version 0.4 (2012-10-15)
10832 ==========================
10833
10834    * ~2000 changes, numerous bugfixes
10835
10836    * Syntax
10837       * All keywords are now strict and may not be used as identifiers anywhere
10838       * Keyword removal: 'again', 'import', 'check', 'new', 'owned', 'send',
10839         'of', 'with', 'to', 'class'.
10840       * Classes are replaced with simpler structs
10841       * Explicit method self types
10842       * `ret` became `return` and `alt` became `match`
10843       * `import` is now `use`; `use is now `extern mod`
10844       * `extern mod { ... }` is now `extern { ... }`
10845       * `use mod` is the recommended way to import modules
10846       * `pub` and `priv` replace deprecated export lists
10847       * The syntax of `match` pattern arms now uses fat arrow (=>)
10848       * `main` no longer accepts an args vector; use `os::args` instead
10849
10850    * Semantics
10851       * Trait implementations are now coherent, ala Haskell typeclasses
10852       * Trait methods may be static
10853       * Argument modes are deprecated
10854       * Borrowed pointers are much more mature and recommended for use
10855       * Strings and vectors in the static region are stored in constant memory
10856       * Typestate was removed
10857       * Resolution rewritten to be more reliable
10858       * Support for 'dual-mode' data structures (freezing and thawing)
10859
10860    * Libraries
10861       * Most binary operators can now be overloaded via the traits in
10862         `core::ops'
10863       * `std::net::url` for representing URLs
10864       * Sendable hash maps in `core::send_map`
10865       * `core::task' gained a (currently unsafe) task-local storage API
10866
10867    * Concurrency
10868       * An efficient new intertask communication primitive called the pipe,
10869         along with a number of higher-level channel types, in `core::pipes`
10870       * `std::arc`, an atomically reference counted, immutable, shared memory
10871         type
10872       * `std::sync`, various exotic synchronization tools based on arcs and pipes
10873       * Futures are now based on pipes and sendable
10874       * More robust linked task failure
10875       * Improved task builder API
10876
10877    * Other
10878       * Improved error reporting
10879       * Preliminary JIT support
10880       * Preliminary work on precise GC
10881       * Extensive architectural improvements to rustc
10882       * Begun a transition away from buggy C++-based reflection (shape) code to
10883         Rust-based (visitor) code
10884       * All hash functions and tables converted to secure, randomized SipHash
10885
10886
10887 Version 0.3  (2012-07-12)
10888 ========================
10889
10890    * ~1900 changes, numerous bugfixes
10891
10892    * New coding conveniences
10893       * Integer-literal suffix inference
10894       * Per-item control over warnings, errors
10895       * #[cfg(windows)] and #[cfg(unix)] attributes
10896       * Documentation comments
10897       * More compact closure syntax
10898       * 'do' expressions for treating higher-order functions as
10899         control structures
10900       * *-patterns (wildcard extended to all constructor fields)
10901
10902    * Semantic cleanup
10903       * Name resolution pass and exhaustiveness checker rewritten
10904       * Region pointers and borrow checking supersede alias
10905         analysis
10906       * Init-ness checking is now provided by a region-based liveness
10907         pass instead of the typestate pass; same for last-use analysis
10908       * Extensive work on region pointers
10909
10910    * Experimental new language features
10911       * Slices and fixed-size, interior-allocated vectors
10912       * #!-comments for lang versioning, shell execution
10913       * Destructors and iface implementation for classes;
10914         type-parameterized classes and class methods
10915       * 'const' type kind for types that can be used to implement
10916         shared-memory concurrency patterns
10917
10918    * Type reflection
10919
10920    * Removal of various obsolete features
10921       * Keywords: 'be', 'prove', 'syntax', 'note', 'mutable', 'bind',
10922                  'crust', 'native' (now 'extern'), 'cont' (now 'again')
10923
10924       * Constructs: do-while loops ('do' repurposed), fn binding,
10925                     resources (replaced by destructors)
10926
10927    * Compiler reorganization
10928       * Syntax-layer of compiler split into separate crate
10929       * Clang (from LLVM project) integrated into build
10930       * Typechecker split into sub-modules
10931
10932    * New library code
10933       * New time functions
10934       * Extension methods for many built-in types
10935       * Arc: atomic-refcount read-only / exclusive-use shared cells
10936       * Par: parallel map and search routines
10937       * Extensive work on libuv interface
10938       * Much vector code moved to libraries
10939       * Syntax extensions: #line, #col, #file, #mod, #stringify,
10940         #include, #include_str, #include_bin
10941
10942    * Tool improvements
10943       * Cargo automatically resolves dependencies
10944
10945
10946 Version 0.2  (2012-03-29)
10947 =========================
10948
10949    * >1500 changes, numerous bugfixes
10950
10951    * New docs and doc tooling
10952
10953    * New port: FreeBSD x86_64
10954
10955    * Compilation model enhancements
10956       * Generics now specialized, multiply instantiated
10957       * Functions now inlined across separate crates
10958
10959    * Scheduling, stack and threading fixes
10960       * Noticeably improved message-passing performance
10961       * Explicit schedulers
10962       * Callbacks from C
10963       * Helgrind clean
10964
10965    * Experimental new language features
10966       * Operator overloading
10967       * Region pointers
10968       * Classes
10969
10970    * Various language extensions
10971       * C-callback function types: 'crust fn ...'
10972       * Infinite-loop construct: 'loop { ... }'
10973       * Shorten 'mutable' to 'mut'
10974       * Required mutable-local qualifier: 'let mut ...'
10975       * Basic glob-exporting: 'export foo::*;'
10976       * Alt now exhaustive, 'alt check' for runtime-checked
10977       * Block-function form of 'for' loop, with 'break' and 'ret'.
10978
10979    * New library code
10980       * AST quasi-quote syntax extension
10981       * Revived libuv interface
10982       * New modules: core::{future, iter}, std::arena
10983       * Merged per-platform std::{os*, fs*} to core::{libc, os}
10984       * Extensive cleanup, regularization in libstd, libcore
10985
10986
10987 Version 0.1  (2012-01-20)
10988 ===============================
10989
10990    * Most language features work, including:
10991       * Unique pointers, unique closures, move semantics
10992       * Interface-constrained generics
10993       * Static interface dispatch
10994       * Stack growth
10995       * Multithread task scheduling
10996       * Typestate predicates
10997       * Failure unwinding, destructors
10998       * Pattern matching and destructuring assignment
10999       * Lightweight block-lambda syntax
11000       * Preliminary macro-by-example
11001
11002    * Compiler works with the following configurations:
11003       * Linux: x86 and x86_64 hosts and targets
11004       * macOS: x86 and x86_64 hosts and targets
11005       * Windows: x86 hosts and targets
11006
11007    * Cross compilation / multi-target configuration supported.
11008
11009    * Preliminary API-documentation and package-management tools included.
11010
11011 Known issues:
11012
11013    * Documentation is incomplete.
11014
11015    * Performance is below intended target.
11016
11017    * Standard library APIs are subject to extensive change, reorganization.
11018
11019    * Language-level versioning is not yet operational - future code will
11020      break unexpectedly.