]> git.lizzy.rs Git - rust.git/blob - RELEASES.md
tidy up
[rust.git] / RELEASES.md
1 Version 1.45.2 (2020-08-03)
2 ==========================
3
4 * [Fix bindings in tuple struct patterns][74954]
5 * [Fix track_caller integration with trait objects][74784]
6
7 [74954]: https://github.com/rust-lang/rust/issues/74954
8 [74784]: https://github.com/rust-lang/rust/issues/74784
9
10 Version 1.45.1 (2020-07-30)
11 ==========================
12
13 * [Fix const propagation with references.][73613]
14 * [rustfmt accepts rustfmt_skip in cfg_attr again.][73078]
15 * [Avoid spurious implicit region bound.][74509]
16 * [Install clippy on x.py install][74457]
17
18 [73613]: https://github.com/rust-lang/rust/pull/73613
19 [73078]: https://github.com/rust-lang/rust/issues/73078
20 [74509]: https://github.com/rust-lang/rust/pull/74509
21 [74457]: https://github.com/rust-lang/rust/pull/74457
22
23 Version 1.45.0 (2020-07-16)
24 ==========================
25
26 Language
27 --------
28 - [Out of range float to int conversions using `as` has been defined as a saturating
29   conversion.][71269] This was previously undefined behaviour, but you can use the
30    `{f64, f32}::to_int_unchecked` methods to continue using the current behaviour, which
31    may be desirable in rare performance sensitive situations.
32 - [`mem::Discriminant<T>` now uses `T`'s discriminant type instead of always
33   using `u64`.][70705]
34 - [Function like procedural macros can now be used in expression, pattern, and  statement
35   positions.][68717] This means you can now use a function-like procedural macro
36   anywhere you can use a declarative (`macro_rules!`) macro.
37
38 Compiler
39 --------
40 - [You can now override individual target features through the `target-feature`
41   flag.][72094] E.g. `-C target-feature=+avx2 -C target-feature=+fma` is now
42   equivalent to `-C target-feature=+avx2,+fma`.
43 - [Added the `force-unwind-tables` flag.][69984] This option allows
44   rustc to always generate unwind tables regardless of panic strategy.
45 - [Added the `embed-bitcode` flag.][71716] This codegen flag allows rustc
46   to include LLVM bitcode into generated `rlib`s (this is on by default).
47 - [Added the `tiny` value to the `code-model` codegen flag.][72397]
48 - [Added tier 3 support\* for the `mipsel-sony-psp` target.][72062]
49 - [Added tier 3 support for the `thumbv7a-uwp-windows-msvc` target.][72133]
50
51 \* Refer to Rust's [platform support page][forge-platform-support] for more
52 information on Rust's tiered platform support.
53
54
55 Libraries
56 ---------
57 - [`net::{SocketAddr, SocketAddrV4, SocketAddrV6}` now implements `PartialOrd`
58   and `Ord`.][72239]
59 - [`proc_macro::TokenStream` now implements `Default`.][72234]
60 - [You can now use `char` with
61   `ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}` to iterate over
62   a range of codepoints.][72413] E.g.
63   you can now write the following;
64   ```rust
65   for ch in 'a'..='z' {
66       print!("{}", ch);
67   }
68   println!();
69   // Prints "abcdefghijklmnopqrstuvwxyz"
70   ```
71 - [`OsString` now implements `FromStr`.][71662]
72 - [The `saturating_neg` method has been added to all signed integer primitive
73   types, and the `saturating_abs` method has been added for all integer
74   primitive types.][71886]
75 - [`Arc<T>`, `Rc<T>` now implement  `From<Cow<'_, T>>`, and `Box` now
76   implements `From<Cow>` when `T` is `[T: Copy]`, `str`, `CStr`, `OsStr`,
77   or `Path`.][71447]
78 - [`Box<[T]>` now implements `From<[T; N]>`.][71095]
79 - [`BitOr` and `BitOrAssign` are implemented for all `NonZero`
80   integer types.][69813]
81 - [The `fetch_min`, and `fetch_max` methods have been added to all atomic
82   integer types.][72324]
83 - [The `fetch_update` method has been added to all atomic integer types.][71843]
84
85 Stabilized APIs
86 ---------------
87 - [`Arc::as_ptr`]
88 - [`BTreeMap::remove_entry`]
89 - [`Rc::as_ptr`]
90 - [`rc::Weak::as_ptr`]
91 - [`rc::Weak::from_raw`]
92 - [`rc::Weak::into_raw`]
93 - [`str::strip_prefix`]
94 - [`str::strip_suffix`]
95 - [`sync::Weak::as_ptr`]
96 - [`sync::Weak::from_raw`]
97 - [`sync::Weak::into_raw`]
98 - [`char::UNICODE_VERSION`]
99 - [`Span::resolved_at`]
100 - [`Span::located_at`]
101 - [`Span::mixed_site`]
102 - [`unix::process::CommandExt::arg0`]
103
104 Cargo
105 -----
106
107 - [Cargo uses the `embed-bitcode` flag to optimize disk usage and build
108   time.][cargo/8066]
109
110 Misc
111 ----
112 - [Rustdoc now supports strikethrough text in Markdown.][71928] E.g.
113   `~~outdated information~~` becomes "~~outdated information~~".
114 - [Added an emoji to Rustdoc's deprecated API message.][72014]
115
116 Compatibility Notes
117 -------------------
118 - [Trying to self initialize a static value (that is creating a value using
119   itself) is unsound and now causes a compile error.][71140]
120 - [`{f32, f64}::powi` now returns a slightly different value on Windows.][73420]
121   This is due to changes in LLVM's intrinsics which `{f32, f64}::powi` uses.
122 - [Rustdoc's CLI's extra error exit codes have been removed.][71900] These were
123   previously undocumented and not intended for public use. Rustdoc still provides
124   a non-zero exit code on errors.
125 - [Rustc's `lto` flag is incompatible with the new `embed-bitcode=no`.][71848]
126   This may cause issues if LTO is enabled through `RUSTFLAGS` or `cargo rustc`
127   flags while cargo is adding `embed-bitcode` itself. The recommended way to
128   control LTO is with Cargo profiles, either in `Cargo.toml` or `.cargo/config`,
129   or by setting `CARGO_PROFILE_<name>_LTO` in the environment.
130
131 Internals Only
132 --------------
133 - [Make clippy a git subtree instead of a git submodule][70655]
134 - [Unify the undo log of all snapshot types][69464]
135
136 [71848]: https://github.com/rust-lang/rust/issues/71848/
137 [73420]: https://github.com/rust-lang/rust/issues/73420/
138 [72324]: https://github.com/rust-lang/rust/pull/72324/
139 [71843]: https://github.com/rust-lang/rust/pull/71843/
140 [71886]: https://github.com/rust-lang/rust/pull/71886/
141 [72234]: https://github.com/rust-lang/rust/pull/72234/
142 [72239]: https://github.com/rust-lang/rust/pull/72239/
143 [72397]: https://github.com/rust-lang/rust/pull/72397/
144 [72413]: https://github.com/rust-lang/rust/pull/72413/
145 [72014]: https://github.com/rust-lang/rust/pull/72014/
146 [72062]: https://github.com/rust-lang/rust/pull/72062/
147 [72094]: https://github.com/rust-lang/rust/pull/72094/
148 [72133]: https://github.com/rust-lang/rust/pull/72133/
149 [71900]: https://github.com/rust-lang/rust/pull/71900/
150 [71928]: https://github.com/rust-lang/rust/pull/71928/
151 [71662]: https://github.com/rust-lang/rust/pull/71662/
152 [71716]: https://github.com/rust-lang/rust/pull/71716/
153 [71447]: https://github.com/rust-lang/rust/pull/71447/
154 [71269]: https://github.com/rust-lang/rust/pull/71269/
155 [71095]: https://github.com/rust-lang/rust/pull/71095/
156 [71140]: https://github.com/rust-lang/rust/pull/71140/
157 [70655]: https://github.com/rust-lang/rust/pull/70655/
158 [70705]: https://github.com/rust-lang/rust/pull/70705/
159 [69984]: https://github.com/rust-lang/rust/pull/69984/
160 [69813]: https://github.com/rust-lang/rust/pull/69813/
161 [69464]: https://github.com/rust-lang/rust/pull/69464/
162 [68717]: https://github.com/rust-lang/rust/pull/68717/
163 [cargo/8066]: https://github.com/rust-lang/cargo/pull/8066
164 [`Arc::as_ptr`]: https://doc.rust-lang.org/stable/std/sync/struct.Arc.html#method.as_ptr
165 [`BTreeMap::remove_entry`]: https://doc.rust-lang.org/stable/std/collections/struct.BTreeMap.html#method.remove_entry
166 [`Rc::as_ptr`]: https://doc.rust-lang.org/stable/std/rc/struct.Rc.html#method.as_ptr
167 [`rc::Weak::as_ptr`]: https://doc.rust-lang.org/stable/std/rc/struct.Weak.html#method.as_ptr
168 [`rc::Weak::from_raw`]: https://doc.rust-lang.org/stable/std/rc/struct.Weak.html#method.from_raw
169 [`rc::Weak::into_raw`]: https://doc.rust-lang.org/stable/std/rc/struct.Weak.html#method.into_raw
170 [`sync::Weak::as_ptr`]: https://doc.rust-lang.org/stable/std/sync/struct.Weak.html#method.as_ptr
171 [`sync::Weak::from_raw`]: https://doc.rust-lang.org/stable/std/sync/struct.Weak.html#method.from_raw
172 [`sync::Weak::into_raw`]: https://doc.rust-lang.org/stable/std/sync/struct.Weak.html#method.into_raw
173 [`str::strip_prefix`]: https://doc.rust-lang.org/stable/std/primitive.str.html#method.strip_prefix
174 [`str::strip_suffix`]: https://doc.rust-lang.org/stable/std/primitive.str.html#method.strip_suffix
175 [`char::UNICODE_VERSION`]: https://doc.rust-lang.org/stable/std/char/constant.UNICODE_VERSION.html
176 [`Span::resolved_at`]: https://doc.rust-lang.org/stable/proc_macro/struct.Span.html#method.resolved_at
177 [`Span::located_at`]: https://doc.rust-lang.org/stable/proc_macro/struct.Span.html#method.located_at
178 [`Span::mixed_site`]: https://doc.rust-lang.org/stable/proc_macro/struct.Span.html#method.mixed_site
179 [`unix::process::CommandExt::arg0`]: https://doc.rust-lang.org/std/os/unix/process/trait.CommandExt.html#tymethod.arg0
180
181
182 Version 1.44.1 (2020-06-18)
183 ===========================
184
185 * [rustfmt accepts rustfmt_skip in cfg_attr again.][73078]
186 * [Don't hash executable filenames on apple platforms, fixing backtraces.][cargo/8329]
187 * [Fix crashes when finding backtrace on macOS.][71397]
188 * [Clippy applies lint levels into different files.][clippy/5356]
189
190 [71397]: https://github.com/rust-lang/rust/issues/71397
191 [73078]: https://github.com/rust-lang/rust/issues/73078
192 [cargo/8329]: https://github.com/rust-lang/cargo/pull/8329
193 [clippy/5356]: https://github.com/rust-lang/rust-clippy/issues/5356
194
195
196 Version 1.44.0 (2020-06-04)
197 ==========================
198
199 Language
200 --------
201 - [You can now use `async/.await` with `#[no_std]` enabled.][69033]
202 - [Added the `unused_braces` lint.][70081]
203
204 **Syntax-only changes**
205
206 - [Expansion-driven outline module parsing][69838]
207 ```rust
208 #[cfg(FALSE)]
209 mod foo {
210     mod bar {
211         mod baz; // `foo/bar/baz.rs` doesn't exist, but no error!
212     }
213 }
214 ```
215
216 These are still rejected semantically, so you will likely receive an error but
217 these changes can be seen and parsed by macros and conditional compilation.
218
219 Compiler
220 --------
221 - [Rustc now respects the `-C codegen-units` flag in incremental mode.][70156]
222   Additionally when in incremental mode rustc defaults to 256 codegen units.
223 - [Refactored `catch_unwind` to have zero-cost, unless unwinding is enabled and
224   a panic is thrown.][67502]
225 - [Added tier 3\* support for the `aarch64-unknown-none` and
226   `aarch64-unknown-none-softfloat` targets.][68334]
227 - [Added tier 3 support for `arm64-apple-tvos` and
228   `x86_64-apple-tvos` targets.][68191]
229
230
231 Libraries
232 ---------
233 - [Special cased `vec![]` to map directly to `Vec::new()`.][70632] This allows
234   `vec![]` to be able to be used in `const` contexts.
235 - [`convert::Infallible` now implements `Hash`.][70281]
236 - [`OsString` now implements `DerefMut` and `IndexMut` returning
237   a `&mut OsStr`.][70048]
238 - [Unicode 13 is now supported.][69929]
239 - [`String` now implements `From<&mut str>`.][69661]
240 - [`IoSlice` now implements `Copy`.][69403]
241 - [`Vec<T>` now implements `From<[T; N]>`.][68692] Where `N` is at most 32.
242 - [`proc_macro::LexError` now implements `fmt::Display` and `Error`.][68899]
243 - [`from_le_bytes`, `to_le_bytes`, `from_be_bytes`, `to_be_bytes`,
244   `from_ne_bytes`, and `to_ne_bytes` methods are now `const` for all
245   integer types.][69373]
246
247 Stabilized APIs
248 ---------------
249 - [`PathBuf::with_capacity`]
250 - [`PathBuf::capacity`]
251 - [`PathBuf::clear`]
252 - [`PathBuf::reserve`]
253 - [`PathBuf::reserve_exact`]
254 - [`PathBuf::shrink_to_fit`]
255 - [`f32::to_int_unchecked`]
256 - [`f64::to_int_unchecked`]
257 - [`Layout::align_to`]
258 - [`Layout::pad_to_align`]
259 - [`Layout::array`]
260 - [`Layout::extend`]
261
262 Cargo
263 -----
264 - [Added the `cargo tree` command which will print a tree graph of
265   your dependencies.][cargo/8062] E.g.
266   ```
267     mdbook v0.3.2 (/Users/src/rust/mdbook)
268   ├── ammonia v3.0.0
269   │   ├── html5ever v0.24.0
270   │   │   ├── log v0.4.8
271   │   │   │   └── cfg-if v0.1.9
272   │   │   ├── mac v0.1.1
273   │   │   └── markup5ever v0.9.0
274   │   │       ├── log v0.4.8 (*)
275   │   │       ├── phf v0.7.24
276   │   │       │   └── phf_shared v0.7.24
277   │   │       │       ├── siphasher v0.2.3
278   │   │       │       └── unicase v1.4.2
279   │   │       │           [build-dependencies]
280   │   │       │           └── version_check v0.1.5
281   ...
282   ```
283   You can also display dependencies on multiple versions of the same crate with
284   `cargo tree -d` (short for `cargo tree --duplicates`).
285
286 Misc
287 ----
288 - [Rustdoc now allows you to specify `--crate-version` to have rustdoc include
289   the version in the sidebar.][69494]
290
291 Compatibility Notes
292 -------------------
293 - [Rustc now correctly generates static libraries on Windows GNU targets with
294   the `.a` extension, rather than the previous `.lib`.][70937]
295 - [Removed the `-C no_integrated_as` flag from rustc.][70345]
296 - [The `file_name` property in JSON output of macro errors now points the actual
297   source file rather than the previous format of `<NAME macros>`.][70969]
298   **Note:** this may not point to a file that actually exists on the user's system.
299 - [The minimum required external LLVM version has been bumped to LLVM 8.][71147]
300 - [`mem::{zeroed, uninitialised}` will now panic when used with types that do
301   not allow zero initialization such as `NonZeroU8`.][66059] This was
302   previously a warning.
303 - [In 1.45.0 (the next release) converting a `f64` to `u32` using the `as`
304   operator has been defined as a saturating operation.][71269] This was previously
305   undefined behaviour, but you can use the `{f64, f32}::to_int_unchecked` methods to
306   continue using the current behaviour, which may be desirable in rare performance
307   sensitive situations.
308
309 Internal Only
310 -------------
311 These changes provide no direct user facing benefits, but represent significant
312 improvements to the internals and overall performance of rustc and
313 related tools.
314
315 - [dep_graph Avoid allocating a set on when the number reads are small.][69778]
316 - [Replace big JS dict with JSON parsing.][71250]
317
318 [69373]: https://github.com/rust-lang/rust/pull/69373/
319 [66059]: https://github.com/rust-lang/rust/pull/66059/
320 [68191]: https://github.com/rust-lang/rust/pull/68191/
321 [68899]: https://github.com/rust-lang/rust/pull/68899/
322 [71147]: https://github.com/rust-lang/rust/pull/71147/
323 [71250]: https://github.com/rust-lang/rust/pull/71250/
324 [70937]: https://github.com/rust-lang/rust/pull/70937/
325 [70969]: https://github.com/rust-lang/rust/pull/70969/
326 [70632]: https://github.com/rust-lang/rust/pull/70632/
327 [70281]: https://github.com/rust-lang/rust/pull/70281/
328 [70345]: https://github.com/rust-lang/rust/pull/70345/
329 [70048]: https://github.com/rust-lang/rust/pull/70048/
330 [70081]: https://github.com/rust-lang/rust/pull/70081/
331 [70156]: https://github.com/rust-lang/rust/pull/70156/
332 [71269]: https://github.com/rust-lang/rust/pull/71269/
333 [69838]: https://github.com/rust-lang/rust/pull/69838/
334 [69929]: https://github.com/rust-lang/rust/pull/69929/
335 [69661]: https://github.com/rust-lang/rust/pull/69661/
336 [69778]: https://github.com/rust-lang/rust/pull/69778/
337 [69494]: https://github.com/rust-lang/rust/pull/69494/
338 [69403]: https://github.com/rust-lang/rust/pull/69403/
339 [69033]: https://github.com/rust-lang/rust/pull/69033/
340 [68692]: https://github.com/rust-lang/rust/pull/68692/
341 [68334]: https://github.com/rust-lang/rust/pull/68334/
342 [67502]: https://github.com/rust-lang/rust/pull/67502/
343 [cargo/8062]: https://github.com/rust-lang/cargo/pull/8062/
344 [`PathBuf::with_capacity`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.with_capacity
345 [`PathBuf::capacity`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.capacity
346 [`PathBuf::clear`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.clear
347 [`PathBuf::reserve`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.reserve
348 [`PathBuf::reserve_exact`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.reserve_exact
349 [`PathBuf::shrink_to_fit`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.shrink_to_fit
350 [`f32::to_int_unchecked`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_int_unchecked
351 [`f64::to_int_unchecked`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_int_unchecked
352 [`Layout::align_to`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html#method.align_to
353 [`Layout::pad_to_align`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html#method.pad_to_align
354 [`Layout::array`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html#method.array
355 [`Layout::extend`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html#method.extend
356
357
358 Version 1.43.1 (2020-05-07)
359 ===========================
360
361 * [Updated openssl-src to 1.1.1g for CVE-2020-1967.][71430]
362 * [Fixed the stabilization of AVX-512 features.][71473]
363 * [Fixed `cargo package --list` not working with unpublished dependencies.][cargo/8151]
364
365 [71430]: https://github.com/rust-lang/rust/pull/71430
366 [71473]: https://github.com/rust-lang/rust/issues/71473
367 [cargo/8151]: https://github.com/rust-lang/cargo/issues/8151
368
369
370 Version 1.43.0 (2020-04-23)
371 ==========================
372
373 Language
374 --------
375 - [Fixed using binary operations with `&{number}` (e.g. `&1.0`) not having
376   the type inferred correctly.][68129]
377 - [Attributes such as `#[cfg()]` can now be used on `if` expressions.][69201]
378
379 **Syntax only changes**
380 - [Allow `type Foo: Ord` syntactically.][69361]
381 - [Fuse associated and extern items up to defaultness.][69194]
382 - [Syntactically allow `self` in all `fn` contexts.][68764]
383 - [Merge `fn` syntax + cleanup item parsing.][68728]
384 - [`item` macro fragments can be interpolated into `trait`s, `impl`s, and `extern` blocks.][69366]
385   For example, you may now write:
386   ```rust
387   macro_rules! mac_trait {
388       ($i:item) => {
389           trait T { $i }
390       }
391   }
392   mac_trait! {
393       fn foo() {}
394   }
395   ```
396
397 These are still rejected *semantically*, so you will likely receive an error but
398 these changes can be seen and parsed by macros and
399 conditional compilation.
400
401
402 Compiler
403 --------
404 - [You can now pass multiple lint flags to rustc to override the previous
405   flags.][67885] For example; `rustc -D unused -A unused-variables` denies
406   everything in the `unused` lint group except `unused-variables` which
407   is explicitly allowed. However, passing `rustc -A unused-variables -D unused` denies
408   everything in the `unused` lint group **including** `unused-variables` since
409   the allow flag is specified before the deny flag (and therefore overridden).
410 - [rustc will now prefer your system MinGW libraries over its bundled libraries
411   if they are available on `windows-gnu`.][67429]
412 - [rustc now buffers errors/warnings printed in JSON.][69227]
413
414 Libraries
415 ---------
416 - [`Arc<[T; N]>`, `Box<[T; N]>`, and `Rc<[T; N]>`, now implement
417   `TryFrom<Arc<[T]>>`,`TryFrom<Box<[T]>>`, and `TryFrom<Rc<[T]>>`
418   respectively.][69538] **Note** These conversions are only available when `N`
419   is `0..=32`.
420 - [You can now use associated constants on floats and integers directly, rather
421   than having to import the module.][68952] e.g. You can now write `u32::MAX` or
422   `f32::NAN` with no imports.
423 - [`u8::is_ascii` is now `const`.][68984]
424 - [`String` now implements `AsMut<str>`.][68742]
425 - [Added the `primitive` module to `std` and `core`.][67637] This module
426   reexports Rust's primitive types. This is mainly useful in macros
427   where you want avoid these types being shadowed.
428 - [Relaxed some of the trait bounds on `HashMap` and `HashSet`.][67642]
429 - [`string::FromUtf8Error` now implements `Clone + Eq`.][68738]
430
431 Stabilized APIs
432 ---------------
433 - [`Once::is_completed`]
434 - [`f32::LOG10_2`]
435 - [`f32::LOG2_10`]
436 - [`f64::LOG10_2`]
437 - [`f64::LOG2_10`]
438 - [`iter::once_with`]
439
440 Cargo
441 -----
442 - [You can now set config `[profile]`s in your `.cargo/config`, or through
443   your environment.][cargo/7823]
444 - [Cargo will now set `CARGO_BIN_EXE_<name>` pointing to a binary's
445   executable path when running integration tests or benchmarks.][cargo/7697]
446   `<name>` is the name of your binary as-is e.g. If you wanted the executable
447   path for a binary named `my-program`you would use `env!("CARGO_BIN_EXE_my-program")`.
448
449 Misc
450 ----
451 - [Certain checks in the `const_err` lint were deemed unrelated to const
452   evaluation][69185], and have been moved to the `unconditional_panic` and
453   `arithmetic_overflow` lints.
454
455 Compatibility Notes
456 -------------------
457
458 - [Having trailing syntax in the `assert!` macro is now a hard error.][69548] This
459   has been a warning since 1.36.0.
460 - [Fixed `Self` not having the correctly inferred type.][69340] This incorrectly
461   led to some instances being accepted, and now correctly emits a hard error.
462
463 [69340]: https://github.com/rust-lang/rust/pull/69340
464
465 Internal Only
466 -------------
467 These changes provide no direct user facing benefits, but represent significant
468 improvements to the internals and overall performance of `rustc` and
469 related tools.
470
471 - [All components are now built with `opt-level=3` instead of `2`.][67878]
472 - [Improved how rustc generates drop code.][67332]
473 - [Improved performance from `#[inline]`-ing certain hot functions.][69256]
474 - [traits: preallocate 2 Vecs of known initial size][69022]
475 - [Avoid exponential behaviour when relating types][68772]
476 - [Skip `Drop` terminators for enum variants without drop glue][68943]
477 - [Improve performance of coherence checks][68966]
478 - [Deduplicate types in the generator witness][68672]
479 - [Invert control in struct_lint_level.][68725]
480
481 [67332]: https://github.com/rust-lang/rust/pull/67332/
482 [67429]: https://github.com/rust-lang/rust/pull/67429/
483 [67637]: https://github.com/rust-lang/rust/pull/67637/
484 [67642]: https://github.com/rust-lang/rust/pull/67642/
485 [67878]: https://github.com/rust-lang/rust/pull/67878/
486 [67885]: https://github.com/rust-lang/rust/pull/67885/
487 [68129]: https://github.com/rust-lang/rust/pull/68129/
488 [68672]: https://github.com/rust-lang/rust/pull/68672/
489 [68725]: https://github.com/rust-lang/rust/pull/68725/
490 [68728]: https://github.com/rust-lang/rust/pull/68728/
491 [68738]: https://github.com/rust-lang/rust/pull/68738/
492 [68742]: https://github.com/rust-lang/rust/pull/68742/
493 [68764]: https://github.com/rust-lang/rust/pull/68764/
494 [68772]: https://github.com/rust-lang/rust/pull/68772/
495 [68943]: https://github.com/rust-lang/rust/pull/68943/
496 [68952]: https://github.com/rust-lang/rust/pull/68952/
497 [68966]: https://github.com/rust-lang/rust/pull/68966/
498 [68984]: https://github.com/rust-lang/rust/pull/68984/
499 [69022]: https://github.com/rust-lang/rust/pull/69022/
500 [69185]: https://github.com/rust-lang/rust/pull/69185/
501 [69194]: https://github.com/rust-lang/rust/pull/69194/
502 [69201]: https://github.com/rust-lang/rust/pull/69201/
503 [69227]: https://github.com/rust-lang/rust/pull/69227/
504 [69548]: https://github.com/rust-lang/rust/pull/69548/
505 [69256]: https://github.com/rust-lang/rust/pull/69256/
506 [69361]: https://github.com/rust-lang/rust/pull/69361/
507 [69366]: https://github.com/rust-lang/rust/pull/69366/
508 [69538]: https://github.com/rust-lang/rust/pull/69538/
509 [cargo/7823]: https://github.com/rust-lang/cargo/pull/7823
510 [cargo/7697]: https://github.com/rust-lang/cargo/pull/7697
511 [`Once::is_completed`]: https://doc.rust-lang.org/std/sync/struct.Once.html#method.is_completed
512 [`f32::LOG10_2`]: https://doc.rust-lang.org/std/f32/consts/constant.LOG10_2.html
513 [`f32::LOG2_10`]: https://doc.rust-lang.org/std/f32/consts/constant.LOG2_10.html
514 [`f64::LOG10_2`]: https://doc.rust-lang.org/std/f64/consts/constant.LOG10_2.html
515 [`f64::LOG2_10`]: https://doc.rust-lang.org/std/f64/consts/constant.LOG2_10.html
516 [`iter::once_with`]: https://doc.rust-lang.org/std/iter/fn.once_with.html
517
518
519 Version 1.42.0 (2020-03-12)
520 ==========================
521
522 Language
523 --------
524 - [You can now use the slice pattern syntax with subslices.][67712] e.g.
525   ```rust
526   fn foo(words: &[&str]) {
527       match words {
528           ["Hello", "World", "!", ..] => println!("Hello World!"),
529           ["Foo", "Bar", ..] => println!("Baz"),
530           rest => println!("{:?}", rest),
531       }
532   }
533   ```
534 - [You can now use `#[repr(transparent)]` on univariant `enum`s.][68122] Meaning
535   that you can create an enum that has the exact layout and ABI of the type
536   it contains.
537 - [There are some *syntax-only* changes:][67131]
538    - `default` is syntactically allowed before items in `trait` definitions.
539    - Items in `impl`s (i.e. `const`s, `type`s, and `fn`s) may syntactically
540      leave out their bodies in favor of `;`.
541    - Bounds on associated types in `impl`s are now syntactically allowed
542      (e.g. `type Foo: Ord;`).
543    - `...` (the C-variadic type) may occur syntactically directly as the type of
544       any function parameter.
545
546   These are still rejected *semantically*, so you will likely receive an error
547   but these changes can be seen and parsed by procedural macros and
548   conditional compilation.
549
550 Compiler
551 --------
552 - [Added tier 2\* support for `armv7a-none-eabi`.][68253]
553 - [Added tier 2 support for `riscv64gc-unknown-linux-gnu`.][68339]
554 - [`Option::{expect,unwrap}` and
555    `Result::{expect, expect_err, unwrap, unwrap_err}` now produce panic messages
556    pointing to the location where they were called, rather than
557    `core`'s internals. ][67887]
558
559 \* Refer to Rust's [platform support page][forge-platform-support] for more
560 information on Rust's tiered platform support.
561
562 Libraries
563 ---------
564 - [`iter::Empty<T>` now implements `Send` and `Sync` for any `T`.][68348]
565 - [`Pin::{map_unchecked, map_unchecked_mut}` no longer require the return type
566    to implement `Sized`.][67935]
567 - [`io::Cursor` now derives `PartialEq` and `Eq`.][67233]
568 - [`Layout::new` is now `const`.][66254]
569 - [Added Standard Library support for `riscv64gc-unknown-linux-gnu`.][66899]
570
571
572 Stabilized APIs
573 ---------------
574 - [`CondVar::wait_while`]
575 - [`CondVar::wait_timeout_while`]
576 - [`DebugMap::key`]
577 - [`DebugMap::value`]
578 - [`ManuallyDrop::take`]
579 - [`matches!`]
580 - [`ptr::slice_from_raw_parts_mut`]
581 - [`ptr::slice_from_raw_parts`]
582
583 Cargo
584 -----
585 - [You no longer need to include `extern crate proc_macro;` to be able to
586   `use proc_macro;` in the `2018` edition.][cargo/7700]
587
588 Compatibility Notes
589 -------------------
590 - [`Error::description` has been deprecated, and its use will now produce a
591   warning.][66919] It's recommended to use `Display`/`to_string` instead.
592
593 [68253]: https://github.com/rust-lang/rust/pull/68253/
594 [68348]: https://github.com/rust-lang/rust/pull/68348/
595 [67935]: https://github.com/rust-lang/rust/pull/67935/
596 [68339]: https://github.com/rust-lang/rust/pull/68339/
597 [68122]: https://github.com/rust-lang/rust/pull/68122/
598 [67712]: https://github.com/rust-lang/rust/pull/67712/
599 [67887]: https://github.com/rust-lang/rust/pull/67887/
600 [67131]: https://github.com/rust-lang/rust/pull/67131/
601 [67233]: https://github.com/rust-lang/rust/pull/67233/
602 [66899]: https://github.com/rust-lang/rust/pull/66899/
603 [66919]: https://github.com/rust-lang/rust/pull/66919/
604 [66254]: https://github.com/rust-lang/rust/pull/66254/
605 [cargo/7700]: https://github.com/rust-lang/cargo/pull/7700
606 [`DebugMap::key`]: https://doc.rust-lang.org/stable/std/fmt/struct.DebugMap.html#method.key
607 [`DebugMap::value`]: https://doc.rust-lang.org/stable/std/fmt/struct.DebugMap.html#method.value
608 [`ManuallyDrop::take`]: https://doc.rust-lang.org/stable/std/mem/struct.ManuallyDrop.html#method.take
609 [`matches!`]: https://doc.rust-lang.org/stable/std/macro.matches.html
610 [`ptr::slice_from_raw_parts_mut`]: https://doc.rust-lang.org/stable/std/ptr/fn.slice_from_raw_parts_mut.html
611 [`ptr::slice_from_raw_parts`]: https://doc.rust-lang.org/stable/std/ptr/fn.slice_from_raw_parts.html
612 [`CondVar::wait_while`]: https://doc.rust-lang.org/stable/std/sync/struct.Condvar.html#method.wait_while
613 [`CondVar::wait_timeout_while`]: https://doc.rust-lang.org/stable/std/sync/struct.Condvar.html#method.wait_timeout_while
614
615
616 Version 1.41.1 (2020-02-27)
617 ===========================
618
619 * [Always check types of static items][69145]
620 * [Always check lifetime bounds of `Copy` impls][69145]
621 * [Fix miscompilation in callers of `Layout::repeat`][69225]
622
623 [69225]: https://github.com/rust-lang/rust/issues/69225
624 [69145]: https://github.com/rust-lang/rust/pull/69145
625
626
627 Version 1.41.0 (2020-01-30)
628 ===========================
629
630 Language
631 --------
632
633 - [You can now pass type parameters to foreign items when implementing
634   traits.][65879] E.g. You can now write `impl<T> From<Foo> for Vec<T> {}`.
635 - [You can now arbitrarily nest receiver types in the `self` position.][64325] E.g. you can
636   now write `fn foo(self: Box<Box<Self>>) {}`. Previously only `Self`, `&Self`,
637   `&mut Self`, `Arc<Self>`, `Rc<Self>`, and `Box<Self>` were allowed.
638 - [You can now use any valid identifier in a `format_args` macro.][66847]
639   Previously identifiers starting with an underscore were not allowed.
640 - [Visibility modifiers (e.g. `pub`) are now syntactically allowed on trait items and
641   enum variants.][66183] These are still rejected semantically, but
642   can be seen and parsed by procedural macros and conditional compilation.
643
644 Compiler
645 --------
646
647 - [Rustc will now warn if you have unused loop `'label`s.][66325]
648 - [Removed support for the `i686-unknown-dragonfly` target.][67255]
649 - [Added tier 3 support\* for the `riscv64gc-unknown-linux-gnu` target.][66661]
650 - [You can now pass an arguments file passing the `@path` syntax
651   to rustc.][66172] Note that the format differs somewhat from what is
652   found in other tooling; please see [the documentation][argfile-docs] for
653   more information.
654 - [You can now provide `--extern` flag without a path, indicating that it is
655   available from the search path or specified with an `-L` flag.][64882]
656
657 \* Refer to Rust's [platform support page][forge-platform-support] for more
658 information on Rust's tiered platform support.
659
660 [argfile-docs]: https://doc.rust-lang.org/nightly/rustc/command-line-arguments.html#path-load-command-line-flags-from-a-path
661
662 Libraries
663 ---------
664
665 - [The `core::panic` module is now stable.][66771] It was already stable
666   through `std`.
667 - [`NonZero*` numerics now implement `From<NonZero*>` if it's a smaller integer
668   width.][66277] E.g. `NonZeroU16` now implements `From<NonZeroU8>`.
669 - [`MaybeUninit<T>` now implements `fmt::Debug`.][65013]
670
671 Stabilized APIs
672 ---------------
673
674 - [`Result::map_or`]
675 - [`Result::map_or_else`]
676 - [`std::rc::Weak::weak_count`]
677 - [`std::rc::Weak::strong_count`]
678 - [`std::sync::Weak::weak_count`]
679 - [`std::sync::Weak::strong_count`]
680
681 Cargo
682 -----
683
684 - [Cargo will now document all the private items for binary crates
685   by default.][cargo/7593]
686 - [`cargo-install` will now reinstall the package if it detects that it is out
687   of date.][cargo/7560]
688 - [Cargo.lock now uses a more git friendly format that should help to reduce
689   merge conflicts.][cargo/7579]
690 - [You can now override specific dependencies's build settings][cargo/7591] E.g.
691   `[profile.dev.package.image] opt-level = 2` sets the `image` crate's
692   optimisation level to `2` for debug builds. You can also use
693   `[profile.<profile>.build-override]` to override build scripts and
694   their dependencies.
695
696 Misc
697 ----
698
699 - [You can now specify `edition` in documentation code blocks to compile the block
700   for that edition.][66238] E.g. `edition2018` tells rustdoc that the code sample
701   should be compiled the 2018 edition of Rust.
702 - [You can now provide custom themes to rustdoc with `--theme`, and check the
703   current theme with `--check-theme`.][54733]
704 - [You can use `#[cfg(doc)]` to compile an item when building documentation.][61351]
705
706 Compatibility Notes
707 -------------------
708
709 - [As previously announced 1.41.0 will be the last tier 1 release for 32-bit
710   Apple targets.][apple-32bit-drop] This means that the source code is still
711   available to build, but the targets are no longer being tested and release
712   binaries for those platforms will no longer be distributed by the Rust project.
713   Please refer to the linked blog post for more information.
714
715 [54733]: https://github.com/rust-lang/rust/pull/54733/
716 [61351]: https://github.com/rust-lang/rust/pull/61351/
717 [67255]: https://github.com/rust-lang/rust/pull/67255/
718 [66661]: https://github.com/rust-lang/rust/pull/66661/
719 [66771]: https://github.com/rust-lang/rust/pull/66771/
720 [66847]: https://github.com/rust-lang/rust/pull/66847/
721 [66238]: https://github.com/rust-lang/rust/pull/66238/
722 [66277]: https://github.com/rust-lang/rust/pull/66277/
723 [66325]: https://github.com/rust-lang/rust/pull/66325/
724 [66172]: https://github.com/rust-lang/rust/pull/66172/
725 [66183]: https://github.com/rust-lang/rust/pull/66183/
726 [65879]: https://github.com/rust-lang/rust/pull/65879/
727 [65013]: https://github.com/rust-lang/rust/pull/65013/
728 [64882]: https://github.com/rust-lang/rust/pull/64882/
729 [64325]: https://github.com/rust-lang/rust/pull/64325/
730 [cargo/7560]: https://github.com/rust-lang/cargo/pull/7560/
731 [cargo/7579]: https://github.com/rust-lang/cargo/pull/7579/
732 [cargo/7591]: https://github.com/rust-lang/cargo/pull/7591/
733 [cargo/7593]: https://github.com/rust-lang/cargo/pull/7593/
734 [`Result::map_or_else`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.map_or_else
735 [`Result::map_or`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.map_or
736 [`std::rc::Weak::weak_count`]: https://doc.rust-lang.org/std/rc/struct.Weak.html#method.weak_count
737 [`std::rc::Weak::strong_count`]: https://doc.rust-lang.org/std/rc/struct.Weak.html#method.strong_count
738 [`std::sync::Weak::weak_count`]: https://doc.rust-lang.org/std/sync/struct.Weak.html#method.weak_count
739 [`std::sync::Weak::strong_count`]: https://doc.rust-lang.org/std/sync/struct.Weak.html#method.strong_count
740 [apple-32bit-drop]: https://blog.rust-lang.org/2020/01/03/reducing-support-for-32-bit-apple-targets.html
741
742 Version 1.40.0 (2019-12-19)
743 ===========================
744
745 Language
746 --------
747 - [You can now use tuple `struct`s and tuple `enum` variant's constructors in
748   `const` contexts.][65188] e.g.
749
750   ```rust
751   pub struct Point(i32, i32);
752
753   const ORIGIN: Point = {
754       let constructor = Point;
755
756       constructor(0, 0)
757   };
758   ```
759
760 - [You can now mark `struct`s, `enum`s, and `enum` variants with the `#[non_exhaustive]` attribute to
761   indicate that there may be variants or fields added in the future.][64639]
762   For example this requires adding a wild-card branch (`_ => {}`) to any match
763   statements on a non-exhaustive `enum`. [(RFC 2008)]
764 - [You can now use function-like procedural macros in `extern` blocks and in
765   type positions.][63931] e.g. `type Generated = macro!();`
766 - [Function-like and attribute procedural macros can now emit
767   `macro_rules!` items, so you can now have your macros generate macros.][64035]
768 - [The `meta` pattern matcher in `macro_rules!` now correctly matches the modern
769   attribute syntax.][63674] For example `(#[$m:meta])` now matches `#[attr]`,
770   `#[attr{tokens}]`, `#[attr[tokens]]`, and `#[attr(tokens)]`.
771
772 Compiler
773 --------
774 - [Added tier 3 support\* for the
775   `thumbv7neon-unknown-linux-musleabihf` target.][66103]
776 - [Added tier 3 support for the
777   `aarch64-unknown-none-softfloat` target.][64589]
778 - [Added tier 3 support for the `mips64-unknown-linux-muslabi64`, and
779   `mips64el-unknown-linux-muslabi64` targets.][65843]
780
781 \* Refer to Rust's [platform support page][forge-platform-support] for more
782   information on Rust's tiered platform support.
783
784 Libraries
785 ---------
786 - [The `is_power_of_two` method on unsigned numeric types is now a `const` function.][65092]
787
788 Stabilized APIs
789 ---------------
790 - [`BTreeMap::get_key_value`]
791 - [`HashMap::get_key_value`]
792 - [`Option::as_deref_mut`]
793 - [`Option::as_deref`]
794 - [`Option::flatten`]
795 - [`UdpSocket::peer_addr`]
796 - [`f32::to_be_bytes`]
797 - [`f32::to_le_bytes`]
798 - [`f32::to_ne_bytes`]
799 - [`f64::to_be_bytes`]
800 - [`f64::to_le_bytes`]
801 - [`f64::to_ne_bytes`]
802 - [`f32::from_be_bytes`]
803 - [`f32::from_le_bytes`]
804 - [`f32::from_ne_bytes`]
805 - [`f64::from_be_bytes`]
806 - [`f64::from_le_bytes`]
807 - [`f64::from_ne_bytes`]
808 - [`mem::take`]
809 - [`slice::repeat`]
810 - [`todo!`]
811
812 Cargo
813 -----
814 - [Cargo will now always display warnings, rather than only on
815   fresh builds.][cargo/7450]
816 - [Feature flags (except `--all-features`) passed to a virtual workspace will
817   now produce an error.][cargo/7507] Previously these flags were ignored.
818 - [You can now publish `dev-dependencies` without including
819   a `version`.][cargo/7333]
820
821 Misc
822 ----
823 - [You can now specify the `#[cfg(doctest)]` attribute to include an item only
824   when running documentation tests with `rustdoc`.][63803]
825
826 Compatibility Notes
827 -------------------
828 - [As previously announced, any previous NLL warnings in the 2015 edition are
829   now hard errors.][64221]
830 - [The `include!` macro will now warn if it failed to include the
831   entire file.][64284] The `include!` macro unintentionally only includes the
832   first _expression_ in a file, and this can be unintuitive. This will become
833   either a hard error in a future release, or the behavior may be fixed to include all expressions as expected.
834 - [Using `#[inline]` on function prototypes and consts now emits a warning under
835   `unused_attribute` lint.][65294] Using `#[inline]` anywhere else inside traits
836   or `extern` blocks now correctly emits a hard error.
837
838 [65294]: https://github.com/rust-lang/rust/pull/65294/
839 [66103]: https://github.com/rust-lang/rust/pull/66103/
840 [65843]: https://github.com/rust-lang/rust/pull/65843/
841 [65188]: https://github.com/rust-lang/rust/pull/65188/
842 [65092]: https://github.com/rust-lang/rust/pull/65092/
843 [64589]: https://github.com/rust-lang/rust/pull/64589/
844 [64639]: https://github.com/rust-lang/rust/pull/64639/
845 [64221]: https://github.com/rust-lang/rust/pull/64221/
846 [64284]: https://github.com/rust-lang/rust/pull/64284/
847 [63931]: https://github.com/rust-lang/rust/pull/63931/
848 [64035]: https://github.com/rust-lang/rust/pull/64035/
849 [63674]: https://github.com/rust-lang/rust/pull/63674/
850 [63803]: https://github.com/rust-lang/rust/pull/63803/
851 [cargo/7450]: https://github.com/rust-lang/cargo/pull/7450/
852 [cargo/7507]: https://github.com/rust-lang/cargo/pull/7507/
853 [cargo/7525]: https://github.com/rust-lang/cargo/pull/7525/
854 [cargo/7333]: https://github.com/rust-lang/cargo/pull/7333/
855 [(rfc 2008)]: https://rust-lang.github.io/rfcs/2008-non-exhaustive.html
856 [`f32::to_be_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_be_bytes
857 [`f32::to_le_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_le_bytes
858 [`f32::to_ne_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_ne_bytes
859 [`f64::to_be_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_be_bytes
860 [`f64::to_le_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_le_bytes
861 [`f64::to_ne_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_ne_bytes
862 [`f32::from_be_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.from_be_bytes
863 [`f32::from_le_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.from_le_bytes
864 [`f32::from_ne_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.from_ne_bytes
865 [`f64::from_be_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.from_be_bytes
866 [`f64::from_le_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.from_le_bytes
867 [`f64::from_ne_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.from_ne_bytes
868 [`option::flatten`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.flatten
869 [`option::as_deref`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.as_deref
870 [`option::as_deref_mut`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.as_deref_mut
871 [`hashmap::get_key_value`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.get_key_value
872 [`btreemap::get_key_value`]: https://doc.rust-lang.org/std/collections/struct.BTreeMap.html#method.get_key_value
873 [`slice::repeat`]: https://doc.rust-lang.org/std/primitive.slice.html#method.repeat
874 [`mem::take`]: https://doc.rust-lang.org/std/mem/fn.take.html
875 [`udpsocket::peer_addr`]: https://doc.rust-lang.org/std/net/struct.UdpSocket.html#method.peer_addr
876 [`todo!`]: https://doc.rust-lang.org/std/macro.todo.html
877
878
879 Version 1.39.0 (2019-11-07)
880 ===========================
881
882 Language
883 --------
884 - [You can now create `async` functions and blocks with `async fn`, `async move {}`, and
885   `async {}` respectively, and you can now call `.await` on async expressions.][63209]
886 - [You can now use certain attributes on function, closure, and function pointer
887   parameters.][64010] These attributes include `cfg`, `cfg_attr`, `allow`, `warn`,
888   `deny`, `forbid` as well as inert helper attributes used by procedural macro
889   attributes applied to items. e.g.
890   ```rust
891   fn len(
892       #[cfg(windows)] slice: &[u16],
893       #[cfg(not(windows))] slice: &[u8],
894   ) -> usize {
895       slice.len()
896   }
897   ```
898 - [You can now take shared references to bind-by-move patterns in the `if` guards
899   of `match` arms.][63118] e.g.
900   ```rust
901   fn main() {
902       let array: Box<[u8; 4]> = Box::new([1, 2, 3, 4]);
903
904       match array {
905           nums
906   //      ---- `nums` is bound by move.
907               if nums.iter().sum::<u8>() == 10
908   //                 ^------ `.iter()` implicitly takes a reference to `nums`.
909           => {
910               drop(nums);
911   //          ----------- Legal as `nums` was bound by move and so we have ownership.
912           }
913           _ => unreachable!(),
914       }
915   }
916   ```
917
918
919
920 Compiler
921 --------
922 - [Added tier 3\* support for the `i686-unknown-uefi` target.][64334]
923 - [Added tier 3 support for the `sparc64-unknown-openbsd` target.][63595]
924 - [rustc will now trim code snippets in diagnostics to fit in your terminal.][63402]
925   **Note** Cargo currently doesn't use this feature. Refer to
926   [cargo#7315][cargo/7315] to track this feature's progress.
927 - [You can now pass `--show-output` argument to test binaries to print the
928   output of successful tests.][62600]
929
930
931 \* Refer to Rust's [platform support page][forge-platform-support] for more
932 information on Rust's tiered platform support.
933
934 Libraries
935 ---------
936 - [`Vec::new` and `String::new` are now `const` functions.][64028]
937 - [`LinkedList::new` is now a `const` function.][63684]
938 - [`str::len`, `[T]::len` and `str::as_bytes` are now `const` functions.][63770]
939 - [The `abs`, `wrapping_abs`, and `overflowing_abs` numeric functions are
940   now `const`.][63786]
941
942 Stabilized APIs
943 ---------------
944 - [`Pin::into_inner`]
945 - [`Instant::checked_duration_since`]
946 - [`Instant::saturating_duration_since`]
947
948 Cargo
949 -----
950 - [You can now publish git dependencies if supplied with a `version`.][cargo/7237]
951 - [The `--all` flag has been renamed to `--workspace`.][cargo/7241] Using
952   `--all` is now deprecated.
953
954 Misc
955 ----
956 - [You can now pass `-Clinker` to rustdoc to control the linker used
957   for compiling doctests.][63834]
958
959 Compatibility Notes
960 -------------------
961 - [Code that was previously accepted by the old borrow checker, but rejected by
962   the NLL borrow checker is now a hard error in Rust 2018.][63565] This was
963   previously a warning, and will also become a hard error in the Rust 2015
964   edition in the 1.40.0 release.
965 - [`rustdoc` now requires `rustc` to be installed and in the same directory to
966   run tests.][63827] This should improve performance when running a large
967   amount of doctests.
968 - [The `try!` macro will now issue a deprecation warning.][62672] It is
969   recommended to use the `?` operator instead.
970 - [`asinh(-0.0)` now correctly returns `-0.0`.][63698] Previously this
971   returned `0.0`.
972
973 [62600]: https://github.com/rust-lang/rust/pull/62600/
974 [62672]: https://github.com/rust-lang/rust/pull/62672/
975 [63118]: https://github.com/rust-lang/rust/pull/63118/
976 [63209]: https://github.com/rust-lang/rust/pull/63209/
977 [63402]: https://github.com/rust-lang/rust/pull/63402/
978 [63565]: https://github.com/rust-lang/rust/pull/63565/
979 [63595]: https://github.com/rust-lang/rust/pull/63595/
980 [63684]: https://github.com/rust-lang/rust/pull/63684/
981 [63698]: https://github.com/rust-lang/rust/pull/63698/
982 [63770]: https://github.com/rust-lang/rust/pull/63770/
983 [63786]: https://github.com/rust-lang/rust/pull/63786/
984 [63827]: https://github.com/rust-lang/rust/pull/63827/
985 [63834]: https://github.com/rust-lang/rust/pull/63834/
986 [63927]: https://github.com/rust-lang/rust/pull/63927/
987 [63933]: https://github.com/rust-lang/rust/pull/63933/
988 [63934]: https://github.com/rust-lang/rust/pull/63934/
989 [63938]: https://github.com/rust-lang/rust/pull/63938/
990 [63940]: https://github.com/rust-lang/rust/pull/63940/
991 [63941]: https://github.com/rust-lang/rust/pull/63941/
992 [63945]: https://github.com/rust-lang/rust/pull/63945/
993 [64010]: https://github.com/rust-lang/rust/pull/64010/
994 [64028]: https://github.com/rust-lang/rust/pull/64028/
995 [64334]: https://github.com/rust-lang/rust/pull/64334/
996 [cargo/7237]: https://github.com/rust-lang/cargo/pull/7237/
997 [cargo/7241]: https://github.com/rust-lang/cargo/pull/7241/
998 [cargo/7315]: https://github.com/rust-lang/cargo/pull/7315/
999 [`Pin::into_inner`]: https://doc.rust-lang.org/std/pin/struct.Pin.html#method.into_inner
1000 [`Instant::checked_duration_since`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.checked_duration_since
1001 [`Instant::saturating_duration_since`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.saturating_duration_since
1002
1003 Version 1.38.0 (2019-09-26)
1004 ==========================
1005
1006 Language
1007 --------
1008 - [The `#[global_allocator]` attribute can now be used in submodules.][62735]
1009 - [The `#[deprecated]` attribute can now be used on macros.][62042]
1010
1011 Compiler
1012 --------
1013 - [Added pipelined compilation support to `rustc`.][62766] This will
1014   improve compilation times in some cases. For further information please refer
1015   to the [_"Evaluating pipelined rustc compilation"_][pipeline-internals] thread.
1016 - [Added tier 3\* support for the `aarch64-uwp-windows-msvc`, `i686-uwp-windows-gnu`,
1017   `i686-uwp-windows-msvc`, `x86_64-uwp-windows-gnu`, and
1018   `x86_64-uwp-windows-msvc` targets.][60260]
1019 - [Added tier 3 support for the `armv7-unknown-linux-gnueabi` and
1020   `armv7-unknown-linux-musleabi` targets.][63107]
1021 - [Added tier 3 support for the `hexagon-unknown-linux-musl` target.][62814]
1022 - [Added tier 3 support for the `riscv32i-unknown-none-elf` target.][62784]
1023
1024 \* Refer to Rust's [platform support page][forge-platform-support] for more
1025 information on Rust's tiered platform support.
1026
1027 Libraries
1028 ---------
1029 - [`ascii::EscapeDefault` now implements `Clone` and `Display`.][63421]
1030 - [Derive macros for prelude traits (e.g. `Clone`, `Debug`, `Hash`) are now
1031   available at the same path as the trait.][63056] (e.g. The `Clone` derive macro
1032   is available at `std::clone::Clone`). This also makes all built-in macros
1033   available in `std`/`core` root. e.g. `std::include_bytes!`.
1034 - [`str::Chars` now implements `Debug`.][63000]
1035 - [`slice::{concat, connect, join}` now accepts `&[T]` in addition to `&T`.][62528]
1036 - [`*const T` and `*mut T` now implement `marker::Unpin`.][62583]
1037 - [`Arc<[T]>` and `Rc<[T]>` now implement `FromIterator<T>`.][61953]
1038 - [Added euclidean remainder and division operations (`div_euclid`,
1039   `rem_euclid`) to all numeric primitives.][61884] Additionally `checked`,
1040   `overflowing`, and `wrapping` versions are available for all
1041   integer primitives.
1042 - [`thread::AccessError` now implements `Clone`, `Copy`, `Eq`, `Error`, and
1043   `PartialEq`.][61491]
1044 - [`iter::{StepBy, Peekable, Take}` now implement `DoubleEndedIterator`.][61457]
1045
1046 Stabilized APIs
1047 ---------------
1048 - [`<*const T>::cast`]
1049 - [`<*mut T>::cast`]
1050 - [`Duration::as_secs_f32`]
1051 - [`Duration::as_secs_f64`]
1052 - [`Duration::div_f32`]
1053 - [`Duration::div_f64`]
1054 - [`Duration::from_secs_f32`]
1055 - [`Duration::from_secs_f64`]
1056 - [`Duration::mul_f32`]
1057 - [`Duration::mul_f64`]
1058 - [`any::type_name`]
1059
1060 Cargo
1061 -----
1062 - [Added pipelined compilation support to `cargo`.][cargo/7143]
1063 - [You can now pass the `--features` option multiple times to enable
1064   multiple features.][cargo/7084]
1065
1066 Misc
1067 ----
1068 - [`rustc` will now warn about some incorrect uses of
1069   `mem::{uninitialized, zeroed}` that are known to cause undefined behaviour.][63346]
1070
1071 Compatibility Notes
1072 -------------------
1073 - The [`x86_64-unknown-uefi` platform can not be built][62785] with rustc
1074   1.38.0.
1075 - The [`armv7-unknown-linux-gnueabihf` platform is known to have
1076   issues][62896] with certain crates such as libc.
1077
1078 [60260]: https://github.com/rust-lang/rust/pull/60260/
1079 [61457]: https://github.com/rust-lang/rust/pull/61457/
1080 [61491]: https://github.com/rust-lang/rust/pull/61491/
1081 [61884]: https://github.com/rust-lang/rust/pull/61884/
1082 [61953]: https://github.com/rust-lang/rust/pull/61953/
1083 [62042]: https://github.com/rust-lang/rust/pull/62042/
1084 [62528]: https://github.com/rust-lang/rust/pull/62528/
1085 [62583]: https://github.com/rust-lang/rust/pull/62583/
1086 [62735]: https://github.com/rust-lang/rust/pull/62735/
1087 [62766]: https://github.com/rust-lang/rust/pull/62766/
1088 [62784]: https://github.com/rust-lang/rust/pull/62784/
1089 [62785]: https://github.com/rust-lang/rust/issues/62785/
1090 [62814]: https://github.com/rust-lang/rust/pull/62814/
1091 [62896]: https://github.com/rust-lang/rust/issues/62896/
1092 [63000]: https://github.com/rust-lang/rust/pull/63000/
1093 [63056]: https://github.com/rust-lang/rust/pull/63056/
1094 [63107]: https://github.com/rust-lang/rust/pull/63107/
1095 [63346]: https://github.com/rust-lang/rust/pull/63346/
1096 [63421]: https://github.com/rust-lang/rust/pull/63421/
1097 [cargo/7084]: https://github.com/rust-lang/cargo/pull/7084/
1098 [cargo/7143]: https://github.com/rust-lang/cargo/pull/7143/
1099 [`<*const T>::cast`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.cast
1100 [`<*mut T>::cast`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.cast
1101 [`Duration::as_secs_f32`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_secs_f32
1102 [`Duration::as_secs_f64`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_secs_f64
1103 [`Duration::div_f32`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.div_f32
1104 [`Duration::div_f64`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.div_f64
1105 [`Duration::from_secs_f32`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.from_secs_f32
1106 [`Duration::from_secs_f64`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.from_secs_f64
1107 [`Duration::mul_f32`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.mul_f32
1108 [`Duration::mul_f64`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.mul_f64
1109 [`any::type_name`]: https://doc.rust-lang.org/std/any/fn.type_name.html
1110 [forge-platform-support]: https://forge.rust-lang.org/release/platform-support.html
1111 [pipeline-internals]: https://internals.rust-lang.org/t/evaluating-pipelined-rustc-compilation/10199
1112
1113 Version 1.37.0 (2019-08-15)
1114 ==========================
1115
1116 Language
1117 --------
1118 - `#[must_use]` will now warn if the type is contained in a [tuple][61100],
1119   [`Box`][62228], or an [array][62235] and unused.
1120 - [You can now use the `cfg` and `cfg_attr` attributes on
1121   generic parameters.][61547]
1122 - [You can now use enum variants through type alias.][61682] e.g. You can
1123   write the following:
1124   ```rust
1125   type MyOption = Option<u8>;
1126
1127   fn increment_or_zero(x: MyOption) -> u8 {
1128       match x {
1129           MyOption::Some(y) => y + 1,
1130           MyOption::None => 0,
1131       }
1132   }
1133   ```
1134 - [You can now use `_` as an identifier for consts.][61347] e.g. You can write
1135   `const _: u32 = 5;`.
1136 - [You can now use `#[repr(align(X)]` on enums.][61229]
1137 - [The  `?` Kleene macro operator is now available in the
1138   2015 edition.][60932]
1139
1140 Compiler
1141 --------
1142 - [You can now enable Profile-Guided Optimization with the `-C profile-generate`
1143   and `-C profile-use` flags.][61268] For more information on how to use profile
1144   guided optimization, please refer to the [rustc book][rustc-book-pgo].
1145 - [The `rust-lldb` wrapper script should now work again.][61827]
1146
1147 Libraries
1148 ---------
1149 - [`mem::MaybeUninit<T>` is now ABI-compatible with `T`.][61802]
1150
1151 Stabilized APIs
1152 ---------------
1153 - [`BufReader::buffer`]
1154 - [`BufWriter::buffer`]
1155 - [`Cell::from_mut`]
1156 - [`Cell<[T]>::as_slice_of_cells`][`Cell<slice>::as_slice_of_cells`]
1157 - [`DoubleEndedIterator::nth_back`]
1158 - [`Option::xor`]
1159 - [`Wrapping::reverse_bits`]
1160 - [`i128::reverse_bits`]
1161 - [`i16::reverse_bits`]
1162 - [`i32::reverse_bits`]
1163 - [`i64::reverse_bits`]
1164 - [`i8::reverse_bits`]
1165 - [`isize::reverse_bits`]
1166 - [`slice::copy_within`]
1167 - [`u128::reverse_bits`]
1168 - [`u16::reverse_bits`]
1169 - [`u32::reverse_bits`]
1170 - [`u64::reverse_bits`]
1171 - [`u8::reverse_bits`]
1172 - [`usize::reverse_bits`]
1173
1174 Cargo
1175 -----
1176 - [`Cargo.lock` files are now included by default when publishing executable crates
1177   with executables.][cargo/7026]
1178 - [You can now specify `default-run="foo"` in `[package]` to specify the
1179   default executable to use for `cargo run`.][cargo/7056]
1180
1181 Misc
1182 ----
1183
1184 Compatibility Notes
1185 -------------------
1186 - [Using `...` for inclusive range patterns will now warn by default.][61342]
1187   Please transition your code to using the `..=` syntax for inclusive
1188   ranges instead.
1189 - [Using a trait object without the `dyn` will now warn by default.][61203]
1190   Please transition your code to use `dyn Trait` for trait objects instead.
1191
1192 [62228]: https://github.com/rust-lang/rust/pull/62228/
1193 [62235]: https://github.com/rust-lang/rust/pull/62235/
1194 [61802]: https://github.com/rust-lang/rust/pull/61802/
1195 [61827]: https://github.com/rust-lang/rust/pull/61827/
1196 [61547]: https://github.com/rust-lang/rust/pull/61547/
1197 [61682]: https://github.com/rust-lang/rust/pull/61682/
1198 [61268]: https://github.com/rust-lang/rust/pull/61268/
1199 [61342]: https://github.com/rust-lang/rust/pull/61342/
1200 [61347]: https://github.com/rust-lang/rust/pull/61347/
1201 [61100]: https://github.com/rust-lang/rust/pull/61100/
1202 [61203]: https://github.com/rust-lang/rust/pull/61203/
1203 [61229]: https://github.com/rust-lang/rust/pull/61229/
1204 [60932]: https://github.com/rust-lang/rust/pull/60932/
1205 [cargo/7026]: https://github.com/rust-lang/cargo/pull/7026/
1206 [cargo/7056]: https://github.com/rust-lang/cargo/pull/7056/
1207 [`BufReader::buffer`]: https://doc.rust-lang.org/std/io/struct.BufReader.html#method.buffer
1208 [`BufWriter::buffer`]: https://doc.rust-lang.org/std/io/struct.BufWriter.html#method.buffer
1209 [`Cell::from_mut`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.from_mut
1210 [`Cell<slice>::as_slice_of_cells`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.as_slice_of_cells
1211 [`DoubleEndedIterator::nth_back`]: https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html#method.nth_back
1212 [`Option::xor`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.xor
1213 [`RefCell::try_borrow_unguarded`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.try_borrow_unguarded
1214 [`Wrapping::reverse_bits`]: https://doc.rust-lang.org/std/num/struct.Wrapping.html#method.reverse_bits
1215 [`i128::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i128.html#method.reverse_bits
1216 [`i16::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i16.html#method.reverse_bits
1217 [`i32::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i32.html#method.reverse_bits
1218 [`i64::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i64.html#method.reverse_bits
1219 [`i8::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i8.html#method.reverse_bits
1220 [`isize::reverse_bits`]: https://doc.rust-lang.org/std/primitive.isize.html#method.reverse_bits
1221 [`slice::copy_within`]: https://doc.rust-lang.org/std/primitive.slice.html#method.copy_within
1222 [`u128::reverse_bits`]: https://doc.rust-lang.org/std/primitive.u128.html#method.reverse_bits
1223 [`u16::reverse_bits`]: https://doc.rust-lang.org/std/primitive.u16.html#method.reverse_bits
1224 [`u32::reverse_bits`]: https://doc.rust-lang.org/std/primitive.u32.html#method.reverse_bits
1225 [`u64::reverse_bits`]: https://doc.rust-lang.org/std/primitive.u64.html#method.reverse_bits
1226 [`u8::reverse_bits`]: https://doc.rust-lang.org/std/primitive.u8.html#method.reverse_bits
1227 [`usize::reverse_bits`]: https://doc.rust-lang.org/std/primitive.usize.html#method.reverse_bits
1228 [rustc-book-pgo]: https://doc.rust-lang.org/rustc/profile-guided-optimization.html
1229
1230
1231 Version 1.36.0 (2019-07-04)
1232 ==========================
1233
1234 Language
1235 --------
1236 - [Non-Lexical Lifetimes are now enabled on the 2015 edition.][59114]
1237 - [The order of traits in trait objects no longer affects the semantics of that
1238   object.][59445] e.g. `dyn Send + fmt::Debug` is now equivalent to
1239   `dyn fmt::Debug + Send`, where this was previously not the case.
1240
1241 Libraries
1242 ---------
1243 - [`HashMap`'s implementation has been replaced with `hashbrown::HashMap` implementation.][58623]
1244 - [`TryFromSliceError` now implements `From<Infallible>`.][60318]
1245 - [`mem::needs_drop` is now available as a const fn.][60364]
1246 - [`alloc::Layout::from_size_align_unchecked` is now available as a const fn.][60370]
1247 - [`String` now implements `BorrowMut<str>`.][60404]
1248 - [`io::Cursor` now implements `Default`.][60234]
1249 - [Both `NonNull::{dangling, cast}` are now const fns.][60244]
1250 - [The `alloc` crate is now stable.][59675] `alloc` allows you to use a subset
1251   of `std` (e.g. `Vec`, `Box`, `Arc`) in `#![no_std]` environments if the
1252   environment has access to heap memory allocation.
1253 - [`String` now implements `From<&String>`.][59825]
1254 - [You can now pass multiple arguments to the `dbg!` macro.][59826] `dbg!` will
1255   return a tuple of each argument when there is multiple arguments.
1256 - [`Result::{is_err, is_ok}` are now `#[must_use]` and will produce a warning if
1257   not used.][59648]
1258
1259 Stabilized APIs
1260 ---------------
1261 - [`VecDeque::rotate_left`]
1262 - [`VecDeque::rotate_right`]
1263 - [`Iterator::copied`]
1264 - [`io::IoSlice`]
1265 - [`io::IoSliceMut`]
1266 - [`Read::read_vectored`]
1267 - [`Write::write_vectored`]
1268 - [`str::as_mut_ptr`]
1269 - [`mem::MaybeUninit`]
1270 - [`pointer::align_offset`]
1271 - [`future::Future`]
1272 - [`task::Context`]
1273 - [`task::RawWaker`]
1274 - [`task::RawWakerVTable`]
1275 - [`task::Waker`]
1276 - [`task::Poll`]
1277
1278 Cargo
1279 -----
1280 - [Cargo will now produce an error if you attempt to use the name of a required dependency as a feature.][cargo/6860]
1281 - [You can now pass the `--offline` flag to run cargo without accessing the network.][cargo/6934]
1282
1283 You can find further change's in [Cargo's 1.36.0 release notes][cargo-1-36-0].
1284
1285 Clippy
1286 ------
1287 There have been numerous additions and fixes to clippy, see [Clippy's 1.36.0 release notes][clippy-1-36-0] for more details.
1288
1289 Misc
1290 ----
1291
1292 Compatibility Notes
1293 -------------------
1294 - With the stabilisation of `mem::MaybeUninit`, `mem::uninitialized` use is no
1295   longer recommended, and will be deprecated in 1.39.0.
1296
1297 [60318]: https://github.com/rust-lang/rust/pull/60318/
1298 [60364]: https://github.com/rust-lang/rust/pull/60364/
1299 [60370]: https://github.com/rust-lang/rust/pull/60370/
1300 [60404]: https://github.com/rust-lang/rust/pull/60404/
1301 [60234]: https://github.com/rust-lang/rust/pull/60234/
1302 [60244]: https://github.com/rust-lang/rust/pull/60244/
1303 [58623]: https://github.com/rust-lang/rust/pull/58623/
1304 [59648]: https://github.com/rust-lang/rust/pull/59648/
1305 [59675]: https://github.com/rust-lang/rust/pull/59675/
1306 [59825]: https://github.com/rust-lang/rust/pull/59825/
1307 [59826]: https://github.com/rust-lang/rust/pull/59826/
1308 [59445]: https://github.com/rust-lang/rust/pull/59445/
1309 [59114]: https://github.com/rust-lang/rust/pull/59114/
1310 [cargo/6860]: https://github.com/rust-lang/cargo/pull/6860/
1311 [cargo/6934]: https://github.com/rust-lang/cargo/pull/6934/
1312 [`VecDeque::rotate_left`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.rotate_left
1313 [`VecDeque::rotate_right`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.rotate_right
1314 [`Iterator::copied`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#tymethod.copied
1315 [`io::IoSlice`]: https://doc.rust-lang.org/std/io/struct.IoSlice.html
1316 [`io::IoSliceMut`]: https://doc.rust-lang.org/std/io/struct.IoSliceMut.html
1317 [`Read::read_vectored`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_vectored
1318 [`Write::write_vectored`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_vectored
1319 [`str::as_mut_ptr`]: https://doc.rust-lang.org/std/primitive.str.html#method.as_mut_ptr
1320 [`mem::MaybeUninit`]: https://doc.rust-lang.org/std/mem/union.MaybeUninit.html
1321 [`pointer::align_offset`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.align_offset
1322 [`future::Future`]: https://doc.rust-lang.org/std/future/trait.Future.html
1323 [`task::Context`]: https://doc.rust-lang.org/beta/std/task/struct.Context.html
1324 [`task::RawWaker`]: https://doc.rust-lang.org/beta/std/task/struct.RawWaker.html
1325 [`task::RawWakerVTable`]: https://doc.rust-lang.org/beta/std/task/struct.RawWakerVTable.html
1326 [`task::Waker`]: https://doc.rust-lang.org/beta/std/task/struct.Waker.html
1327 [`task::Poll`]: https://doc.rust-lang.org/beta/std/task/enum.Poll.html
1328 [clippy-1-36-0]: https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-136
1329 [cargo-1-36-0]: https://github.com/rust-lang/cargo/blob/master/CHANGELOG.md#cargo-136-2019-07-04
1330
1331
1332 Version 1.35.0 (2019-05-23)
1333 ==========================
1334
1335 Language
1336 --------
1337 - [`FnOnce`, `FnMut`, and the `Fn` traits are now implemented for `Box<FnOnce>`,
1338   `Box<FnMut>`, and `Box<Fn>` respectively.][59500]
1339 - [You can now coerce closures into unsafe function pointers.][59580] e.g.
1340   ```rust
1341   unsafe fn call_unsafe(func: unsafe fn()) {
1342       func()
1343   }
1344
1345   pub fn main() {
1346       unsafe { call_unsafe(|| {}); }
1347   }
1348   ```
1349
1350
1351 Compiler
1352 --------
1353 - [Added the `armv6-unknown-freebsd-gnueabihf` and
1354   `armv7-unknown-freebsd-gnueabihf` targets.][58080]
1355 - [Added the `wasm32-unknown-wasi` target.][59464]
1356
1357
1358 Libraries
1359 ---------
1360 - [`Thread` will now show its ID in `Debug` output.][59460]
1361 - [`StdinLock`, `StdoutLock`, and `StderrLock` now implement `AsRawFd`.][59512]
1362 - [`alloc::System` now implements `Default`.][59451]
1363 - [Expanded `Debug` output (`{:#?}`) for structs now has a trailing comma on the
1364   last field.][59076]
1365 - [`char::{ToLowercase, ToUppercase}` now
1366   implement `ExactSizeIterator`.][58778]
1367 - [All `NonZero` numeric types now implement `FromStr`.][58717]
1368 - [Removed the `Read` trait bounds
1369   on the `BufReader::{get_ref, get_mut, into_inner}` methods.][58423]
1370 - [You can now call the `dbg!` macro without any parameters to print the file
1371   and line where it is called.][57847]
1372 - [In place ASCII case conversions are now up to 4× faster.][59283]
1373   e.g. `str::make_ascii_lowercase`
1374 - [`hash_map::{OccupiedEntry, VacantEntry}` now implement `Sync`
1375   and `Send`.][58369]
1376
1377 Stabilized APIs
1378 ---------------
1379 - [`f32::copysign`]
1380 - [`f64::copysign`]
1381 - [`RefCell::replace_with`]
1382 - [`RefCell::map_split`]
1383 - [`ptr::hash`]
1384 - [`Range::contains`]
1385 - [`RangeFrom::contains`]
1386 - [`RangeTo::contains`]
1387 - [`RangeInclusive::contains`]
1388 - [`RangeToInclusive::contains`]
1389 - [`Option::copied`]
1390
1391 Cargo
1392 -----
1393 - [You can now set `cargo:rustc-cdylib-link-arg` at build time to pass custom
1394   linker arguments when building a `cdylib`.][cargo/6298] Its usage is highly
1395   platform specific.
1396
1397 Misc
1398 ----
1399 - [The Rust toolchain is now available natively for musl based distros.][58575]
1400
1401 [59460]: https://github.com/rust-lang/rust/pull/59460/
1402 [59464]: https://github.com/rust-lang/rust/pull/59464/
1403 [59500]: https://github.com/rust-lang/rust/pull/59500/
1404 [59512]: https://github.com/rust-lang/rust/pull/59512/
1405 [59580]: https://github.com/rust-lang/rust/pull/59580/
1406 [59283]: https://github.com/rust-lang/rust/pull/59283/
1407 [59451]: https://github.com/rust-lang/rust/pull/59451/
1408 [59076]: https://github.com/rust-lang/rust/pull/59076/
1409 [58778]: https://github.com/rust-lang/rust/pull/58778/
1410 [58717]: https://github.com/rust-lang/rust/pull/58717/
1411 [58369]: https://github.com/rust-lang/rust/pull/58369/
1412 [58423]: https://github.com/rust-lang/rust/pull/58423/
1413 [58080]: https://github.com/rust-lang/rust/pull/58080/
1414 [57847]: https://github.com/rust-lang/rust/pull/57847/
1415 [58575]: https://github.com/rust-lang/rust/pull/58575
1416 [cargo/6298]: https://github.com/rust-lang/cargo/pull/6298/
1417 [`f32::copysign`]: https://doc.rust-lang.org/stable/std/primitive.f32.html#method.copysign
1418 [`f64::copysign`]: https://doc.rust-lang.org/stable/std/primitive.f64.html#method.copysign
1419 [`RefCell::replace_with`]: https://doc.rust-lang.org/stable/std/cell/struct.RefCell.html#method.replace_with
1420 [`RefCell::map_split`]: https://doc.rust-lang.org/stable/std/cell/struct.RefCell.html#method.map_split
1421 [`ptr::hash`]: https://doc.rust-lang.org/stable/std/ptr/fn.hash.html
1422 [`Range::contains`]: https://doc.rust-lang.org/std/ops/struct.Range.html#method.contains
1423 [`RangeFrom::contains`]: https://doc.rust-lang.org/std/ops/struct.RangeFrom.html#method.contains
1424 [`RangeTo::contains`]: https://doc.rust-lang.org/std/ops/struct.RangeTo.html#method.contains
1425 [`RangeInclusive::contains`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html#method.contains
1426 [`RangeToInclusive::contains`]: https://doc.rust-lang.org/std/ops/struct.RangeToInclusive.html#method.contains
1427 [`Option::copied`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.copied
1428
1429 Version 1.34.2 (2019-05-14)
1430 ===========================
1431
1432 * [Destabilize the `Error::type_id` function due to a security
1433    vulnerability][60785] ([CVE-2019-12083])
1434
1435 [60785]: https://github.com/rust-lang/rust/pull/60785
1436 [CVE-2019-12083]: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-12083
1437
1438 Version 1.34.1 (2019-04-25)
1439 ===========================
1440
1441 * [Fix false positives for the `redundant_closure` Clippy lint][clippy/3821]
1442 * [Fix false positives for the `missing_const_for_fn` Clippy lint][clippy/3844]
1443 * [Fix Clippy panic when checking some macros][clippy/3805]
1444
1445 [clippy/3821]: https://github.com/rust-lang/rust-clippy/pull/3821
1446 [clippy/3844]: https://github.com/rust-lang/rust-clippy/pull/3844
1447 [clippy/3805]: https://github.com/rust-lang/rust-clippy/pull/3805
1448
1449 Version 1.34.0 (2019-04-11)
1450 ==========================
1451
1452 Language
1453 --------
1454 - [You can now use `#[deprecated = "reason"]`][58166] as a shorthand for
1455   `#[deprecated(note = "reason")]`. This was previously allowed by mistake
1456   but had no effect.
1457 - [You can now accept token streams in `#[attr()]`,`#[attr[]]`, and
1458   `#[attr{}]` procedural macros.][57367]
1459 - [You can now write `extern crate self as foo;`][57407] to import your
1460   crate's root into the extern prelude.
1461
1462
1463 Compiler
1464 --------
1465 - [You can now target `riscv64imac-unknown-none-elf` and
1466   `riscv64gc-unknown-none-elf`.][58406]
1467 - [You can now enable linker plugin LTO optimisations with
1468   `-C linker-plugin-lto`.][58057] This allows rustc to compile your Rust code
1469   into LLVM bitcode allowing LLVM to perform LTO optimisations across C/C++ FFI
1470   boundaries.
1471 - [You can now target `powerpc64-unknown-freebsd`.][57809]
1472
1473
1474 Libraries
1475 ---------
1476 - [The trait bounds have been removed on some of `HashMap<K, V, S>`'s and
1477   `HashSet<T, S>`'s basic methods.][58370] Most notably you no longer require
1478   the `Hash` trait to create an iterator.
1479 - [The `Ord` trait bounds have been removed on some of `BinaryHeap<T>`'s basic
1480   methods.][58421] Most notably you no longer require the `Ord` trait to create
1481   an iterator.
1482 - [The methods `overflowing_neg` and `wrapping_neg` are now `const` functions
1483   for all numeric types.][58044]
1484 - [Indexing a `str` is now generic over all types that
1485   implement `SliceIndex<str>`.][57604]
1486 - [`str::trim`, `str::trim_matches`, `str::trim_{start, end}`, and
1487   `str::trim_{start, end}_matches` are now `#[must_use]`][57106] and will
1488   produce a warning if their returning type is unused.
1489 - [The methods `checked_pow`, `saturating_pow`, `wrapping_pow`, and
1490   `overflowing_pow` are now available for all numeric types.][57873] These are
1491   equivalent to methods such as `wrapping_add` for the `pow` operation.
1492
1493
1494 Stabilized APIs
1495 ---------------
1496
1497 #### std & core
1498 * [`Any::type_id`]
1499 * [`Error::type_id`]
1500 * [`atomic::AtomicI16`]
1501 * [`atomic::AtomicI32`]
1502 * [`atomic::AtomicI64`]
1503 * [`atomic::AtomicI8`]
1504 * [`atomic::AtomicU16`]
1505 * [`atomic::AtomicU32`]
1506 * [`atomic::AtomicU64`]
1507 * [`atomic::AtomicU8`]
1508 * [`convert::Infallible`]
1509 * [`convert::TryFrom`]
1510 * [`convert::TryInto`]
1511 * [`iter::from_fn`]
1512 * [`iter::successors`]
1513 * [`num::NonZeroI128`]
1514 * [`num::NonZeroI16`]
1515 * [`num::NonZeroI32`]
1516 * [`num::NonZeroI64`]
1517 * [`num::NonZeroI8`]
1518 * [`num::NonZeroIsize`]
1519 * [`slice::sort_by_cached_key`]
1520 * [`str::escape_debug`]
1521 * [`str::escape_default`]
1522 * [`str::escape_unicode`]
1523 * [`str::split_ascii_whitespace`]
1524
1525 #### std
1526 * [`Instant::checked_add`]
1527 * [`Instant::checked_sub`]
1528 * [`SystemTime::checked_add`]
1529 * [`SystemTime::checked_sub`]
1530
1531 Cargo
1532 -----
1533 - [You can now use alternative registries to crates.io.][cargo/6654]
1534
1535 Misc
1536 ----
1537 - [You can now use the `?` operator in your documentation tests without manually
1538   adding `fn main() -> Result<(), _> {}`.][56470]
1539
1540 Compatibility Notes
1541 -------------------
1542 - [`Command::before_exec` is being replaced by the unsafe method
1543   `Command::pre_exec`][58059] and will be deprecated with Rust 1.37.0.
1544 - [Use of `ATOMIC_{BOOL, ISIZE, USIZE}_INIT` is now deprecated][57425] as you
1545   can now use `const` functions in `static` variables.
1546
1547 [58370]: https://github.com/rust-lang/rust/pull/58370/
1548 [58406]: https://github.com/rust-lang/rust/pull/58406/
1549 [58421]: https://github.com/rust-lang/rust/pull/58421/
1550 [58166]: https://github.com/rust-lang/rust/pull/58166/
1551 [58044]: https://github.com/rust-lang/rust/pull/58044/
1552 [58057]: https://github.com/rust-lang/rust/pull/58057/
1553 [58059]: https://github.com/rust-lang/rust/pull/58059/
1554 [57809]: https://github.com/rust-lang/rust/pull/57809/
1555 [57873]: https://github.com/rust-lang/rust/pull/57873/
1556 [57604]: https://github.com/rust-lang/rust/pull/57604/
1557 [57367]: https://github.com/rust-lang/rust/pull/57367/
1558 [57407]: https://github.com/rust-lang/rust/pull/57407/
1559 [57425]: https://github.com/rust-lang/rust/pull/57425/
1560 [57106]: https://github.com/rust-lang/rust/pull/57106/
1561 [56470]: https://github.com/rust-lang/rust/pull/56470/
1562 [cargo/6654]: https://github.com/rust-lang/cargo/pull/6654/
1563 [`Any::type_id`]: https://doc.rust-lang.org/std/any/trait.Any.html#tymethod.type_id
1564 [`Error::type_id`]: https://doc.rust-lang.org/std/error/trait.Error.html#method.type_id
1565 [`atomic::AtomicI16`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicI16.html
1566 [`atomic::AtomicI32`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicI32.html
1567 [`atomic::AtomicI64`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicI64.html
1568 [`atomic::AtomicI8`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicI8.html
1569 [`atomic::AtomicU16`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU16.html
1570 [`atomic::AtomicU32`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU32.html
1571 [`atomic::AtomicU64`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU64.html
1572 [`atomic::AtomicU8`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU8.html
1573 [`convert::Infallible`]: https://doc.rust-lang.org/std/convert/enum.Infallible.html
1574 [`convert::TryFrom`]: https://doc.rust-lang.org/std/convert/trait.TryFrom.html
1575 [`convert::TryInto`]: https://doc.rust-lang.org/std/convert/trait.TryInto.html
1576 [`iter::from_fn`]: https://doc.rust-lang.org/std/iter/fn.from_fn.html
1577 [`iter::successors`]: https://doc.rust-lang.org/std/iter/fn.successors.html
1578 [`num::NonZeroI128`]: https://doc.rust-lang.org/std/num/struct.NonZeroI128.html
1579 [`num::NonZeroI16`]: https://doc.rust-lang.org/std/num/struct.NonZeroI16.html
1580 [`num::NonZeroI32`]: https://doc.rust-lang.org/std/num/struct.NonZeroI32.html
1581 [`num::NonZeroI64`]: https://doc.rust-lang.org/std/num/struct.NonZeroI64.html
1582 [`num::NonZeroI8`]: https://doc.rust-lang.org/std/num/struct.NonZeroI8.html
1583 [`num::NonZeroIsize`]: https://doc.rust-lang.org/std/num/struct.NonZeroIsize.html
1584 [`slice::sort_by_cached_key`]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_by_cached_key
1585 [`str::escape_debug`]: https://doc.rust-lang.org/std/primitive.str.html#method.escape_debug
1586 [`str::escape_default`]: https://doc.rust-lang.org/std/primitive.str.html#method.escape_default
1587 [`str::escape_unicode`]: https://doc.rust-lang.org/std/primitive.str.html#method.escape_unicode
1588 [`str::split_ascii_whitespace`]: https://doc.rust-lang.org/std/primitive.str.html#method.split_ascii_whitespace
1589 [`Instant::checked_add`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.checked_add
1590 [`Instant::checked_sub`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.checked_sub
1591 [`SystemTime::checked_add`]: https://doc.rust-lang.org/std/time/struct.SystemTime.html#method.checked_add
1592 [`SystemTime::checked_sub`]: https://doc.rust-lang.org/std/time/struct.SystemTime.html#method.checked_sub
1593
1594
1595 Version 1.33.0 (2019-02-28)
1596 ==========================
1597
1598 Language
1599 --------
1600 - [You can now use the `cfg(target_vendor)` attribute.][57465] E.g.
1601   `#[cfg(target_vendor="apple")] fn main() { println!("Hello Apple!"); }`
1602 - [Integer patterns such as in a match expression can now be exhaustive.][56362]
1603   E.g. You can have match statement on a `u8` that covers `0..=255` and
1604   you would no longer be required to have a `_ => unreachable!()` case.
1605 - [You can now have multiple patterns in `if let` and `while let`
1606   expressions.][57532] You can do this with the same syntax as a `match`
1607   expression. E.g.
1608   ```rust
1609   enum Creature {
1610       Crab(String),
1611       Lobster(String),
1612       Person(String),
1613   }
1614
1615   fn main() {
1616       let state = Creature::Crab("Ferris");
1617
1618       if let Creature::Crab(name) | Creature::Person(name) = state {
1619           println!("This creature's name is: {}", name);
1620       }
1621   }
1622   ```
1623 - [You can now have irrefutable `if let` and `while let` patterns.][57535] Using
1624   this feature will by default produce a warning as this behaviour can be
1625   unintuitive. E.g. `if let _ = 5 {}`
1626 - [You can now use `let` bindings, assignments, expression statements,
1627   and irrefutable pattern destructuring in const functions.][57175]
1628 - [You can now call unsafe const functions.][57067] E.g.
1629   ```rust
1630   const unsafe fn foo() -> i32 { 5 }
1631   const fn bar() -> i32 {
1632       unsafe { foo() }
1633   }
1634   ```
1635 - [You can now specify multiple attributes in a `cfg_attr` attribute.][57332]
1636   E.g. `#[cfg_attr(all(), must_use, optimize)]`
1637 - [You can now specify a specific alignment with the `#[repr(packed)]`
1638   attribute.][57049] E.g. `#[repr(packed(2))] struct Foo(i16, i32);` is a struct
1639   with an alignment of 2 bytes and a size of 6 bytes.
1640 - [You can now import an item from a module as an `_`.][56303] This allows you to
1641   import a trait's impls, and not have the name in the namespace. E.g.
1642   ```rust
1643   use std::io::Read as _;
1644
1645   // Allowed as there is only one `Read` in the module.
1646   pub trait Read {}
1647   ```
1648 - [You may now use `Rc`, `Arc`, and `Pin` as method receivers][56805].
1649
1650 Compiler
1651 --------
1652 - [You can now set a linker flavor for `rustc` with the `-Clinker-flavor`
1653   command line argument.][56351]
1654 - [The minimum required LLVM version has been bumped to 6.0.][56642]
1655 - [Added support for the PowerPC64 architecture on FreeBSD.][57615]
1656 - [The `x86_64-fortanix-unknown-sgx` target support has been upgraded to
1657   tier 2 support.][57130] Visit the [platform support][platform-support] page for
1658   information on Rust's platform support.
1659 - [Added support for the `thumbv7neon-linux-androideabi` and
1660   `thumbv7neon-unknown-linux-gnueabihf` targets.][56947]
1661 - [Added support for the `x86_64-unknown-uefi` target.][56769]
1662
1663 Libraries
1664 ---------
1665 - [The methods `overflowing_{add, sub, mul, shl, shr}` are now `const`
1666   functions for all numeric types.][57566]
1667 - [The methods `rotate_left`, `rotate_right`, and `wrapping_{add, sub, mul, shl, shr}`
1668   are now `const` functions for all numeric types.][57105]
1669 - [The methods `is_positive` and `is_negative` are now `const` functions for
1670   all signed numeric types.][57105]
1671 - [The `get` method for all `NonZero` types is now `const`.][57167]
1672 - [The methods `count_ones`, `count_zeros`, `leading_zeros`, `trailing_zeros`,
1673   `swap_bytes`, `from_be`, `from_le`, `to_be`, `to_le` are now `const` for all
1674   numeric types.][57234]
1675 - [`Ipv4Addr::new` is now a `const` function][57234]
1676
1677 Stabilized APIs
1678 ---------------
1679 - [`unix::FileExt::read_exact_at`]
1680 - [`unix::FileExt::write_all_at`]
1681 - [`Option::transpose`]
1682 - [`Result::transpose`]
1683 - [`convert::identity`]
1684 - [`pin::Pin`]
1685 - [`marker::Unpin`]
1686 - [`marker::PhantomPinned`]
1687 - [`Vec::resize_with`]
1688 - [`VecDeque::resize_with`]
1689 - [`Duration::as_millis`]
1690 - [`Duration::as_micros`]
1691 - [`Duration::as_nanos`]
1692
1693
1694 Cargo
1695 -----
1696 - [You can now publish crates that require a feature flag to compile with
1697   `cargo publish --features` or `cargo publish --all-features`.][cargo/6453]
1698 - [Cargo should now rebuild a crate if a file was modified during the initial
1699   build.][cargo/6484]
1700
1701 Compatibility Notes
1702 -------------------
1703 - The methods `str::{trim_left, trim_right, trim_left_matches, trim_right_matches}`
1704   are now deprecated in the standard library, and their usage will now produce a warning.
1705   Please use the `str::{trim_start, trim_end, trim_start_matches, trim_end_matches}`
1706   methods instead.
1707 - The `Error::cause` method has been deprecated in favor of `Error::source` which supports
1708   downcasting.
1709 - [Libtest no longer creates a new thread for each test when
1710   `--test-threads=1`.  It also runs the tests in deterministic order][56243]
1711
1712 [55982]: https://github.com/rust-lang/rust/pull/55982/
1713 [56243]: https://github.com/rust-lang/rust/pull/56243
1714 [56303]: https://github.com/rust-lang/rust/pull/56303/
1715 [56351]: https://github.com/rust-lang/rust/pull/56351/
1716 [56362]: https://github.com/rust-lang/rust/pull/56362
1717 [56642]: https://github.com/rust-lang/rust/pull/56642/
1718 [56769]: https://github.com/rust-lang/rust/pull/56769/
1719 [56805]: https://github.com/rust-lang/rust/pull/56805
1720 [56947]: https://github.com/rust-lang/rust/pull/56947/
1721 [57049]: https://github.com/rust-lang/rust/pull/57049/
1722 [57067]: https://github.com/rust-lang/rust/pull/57067/
1723 [57105]: https://github.com/rust-lang/rust/pull/57105
1724 [57130]: https://github.com/rust-lang/rust/pull/57130/
1725 [57167]: https://github.com/rust-lang/rust/pull/57167/
1726 [57175]: https://github.com/rust-lang/rust/pull/57175/
1727 [57234]: https://github.com/rust-lang/rust/pull/57234/
1728 [57332]: https://github.com/rust-lang/rust/pull/57332/
1729 [57465]: https://github.com/rust-lang/rust/pull/57465/
1730 [57532]: https://github.com/rust-lang/rust/pull/57532/
1731 [57535]: https://github.com/rust-lang/rust/pull/57535/
1732 [57566]: https://github.com/rust-lang/rust/pull/57566/
1733 [57615]: https://github.com/rust-lang/rust/pull/57615/
1734 [cargo/6453]: https://github.com/rust-lang/cargo/pull/6453/
1735 [cargo/6484]: https://github.com/rust-lang/cargo/pull/6484/
1736 [`unix::FileExt::read_exact_at`]: https://doc.rust-lang.org/std/os/unix/fs/trait.FileExt.html#method.read_exact_at
1737 [`unix::FileExt::write_all_at`]: https://doc.rust-lang.org/std/os/unix/fs/trait.FileExt.html#method.write_all_at
1738 [`Option::transpose`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.transpose
1739 [`Result::transpose`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.transpose
1740 [`convert::identity`]: https://doc.rust-lang.org/std/convert/fn.identity.html
1741 [`pin::Pin`]: https://doc.rust-lang.org/std/pin/struct.Pin.html
1742 [`marker::Unpin`]: https://doc.rust-lang.org/stable/std/marker/trait.Unpin.html
1743 [`marker::PhantomPinned`]: https://doc.rust-lang.org/nightly/std/marker/struct.PhantomPinned.html
1744 [`Vec::resize_with`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.resize_with
1745 [`VecDeque::resize_with`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.resize_with
1746 [`Duration::as_millis`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_millis
1747 [`Duration::as_micros`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_micros
1748 [`Duration::as_nanos`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_nanos
1749 [platform-support]: https://forge.rust-lang.org/platform-support.html
1750
1751 Version 1.32.0 (2019-01-17)
1752 ==========================
1753
1754 Language
1755 --------
1756 #### 2018 edition
1757 - [You can now use the `?` operator in macro definitions.][56245] The `?`
1758   operator allows you to specify zero or one repetitions similar to the `*` and
1759   `+` operators.
1760 - [Module paths with no leading keyword like `super`, `self`, or `crate`, will
1761   now always resolve to the item (`enum`, `struct`, etc.) available in the
1762   module if present, before resolving to a external crate or an item the prelude.][56759]
1763   E.g.
1764   ```rust
1765   enum Color { Red, Green, Blue }
1766
1767   use Color::*;
1768   ```
1769
1770 #### All editions
1771 - [You can now match against `PhantomData<T>` types.][55837]
1772 - [You can now match against literals in macros with the `literal`
1773   specifier.][56072] This will match against a literal of any type.
1774   E.g. `1`, `'A'`, `"Hello World"`
1775 - [Self can now be used as a constructor and pattern for unit and tuple structs.][56365] E.g.
1776   ```rust
1777   struct Point(i32, i32);
1778
1779   impl Point {
1780       pub fn new(x: i32, y: i32) -> Self {
1781           Self(x, y)
1782       }
1783
1784       pub fn is_origin(&self) -> bool {
1785           match self {
1786               Self(0, 0) => true,
1787               _ => false,
1788           }
1789       }
1790   }
1791   ```
1792 - [Self can also now be used in type definitions.][56366] E.g.
1793   ```rust
1794   enum List<T>
1795   where
1796       Self: PartialOrd<Self> // can write `Self` instead of `List<T>`
1797   {
1798       Nil,
1799       Cons(T, Box<Self>) // likewise here
1800   }
1801   ```
1802 - [You can now mark traits with `#[must_use]`.][55663] This provides a warning if
1803   a `impl Trait` or `dyn Trait` is returned and unused in the program.
1804
1805 Compiler
1806 --------
1807 - [The default allocator has changed from jemalloc to the default allocator on
1808   your system.][55238] The compiler itself on Linux & macOS will still use
1809   jemalloc, but programs compiled with it will use the system allocator.
1810 - [Added the `aarch64-pc-windows-msvc` target.][55702]
1811
1812 Libraries
1813 ---------
1814 - [`PathBuf` now implements `FromStr`.][55148]
1815 - [`Box<[T]>` now implements `FromIterator<T>`.][55843]
1816 - [The `dbg!` macro has been stabilized.][56395] This macro enables you to
1817   easily debug expressions in your rust program. E.g.
1818   ```rust
1819   let a = 2;
1820   let b = dbg!(a * 2) + 1;
1821   //      ^-- prints: [src/main.rs:4] a * 2 = 4
1822   assert_eq!(b, 5);
1823   ```
1824
1825 The following APIs are now `const` functions and can be used in a
1826 `const` context.
1827
1828 - [`Cell::as_ptr`]
1829 - [`UnsafeCell::get`]
1830 - [`char::is_ascii`]
1831 - [`iter::empty`]
1832 - [`ManuallyDrop::new`]
1833 - [`ManuallyDrop::into_inner`]
1834 - [`RangeInclusive::start`]
1835 - [`RangeInclusive::end`]
1836 - [`NonNull::as_ptr`]
1837 - [`slice::as_ptr`]
1838 - [`str::as_ptr`]
1839 - [`Duration::as_secs`]
1840 - [`Duration::subsec_millis`]
1841 - [`Duration::subsec_micros`]
1842 - [`Duration::subsec_nanos`]
1843 - [`CStr::as_ptr`]
1844 - [`Ipv4Addr::is_unspecified`]
1845 - [`Ipv6Addr::new`]
1846 - [`Ipv6Addr::octets`]
1847
1848 Stabilized APIs
1849 ---------------
1850 - [`i8::to_be_bytes`]
1851 - [`i8::to_le_bytes`]
1852 - [`i8::to_ne_bytes`]
1853 - [`i8::from_be_bytes`]
1854 - [`i8::from_le_bytes`]
1855 - [`i8::from_ne_bytes`]
1856 - [`i16::to_be_bytes`]
1857 - [`i16::to_le_bytes`]
1858 - [`i16::to_ne_bytes`]
1859 - [`i16::from_be_bytes`]
1860 - [`i16::from_le_bytes`]
1861 - [`i16::from_ne_bytes`]
1862 - [`i32::to_be_bytes`]
1863 - [`i32::to_le_bytes`]
1864 - [`i32::to_ne_bytes`]
1865 - [`i32::from_be_bytes`]
1866 - [`i32::from_le_bytes`]
1867 - [`i32::from_ne_bytes`]
1868 - [`i64::to_be_bytes`]
1869 - [`i64::to_le_bytes`]
1870 - [`i64::to_ne_bytes`]
1871 - [`i64::from_be_bytes`]
1872 - [`i64::from_le_bytes`]
1873 - [`i64::from_ne_bytes`]
1874 - [`i128::to_be_bytes`]
1875 - [`i128::to_le_bytes`]
1876 - [`i128::to_ne_bytes`]
1877 - [`i128::from_be_bytes`]
1878 - [`i128::from_le_bytes`]
1879 - [`i128::from_ne_bytes`]
1880 - [`isize::to_be_bytes`]
1881 - [`isize::to_le_bytes`]
1882 - [`isize::to_ne_bytes`]
1883 - [`isize::from_be_bytes`]
1884 - [`isize::from_le_bytes`]
1885 - [`isize::from_ne_bytes`]
1886 - [`u8::to_be_bytes`]
1887 - [`u8::to_le_bytes`]
1888 - [`u8::to_ne_bytes`]
1889 - [`u8::from_be_bytes`]
1890 - [`u8::from_le_bytes`]
1891 - [`u8::from_ne_bytes`]
1892 - [`u16::to_be_bytes`]
1893 - [`u16::to_le_bytes`]
1894 - [`u16::to_ne_bytes`]
1895 - [`u16::from_be_bytes`]
1896 - [`u16::from_le_bytes`]
1897 - [`u16::from_ne_bytes`]
1898 - [`u32::to_be_bytes`]
1899 - [`u32::to_le_bytes`]
1900 - [`u32::to_ne_bytes`]
1901 - [`u32::from_be_bytes`]
1902 - [`u32::from_le_bytes`]
1903 - [`u32::from_ne_bytes`]
1904 - [`u64::to_be_bytes`]
1905 - [`u64::to_le_bytes`]
1906 - [`u64::to_ne_bytes`]
1907 - [`u64::from_be_bytes`]
1908 - [`u64::from_le_bytes`]
1909 - [`u64::from_ne_bytes`]
1910 - [`u128::to_be_bytes`]
1911 - [`u128::to_le_bytes`]
1912 - [`u128::to_ne_bytes`]
1913 - [`u128::from_be_bytes`]
1914 - [`u128::from_le_bytes`]
1915 - [`u128::from_ne_bytes`]
1916 - [`usize::to_be_bytes`]
1917 - [`usize::to_le_bytes`]
1918 - [`usize::to_ne_bytes`]
1919 - [`usize::from_be_bytes`]
1920 - [`usize::from_le_bytes`]
1921 - [`usize::from_ne_bytes`]
1922
1923 Cargo
1924 -----
1925 - [You can now run `cargo c` as an alias for `cargo check`.][cargo/6218]
1926 - [Usernames are now allowed in alt registry URLs.][cargo/6242]
1927
1928 Misc
1929 ----
1930 - [`libproc_macro` has been added to the `rust-src` distribution.][55280]
1931
1932 Compatibility Notes
1933 -------------------
1934 - [The argument types for AVX's
1935   `_mm256_stream_si256`, `_mm256_stream_pd`, `_mm256_stream_ps`][55610] have
1936   been changed from `*const` to `*mut` as the previous implementation
1937   was unsound.
1938
1939
1940 [55148]: https://github.com/rust-lang/rust/pull/55148/
1941 [55238]: https://github.com/rust-lang/rust/pull/55238/
1942 [55280]: https://github.com/rust-lang/rust/pull/55280/
1943 [55610]: https://github.com/rust-lang/rust/pull/55610/
1944 [55663]: https://github.com/rust-lang/rust/pull/55663/
1945 [55702]: https://github.com/rust-lang/rust/pull/55702/
1946 [55837]: https://github.com/rust-lang/rust/pull/55837/
1947 [55843]: https://github.com/rust-lang/rust/pull/55843/
1948 [56072]: https://github.com/rust-lang/rust/pull/56072/
1949 [56245]: https://github.com/rust-lang/rust/pull/56245/
1950 [56365]: https://github.com/rust-lang/rust/pull/56365/
1951 [56366]: https://github.com/rust-lang/rust/pull/56366/
1952 [56395]: https://github.com/rust-lang/rust/pull/56395/
1953 [56759]: https://github.com/rust-lang/rust/pull/56759/
1954 [cargo/6218]: https://github.com/rust-lang/cargo/pull/6218/
1955 [cargo/6242]: https://github.com/rust-lang/cargo/pull/6242/
1956 [`CStr::as_ptr`]: https://doc.rust-lang.org/std/ffi/struct.CStr.html#method.as_ptr
1957 [`Cell::as_ptr`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.as_ptr
1958 [`Duration::as_secs`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_secs
1959 [`Duration::subsec_micros`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_micros
1960 [`Duration::subsec_millis`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_millis
1961 [`Duration::subsec_nanos`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_nanos
1962 [`Ipv4Addr::is_unspecified`]: https://doc.rust-lang.org/std/net/struct.Ipv4Addr.html#method.is_unspecified
1963 [`Ipv6Addr::new`]: https://doc.rust-lang.org/std/net/struct.Ipv6Addr.html#method.new
1964 [`Ipv6Addr::octets`]: https://doc.rust-lang.org/std/net/struct.Ipv6Addr.html#method.octets
1965 [`ManuallyDrop::into_inner`]: https://doc.rust-lang.org/std/mem/struct.ManuallyDrop.html#method.into_inner
1966 [`ManuallyDrop::new`]: https://doc.rust-lang.org/std/mem/struct.ManuallyDrop.html#method.new
1967 [`NonNull::as_ptr`]: https://doc.rust-lang.org/std/ptr/struct.NonNull.html#method.as_ptr
1968 [`RangeInclusive::end`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html#method.end
1969 [`RangeInclusive::start`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html#method.start
1970 [`UnsafeCell::get`]: https://doc.rust-lang.org/std/cell/struct.UnsafeCell.html#method.get
1971 [`slice::as_ptr`]: https://doc.rust-lang.org/std/primitive.slice.html#method.as_ptr
1972 [`char::is_ascii`]: https://doc.rust-lang.org/std/primitive.char.html#method.is_ascii
1973 [`i128::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.from_be_bytes
1974 [`i128::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.from_le_bytes
1975 [`i128::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.from_ne_bytes
1976 [`i128::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.to_be_bytes
1977 [`i128::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.to_le_bytes
1978 [`i128::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.to_ne_bytes
1979 [`i16::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_be_bytes
1980 [`i16::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_le_bytes
1981 [`i16::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_ne_bytes
1982 [`i16::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.to_be_bytes
1983 [`i16::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.to_le_bytes
1984 [`i16::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.to_ne_bytes
1985 [`i32::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.from_be_bytes
1986 [`i32::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.from_le_bytes
1987 [`i32::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.from_ne_bytes
1988 [`i32::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.to_be_bytes
1989 [`i32::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.to_le_bytes
1990 [`i32::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.to_ne_bytes
1991 [`i64::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.from_be_bytes
1992 [`i64::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.from_le_bytes
1993 [`i64::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.from_ne_bytes
1994 [`i64::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.to_be_bytes
1995 [`i64::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.to_le_bytes
1996 [`i64::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.to_ne_bytes
1997 [`i8::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.from_be_bytes
1998 [`i8::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.from_le_bytes
1999 [`i8::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.from_ne_bytes
2000 [`i8::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.to_be_bytes
2001 [`i8::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.to_le_bytes
2002 [`i8::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.to_ne_bytes
2003 [`isize::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.from_be_bytes
2004 [`isize::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.from_le_bytes
2005 [`isize::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.from_ne_bytes
2006 [`isize::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.to_be_bytes
2007 [`isize::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.to_le_bytes
2008 [`isize::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.to_ne_bytes
2009 [`iter::empty`]: https://doc.rust-lang.org/std/iter/fn.empty.html
2010 [`str::as_ptr`]: https://doc.rust-lang.org/std/primitive.str.html#method.as_ptr
2011 [`u128::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.from_be_bytes
2012 [`u128::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.from_le_bytes
2013 [`u128::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.from_ne_bytes
2014 [`u128::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.to_be_bytes
2015 [`u128::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.to_le_bytes
2016 [`u128::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.to_ne_bytes
2017 [`u16::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.from_be_bytes
2018 [`u16::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.from_le_bytes
2019 [`u16::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.from_ne_bytes
2020 [`u16::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.to_be_bytes
2021 [`u16::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.to_le_bytes
2022 [`u16::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.to_ne_bytes
2023 [`u32::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.from_be_bytes
2024 [`u32::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.from_le_bytes
2025 [`u32::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.from_ne_bytes
2026 [`u32::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.to_be_bytes
2027 [`u32::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.to_le_bytes
2028 [`u32::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.to_ne_bytes
2029 [`u64::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.from_be_bytes
2030 [`u64::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.from_le_bytes
2031 [`u64::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.from_ne_bytes
2032 [`u64::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.to_be_bytes
2033 [`u64::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.to_le_bytes
2034 [`u64::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.to_ne_bytes
2035 [`u8::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.from_be_bytes
2036 [`u8::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.from_le_bytes
2037 [`u8::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.from_ne_bytes
2038 [`u8::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.to_be_bytes
2039 [`u8::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.to_le_bytes
2040 [`u8::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.to_ne_bytes
2041 [`usize::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.from_be_bytes
2042 [`usize::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.from_le_bytes
2043 [`usize::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.from_ne_bytes
2044 [`usize::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.to_be_bytes
2045 [`usize::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.to_le_bytes
2046 [`usize::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.to_ne_bytes
2047
2048
2049 Version 1.31.1 (2018-12-20)
2050 ===========================
2051
2052 - [Fix Rust failing to build on `powerpc-unknown-netbsd`][56562]
2053 - [Fix broken go-to-definition in RLS][rls/1171]
2054 - [Fix infinite loop on hover in RLS][rls/1170]
2055
2056 [56562]: https://github.com/rust-lang/rust/pull/56562
2057 [rls/1171]: https://github.com/rust-lang/rls/issues/1171
2058 [rls/1170]: https://github.com/rust-lang/rls/pull/1170
2059
2060 Version 1.31.0 (2018-12-06)
2061 ==========================
2062
2063 Language
2064 --------
2065 - 🎉 [This version marks the release of the 2018 edition of Rust.][54057] 🎉
2066 - [New lifetime elision rules now allow for eliding lifetimes in functions and
2067   impl headers.][54778] E.g. `impl<'a> Reader for BufReader<'a> {}` can now be
2068   `impl Reader for BufReader<'_> {}`. Lifetimes are still required to be defined
2069   in structs.
2070 - [You can now define and use `const` functions.][54835] These are currently
2071   a strict minimal subset of the [const fn RFC][RFC-911]. Refer to the
2072   [language reference][const-reference] for what exactly is available.
2073 - [You can now use tool lints, which allow you to scope lints from external
2074   tools using attributes.][54870] E.g. `#[allow(clippy::filter_map)]`.
2075 - [`#[no_mangle]` and `#[export_name]` attributes can now be located anywhere in
2076   a crate, not just in exported functions.][54451]
2077 - [You can now use parentheses in pattern matches.][54497]
2078
2079 Compiler
2080 --------
2081 - [Updated musl to 1.1.20][54430]
2082
2083 Libraries
2084 ---------
2085 - [You can now convert `num::NonZero*` types to their raw equivalents using the
2086   `From` trait.][54240] E.g. `u8` now implements `From<NonZeroU8>`.
2087 - [You can now convert a `&Option<T>` into `Option<&T>` and `&mut Option<T>`
2088   into `Option<&mut T>` using the `From` trait.][53218]
2089 - [You can now multiply (`*`) a `time::Duration` by a `u32`.][52813]
2090
2091
2092 Stabilized APIs
2093 ---------------
2094 - [`slice::align_to`]
2095 - [`slice::align_to_mut`]
2096 - [`slice::chunks_exact`]
2097 - [`slice::chunks_exact_mut`]
2098 - [`slice::rchunks`]
2099 - [`slice::rchunks_mut`]
2100 - [`slice::rchunks_exact`]
2101 - [`slice::rchunks_exact_mut`]
2102 - [`Option::replace`]
2103
2104 Cargo
2105 -----
2106 - [Cargo will now download crates in parallel using HTTP/2.][cargo/6005]
2107 - [You can now rename packages in your Cargo.toml][cargo/6319] We have a guide
2108   on [how to use the `package` key in your dependencies.][cargo-rename-reference]
2109
2110 [52813]: https://github.com/rust-lang/rust/pull/52813/
2111 [53218]: https://github.com/rust-lang/rust/pull/53218/
2112 [53555]: https://github.com/rust-lang/rust/issues/53555/
2113 [54057]: https://github.com/rust-lang/rust/pull/54057/
2114 [54240]: https://github.com/rust-lang/rust/pull/54240/
2115 [54430]: https://github.com/rust-lang/rust/pull/54430/
2116 [54451]: https://github.com/rust-lang/rust/pull/54451/
2117 [54497]: https://github.com/rust-lang/rust/pull/54497/
2118 [54778]: https://github.com/rust-lang/rust/pull/54778/
2119 [54835]: https://github.com/rust-lang/rust/pull/54835/
2120 [54870]: https://github.com/rust-lang/rust/pull/54870/
2121 [RFC-911]: https://github.com/rust-lang/rfcs/pull/911
2122 [`Option::replace`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.replace
2123 [`slice::align_to_mut`]: https://doc.rust-lang.org/std/primitive.slice.html#method.align_to_mut
2124 [`slice::align_to`]: https://doc.rust-lang.org/std/primitive.slice.html#method.align_to
2125 [`slice::chunks_exact_mut`]: https://doc.rust-lang.org/std/primitive.slice.html#method.chunks_exact_mut
2126 [`slice::chunks_exact`]: https://doc.rust-lang.org/std/primitive.slice.html#method.chunks_exact
2127 [`slice::rchunks_exact_mut`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rchunks_mut
2128 [`slice::rchunks_exact`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rchunks_exact
2129 [`slice::rchunks_mut`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rchunks_mut
2130 [`slice::rchunks`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rchunks
2131 [cargo/6005]: https://github.com/rust-lang/cargo/pull/6005/
2132 [cargo/6319]: https://github.com/rust-lang/cargo/pull/6319/
2133 [cargo-rename-reference]: https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#renaming-dependencies-in-cargotoml
2134 [const-reference]: https://doc.rust-lang.org/reference/items/functions.html#const-functions
2135
2136 Version 1.30.1 (2018-11-08)
2137 ===========================
2138
2139 - [Fixed overflow ICE in rustdoc][54199]
2140 - [Cap Cargo progress bar width at 60 in MSYS terminals][cargo/6122]
2141
2142 [54199]: https://github.com/rust-lang/rust/pull/54199
2143 [cargo/6122]: https://github.com/rust-lang/cargo/pull/6122
2144
2145 Version 1.30.0 (2018-10-25)
2146 ==========================
2147
2148 Language
2149 --------
2150 - [Procedural macros are now available.][52081] These kinds of macros allow for
2151   more powerful code generation. There is a [new chapter available][proc-macros]
2152   in the Rust Programming Language book that goes further in depth.
2153 - [You can now use keywords as identifiers using the raw identifiers
2154   syntax (`r#`),][53236] e.g. `let r#for = true;`
2155 - [Using anonymous parameters in traits is now deprecated with a warning and
2156   will be a hard error in the 2018 edition.][53272]
2157 - [You can now use `crate` in paths.][54404] This allows you to refer to the
2158   crate root in the path, e.g. `use crate::foo;` refers to `foo` in `src/lib.rs`.
2159 - [Using a external crate no longer requires being prefixed with `::`.][54404]
2160   Previously, using a external crate in a module without a use statement
2161   required `let json = ::serde_json::from_str(foo);` but can now be written
2162   as `let json = serde_json::from_str(foo);`.
2163 - [You can now apply the `#[used]` attribute to static items to prevent the
2164   compiler from optimising them away, even if they appear to be unused,][51363]
2165   e.g. `#[used] static FOO: u32 = 1;`
2166 - [You can now import and reexport macros from other crates with the `use`
2167   syntax.][50911] Macros exported with `#[macro_export]` are now placed into
2168   the root module of the crate. If your macro relies on calling other local
2169   macros, it is recommended to export with the
2170   `#[macro_export(local_inner_macros)]` attribute so users won't have to import
2171   those macros.
2172 - [You can now catch visibility keywords (e.g. `pub`, `pub(crate)`) in macros
2173   using the `vis` specifier.][53370]
2174 - [Non-macro attributes now allow all forms of literals, not just
2175   strings.][53044] Previously, you would write `#[attr("true")]`, and you can now
2176   write `#[attr(true)]`.
2177 - [You can now specify a function to handle a panic in the Rust runtime with the
2178   `#[panic_handler]` attribute.][51366]
2179
2180 Compiler
2181 --------
2182 - [Added the `riscv32imc-unknown-none-elf` target.][53822]
2183 - [Added the `aarch64-unknown-netbsd` target][53165]
2184
2185 Libraries
2186 ---------
2187 - [`ManuallyDrop` now allows the inner type to be unsized.][53033]
2188
2189 Stabilized APIs
2190 ---------------
2191 - [`Ipv4Addr::BROADCAST`]
2192 - [`Ipv4Addr::LOCALHOST`]
2193 - [`Ipv4Addr::UNSPECIFIED`]
2194 - [`Ipv6Addr::LOCALHOST`]
2195 - [`Ipv6Addr::UNSPECIFIED`]
2196 - [`Iterator::find_map`]
2197
2198   The following methods are replacement methods for `trim_left`, `trim_right`,
2199   `trim_left_matches`, and `trim_right_matches`, which will be deprecated
2200   in 1.33.0:
2201 - [`str::trim_end_matches`]
2202 - [`str::trim_end`]
2203 - [`str::trim_start_matches`]
2204 - [`str::trim_start`]
2205
2206 Cargo
2207 ----
2208 - [`cargo run` doesn't require specifying a package in workspaces.][cargo/5877]
2209 - [`cargo doc` now supports `--message-format=json`.][cargo/5878] This is
2210   equivalent to calling `rustdoc --error-format=json`.
2211 - [Cargo will now provide a progress bar for builds.][cargo/5995]
2212
2213 Misc
2214 ----
2215 - [`rustdoc` allows you to specify what edition to treat your code as with the
2216   `--edition` option.][54057]
2217 - [`rustdoc` now has the `--color` (specify whether to output color) and
2218   `--error-format` (specify error format, e.g. `json`) options.][53003]
2219 - [We now distribute a `rust-gdbgui` script that invokes `gdbgui` with Rust
2220   debug symbols.][53774]
2221 - [Attributes from Rust tools such as `rustfmt` or `clippy` are now
2222   available,][53459] e.g. `#[rustfmt::skip]` will skip formatting the next item.
2223
2224 [50911]: https://github.com/rust-lang/rust/pull/50911/
2225 [51363]: https://github.com/rust-lang/rust/pull/51363/
2226 [51366]: https://github.com/rust-lang/rust/pull/51366/
2227 [52081]: https://github.com/rust-lang/rust/pull/52081/
2228 [53003]: https://github.com/rust-lang/rust/pull/53003/
2229 [53033]: https://github.com/rust-lang/rust/pull/53033/
2230 [53044]: https://github.com/rust-lang/rust/pull/53044/
2231 [53165]: https://github.com/rust-lang/rust/pull/53165/
2232 [53213]: https://github.com/rust-lang/rust/pull/53213/
2233 [53236]: https://github.com/rust-lang/rust/pull/53236/
2234 [53272]: https://github.com/rust-lang/rust/pull/53272/
2235 [53370]: https://github.com/rust-lang/rust/pull/53370/
2236 [53459]: https://github.com/rust-lang/rust/pull/53459/
2237 [53774]: https://github.com/rust-lang/rust/pull/53774/
2238 [53822]: https://github.com/rust-lang/rust/pull/53822/
2239 [54057]: https://github.com/rust-lang/rust/pull/54057/
2240 [54146]: https://github.com/rust-lang/rust/pull/54146/
2241 [54404]: https://github.com/rust-lang/rust/pull/54404/
2242 [cargo/5877]: https://github.com/rust-lang/cargo/pull/5877/
2243 [cargo/5878]: https://github.com/rust-lang/cargo/pull/5878/
2244 [cargo/5995]: https://github.com/rust-lang/cargo/pull/5995/
2245 [proc-macros]: https://doc.rust-lang.org/nightly/book/2018-edition/ch19-06-macros.html
2246
2247 [`Ipv4Addr::BROADCAST`]: https://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#associatedconstant.BROADCAST
2248 [`Ipv4Addr::LOCALHOST`]: https://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#associatedconstant.LOCALHOST
2249 [`Ipv4Addr::UNSPECIFIED`]: https://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#associatedconstant.UNSPECIFIED
2250 [`Ipv6Addr::LOCALHOST`]: https://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#associatedconstant.LOCALHOST
2251 [`Ipv6Addr::UNSPECIFIED`]: https://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#associatedconstant.UNSPECIFIED
2252 [`Iterator::find_map`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.find_map
2253 [`str::trim_end_matches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.trim_end_matches
2254 [`str::trim_end`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.trim_end
2255 [`str::trim_start_matches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.trim_start_matches
2256 [`str::trim_start`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.trim_start
2257
2258
2259 Version 1.29.2 (2018-10-11)
2260 ===========================
2261
2262 - [Workaround for an aliasing-related LLVM bug, which caused miscompilation.][54639]
2263 - The `rls-preview` component on the windows-gnu targets has been restored.
2264
2265 [54639]: https://github.com/rust-lang/rust/pull/54639
2266
2267
2268 Version 1.29.1 (2018-09-25)
2269 ===========================
2270
2271 Security Notes
2272 --------------
2273
2274 - The standard library's `str::repeat` function contained an out of bounds write
2275   caused by an integer overflow. This has been fixed by deterministically
2276   panicking when an overflow happens.
2277
2278   Thank you to Scott McMurray for responsibly disclosing this vulnerability to
2279   us.
2280
2281
2282 Version 1.29.0 (2018-09-13)
2283 ==========================
2284
2285 Compiler
2286 --------
2287 - [Bumped minimum LLVM version to 5.0.][51899]
2288 - [Added `powerpc64le-unknown-linux-musl` target.][51619]
2289 - [Added `aarch64-unknown-hermit` and `x86_64-unknown-hermit` targets.][52861]
2290
2291 Libraries
2292 ---------
2293 - [`Once::call_once` no longer requires `Once` to be `'static`.][52239]
2294 - [`BuildHasherDefault` now implements `PartialEq` and `Eq`.][52402]
2295 - [`Box<CStr>`, `Box<OsStr>`, and `Box<Path>` now implement `Clone`.][51912]
2296 - [Implemented `PartialEq<&str>` for `OsString` and `PartialEq<OsString>`
2297   for `&str`.][51178]
2298 - [`Cell<T>` now allows `T` to be unsized.][50494]
2299 - [`SocketAddr` is now stable on Redox.][52656]
2300
2301 Stabilized APIs
2302 ---------------
2303 - [`Arc::downcast`]
2304 - [`Iterator::flatten`]
2305 - [`Rc::downcast`]
2306
2307 Cargo
2308 -----
2309 - [Cargo can silently fix some bad lockfiles.][cargo/5831] You can use
2310   `--locked` to disable this behavior.
2311 - [`cargo-install` will now allow you to cross compile an install
2312   using `--target`.][cargo/5614]
2313 - [Added the `cargo-fix` subcommand to automatically move project code from
2314   2015 edition to 2018.][cargo/5723]
2315 - [`cargo doc` can now optionally document private types using the
2316   `--document-private-items` flag.][cargo/5543]
2317
2318 Misc
2319 ----
2320 - [`rustdoc` now has the `--cap-lints` option which demotes all lints above
2321   the specified level to that level.][52354] For example `--cap-lints warn`
2322   will demote `deny` and `forbid` lints to `warn`.
2323 - [`rustc` and `rustdoc` will now have the exit code of `1` if compilation
2324   fails and `101` if there is a panic.][52197]
2325 - [A preview of clippy has been made available through rustup.][51122]
2326   You can install the preview with `rustup component add clippy-preview`.
2327
2328 Compatibility Notes
2329 -------------------
2330 - [`str::{slice_unchecked, slice_unchecked_mut}` are now deprecated.][51807]
2331   Use `str::get_unchecked(begin..end)` instead.
2332 - [`std::env::home_dir` is now deprecated for its unintuitive behavior.][51656]
2333   Consider using the `home_dir` function from
2334   https://crates.io/crates/dirs instead.
2335 - [`rustc` will no longer silently ignore invalid data in target spec.][52330]
2336 - [`cfg` attributes and `--cfg` command line flags are now more
2337   strictly validated.][53893]
2338
2339 [53893]: https://github.com/rust-lang/rust/pull/53893/
2340 [52861]: https://github.com/rust-lang/rust/pull/52861/
2341 [52656]: https://github.com/rust-lang/rust/pull/52656/
2342 [52239]: https://github.com/rust-lang/rust/pull/52239/
2343 [52330]: https://github.com/rust-lang/rust/pull/52330/
2344 [52354]: https://github.com/rust-lang/rust/pull/52354/
2345 [52402]: https://github.com/rust-lang/rust/pull/52402/
2346 [52103]: https://github.com/rust-lang/rust/pull/52103/
2347 [52197]: https://github.com/rust-lang/rust/pull/52197/
2348 [51807]: https://github.com/rust-lang/rust/pull/51807/
2349 [51899]: https://github.com/rust-lang/rust/pull/51899/
2350 [51912]: https://github.com/rust-lang/rust/pull/51912/
2351 [51511]: https://github.com/rust-lang/rust/pull/51511/
2352 [51619]: https://github.com/rust-lang/rust/pull/51619/
2353 [51656]: https://github.com/rust-lang/rust/pull/51656/
2354 [51178]: https://github.com/rust-lang/rust/pull/51178/
2355 [51122]: https://github.com/rust-lang/rust/pull/51122
2356 [50494]: https://github.com/rust-lang/rust/pull/50494/
2357 [cargo/5543]: https://github.com/rust-lang/cargo/pull/5543
2358 [cargo/5614]: https://github.com/rust-lang/cargo/pull/5614/
2359 [cargo/5723]: https://github.com/rust-lang/cargo/pull/5723/
2360 [cargo/5831]: https://github.com/rust-lang/cargo/pull/5831/
2361 [`Arc::downcast`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.downcast
2362 [`Iterator::flatten`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.flatten
2363 [`Rc::downcast`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.downcast
2364
2365
2366 Version 1.28.0 (2018-08-02)
2367 ===========================
2368
2369 Language
2370 --------
2371 - [The `#[repr(transparent)]` attribute is now stable.][51562] This attribute
2372   allows a Rust newtype wrapper (`struct NewType<T>(T);`) to be represented as
2373   the inner type across Foreign Function Interface (FFI) boundaries.
2374 - [The keywords `pure`, `sizeof`, `alignof`, and `offsetof` have been unreserved
2375   and can now be used as identifiers.][51196]
2376 - [The `GlobalAlloc` trait and `#[global_allocator]` attribute are now
2377   stable.][51241] This will allow users to specify a global allocator for
2378   their program.
2379 - [Unit test functions marked with the `#[test]` attribute can now return
2380   `Result<(), E: Debug>` in addition to `()`.][51298]
2381 - [The `lifetime` specifier for `macro_rules!` is now stable.][50385] This
2382   allows macros to easily target lifetimes.
2383
2384 Compiler
2385 --------
2386 - [The `s` and `z` optimisation levels are now stable.][50265] These optimisations
2387   prioritise making smaller binary sizes. `z` is the same as `s` with the
2388   exception that it does not vectorise loops, which typically results in an even
2389   smaller binary.
2390 - [The short error format is now stable.][49546] Specified with
2391   `--error-format=short` this option will provide a more compressed output of
2392   rust error messages.
2393 - [Added a lint warning when you have duplicated `macro_export`s.][50143]
2394 - [Reduced the number of allocations in the macro parser.][50855] This can
2395   improve compile times of macro heavy crates on average by 5%.
2396
2397 Libraries
2398 ---------
2399 - [Implemented `Default` for `&mut str`.][51306]
2400 - [Implemented `From<bool>` for all integer and unsigned number types.][50554]
2401 - [Implemented `Extend` for `()`.][50234]
2402 - [The `Debug` implementation of `time::Duration` should now be more easily
2403   human readable.][50364] Previously a `Duration` of one second would printed as
2404   `Duration { secs: 1, nanos: 0 }` and will now be printed as `1s`.
2405 - [Implemented `From<&String>` for `Cow<str>`, `From<&Vec<T>>` for `Cow<[T]>`,
2406   `From<Cow<CStr>>` for `CString`, `From<CString>, From<CStr>, From<&CString>`
2407   for `Cow<CStr>`, `From<OsString>, From<OsStr>, From<&OsString>` for
2408   `Cow<OsStr>`, `From<&PathBuf>` for `Cow<Path>`, and `From<Cow<Path>>`
2409   for `PathBuf`.][50170]
2410 - [Implemented `Shl` and `Shr` for `Wrapping<u128>`
2411   and `Wrapping<i128>`.][50465]
2412 - [`DirEntry::metadata` now uses `fstatat` instead of `lstat` when
2413   possible.][51050] This can provide up to a 40% speed increase.
2414 - [Improved error messages when using `format!`.][50610]
2415
2416 Stabilized APIs
2417 ---------------
2418 - [`Iterator::step_by`]
2419 - [`Path::ancestors`]
2420 - [`SystemTime::UNIX_EPOCH`]
2421 - [`alloc::GlobalAlloc`]
2422 - [`alloc::Layout`]
2423 - [`alloc::LayoutErr`]
2424 - [`alloc::System`]
2425 - [`alloc::alloc`]
2426 - [`alloc::alloc_zeroed`]
2427 - [`alloc::dealloc`]
2428 - [`alloc::realloc`]
2429 - [`alloc::handle_alloc_error`]
2430 - [`btree_map::Entry::or_default`]
2431 - [`fmt::Alignment`]
2432 - [`hash_map::Entry::or_default`]
2433 - [`iter::repeat_with`]
2434 - [`num::NonZeroUsize`]
2435 - [`num::NonZeroU128`]
2436 - [`num::NonZeroU16`]
2437 - [`num::NonZeroU32`]
2438 - [`num::NonZeroU64`]
2439 - [`num::NonZeroU8`]
2440 - [`ops::RangeBounds`]
2441 - [`slice::SliceIndex`]
2442 - [`slice::from_mut`]
2443 - [`slice::from_ref`]
2444 - [`{Any + Send + Sync}::downcast_mut`]
2445 - [`{Any + Send + Sync}::downcast_ref`]
2446 - [`{Any + Send + Sync}::is`]
2447
2448 Cargo
2449 -----
2450 - [Cargo will now no longer allow you to publish crates with build scripts that
2451   modify the `src` directory.][cargo/5584] The `src` directory in a crate should be
2452   considered to be immutable.
2453
2454 Misc
2455 ----
2456 - [The `suggestion_applicability` field in `rustc`'s json output is now
2457   stable.][50486] This will allow dev tools to check whether a code suggestion
2458   would apply to them.
2459
2460 Compatibility Notes
2461 -------------------
2462 - [Rust will consider trait objects with duplicated constraints to be the same
2463   type as without the duplicated constraint.][51276] For example the below code will
2464   now fail to compile.
2465   ```rust
2466   trait Trait {}
2467
2468   impl Trait + Send {
2469       fn test(&self) { println!("one"); } //~ ERROR duplicate definitions with name `test`
2470   }
2471
2472   impl Trait + Send + Send {
2473       fn test(&self) { println!("two"); }
2474   }
2475   ```
2476
2477 [49546]: https://github.com/rust-lang/rust/pull/49546/
2478 [50143]: https://github.com/rust-lang/rust/pull/50143/
2479 [50170]: https://github.com/rust-lang/rust/pull/50170/
2480 [50234]: https://github.com/rust-lang/rust/pull/50234/
2481 [50265]: https://github.com/rust-lang/rust/pull/50265/
2482 [50364]: https://github.com/rust-lang/rust/pull/50364/
2483 [50385]: https://github.com/rust-lang/rust/pull/50385/
2484 [50465]: https://github.com/rust-lang/rust/pull/50465/
2485 [50486]: https://github.com/rust-lang/rust/pull/50486/
2486 [50554]: https://github.com/rust-lang/rust/pull/50554/
2487 [50610]: https://github.com/rust-lang/rust/pull/50610/
2488 [50855]: https://github.com/rust-lang/rust/pull/50855/
2489 [51050]: https://github.com/rust-lang/rust/pull/51050/
2490 [51196]: https://github.com/rust-lang/rust/pull/51196/
2491 [51200]: https://github.com/rust-lang/rust/pull/51200/
2492 [51241]: https://github.com/rust-lang/rust/pull/51241/
2493 [51276]: https://github.com/rust-lang/rust/pull/51276/
2494 [51298]: https://github.com/rust-lang/rust/pull/51298/
2495 [51306]: https://github.com/rust-lang/rust/pull/51306/
2496 [51562]: https://github.com/rust-lang/rust/pull/51562/
2497 [cargo/5584]: https://github.com/rust-lang/cargo/pull/5584/
2498 [`Iterator::step_by`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.step_by
2499 [`Path::ancestors`]: https://doc.rust-lang.org/std/path/struct.Path.html#method.ancestors
2500 [`SystemTime::UNIX_EPOCH`]: https://doc.rust-lang.org/std/time/struct.SystemTime.html#associatedconstant.UNIX_EPOCH
2501 [`alloc::GlobalAlloc`]: https://doc.rust-lang.org/std/alloc/trait.GlobalAlloc.html
2502 [`alloc::Layout`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html
2503 [`alloc::LayoutErr`]: https://doc.rust-lang.org/std/alloc/struct.LayoutErr.html
2504 [`alloc::System`]: https://doc.rust-lang.org/std/alloc/struct.System.html
2505 [`alloc::alloc`]: https://doc.rust-lang.org/std/alloc/fn.alloc.html
2506 [`alloc::alloc_zeroed`]: https://doc.rust-lang.org/std/alloc/fn.alloc_zeroed.html
2507 [`alloc::dealloc`]: https://doc.rust-lang.org/std/alloc/fn.dealloc.html
2508 [`alloc::realloc`]: https://doc.rust-lang.org/std/alloc/fn.realloc.html
2509 [`alloc::handle_alloc_error`]: https://doc.rust-lang.org/std/alloc/fn.handle_alloc_error.html
2510 [`btree_map::Entry::or_default`]: https://doc.rust-lang.org/std/collections/btree_map/enum.Entry.html#method.or_default
2511 [`fmt::Alignment`]: https://doc.rust-lang.org/std/fmt/enum.Alignment.html
2512 [`hash_map::Entry::or_default`]: https://doc.rust-lang.org/std/collections/hash_map/enum.Entry.html#method.or_default
2513 [`iter::repeat_with`]: https://doc.rust-lang.org/std/iter/fn.repeat_with.html
2514 [`num::NonZeroUsize`]: https://doc.rust-lang.org/std/num/struct.NonZeroUsize.html
2515 [`num::NonZeroU128`]: https://doc.rust-lang.org/std/num/struct.NonZeroU128.html
2516 [`num::NonZeroU16`]: https://doc.rust-lang.org/std/num/struct.NonZeroU16.html
2517 [`num::NonZeroU32`]: https://doc.rust-lang.org/std/num/struct.NonZeroU32.html
2518 [`num::NonZeroU64`]: https://doc.rust-lang.org/std/num/struct.NonZeroU64.html
2519 [`num::NonZeroU8`]: https://doc.rust-lang.org/std/num/struct.NonZeroU8.html
2520 [`ops::RangeBounds`]: https://doc.rust-lang.org/std/ops/trait.RangeBounds.html
2521 [`slice::SliceIndex`]: https://doc.rust-lang.org/std/slice/trait.SliceIndex.html
2522 [`slice::from_mut`]: https://doc.rust-lang.org/std/slice/fn.from_mut.html
2523 [`slice::from_ref`]: https://doc.rust-lang.org/std/slice/fn.from_ref.html
2524 [`{Any + Send + Sync}::downcast_mut`]: https://doc.rust-lang.org/std/any/trait.Any.html#method.downcast_mut-2
2525 [`{Any + Send + Sync}::downcast_ref`]: https://doc.rust-lang.org/std/any/trait.Any.html#method.downcast_ref-2
2526 [`{Any + Send + Sync}::is`]: https://doc.rust-lang.org/std/any/trait.Any.html#method.is-2
2527
2528 Version 1.27.2 (2018-07-20)
2529 ===========================
2530
2531 Compatibility Notes
2532 -------------------
2533
2534 - The borrow checker was fixed to avoid potential unsoundness when using
2535   match ergonomics: [#52213][52213].
2536
2537 [52213]: https://github.com/rust-lang/rust/issues/52213
2538
2539 Version 1.27.1 (2018-07-10)
2540 ===========================
2541
2542 Security Notes
2543 --------------
2544
2545 - rustdoc would execute plugins in the /tmp/rustdoc/plugins directory
2546   when running, which enabled executing code as some other user on a
2547   given machine. This release fixes that vulnerability; you can read
2548   more about this on the [blog][rustdoc-sec]. The associated CVE is [CVE-2018-1000622].
2549
2550   Thank you to Red Hat for responsibly disclosing this vulnerability to us.
2551
2552 Compatibility Notes
2553 -------------------
2554
2555 - The borrow checker was fixed to avoid an additional potential unsoundness when using
2556   match ergonomics: [#51415][51415], [#49534][49534].
2557
2558 [51415]: https://github.com/rust-lang/rust/issues/51415
2559 [49534]: https://github.com/rust-lang/rust/issues/49534
2560 [rustdoc-sec]: https://blog.rust-lang.org/2018/07/06/security-advisory-for-rustdoc.html
2561 [CVE-2018-1000622]: https://cve.mitre.org/cgi-bin/cvename.cgi?name=%20CVE-2018-1000622
2562
2563 Version 1.27.0 (2018-06-21)
2564 ==========================
2565
2566 Language
2567 --------
2568 - [Removed 'proc' from the reserved keywords list.][49699] This allows `proc` to
2569   be used as an identifier.
2570 - [The dyn syntax is now available.][49968] This syntax is equivalent to the
2571   bare `Trait` syntax, and should make it clearer when being used in tandem with
2572   `impl Trait` because it is equivalent to the following syntax:
2573   `&Trait == &dyn Trait`, `&mut Trait == &mut dyn Trait`, and
2574   `Box<Trait> == Box<dyn Trait>`.
2575 - [Attributes on generic parameters such as types and lifetimes are
2576   now stable.][48851] e.g.
2577   `fn foo<#[lifetime_attr] 'a, #[type_attr] T: 'a>() {}`
2578 - [The `#[must_use]` attribute can now also be used on functions as well as
2579   types.][48925] It provides a lint that by default warns users when the
2580   value returned by a function has not been used.
2581
2582 Compiler
2583 --------
2584 - [Added the `armv5te-unknown-linux-musleabi` target.][50423]
2585
2586 Libraries
2587 ---------
2588 - [SIMD (Single Instruction Multiple Data) on x86/x86_64 is now stable.][49664]
2589   This includes [`arch::x86`] & [`arch::x86_64`] modules which contain
2590   SIMD intrinsics, a new macro called `is_x86_feature_detected!`, the
2591   `#[target_feature(enable="")]` attribute, and adding `target_feature = ""` to
2592   the `cfg` attribute.
2593 - [A lot of methods for `[u8]`, `f32`, and `f64` previously only available in
2594   std are now available in core.][49896]
2595 - [The generic `Rhs` type parameter on `ops::{Shl, ShlAssign, Shr}` now defaults
2596   to `Self`.][49630]
2597 - [`std::str::replace` now has the `#[must_use]` attribute][50177] to clarify
2598   that the operation isn't done in place.
2599 - [`Clone::clone`, `Iterator::collect`, and `ToOwned::to_owned` now have
2600   the `#[must_use]` attribute][49533] to warn about unused potentially
2601   expensive allocations.
2602
2603 Stabilized APIs
2604 ---------------
2605 - [`DoubleEndedIterator::rfind`]
2606 - [`DoubleEndedIterator::rfold`]
2607 - [`DoubleEndedIterator::try_rfold`]
2608 - [`Duration::from_micros`]
2609 - [`Duration::from_nanos`]
2610 - [`Duration::subsec_micros`]
2611 - [`Duration::subsec_millis`]
2612 - [`HashMap::remove_entry`]
2613 - [`Iterator::try_fold`]
2614 - [`Iterator::try_for_each`]
2615 - [`NonNull::cast`]
2616 - [`Option::filter`]
2617 - [`String::replace_range`]
2618 - [`Take::set_limit`]
2619 - [`hint::unreachable_unchecked`]
2620 - [`os::unix::process::parent_id`]
2621 - [`ptr::swap_nonoverlapping`]
2622 - [`slice::rsplit_mut`]
2623 - [`slice::rsplit`]
2624 - [`slice::swap_with_slice`]
2625
2626 Cargo
2627 -----
2628 - [`cargo-metadata` now includes `authors`, `categories`, `keywords`,
2629   `readme`, and `repository` fields.][cargo/5386]
2630 - [`cargo-metadata` now includes a package's `metadata` table.][cargo/5360]
2631 - [Added the `--target-dir` optional argument.][cargo/5393] This allows you to specify
2632   a different directory than `target` for placing compilation artifacts.
2633 - [Cargo will be adding automatic target inference for binaries, benchmarks,
2634   examples, and tests in the Rust 2018 edition.][cargo/5335] If your project specifies
2635   specific targets, e.g. using `[[bin]]`, and have other binaries in locations
2636   where cargo would infer a binary, Cargo will produce a warning. You can
2637   disable this feature ahead of time by setting any of the following to false:
2638   `autobins`, `autobenches`, `autoexamples`, `autotests`.
2639 - [Cargo will now cache compiler information.][cargo/5359] This can be disabled by
2640   setting `CARGO_CACHE_RUSTC_INFO=0` in your environment.
2641
2642 Misc
2643 ----
2644 - [Added “The Rustc book” into the official documentation.][49707]
2645   [“The Rustc book”] documents and teaches how to use the rustc compiler.
2646 - [All books available on `doc.rust-lang.org` are now searchable.][49623]
2647
2648 Compatibility Notes
2649 -------------------
2650 - [Calling a `CharExt` or `StrExt` method directly on core will no longer
2651   work.][49896] e.g. `::core::prelude::v1::StrExt::is_empty("")` will not
2652   compile, `"".is_empty()` will still compile.
2653 - [`Debug` output on `atomic::{AtomicBool, AtomicIsize, AtomicPtr, AtomicUsize}`
2654   will only print the inner type.][48553] E.g.
2655   `print!("{:?}", AtomicBool::new(true))` will print `true`,
2656   not `AtomicBool(true)`.
2657 - [The maximum number for `repr(align(N))` is now 2²⁹.][50378] Previously you
2658   could enter higher numbers but they were not supported by LLVM. Up to 512MB
2659   alignment should cover all use cases.
2660 - The `.description()` method on the `std::error::Error` trait
2661   [has been soft-deprecated][50163]. It is no longer required to implement it.
2662
2663 [48553]: https://github.com/rust-lang/rust/pull/48553/
2664 [48851]: https://github.com/rust-lang/rust/pull/48851/
2665 [48925]: https://github.com/rust-lang/rust/pull/48925/
2666 [49533]: https://github.com/rust-lang/rust/pull/49533/
2667 [49623]: https://github.com/rust-lang/rust/pull/49623/
2668 [49630]: https://github.com/rust-lang/rust/pull/49630/
2669 [49664]: https://github.com/rust-lang/rust/pull/49664/
2670 [49699]: https://github.com/rust-lang/rust/pull/49699/
2671 [49707]: https://github.com/rust-lang/rust/pull/49707/
2672 [49719]: https://github.com/rust-lang/rust/pull/49719/
2673 [49896]: https://github.com/rust-lang/rust/pull/49896/
2674 [49968]: https://github.com/rust-lang/rust/pull/49968/
2675 [50163]: https://github.com/rust-lang/rust/pull/50163
2676 [50177]: https://github.com/rust-lang/rust/pull/50177/
2677 [50378]: https://github.com/rust-lang/rust/pull/50378/
2678 [50398]: https://github.com/rust-lang/rust/pull/50398/
2679 [50423]: https://github.com/rust-lang/rust/pull/50423/
2680 [cargo/5203]: https://github.com/rust-lang/cargo/pull/5203/
2681 [cargo/5335]: https://github.com/rust-lang/cargo/pull/5335/
2682 [cargo/5359]: https://github.com/rust-lang/cargo/pull/5359/
2683 [cargo/5360]: https://github.com/rust-lang/cargo/pull/5360/
2684 [cargo/5386]: https://github.com/rust-lang/cargo/pull/5386/
2685 [cargo/5393]: https://github.com/rust-lang/cargo/pull/5393/
2686 [`DoubleEndedIterator::rfind`]: https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html#method.rfind
2687 [`DoubleEndedIterator::rfold`]: https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html#method.rfold
2688 [`DoubleEndedIterator::try_rfold`]: https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html#method.try_rfold
2689 [`Duration::from_micros`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.from_micros
2690 [`Duration::from_nanos`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.from_nanos
2691 [`Duration::subsec_micros`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_micros
2692 [`Duration::subsec_millis`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_millis
2693 [`HashMap::remove_entry`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.remove_entry
2694 [`Iterator::try_fold`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.try_fold
2695 [`Iterator::try_for_each`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.try_for_each
2696 [`NonNull::cast`]: https://doc.rust-lang.org/std/ptr/struct.NonNull.html#method.cast
2697 [`Option::filter`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.filter
2698 [`String::replace_range`]: https://doc.rust-lang.org/std/string/struct.String.html#method.replace_range
2699 [`Take::set_limit`]: https://doc.rust-lang.org/std/io/struct.Take.html#method.set_limit
2700 [`hint::unreachable_unchecked`]: https://doc.rust-lang.org/std/hint/fn.unreachable_unchecked.html
2701 [`os::unix::process::parent_id`]: https://doc.rust-lang.org/std/os/unix/process/fn.parent_id.html
2702 [`process::id`]: https://doc.rust-lang.org/std/process/fn.id.html
2703 [`ptr::swap_nonoverlapping`]: https://doc.rust-lang.org/std/ptr/fn.swap_nonoverlapping.html
2704 [`slice::rsplit_mut`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rsplit_mut
2705 [`slice::rsplit`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rsplit
2706 [`slice::swap_with_slice`]: https://doc.rust-lang.org/std/primitive.slice.html#method.swap_with_slice
2707 [`arch::x86_64`]: https://doc.rust-lang.org/std/arch/x86_64/index.html
2708 [`arch::x86`]: https://doc.rust-lang.org/std/arch/x86/index.html
2709 [“The Rustc book”]: https://doc.rust-lang.org/rustc
2710
2711
2712 Version 1.26.2 (2018-06-05)
2713 ==========================
2714
2715 Compatibility Notes
2716 -------------------
2717
2718 - [The borrow checker was fixed to avoid unsoundness when using match ergonomics.][51117]
2719
2720 [51117]: https://github.com/rust-lang/rust/issues/51117
2721
2722
2723 Version 1.26.1 (2018-05-29)
2724 ==========================
2725
2726 Tools
2727 -----
2728
2729 - [RLS now works on Windows.][50646]
2730 - [Rustfmt stopped badly formatting text in some cases.][rustfmt/2695]
2731
2732
2733 Compatibility Notes
2734 --------
2735
2736 - [`fn main() -> impl Trait` no longer works for non-Termination
2737   trait.][50656]
2738   This reverts an accidental stabilization.
2739 - [`NaN > NaN` no longer returns true in const-fn contexts.][50812]
2740 - [Prohibit using turbofish for `impl Trait` in method arguments.][50950]
2741
2742 [50646]: https://github.com/rust-lang/rust/issues/50646
2743 [50656]: https://github.com/rust-lang/rust/pull/50656
2744 [50812]: https://github.com/rust-lang/rust/pull/50812
2745 [50950]: https://github.com/rust-lang/rust/issues/50950
2746 [rustfmt/2695]: https://github.com/rust-lang-nursery/rustfmt/issues/2695
2747
2748 Version 1.26.0 (2018-05-10)
2749 ==========================
2750
2751 Language
2752 --------
2753 - [Closures now implement `Copy` and/or `Clone` if all captured variables
2754   implement either or both traits.][49299]
2755 - [The inclusive range syntax e.g. `for x in 0..=10` is now stable.][47813]
2756 - [The `'_` lifetime is now stable. The underscore lifetime can be used anywhere a
2757   lifetime can be elided.][49458]
2758 - [`impl Trait` is now stable allowing you to have abstract types in returns
2759    or in function parameters.][49255] E.g. `fn foo() -> impl Iterator<Item=u8>` or
2760   `fn open(path: impl AsRef<Path>)`.
2761 - [Pattern matching will now automatically apply dereferences.][49394]
2762 - [128-bit integers in the form of `u128` and `i128` are now stable.][49101]
2763 - [`main` can now return `Result<(), E: Debug>`][49162] in addition to `()`.
2764 - [A lot of operations are now available in a const context.][46882] E.g. You
2765   can now index into constant arrays, reference and dereference into constants,
2766   and use tuple struct constructors.
2767 - [Fixed entry slice patterns are now stable.][48516] E.g.
2768   ```rust
2769   let points = [1, 2, 3, 4];
2770   match points {
2771       [1, 2, 3, 4] => println!("All points were sequential."),
2772       _ => println!("Not all points were sequential."),
2773   }
2774   ```
2775
2776
2777 Compiler
2778 --------
2779 - [LLD is now used as the default linker for `wasm32-unknown-unknown`.][48125]
2780 - [Fixed exponential projection complexity on nested types.][48296]
2781   This can provide up to a ~12% reduction in compile times for certain crates.
2782 - [Added the `--remap-path-prefix` option to rustc.][48359] Allowing you
2783   to remap path prefixes outputted by the compiler.
2784 - [Added `powerpc-unknown-netbsd` target.][48281]
2785
2786 Libraries
2787 ---------
2788 - [Implemented `From<u16> for usize` & `From<{u8, i16}> for isize`.][49305]
2789 - [Added hexadecimal formatting for integers with fmt::Debug][48978]
2790   e.g. `assert!(format!("{:02x?}", b"Foo\0") == "[46, 6f, 6f, 00]")`
2791 - [Implemented `Default, Hash` for `cmp::Reverse`.][48628]
2792 - [Optimized `str::repeat` being 8x faster in large cases.][48657]
2793 - [`ascii::escape_default` is now available in libcore.][48735]
2794 - [Trailing commas are now supported in std and core macros.][48056]
2795 - [Implemented `Copy, Clone` for `cmp::Reverse`][47379]
2796 - [Implemented `Clone` for `char::{ToLowercase, ToUppercase}`.][48629]
2797
2798 Stabilized APIs
2799 ---------------
2800 - [`*const T::add`]
2801 - [`*const T::copy_to_nonoverlapping`]
2802 - [`*const T::copy_to`]
2803 - [`*const T::read_unaligned`]
2804 - [`*const T::read_volatile`]
2805 - [`*const T::read`]
2806 - [`*const T::sub`]
2807 - [`*const T::wrapping_add`]
2808 - [`*const T::wrapping_sub`]
2809 - [`*mut T::add`]
2810 - [`*mut T::copy_to_nonoverlapping`]
2811 - [`*mut T::copy_to`]
2812 - [`*mut T::read_unaligned`]
2813 - [`*mut T::read_volatile`]
2814 - [`*mut T::read`]
2815 - [`*mut T::replace`]
2816 - [`*mut T::sub`]
2817 - [`*mut T::swap`]
2818 - [`*mut T::wrapping_add`]
2819 - [`*mut T::wrapping_sub`]
2820 - [`*mut T::write_bytes`]
2821 - [`*mut T::write_unaligned`]
2822 - [`*mut T::write_volatile`]
2823 - [`*mut T::write`]
2824 - [`Box::leak`]
2825 - [`FromUtf8Error::as_bytes`]
2826 - [`LocalKey::try_with`]
2827 - [`Option::cloned`]
2828 - [`btree_map::Entry::and_modify`]
2829 - [`fs::read_to_string`]
2830 - [`fs::read`]
2831 - [`fs::write`]
2832 - [`hash_map::Entry::and_modify`]
2833 - [`iter::FusedIterator`]
2834 - [`ops::RangeInclusive`]
2835 - [`ops::RangeToInclusive`]
2836 - [`process::id`]
2837 - [`slice::rotate_left`]
2838 - [`slice::rotate_right`]
2839 - [`String::retain`]
2840
2841
2842 Cargo
2843 -----
2844 - [Cargo will now output path to custom commands when `-v` is
2845   passed with `--list`][cargo/5041]
2846 - [The Cargo binary version is now the same as the Rust version][cargo/5083]
2847
2848 Misc
2849 ----
2850 - [The second edition of "The Rust Programming Language" book is now recommended
2851   over the first.][48404]
2852
2853 Compatibility Notes
2854 -------------------
2855
2856 - [aliasing a `Fn` trait as `dyn` no longer works.][48481] E.g. the following
2857   syntax is now invalid.
2858   ```
2859   use std::ops::Fn as dyn;
2860   fn g(_: Box<dyn(std::fmt::Debug)>) {}
2861   ```
2862 - [The result of dereferences are no longer promoted to `'static`.][47408]
2863   e.g.
2864   ```rust
2865   fn main() {
2866       const PAIR: &(i32, i32) = &(0, 1);
2867       let _reversed_pair: &'static _ = &(PAIR.1, PAIR.0); // Doesn't work
2868   }
2869   ```
2870 - [Deprecate `AsciiExt` trait in favor of inherent methods.][49109]
2871 - [`".e0"` will now no longer parse as `0.0` and will instead cause
2872   an error.][48235]
2873 - [Removed hoedown from rustdoc.][48274]
2874 - [Bounds on higher-kinded lifetimes a hard error.][48326]
2875
2876 [46882]: https://github.com/rust-lang/rust/pull/46882
2877 [47379]: https://github.com/rust-lang/rust/pull/47379
2878 [47408]: https://github.com/rust-lang/rust/pull/47408
2879 [47813]: https://github.com/rust-lang/rust/pull/47813
2880 [48056]: https://github.com/rust-lang/rust/pull/48056
2881 [48125]: https://github.com/rust-lang/rust/pull/48125
2882 [48166]: https://github.com/rust-lang/rust/pull/48166
2883 [48235]: https://github.com/rust-lang/rust/pull/48235
2884 [48274]: https://github.com/rust-lang/rust/pull/48274
2885 [48281]: https://github.com/rust-lang/rust/pull/48281
2886 [48296]: https://github.com/rust-lang/rust/pull/48296
2887 [48326]: https://github.com/rust-lang/rust/pull/48326
2888 [48359]: https://github.com/rust-lang/rust/pull/48359
2889 [48404]: https://github.com/rust-lang/rust/pull/48404
2890 [48481]: https://github.com/rust-lang/rust/pull/48481
2891 [48516]: https://github.com/rust-lang/rust/pull/48516
2892 [48628]: https://github.com/rust-lang/rust/pull/48628
2893 [48629]: https://github.com/rust-lang/rust/pull/48629
2894 [48657]: https://github.com/rust-lang/rust/pull/48657
2895 [48735]: https://github.com/rust-lang/rust/pull/48735
2896 [48978]: https://github.com/rust-lang/rust/pull/48978
2897 [49101]: https://github.com/rust-lang/rust/pull/49101
2898 [49109]: https://github.com/rust-lang/rust/pull/49109
2899 [49121]: https://github.com/rust-lang/rust/pull/49121
2900 [49162]: https://github.com/rust-lang/rust/pull/49162
2901 [49184]: https://github.com/rust-lang/rust/pull/49184
2902 [49234]: https://github.com/rust-lang/rust/pull/49234
2903 [49255]: https://github.com/rust-lang/rust/pull/49255
2904 [49299]: https://github.com/rust-lang/rust/pull/49299
2905 [49305]: https://github.com/rust-lang/rust/pull/49305
2906 [49394]: https://github.com/rust-lang/rust/pull/49394
2907 [49458]: https://github.com/rust-lang/rust/pull/49458
2908 [`*const T::add`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.add
2909 [`*const T::copy_to_nonoverlapping`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.copy_to_nonoverlapping
2910 [`*const T::copy_to`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.copy_to
2911 [`*const T::read_unaligned`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read_unaligned
2912 [`*const T::read_volatile`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read_volatile
2913 [`*const T::read`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read
2914 [`*const T::sub`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.sub
2915 [`*const T::wrapping_add`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_add
2916 [`*const T::wrapping_sub`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_sub
2917 [`*mut T::add`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.add-1
2918 [`*mut T::copy_to_nonoverlapping`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.copy_to_nonoverlapping-1
2919 [`*mut T::copy_to`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.copy_to-1
2920 [`*mut T::read_unaligned`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read_unaligned-1
2921 [`*mut T::read_volatile`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read_volatile-1
2922 [`*mut T::read`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read-1
2923 [`*mut T::replace`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.replace
2924 [`*mut T::sub`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.sub-1
2925 [`*mut T::swap`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.swap
2926 [`*mut T::wrapping_add`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_add-1
2927 [`*mut T::wrapping_sub`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_sub-1
2928 [`*mut T::write_bytes`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write_bytes
2929 [`*mut T::write_unaligned`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write_unaligned
2930 [`*mut T::write_volatile`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write_volatile
2931 [`*mut T::write`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write
2932 [`Box::leak`]: https://doc.rust-lang.org/std/boxed/struct.Box.html#method.leak
2933 [`FromUtf8Error::as_bytes`]: https://doc.rust-lang.org/std/string/struct.FromUtf8Error.html#method.as_bytes
2934 [`LocalKey::try_with`]: https://doc.rust-lang.org/std/thread/struct.LocalKey.html#method.try_with
2935 [`Option::cloned`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.cloned
2936 [`btree_map::Entry::and_modify`]: https://doc.rust-lang.org/std/collections/btree_map/enum.Entry.html#method.and_modify
2937 [`fs::read_to_string`]: https://doc.rust-lang.org/std/fs/fn.read_to_string.html
2938 [`fs::read`]: https://doc.rust-lang.org/std/fs/fn.read.html
2939 [`fs::write`]: https://doc.rust-lang.org/std/fs/fn.write.html
2940 [`hash_map::Entry::and_modify`]: https://doc.rust-lang.org/std/collections/hash_map/enum.Entry.html#method.and_modify
2941 [`iter::FusedIterator`]: https://doc.rust-lang.org/std/iter/trait.FusedIterator.html
2942 [`ops::RangeInclusive`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html
2943 [`ops::RangeToInclusive`]: https://doc.rust-lang.org/std/ops/struct.RangeToInclusive.html
2944 [`process::id`]: https://doc.rust-lang.org/std/process/fn.id.html
2945 [`slice::rotate_left`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rotate_left
2946 [`slice::rotate_right`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rotate_right
2947 [`String::retain`]: https://doc.rust-lang.org/std/string/struct.String.html#method.retain
2948 [cargo/5041]: https://github.com/rust-lang/cargo/pull/5041
2949 [cargo/5083]: https://github.com/rust-lang/cargo/pull/5083
2950
2951
2952 Version 1.25.0 (2018-03-29)
2953 ==========================
2954
2955 Language
2956 --------
2957 - [The `#[repr(align(x))]` attribute is now stable.][47006] [RFC 1358]
2958 - [You can now use nested groups of imports.][47948]
2959   e.g. `use std::{fs::File, io::Read, path::{Path, PathBuf}};`
2960 - [You can now have `|` at the start of a match arm.][47947] e.g.
2961 ```rust
2962 enum Foo { A, B, C }
2963
2964 fn main() {
2965     let x = Foo::A;
2966     match x {
2967         | Foo::A
2968         | Foo::B => println!("AB"),
2969         | Foo::C => println!("C"),
2970     }
2971 }
2972 ```
2973
2974 Compiler
2975 --------
2976 - [Upgraded to LLVM 6.][47828]
2977 - [Added `-C lto=val` option.][47521]
2978 - [Added `i586-unknown-linux-musl` target][47282]
2979
2980 Libraries
2981 ---------
2982 - [Impl Send for `process::Command` on Unix.][47760]
2983 - [Impl PartialEq and Eq for `ParseCharError`.][47790]
2984 - [`UnsafeCell::into_inner` is now safe.][47204]
2985 - [Implement libstd for CloudABI.][47268]
2986 - [`Float::{from_bits, to_bits}` is now available in libcore.][46931]
2987 - [Implement `AsRef<Path>` for Component][46985]
2988 - [Implemented `Write` for `Cursor<&mut Vec<u8>>`][46830]
2989 - [Moved `Duration` to libcore.][46666]
2990
2991 Stabilized APIs
2992 ---------------
2993 - [`Location::column`]
2994 - [`ptr::NonNull`]
2995
2996 The following functions can now be used in a constant expression.
2997 eg. `static MINUTE: Duration = Duration::from_secs(60);`
2998 - [`Duration::new`][47300]
2999 - [`Duration::from_secs`][47300]
3000 - [`Duration::from_millis`][47300]
3001
3002 Cargo
3003 -----
3004 - [`cargo new` no longer removes `rust` or `rs` prefixs/suffixs.][cargo/5013]
3005 - [`cargo new` now defaults to creating a binary crate, instead of a
3006   library crate.][cargo/5029]
3007
3008 Misc
3009 ----
3010 - [Rust by example is now shipped with new releases][46196]
3011
3012 Compatibility Notes
3013 -------------------
3014 - [Deprecated `net::lookup_host`.][47510]
3015 - [`rustdoc` has switched to pulldown as the default markdown renderer.][47398]
3016 - The borrow checker was sometimes incorrectly permitting overlapping borrows
3017   around indexing operations (see [#47349][47349]). This has been fixed (which also
3018   enabled some correct code that used to cause errors (e.g. [#33903][33903] and [#46095][46095]).
3019 - [Removed deprecated unstable attribute `#[simd]`.][47251]
3020
3021 [33903]: https://github.com/rust-lang/rust/pull/33903
3022 [47947]: https://github.com/rust-lang/rust/pull/47947
3023 [47948]: https://github.com/rust-lang/rust/pull/47948
3024 [47760]: https://github.com/rust-lang/rust/pull/47760
3025 [47790]: https://github.com/rust-lang/rust/pull/47790
3026 [47828]: https://github.com/rust-lang/rust/pull/47828
3027 [47398]: https://github.com/rust-lang/rust/pull/47398
3028 [47510]: https://github.com/rust-lang/rust/pull/47510
3029 [47521]: https://github.com/rust-lang/rust/pull/47521
3030 [47204]: https://github.com/rust-lang/rust/pull/47204
3031 [47251]: https://github.com/rust-lang/rust/pull/47251
3032 [47268]: https://github.com/rust-lang/rust/pull/47268
3033 [47282]: https://github.com/rust-lang/rust/pull/47282
3034 [47300]: https://github.com/rust-lang/rust/pull/47300
3035 [47349]: https://github.com/rust-lang/rust/pull/47349
3036 [46931]: https://github.com/rust-lang/rust/pull/46931
3037 [46985]: https://github.com/rust-lang/rust/pull/46985
3038 [47006]: https://github.com/rust-lang/rust/pull/47006
3039 [46830]: https://github.com/rust-lang/rust/pull/46830
3040 [46095]: https://github.com/rust-lang/rust/pull/46095
3041 [46666]: https://github.com/rust-lang/rust/pull/46666
3042 [46196]: https://github.com/rust-lang/rust/pull/46196
3043 [cargo/5013]: https://github.com/rust-lang/cargo/pull/5013
3044 [cargo/5029]: https://github.com/rust-lang/cargo/pull/5029
3045 [RFC 1358]: https://github.com/rust-lang/rfcs/pull/1358
3046 [`Location::column`]: https://doc.rust-lang.org/std/panic/struct.Location.html#method.column
3047 [`ptr::NonNull`]: https://doc.rust-lang.org/std/ptr/struct.NonNull.html
3048
3049
3050 Version 1.24.1 (2018-03-01)
3051 ==========================
3052
3053  - [Do not abort when unwinding through FFI][48251]
3054  - [Emit UTF-16 files for linker arguments on Windows][48318]
3055  - [Make the error index generator work again][48308]
3056  - [Cargo will warn on Windows 7 if an update is needed][cargo/5069].
3057
3058 [48251]: https://github.com/rust-lang/rust/issues/48251
3059 [48308]: https://github.com/rust-lang/rust/issues/48308
3060 [48318]: https://github.com/rust-lang/rust/issues/48318
3061 [cargo/5069]: https://github.com/rust-lang/cargo/pull/5069
3062
3063
3064 Version 1.24.0 (2018-02-15)
3065 ==========================
3066
3067 Language
3068 --------
3069 - [External `sysv64` ffi is now available.][46528]
3070   eg. `extern "sysv64" fn foo () {}`
3071
3072 Compiler
3073 --------
3074 - [rustc now uses 16 codegen units by default for release builds.][46910]
3075   For the fastest builds, utilize `codegen-units=1`.
3076 - [Added `armv4t-unknown-linux-gnueabi` target.][47018]
3077 - [Add `aarch64-unknown-openbsd` support][46760]
3078
3079 Libraries
3080 ---------
3081 - [`str::find::<char>` now uses memchr.][46735] This should lead to a 10x
3082   improvement in performance in the majority of cases.
3083 - [`OsStr`'s `Debug` implementation is now lossless and consistent
3084   with Windows.][46798]
3085 - [`time::{SystemTime, Instant}` now implement `Hash`.][46828]
3086 - [impl `From<bool>` for `AtomicBool`][46293]
3087 - [impl `From<{CString, &CStr}>` for `{Arc<CStr>, Rc<CStr>}`][45990]
3088 - [impl `From<{OsString, &OsStr}>` for `{Arc<OsStr>, Rc<OsStr>}`][45990]
3089 - [impl `From<{PathBuf, &Path}>` for `{Arc<Path>, Rc<Path>}`][45990]
3090 - [float::from_bits now just uses transmute.][46012] This provides
3091   some optimisations from LLVM.
3092 - [Copied `AsciiExt` methods onto `char`][46077]
3093 - [Remove `T: Sized` requirement on `ptr::is_null()`][46094]
3094 - [impl `From<RecvError>` for `{TryRecvError, RecvTimeoutError}`][45506]
3095 - [Optimised `f32::{min, max}` to generate more efficient x86 assembly][47080]
3096 - [`[u8]::contains` now uses memchr which provides a 3x speed improvement][46713]
3097
3098 Stabilized APIs
3099 ---------------
3100 - [`RefCell::replace`]
3101 - [`RefCell::swap`]
3102 - [`atomic::spin_loop_hint`]
3103
3104 The following functions can now be used in a constant expression.
3105 eg. `let buffer: [u8; size_of::<usize>()];`, `static COUNTER: AtomicUsize = AtomicUsize::new(1);`
3106
3107 - [`AtomicBool::new`][46287]
3108 - [`AtomicUsize::new`][46287]
3109 - [`AtomicIsize::new`][46287]
3110 - [`AtomicPtr::new`][46287]
3111 - [`Cell::new`][46287]
3112 - [`{integer}::min_value`][46287]
3113 - [`{integer}::max_value`][46287]
3114 - [`mem::size_of`][46287]
3115 - [`mem::align_of`][46287]
3116 - [`ptr::null`][46287]
3117 - [`ptr::null_mut`][46287]
3118 - [`RefCell::new`][46287]
3119 - [`UnsafeCell::new`][46287]
3120
3121 Cargo
3122 -----
3123 - [Added a `workspace.default-members` config that
3124   overrides implied `--all` in virtual workspaces.][cargo/4743]
3125 - [Enable incremental by default on development builds.][cargo/4817] Also added
3126   configuration keys to `Cargo.toml` and `.cargo/config` to disable on a
3127   per-project or global basis respectively.
3128
3129 Misc
3130 ----
3131
3132 Compatibility Notes
3133 -------------------
3134 - [Floating point types `Debug` impl now always prints a decimal point.][46831]
3135 - [`Ipv6Addr` now rejects superfluous `::`'s in IPv6 addresses][46671] This is
3136   in accordance with IETF RFC 4291 §2.2.
3137 - [Unwinding will no longer go past FFI boundaries, and will instead abort.][46833]
3138 - [`Formatter::flags` method is now deprecated.][46284] The `sign_plus`,
3139   `sign_minus`, `alternate`, and `sign_aware_zero_pad` should be used instead.
3140 - [Leading zeros in tuple struct members is now an error][47084]
3141 - [`column!()` macro is one-based instead of zero-based][46977]
3142 - [`fmt::Arguments` can no longer be shared across threads][45198]
3143 - [Access to `#[repr(packed)]` struct fields is now unsafe][44884]
3144 - [Cargo sets a different working directory for the compiler][cargo/4788]
3145
3146 [44884]: https://github.com/rust-lang/rust/pull/44884
3147 [45198]: https://github.com/rust-lang/rust/pull/45198
3148 [45506]: https://github.com/rust-lang/rust/pull/45506
3149 [45904]: https://github.com/rust-lang/rust/pull/45904
3150 [45990]: https://github.com/rust-lang/rust/pull/45990
3151 [46012]: https://github.com/rust-lang/rust/pull/46012
3152 [46077]: https://github.com/rust-lang/rust/pull/46077
3153 [46094]: https://github.com/rust-lang/rust/pull/46094
3154 [46284]: https://github.com/rust-lang/rust/pull/46284
3155 [46287]: https://github.com/rust-lang/rust/pull/46287
3156 [46293]: https://github.com/rust-lang/rust/pull/46293
3157 [46528]: https://github.com/rust-lang/rust/pull/46528
3158 [46671]: https://github.com/rust-lang/rust/pull/46671
3159 [46713]: https://github.com/rust-lang/rust/pull/46713
3160 [46735]: https://github.com/rust-lang/rust/pull/46735
3161 [46749]: https://github.com/rust-lang/rust/pull/46749
3162 [46760]: https://github.com/rust-lang/rust/pull/46760
3163 [46798]: https://github.com/rust-lang/rust/pull/46798
3164 [46828]: https://github.com/rust-lang/rust/pull/46828
3165 [46831]: https://github.com/rust-lang/rust/pull/46831
3166 [46833]: https://github.com/rust-lang/rust/pull/46833
3167 [46910]: https://github.com/rust-lang/rust/pull/46910
3168 [46977]: https://github.com/rust-lang/rust/pull/46977
3169 [47018]: https://github.com/rust-lang/rust/pull/47018
3170 [47080]: https://github.com/rust-lang/rust/pull/47080
3171 [47084]: https://github.com/rust-lang/rust/pull/47084
3172 [cargo/4743]: https://github.com/rust-lang/cargo/pull/4743
3173 [cargo/4788]: https://github.com/rust-lang/cargo/pull/4788
3174 [cargo/4817]: https://github.com/rust-lang/cargo/pull/4817
3175 [`RefCell::replace`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.replace
3176 [`RefCell::swap`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.swap
3177 [`atomic::spin_loop_hint`]: https://doc.rust-lang.org/std/sync/atomic/fn.spin_loop_hint.html
3178
3179
3180 Version 1.23.0 (2018-01-04)
3181 ==========================
3182
3183 Language
3184 --------
3185 - [Arbitrary `auto` traits are now permitted in trait objects.][45772]
3186 - [rustc now uses subtyping on the left hand side of binary operations.][45435]
3187   Which should fix some confusing errors in some operations.
3188
3189 Compiler
3190 --------
3191 - [Enabled `TrapUnreachable` in LLVM which should mitigate the impact of
3192   undefined behavior.][45920]
3193 - [rustc now suggests renaming import if names clash.][45660]
3194 - [Display errors/warnings correctly when there are zero-width or
3195   wide characters.][45711]
3196 - [rustc now avoids unnecessary copies of arguments that are
3197   simple bindings][45380] This should improve memory usage on average by 5-10%.
3198 - [Updated musl used to build musl rustc to 1.1.17][45393]
3199
3200 Libraries
3201 ---------
3202 - [Allow a trailing comma in `assert_eq/ne` macro][45887]
3203 - [Implement Hash for raw pointers to unsized types][45483]
3204 - [impl `From<*mut T>` for `AtomicPtr<T>`][45610]
3205 - [impl `From<usize/isize>` for `AtomicUsize/AtomicIsize`.][45610]
3206 - [Removed the `T: Sync` requirement for `RwLock<T>: Send`][45267]
3207 - [Removed `T: Sized` requirement for `{<*const T>, <*mut T>}::as_ref`
3208   and `<*mut T>::as_mut`][44932]
3209 - [Optimized `Thread::{park, unpark}` implementation][45524]
3210 - [Improved `SliceExt::binary_search` performance.][45333]
3211 - [impl `FromIterator<()>` for `()`][45379]
3212 - [Copied `AsciiExt` trait methods to primitive types.][44042] Use of `AsciiExt`
3213   is now deprecated.
3214
3215 Stabilized APIs
3216 ---------------
3217
3218 Cargo
3219 -----
3220 - [Cargo now supports uninstallation of multiple packages][cargo/4561]
3221   eg. `cargo uninstall foo bar` uninstalls `foo` and `bar`.
3222 - [Added unit test checking to `cargo check`][cargo/4592]
3223 - [Cargo now lets you install a specific version
3224   using `cargo install --version`][cargo/4637]
3225
3226 Misc
3227 ----
3228 - [Releases now ship with the Cargo book documentation.][45692]
3229 - [rustdoc now prints rendering warnings on every run.][45324]
3230
3231 Compatibility Notes
3232 -------------------
3233 - [Changes have been made to type equality to make it more correct,
3234   in rare cases this could break some code.][45853] [Tracking issue for
3235   further information][45852]
3236 - [`char::escape_debug` now uses Unicode 10 over 9.][45571]
3237 - [Upgraded Android SDK to 27, and NDK to r15c.][45580] This drops support for
3238   Android 9, the minimum supported version is Android 14.
3239 - [Bumped the minimum LLVM to 3.9][45326]
3240
3241 [44042]: https://github.com/rust-lang/rust/pull/44042
3242 [44932]: https://github.com/rust-lang/rust/pull/44932
3243 [45267]: https://github.com/rust-lang/rust/pull/45267
3244 [45324]: https://github.com/rust-lang/rust/pull/45324
3245 [45326]: https://github.com/rust-lang/rust/pull/45326
3246 [45333]: https://github.com/rust-lang/rust/pull/45333
3247 [45379]: https://github.com/rust-lang/rust/pull/45379
3248 [45380]: https://github.com/rust-lang/rust/pull/45380
3249 [45393]: https://github.com/rust-lang/rust/pull/45393
3250 [45435]: https://github.com/rust-lang/rust/pull/45435
3251 [45483]: https://github.com/rust-lang/rust/pull/45483
3252 [45524]: https://github.com/rust-lang/rust/pull/45524
3253 [45571]: https://github.com/rust-lang/rust/pull/45571
3254 [45580]: https://github.com/rust-lang/rust/pull/45580
3255 [45610]: https://github.com/rust-lang/rust/pull/45610
3256 [45660]: https://github.com/rust-lang/rust/pull/45660
3257 [45692]: https://github.com/rust-lang/rust/pull/45692
3258 [45711]: https://github.com/rust-lang/rust/pull/45711
3259 [45772]: https://github.com/rust-lang/rust/pull/45772
3260 [45852]: https://github.com/rust-lang/rust/issues/45852
3261 [45853]: https://github.com/rust-lang/rust/pull/45853
3262 [45887]: https://github.com/rust-lang/rust/pull/45887
3263 [45920]: https://github.com/rust-lang/rust/pull/45920
3264 [cargo/4561]: https://github.com/rust-lang/cargo/pull/4561
3265 [cargo/4592]: https://github.com/rust-lang/cargo/pull/4592
3266 [cargo/4637]: https://github.com/rust-lang/cargo/pull/4637
3267
3268
3269 Version 1.22.1 (2017-11-22)
3270 ==========================
3271
3272 - [Update Cargo to fix an issue with macOS 10.13 "High Sierra"][46183]
3273
3274 [46183]: https://github.com/rust-lang/rust/pull/46183
3275
3276 Version 1.22.0 (2017-11-22)
3277 ==========================
3278
3279 Language
3280 --------
3281 - [`non_snake_case` lint now allows extern no-mangle functions][44966]
3282 - [Now accepts underscores in unicode escapes][43716]
3283 - [`T op= &T` now works for numeric types.][44287] eg. `let mut x = 2; x += &8;`
3284 - [types that impl `Drop` are now allowed in `const` and `static` types][44456]
3285
3286 Compiler
3287 --------
3288 - [rustc now defaults to having 16 codegen units at debug on supported platforms.][45064]
3289 - [rustc will no longer inline in codegen units when compiling for debug][45075]
3290   This should decrease compile times for debug builds.
3291 - [strict memory alignment now enabled on ARMv6][45094]
3292 - [Remove support for the PNaCl target `le32-unknown-nacl`][45041]
3293
3294 Libraries
3295 ---------
3296 - [Allow atomic operations up to 32 bits
3297   on `armv5te_unknown_linux_gnueabi`][44978]
3298 - [`Box<Error>` now impls `From<Cow<str>>`][44466]
3299 - [`std::mem::Discriminant` is now guaranteed to be `Send + Sync`][45095]
3300 - [`fs::copy` now returns the length of the main stream on NTFS.][44895]
3301 - [Properly detect overflow in `Instant += Duration`.][44220]
3302 - [impl `Hasher` for `{&mut Hasher, Box<Hasher>}`][44015]
3303 - [impl `fmt::Debug` for `SplitWhitespace`.][44303]
3304 - [`Option<T>` now impls `Try`][42526] This allows for using `?` with `Option` types.
3305
3306 Stabilized APIs
3307 ---------------
3308
3309 Cargo
3310 -----
3311 - [Cargo will now build multi file examples in subdirectories of the `examples`
3312   folder that have a `main.rs` file.][cargo/4496]
3313 - [Changed `[root]` to `[package]` in `Cargo.lock`][cargo/4571] Packages with
3314   the old format will continue to work and can be updated with `cargo update`.
3315 - [Now supports vendoring git repositories][cargo/3992]
3316
3317 Misc
3318 ----
3319 - [`libbacktrace` is now available on Apple platforms.][44251]
3320 - [Stabilised the `compile_fail` attribute for code fences in doc-comments.][43949]
3321   This now lets you specify that a given code example will fail to compile.
3322
3323 Compatibility Notes
3324 -------------------
3325 - [The minimum Android version that rustc can build for has been bumped
3326   to `4.0` from `2.3`][45656]
3327 - [Allowing `T op= &T` for numeric types has broken some type
3328   inference cases][45480]
3329
3330
3331 [42526]: https://github.com/rust-lang/rust/pull/42526
3332 [43017]: https://github.com/rust-lang/rust/pull/43017
3333 [43716]: https://github.com/rust-lang/rust/pull/43716
3334 [43949]: https://github.com/rust-lang/rust/pull/43949
3335 [44015]: https://github.com/rust-lang/rust/pull/44015
3336 [44220]: https://github.com/rust-lang/rust/pull/44220
3337 [44251]: https://github.com/rust-lang/rust/pull/44251
3338 [44287]: https://github.com/rust-lang/rust/pull/44287
3339 [44303]: https://github.com/rust-lang/rust/pull/44303
3340 [44456]: https://github.com/rust-lang/rust/pull/44456
3341 [44466]: https://github.com/rust-lang/rust/pull/44466
3342 [44895]: https://github.com/rust-lang/rust/pull/44895
3343 [44966]: https://github.com/rust-lang/rust/pull/44966
3344 [44978]: https://github.com/rust-lang/rust/pull/44978
3345 [45041]: https://github.com/rust-lang/rust/pull/45041
3346 [45064]: https://github.com/rust-lang/rust/pull/45064
3347 [45075]: https://github.com/rust-lang/rust/pull/45075
3348 [45094]: https://github.com/rust-lang/rust/pull/45094
3349 [45095]: https://github.com/rust-lang/rust/pull/45095
3350 [45480]: https://github.com/rust-lang/rust/issues/45480
3351 [45656]: https://github.com/rust-lang/rust/pull/45656
3352 [cargo/3992]: https://github.com/rust-lang/cargo/pull/3992
3353 [cargo/4496]: https://github.com/rust-lang/cargo/pull/4496
3354 [cargo/4571]: https://github.com/rust-lang/cargo/pull/4571
3355
3356
3357
3358
3359
3360
3361 Version 1.21.0 (2017-10-12)
3362 ==========================
3363
3364 Language
3365 --------
3366 - [You can now use static references for literals.][43838]
3367   Example:
3368   ```rust
3369   fn main() {
3370       let x: &'static u32 = &0;
3371   }
3372   ```
3373 - [Relaxed path syntax. Optional `::` before `<` is now allowed in all contexts.][43540]
3374   Example:
3375   ```rust
3376   my_macro!(Vec<i32>::new); // Always worked
3377   my_macro!(Vec::<i32>::new); // Now works
3378   ```
3379
3380 Compiler
3381 --------
3382 - [Upgraded jemalloc to 4.5.0][43911]
3383 - [Enabled unwinding panics on Redox][43917]
3384 - [Now runs LLVM in parallel during translation phase.][43506]
3385   This should reduce peak memory usage.
3386
3387 Libraries
3388 ---------
3389 - [Generate builtin impls for `Clone` for all arrays and tuples that
3390   are `T: Clone`][43690]
3391 - [`Stdin`, `Stdout`, and `Stderr` now implement `AsRawFd`.][43459]
3392 - [`Rc` and `Arc` now implement `From<&[T]> where T: Clone`, `From<str>`,
3393   `From<String>`, `From<Box<T>> where T: ?Sized`, and `From<Vec<T>>`.][42565]
3394
3395 Stabilized APIs
3396 ---------------
3397
3398 [`std::mem::discriminant`]
3399
3400 Cargo
3401 -----
3402 - [You can now call `cargo install` with multiple package names][cargo/4216]
3403 - [Cargo commands inside a virtual workspace will now implicitly
3404   pass `--all`][cargo/4335]
3405 - [Added a `[patch]` section to `Cargo.toml` to handle
3406   prepublication dependencies][cargo/4123] [RFC 1969]
3407 - [`include` & `exclude` fields in `Cargo.toml` now accept gitignore
3408   like patterns][cargo/4270]
3409 - [Added the `--all-targets` option][cargo/4400]
3410 - [Using required dependencies as a feature is now deprecated and emits
3411   a warning][cargo/4364]
3412
3413
3414 Misc
3415 ----
3416 - [Cargo docs are moving][43916]
3417   to [doc.rust-lang.org/cargo](https://doc.rust-lang.org/cargo)
3418 - [The rustdoc book is now available][43863]
3419   at [doc.rust-lang.org/rustdoc](https://doc.rust-lang.org/rustdoc)
3420 - [Added a preview of RLS has been made available through rustup][44204]
3421   Install with `rustup component add rls-preview`
3422 - [`std::os` documentation for Unix, Linux, and Windows now appears on doc.rust-lang.org][43348]
3423   Previously only showed `std::os::unix`.
3424
3425 Compatibility Notes
3426 -------------------
3427 - [Changes in method matching against higher-ranked types][43880] This may cause
3428   breakage in subtyping corner cases. [A more in-depth explanation is available.][info/43880]
3429 - [rustc's JSON error output's byte position start at top of file.][42973]
3430   Was previously relative to the rustc's internal `CodeMap` struct which
3431   required the unstable library `libsyntax` to correctly use.
3432 - [`unused_results` lint no longer ignores booleans][43728]
3433
3434 [42565]: https://github.com/rust-lang/rust/pull/42565
3435 [42973]: https://github.com/rust-lang/rust/pull/42973
3436 [43348]: https://github.com/rust-lang/rust/pull/43348
3437 [43459]: https://github.com/rust-lang/rust/pull/43459
3438 [43506]: https://github.com/rust-lang/rust/pull/43506
3439 [43540]: https://github.com/rust-lang/rust/pull/43540
3440 [43690]: https://github.com/rust-lang/rust/pull/43690
3441 [43728]: https://github.com/rust-lang/rust/pull/43728
3442 [43838]: https://github.com/rust-lang/rust/pull/43838
3443 [43863]: https://github.com/rust-lang/rust/pull/43863
3444 [43880]: https://github.com/rust-lang/rust/pull/43880
3445 [43911]: https://github.com/rust-lang/rust/pull/43911
3446 [43916]: https://github.com/rust-lang/rust/pull/43916
3447 [43917]: https://github.com/rust-lang/rust/pull/43917
3448 [44204]: https://github.com/rust-lang/rust/pull/44204
3449 [cargo/4123]: https://github.com/rust-lang/cargo/pull/4123
3450 [cargo/4216]: https://github.com/rust-lang/cargo/pull/4216
3451 [cargo/4270]: https://github.com/rust-lang/cargo/pull/4270
3452 [cargo/4335]: https://github.com/rust-lang/cargo/pull/4335
3453 [cargo/4364]: https://github.com/rust-lang/cargo/pull/4364
3454 [cargo/4400]: https://github.com/rust-lang/cargo/pull/4400
3455 [RFC 1969]: https://github.com/rust-lang/rfcs/pull/1969
3456 [info/43880]: https://github.com/rust-lang/rust/issues/44224#issuecomment-330058902
3457 [`std::mem::discriminant`]: https://doc.rust-lang.org/std/mem/fn.discriminant.html
3458
3459 Version 1.20.0 (2017-08-31)
3460 ===========================
3461
3462 Language
3463 --------
3464 - [Associated constants are now stabilised.][42809]
3465 - [A lot of macro bugs are now fixed.][42913]
3466
3467 Compiler
3468 --------
3469
3470 - [Struct fields are now properly coerced to the expected field type.][42807]
3471 - [Enabled wasm LLVM backend][42571] WASM can now be built with the
3472   `wasm32-experimental-emscripten` target.
3473 - [Changed some of the error messages to be more helpful.][42033]
3474 - [Add support for RELRO(RELocation Read-Only) for platforms that support
3475   it.][43170]
3476 - [rustc now reports the total number of errors on compilation failure][43015]
3477   previously this was only the number of errors in the pass that failed.
3478 - [Expansion in rustc has been sped up 29x.][42533]
3479 - [added `msp430-none-elf` target.][43099]
3480 - [rustc will now suggest one-argument enum variant to fix type mismatch when
3481   applicable][43178]
3482 - [Fixes backtraces on Redox][43228]
3483 - [rustc now identifies different versions of same crate when absolute paths of
3484   different types match in an error message.][42826]
3485
3486 Libraries
3487 ---------
3488
3489
3490 - [Relaxed Debug constraints on `{HashMap,BTreeMap}::{Keys,Values}`.][42854]
3491 - [Impl `PartialEq`, `Eq`, `PartialOrd`, `Ord`, `Debug`, `Hash` for unsized
3492   tuples.][43011]
3493 - [Impl `fmt::{Display, Debug}` for `Ref`, `RefMut`, `MutexGuard`,
3494   `RwLockReadGuard`, `RwLockWriteGuard`][42822]
3495 - [Impl `Clone` for `DefaultHasher`.][42799]
3496 - [Impl `Sync` for `SyncSender`.][42397]
3497 - [Impl `FromStr` for `char`][42271]
3498 - [Fixed how `{f32, f64}::{is_sign_negative, is_sign_positive}` handles
3499   NaN.][42431]
3500 - [allow messages in the `unimplemented!()` macro.][42155]
3501   ie. `unimplemented!("Waiting for 1.21 to be stable")`
3502 - [`pub(restricted)` is now supported in the `thread_local!` macro.][43185]
3503 - [Upgrade to Unicode 10.0.0][42999]
3504 - [Reimplemented `{f32, f64}::{min, max}` in Rust instead of using CMath.][42430]
3505 - [Skip the main thread's manual stack guard on Linux][43072]
3506 - [Iterator::nth for `ops::{Range, RangeFrom}` is now done in O(1) time][43077]
3507 - [`#[repr(align(N))]` attribute max number is now 2^31 - 1.][43097] This was
3508   previously 2^15.
3509 - [`{OsStr, Path}::Display` now avoids allocations where possible][42613]
3510
3511 Stabilized APIs
3512 ---------------
3513
3514 - [`CStr::into_c_string`]
3515 - [`CString::as_c_str`]
3516 - [`CString::into_boxed_c_str`]
3517 - [`Chain::get_mut`]
3518 - [`Chain::get_ref`]
3519 - [`Chain::into_inner`]
3520 - [`Option::get_or_insert_with`]
3521 - [`Option::get_or_insert`]
3522 - [`OsStr::into_os_string`]
3523 - [`OsString::into_boxed_os_str`]
3524 - [`Take::get_mut`]
3525 - [`Take::get_ref`]
3526 - [`Utf8Error::error_len`]
3527 - [`char::EscapeDebug`]
3528 - [`char::escape_debug`]
3529 - [`compile_error!`]
3530 - [`f32::from_bits`]
3531 - [`f32::to_bits`]
3532 - [`f64::from_bits`]
3533 - [`f64::to_bits`]
3534 - [`mem::ManuallyDrop`]
3535 - [`slice::sort_unstable_by_key`]
3536 - [`slice::sort_unstable_by`]
3537 - [`slice::sort_unstable`]
3538 - [`str::from_boxed_utf8_unchecked`]
3539 - [`str::as_bytes_mut`]
3540 - [`str::as_bytes_mut`]
3541 - [`str::from_utf8_mut`]
3542 - [`str::from_utf8_unchecked_mut`]
3543 - [`str::get_mut`]
3544 - [`str::get_unchecked_mut`]
3545 - [`str::get_unchecked`]
3546 - [`str::get`]
3547 - [`str::into_boxed_bytes`]
3548
3549
3550 Cargo
3551 -----
3552 - [Cargo API token location moved from `~/.cargo/config` to
3553   `~/.cargo/credentials`.][cargo/3978]
3554 - [Cargo will now build `main.rs` binaries that are in sub-directories of
3555   `src/bin`.][cargo/4214] ie. Having `src/bin/server/main.rs` and
3556   `src/bin/client/main.rs` generates `target/debug/server` and `target/debug/client`
3557 - [You can now specify version of a binary when installed through
3558   `cargo install` using `--vers`.][cargo/4229]
3559 - [Added `--no-fail-fast` flag to cargo to run all benchmarks regardless of
3560   failure.][cargo/4248]
3561 - [Changed the convention around which file is the crate root.][cargo/4259]
3562 - [The `include`/`exclude` property in `Cargo.toml` now accepts gitignore paths
3563   instead of glob patterns][cargo/4270]. Glob patterns are now deprecated.
3564
3565 Compatibility Notes
3566 -------------------
3567
3568 - [Functions with `'static` in their return types will now not be as usable as
3569   if they were using lifetime parameters instead.][42417]
3570 - [The reimplementation of `{f32, f64}::is_sign_{negative, positive}` now
3571   takes the sign of NaN into account where previously didn't.][42430]
3572
3573 [42033]: https://github.com/rust-lang/rust/pull/42033
3574 [42155]: https://github.com/rust-lang/rust/pull/42155
3575 [42271]: https://github.com/rust-lang/rust/pull/42271
3576 [42397]: https://github.com/rust-lang/rust/pull/42397
3577 [42417]: https://github.com/rust-lang/rust/pull/42417
3578 [42430]: https://github.com/rust-lang/rust/pull/42430
3579 [42431]: https://github.com/rust-lang/rust/pull/42431
3580 [42533]: https://github.com/rust-lang/rust/pull/42533
3581 [42571]: https://github.com/rust-lang/rust/pull/42571
3582 [42613]: https://github.com/rust-lang/rust/pull/42613
3583 [42799]: https://github.com/rust-lang/rust/pull/42799
3584 [42807]: https://github.com/rust-lang/rust/pull/42807
3585 [42809]: https://github.com/rust-lang/rust/pull/42809
3586 [42822]: https://github.com/rust-lang/rust/pull/42822
3587 [42826]: https://github.com/rust-lang/rust/pull/42826
3588 [42854]: https://github.com/rust-lang/rust/pull/42854
3589 [42913]: https://github.com/rust-lang/rust/pull/42913
3590 [42999]: https://github.com/rust-lang/rust/pull/42999
3591 [43011]: https://github.com/rust-lang/rust/pull/43011
3592 [43015]: https://github.com/rust-lang/rust/pull/43015
3593 [43072]: https://github.com/rust-lang/rust/pull/43072
3594 [43077]: https://github.com/rust-lang/rust/pull/43077
3595 [43097]: https://github.com/rust-lang/rust/pull/43097
3596 [43099]: https://github.com/rust-lang/rust/pull/43099
3597 [43170]: https://github.com/rust-lang/rust/pull/43170
3598 [43178]: https://github.com/rust-lang/rust/pull/43178
3599 [43185]: https://github.com/rust-lang/rust/pull/43185
3600 [43228]: https://github.com/rust-lang/rust/pull/43228
3601 [cargo/3978]: https://github.com/rust-lang/cargo/pull/3978
3602 [cargo/4214]: https://github.com/rust-lang/cargo/pull/4214
3603 [cargo/4229]: https://github.com/rust-lang/cargo/pull/4229
3604 [cargo/4248]: https://github.com/rust-lang/cargo/pull/4248
3605 [cargo/4259]: https://github.com/rust-lang/cargo/pull/4259
3606 [cargo/4270]: https://github.com/rust-lang/cargo/pull/4270
3607 [`CStr::into_c_string`]: https://doc.rust-lang.org/std/ffi/struct.CStr.html#method.into_c_string
3608 [`CString::as_c_str`]: https://doc.rust-lang.org/std/ffi/struct.CString.html#method.as_c_str
3609 [`CString::into_boxed_c_str`]: https://doc.rust-lang.org/std/ffi/struct.CString.html#method.into_boxed_c_str
3610 [`Chain::get_mut`]: https://doc.rust-lang.org/std/io/struct.Chain.html#method.get_mut
3611 [`Chain::get_ref`]: https://doc.rust-lang.org/std/io/struct.Chain.html#method.get_ref
3612 [`Chain::into_inner`]: https://doc.rust-lang.org/std/io/struct.Chain.html#method.into_inner
3613 [`Option::get_or_insert_with`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.get_or_insert_with
3614 [`Option::get_or_insert`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.get_or_insert
3615 [`OsStr::into_os_string`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html#method.into_os_string
3616 [`OsString::into_boxed_os_str`]: https://doc.rust-lang.org/std/ffi/struct.OsString.html#method.into_boxed_os_str
3617 [`Take::get_mut`]: https://doc.rust-lang.org/std/io/struct.Take.html#method.get_mut
3618 [`Take::get_ref`]: https://doc.rust-lang.org/std/io/struct.Take.html#method.get_ref
3619 [`Utf8Error::error_len`]: https://doc.rust-lang.org/std/str/struct.Utf8Error.html#method.error_len
3620 [`char::EscapeDebug`]: https://doc.rust-lang.org/std/char/struct.EscapeDebug.html
3621 [`char::escape_debug`]: https://doc.rust-lang.org/std/primitive.char.html#method.escape_debug
3622 [`compile_error!`]: https://doc.rust-lang.org/std/macro.compile_error.html
3623 [`f32::from_bits`]: https://doc.rust-lang.org/std/primitive.f32.html#method.from_bits
3624 [`f32::to_bits`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_bits
3625 [`f64::from_bits`]: https://doc.rust-lang.org/std/primitive.f64.html#method.from_bits
3626 [`f64::to_bits`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_bits
3627 [`mem::ManuallyDrop`]: https://doc.rust-lang.org/std/mem/union.ManuallyDrop.html
3628 [`slice::sort_unstable_by_key`]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_unstable_by_key
3629 [`slice::sort_unstable_by`]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_unstable_by
3630 [`slice::sort_unstable`]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_unstable
3631 [`str::from_boxed_utf8_unchecked`]: https://doc.rust-lang.org/std/str/fn.from_boxed_utf8_unchecked.html
3632 [`str::as_bytes_mut`]: https://doc.rust-lang.org/std/primitive.str.html#method.as_bytes_mut
3633 [`str::from_utf8_mut`]: https://doc.rust-lang.org/std/str/fn.from_utf8_mut.html
3634 [`str::from_utf8_unchecked_mut`]: https://doc.rust-lang.org/std/str/fn.from_utf8_unchecked_mut.html
3635 [`str::get_mut`]: https://doc.rust-lang.org/std/primitive.str.html#method.get_mut
3636 [`str::get_unchecked_mut`]: https://doc.rust-lang.org/std/primitive.str.html#method.get_unchecked_mut
3637 [`str::get_unchecked`]: https://doc.rust-lang.org/std/primitive.str.html#method.get_unchecked
3638 [`str::get`]: https://doc.rust-lang.org/std/primitive.str.html#method.get
3639 [`str::into_boxed_bytes`]: https://doc.rust-lang.org/std/primitive.str.html#method.into_boxed_bytes
3640
3641
3642 Version 1.19.0 (2017-07-20)
3643 ===========================
3644
3645 Language
3646 --------
3647
3648 - [Numeric fields can now be used for creating tuple structs.][41145] [RFC 1506]
3649   For example `struct Point(u32, u32); let x = Point { 0: 7, 1: 0 };`.
3650 - [Macro recursion limit increased to 1024 from 64.][41676]
3651 - [Added lint for detecting unused macros.][41907]
3652 - [`loop` can now return a value with `break`.][42016] [RFC 1624]
3653   For example: `let x = loop { break 7; };`
3654 - [C compatible `union`s are now available.][42068] [RFC 1444] They can only
3655   contain `Copy` types and cannot have a `Drop` implementation.
3656   Example: `union Foo { bar: u8, baz: usize }`
3657 - [Non capturing closures can now be coerced into `fn`s,][42162] [RFC 1558]
3658   Example: `let foo: fn(u8) -> u8 = |v: u8| { v };`
3659
3660 Compiler
3661 --------
3662
3663 - [Add support for bootstrapping the Rust compiler toolchain on Android.][41370]
3664 - [Change `arm-linux-androideabi` to correspond to the `armeabi`
3665   official ABI.][41656] If you wish to continue targeting the `armeabi-v7a` ABI
3666   you should use `--target armv7-linux-androideabi`.
3667 - [Fixed ICE when removing a source file between compilation sessions.][41873]
3668 - [Minor optimisation of string operations.][42037]
3669 - [Compiler error message is now `aborting due to previous error(s)` instead of
3670   `aborting due to N previous errors`][42150] This was previously inaccurate and
3671   would only count certain kinds of errors.
3672 - [The compiler now supports Visual Studio 2017][42225]
3673 - [The compiler is now built against LLVM 4.0.1 by default][42948]
3674 - [Added a lot][42264] of [new error codes][42302]
3675 - [Added `target-feature=+crt-static` option][37406] [RFC 1721] Which allows
3676   libraries with C Run-time Libraries(CRT) to be statically linked.
3677 - [Fixed various ARM codegen bugs][42740]
3678
3679 Libraries
3680 ---------
3681
3682 - [`String` now implements `FromIterator<Cow<'a, str>>` and
3683   `Extend<Cow<'a, str>>`][41449]
3684 - [`Vec` now implements `From<&mut [T]>`][41530]
3685 - [`Box<[u8]>` now implements `From<Box<str>>`][41258]
3686 - [`SplitWhitespace` now implements `Clone`][41659]
3687 - [`[u8]::reverse` is now 5x faster and `[u16]::reverse` is now
3688   1.5x faster][41764]
3689 - [`eprint!` and `eprintln!` macros added to prelude.][41192] Same as the `print!`
3690   macros, but for printing to stderr.
3691
3692 Stabilized APIs
3693 ---------------
3694
3695 - [`OsString::shrink_to_fit`]
3696 - [`cmp::Reverse`]
3697 - [`Command::envs`]
3698 - [`thread::ThreadId`]
3699
3700 Cargo
3701 -----
3702
3703 - [Build scripts can now add environment variables to the environment
3704   the crate is being compiled in.
3705   Example: `println!("cargo:rustc-env=FOO=bar");`][cargo/3929]
3706 - [Subcommands now replace the current process rather than spawning a new
3707   child process][cargo/3970]
3708 - [Workspace members can now accept glob file patterns][cargo/3979]
3709 - [Added `--all` flag to the `cargo bench` subcommand to run benchmarks of all
3710   the members in a given workspace.][cargo/3988]
3711 - [Updated `libssh2-sys` to 0.2.6][cargo/4008]
3712 - [Target directory path is now in the cargo metadata][cargo/4022]
3713 - [Cargo no longer checks out a local working directory for the
3714   crates.io index][cargo/4026] This should provide smaller file size for the
3715   registry, and improve cloning times, especially on Windows machines.
3716 - [Added an `--exclude` option for excluding certain packages when using the
3717   `--all` option][cargo/4031]
3718 - [Cargo will now automatically retry when receiving a 5xx error
3719   from crates.io][cargo/4032]
3720 - [The `--features` option now accepts multiple comma or space
3721   delimited values.][cargo/4084]
3722 - [Added support for custom target specific runners][cargo/3954]
3723
3724 Misc
3725 ----
3726
3727 - [Added `rust-windbg.cmd`][39983] for loading rust `.natvis` files in the
3728   Windows Debugger.
3729 - [Rust will now release XZ compressed packages][rust-installer/57]
3730 - [rustup will now prefer to download rust packages with
3731   XZ compression][rustup/1100] over GZip packages.
3732 - [Added the ability to escape `#` in rust documentation][41785] By adding
3733   additional `#`'s ie. `##` is now `#`
3734
3735 Compatibility Notes
3736 -------------------
3737
3738 - [`MutexGuard<T>` may only be `Sync` if `T` is `Sync`.][41624]
3739 - [`-Z` flags are now no longer allowed to be used on the stable
3740   compiler.][41751] This has been a warning for a year previous to this.
3741 - [As a result of the `-Z` flag change, the `cargo-check` plugin no
3742   longer works][42844]. Users should migrate to the built-in `check`
3743   command, which has been available since 1.16.
3744 - [Ending a float literal with `._` is now a hard error.
3745   Example: `42._` .][41946]
3746 - [Any use of a private `extern crate` outside of its module is now a
3747   hard error.][36886] This was previously a warning.
3748 - [`use ::self::foo;` is now a hard error.][36888] `self` paths are always
3749   relative while the `::` prefix makes a path absolute, but was ignored and the
3750   path was relative regardless.
3751 - [Floating point constants in match patterns is now a hard error][36890]
3752   This was previously a warning.
3753 - [Struct or enum constants that don't derive `PartialEq` & `Eq` used
3754   match patterns is now a hard error][36891] This was previously a warning.
3755 - [Lifetimes named `'_` are no longer allowed.][36892] This was previously
3756   a warning.
3757 - [From the pound escape, lines consisting of multiple `#`s are
3758   now visible][41785]
3759 - [It is an error to re-export private enum variants][42460]. This is
3760   known to break a number of crates that depend on an older version of
3761   mustache.
3762 - [On Windows, if `VCINSTALLDIR` is set incorrectly, `rustc` will try
3763   to use it to find the linker, and the build will fail where it did
3764   not previously][42607]
3765
3766 [36886]: https://github.com/rust-lang/rust/issues/36886
3767 [36888]: https://github.com/rust-lang/rust/issues/36888
3768 [36890]: https://github.com/rust-lang/rust/issues/36890
3769 [36891]: https://github.com/rust-lang/rust/issues/36891
3770 [36892]: https://github.com/rust-lang/rust/issues/36892
3771 [37406]: https://github.com/rust-lang/rust/issues/37406
3772 [39983]: https://github.com/rust-lang/rust/pull/39983
3773 [41145]: https://github.com/rust-lang/rust/pull/41145
3774 [41192]: https://github.com/rust-lang/rust/pull/41192
3775 [41258]: https://github.com/rust-lang/rust/pull/41258
3776 [41370]: https://github.com/rust-lang/rust/pull/41370
3777 [41449]: https://github.com/rust-lang/rust/pull/41449
3778 [41530]: https://github.com/rust-lang/rust/pull/41530
3779 [41624]: https://github.com/rust-lang/rust/pull/41624
3780 [41656]: https://github.com/rust-lang/rust/pull/41656
3781 [41659]: https://github.com/rust-lang/rust/pull/41659
3782 [41676]: https://github.com/rust-lang/rust/pull/41676
3783 [41751]: https://github.com/rust-lang/rust/pull/41751
3784 [41764]: https://github.com/rust-lang/rust/pull/41764
3785 [41785]: https://github.com/rust-lang/rust/pull/41785
3786 [41873]: https://github.com/rust-lang/rust/pull/41873
3787 [41907]: https://github.com/rust-lang/rust/pull/41907
3788 [41946]: https://github.com/rust-lang/rust/pull/41946
3789 [42016]: https://github.com/rust-lang/rust/pull/42016
3790 [42037]: https://github.com/rust-lang/rust/pull/42037
3791 [42068]: https://github.com/rust-lang/rust/pull/42068
3792 [42150]: https://github.com/rust-lang/rust/pull/42150
3793 [42162]: https://github.com/rust-lang/rust/pull/42162
3794 [42225]: https://github.com/rust-lang/rust/pull/42225
3795 [42264]: https://github.com/rust-lang/rust/pull/42264
3796 [42302]: https://github.com/rust-lang/rust/pull/42302
3797 [42460]: https://github.com/rust-lang/rust/issues/42460
3798 [42607]: https://github.com/rust-lang/rust/issues/42607
3799 [42740]: https://github.com/rust-lang/rust/pull/42740
3800 [42844]: https://github.com/rust-lang/rust/issues/42844
3801 [42948]: https://github.com/rust-lang/rust/pull/42948
3802 [RFC 1444]: https://github.com/rust-lang/rfcs/pull/1444
3803 [RFC 1506]: https://github.com/rust-lang/rfcs/pull/1506
3804 [RFC 1558]: https://github.com/rust-lang/rfcs/pull/1558
3805 [RFC 1624]: https://github.com/rust-lang/rfcs/pull/1624
3806 [RFC 1721]: https://github.com/rust-lang/rfcs/pull/1721
3807 [`Command::envs`]: https://doc.rust-lang.org/std/process/struct.Command.html#method.envs
3808 [`OsString::shrink_to_fit`]: https://doc.rust-lang.org/std/ffi/struct.OsString.html#method.shrink_to_fit
3809 [`cmp::Reverse`]: https://doc.rust-lang.org/std/cmp/struct.Reverse.html
3810 [`thread::ThreadId`]: https://doc.rust-lang.org/std/thread/struct.ThreadId.html
3811 [cargo/3929]: https://github.com/rust-lang/cargo/pull/3929
3812 [cargo/3954]: https://github.com/rust-lang/cargo/pull/3954
3813 [cargo/3970]: https://github.com/rust-lang/cargo/pull/3970
3814 [cargo/3979]: https://github.com/rust-lang/cargo/pull/3979
3815 [cargo/3988]: https://github.com/rust-lang/cargo/pull/3988
3816 [cargo/4008]: https://github.com/rust-lang/cargo/pull/4008
3817 [cargo/4022]: https://github.com/rust-lang/cargo/pull/4022
3818 [cargo/4026]: https://github.com/rust-lang/cargo/pull/4026
3819 [cargo/4031]: https://github.com/rust-lang/cargo/pull/4031
3820 [cargo/4032]: https://github.com/rust-lang/cargo/pull/4032
3821 [cargo/4084]: https://github.com/rust-lang/cargo/pull/4084
3822 [rust-installer/57]: https://github.com/rust-lang/rust-installer/pull/57
3823 [rustup/1100]: https://github.com/rust-lang-nursery/rustup.rs/pull/1100
3824
3825
3826 Version 1.18.0 (2017-06-08)
3827 ===========================
3828
3829 Language
3830 --------
3831
3832 - [Stabilize pub(restricted)][40556] `pub` can now accept a module path to
3833   make the item visible to just that module tree. Also accepts the keyword
3834   `crate` to make something public to the whole crate but not users of the
3835   library. Example: `pub(crate) mod utils;`. [RFC 1422].
3836 - [Stabilize `#![windows_subsystem]` attribute][40870] conservative exposure of the
3837   `/SUBSYSTEM` linker flag on Windows platforms. [RFC 1665].
3838 - [Refactor of trait object type parsing][40043] Now `ty` in macros can accept
3839   types like `Write + Send`, trailing `+` are now supported in trait objects,
3840   and better error reporting for trait objects starting with `?Sized`.
3841 - [0e+10 is now a valid floating point literal][40589]
3842 - [Now warns if you bind a lifetime parameter to 'static][40734]
3843 - [Tuples, Enum variant fields, and structs with no `repr` attribute or with
3844   `#[repr(Rust)]` are reordered to minimize padding and produce a smaller
3845   representation in some cases.][40377]
3846
3847 Compiler
3848 --------
3849
3850 - [rustc can now emit mir with `--emit mir`][39891]
3851 - [Improved LLVM IR for trivial functions][40367]
3852 - [Added explanation for E0090(Wrong number of lifetimes are supplied)][40723]
3853 - [rustc compilation is now 15%-20% faster][41469] Thanks to optimisation
3854   opportunities found through profiling
3855 - [Improved backtrace formatting when panicking][38165]
3856
3857 Libraries
3858 ---------
3859
3860 - [Specialized `Vec::from_iter` being passed `vec::IntoIter`][40731] if the
3861   iterator hasn't been advanced the original `Vec` is reassembled with no actual
3862   iteration or reallocation.
3863 - [Simplified HashMap Bucket interface][40561] provides performance
3864   improvements for iterating and cloning.
3865 - [Specialize Vec::from_elem to use calloc][40409]
3866 - [Fixed Race condition in fs::create_dir_all][39799]
3867 - [No longer caching stdio on Windows][40516]
3868 - [Optimized insertion sort in slice][40807] insertion sort in some cases
3869   2.50%~ faster and in one case now 12.50% faster.
3870 - [Optimized `AtomicBool::fetch_nand`][41143]
3871
3872 Stabilized APIs
3873 ---------------
3874
3875 - [`Child::try_wait`]
3876 - [`HashMap::retain`]
3877 - [`HashSet::retain`]
3878 - [`PeekMut::pop`]
3879 - [`TcpStream::peek`]
3880 - [`UdpSocket::peek`]
3881 - [`UdpSocket::peek_from`]
3882
3883 Cargo
3884 -----
3885
3886 - [Added partial Pijul support][cargo/3842] Pijul is a version control system in Rust.
3887   You can now create new cargo projects with Pijul using `cargo new --vcs pijul`
3888 - [Now always emits build script warnings for crates that fail to build][cargo/3847]
3889 - [Added Android build support][cargo/3885]
3890 - [Added `--bins` and `--tests` flags][cargo/3901] now you can build all programs
3891   of a certain type, for example `cargo build --bins` will build all
3892   binaries.
3893 - [Added support for haiku][cargo/3952]
3894
3895 Misc
3896 ----
3897
3898 - [rustdoc can now use pulldown-cmark with the `--enable-commonmark` flag][40338]
3899 - [Added rust-windbg script for better debugging on Windows][39983]
3900 - [Rust now uses the official cross compiler for NetBSD][40612]
3901 - [rustdoc now accepts `#` at the start of files][40828]
3902 - [Fixed jemalloc support for musl][41168]
3903
3904 Compatibility Notes
3905 -------------------
3906
3907 - [Changes to how the `0` flag works in format!][40241] Padding zeroes are now
3908   always placed after the sign if it exists and before the digits. With the `#`
3909   flag the zeroes are placed after the prefix and before the digits.
3910 - [Due to the struct field optimisation][40377], using `transmute` on structs
3911   that have no `repr` attribute or `#[repr(Rust)]` will no longer work. This has
3912   always been undefined behavior, but is now more likely to break in practice.
3913 - [The refactor of trait object type parsing][40043] fixed a bug where `+` was
3914   receiving the wrong priority parsing things like `&for<'a> Tr<'a> + Send` as
3915   `&(for<'a> Tr<'a> + Send)` instead of `(&for<'a> Tr<'a>) + Send`
3916 - [Overlapping inherent `impl`s are now a hard error][40728]
3917 - [`PartialOrd` and `Ord` must agree on the ordering.][41270]
3918 - [`rustc main.rs -o out --emit=asm,llvm-ir`][41085] Now will output
3919   `out.asm` and `out.ll` instead of only one of the filetypes.
3920 - [ calling a function that returns `Self` will no longer work][41805] when
3921   the size of `Self` cannot be statically determined.
3922 - [rustc now builds with a "pthreads" flavour of MinGW for Windows GNU][40805]
3923   this has caused a few regressions namely:
3924
3925   - Changed the link order of local static/dynamic libraries (respecting the
3926     order on given rather than having the compiler reorder).
3927   - Changed how MinGW is linked, native code linked to dynamic libraries
3928     may require manually linking to the gcc support library (for the native
3929     code itself)
3930
3931 [38165]: https://github.com/rust-lang/rust/pull/38165
3932 [39799]: https://github.com/rust-lang/rust/pull/39799
3933 [39891]: https://github.com/rust-lang/rust/pull/39891
3934 [39983]: https://github.com/rust-lang/rust/pull/39983
3935 [40043]: https://github.com/rust-lang/rust/pull/40043
3936 [40241]: https://github.com/rust-lang/rust/pull/40241
3937 [40338]: https://github.com/rust-lang/rust/pull/40338
3938 [40367]: https://github.com/rust-lang/rust/pull/40367
3939 [40377]: https://github.com/rust-lang/rust/pull/40377
3940 [40409]: https://github.com/rust-lang/rust/pull/40409
3941 [40516]: https://github.com/rust-lang/rust/pull/40516
3942 [40556]: https://github.com/rust-lang/rust/pull/40556
3943 [40561]: https://github.com/rust-lang/rust/pull/40561
3944 [40589]: https://github.com/rust-lang/rust/pull/40589
3945 [40612]: https://github.com/rust-lang/rust/pull/40612
3946 [40723]: https://github.com/rust-lang/rust/pull/40723
3947 [40728]: https://github.com/rust-lang/rust/pull/40728
3948 [40731]: https://github.com/rust-lang/rust/pull/40731
3949 [40734]: https://github.com/rust-lang/rust/pull/40734
3950 [40805]: https://github.com/rust-lang/rust/pull/40805
3951 [40807]: https://github.com/rust-lang/rust/pull/40807
3952 [40828]: https://github.com/rust-lang/rust/pull/40828
3953 [40870]: https://github.com/rust-lang/rust/pull/40870
3954 [41085]: https://github.com/rust-lang/rust/pull/41085
3955 [41143]: https://github.com/rust-lang/rust/pull/41143
3956 [41168]: https://github.com/rust-lang/rust/pull/41168
3957 [41270]: https://github.com/rust-lang/rust/issues/41270
3958 [41469]: https://github.com/rust-lang/rust/pull/41469
3959 [41805]: https://github.com/rust-lang/rust/issues/41805
3960 [RFC 1422]: https://github.com/rust-lang/rfcs/blob/master/text/1422-pub-restricted.md
3961 [RFC 1665]: https://github.com/rust-lang/rfcs/blob/master/text/1665-windows-subsystem.md
3962 [`Child::try_wait`]: https://doc.rust-lang.org/std/process/struct.Child.html#method.try_wait
3963 [`HashMap::retain`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.retain
3964 [`HashSet::retain`]: https://doc.rust-lang.org/std/collections/struct.HashSet.html#method.retain
3965 [`PeekMut::pop`]: https://doc.rust-lang.org/std/collections/binary_heap/struct.PeekMut.html#method.pop
3966 [`TcpStream::peek`]: https://doc.rust-lang.org/std/net/struct.TcpStream.html#method.peek
3967 [`UdpSocket::peek_from`]: https://doc.rust-lang.org/std/net/struct.UdpSocket.html#method.peek_from
3968 [`UdpSocket::peek`]: https://doc.rust-lang.org/std/net/struct.UdpSocket.html#method.peek
3969 [cargo/3842]: https://github.com/rust-lang/cargo/pull/3842
3970 [cargo/3847]: https://github.com/rust-lang/cargo/pull/3847
3971 [cargo/3885]: https://github.com/rust-lang/cargo/pull/3885
3972 [cargo/3901]: https://github.com/rust-lang/cargo/pull/3901
3973 [cargo/3952]: https://github.com/rust-lang/cargo/pull/3952
3974
3975
3976 Version 1.17.0 (2017-04-27)
3977 ===========================
3978
3979 Language
3980 --------
3981
3982 * [The lifetime of statics and consts defaults to `'static`][39265]. [RFC 1623]
3983 * [Fields of structs may be initialized without duplicating the field/variable
3984   names][39761]. [RFC 1682]
3985 * [`Self` may be included in the `where` clause of `impls`][38864]. [RFC 1647]
3986 * [When coercing to an unsized type lifetimes must be equal][40319]. That is,
3987   there is no subtyping between `T` and `U` when `T: Unsize<U>`. For example,
3988   coercing `&mut [&'a X; N]` to `&mut [&'b X]` requires `'a` be equal to
3989   `'b`. Soundness fix.
3990 * [Values passed to the indexing operator, `[]`, automatically coerce][40166]
3991 * [Static variables may contain references to other statics][40027]
3992
3993 Compiler
3994 --------
3995
3996 * [Exit quickly on only `--emit dep-info`][40336]
3997 * [Make `-C relocation-model` more correctly determine whether the linker
3998   creates a position-independent executable][40245]
3999 * [Add `-C overflow-checks` to directly control whether integer overflow
4000   panics][40037]
4001 * [The rustc type checker now checks items on demand instead of in a single
4002   in-order pass][40008]. This is mostly an internal refactoring in support of
4003   future work, including incremental type checking, but also resolves [RFC
4004   1647], allowing `Self` to appear in `impl` `where` clauses.
4005 * [Optimize vtable loads][39995]
4006 * [Turn off vectorization for Emscripten targets][39990]
4007 * [Provide suggestions for unknown macros imported with `use`][39953]
4008 * [Fix ICEs in path resolution][39939]
4009 * [Strip exception handling code on Emscripten when `panic=abort`][39193]
4010 * [Add clearer error message using `&str + &str`][39116]
4011
4012 Stabilized APIs
4013 ---------------
4014
4015 * [`Arc::into_raw`]
4016 * [`Arc::from_raw`]
4017 * [`Arc::ptr_eq`]
4018 * [`Rc::into_raw`]
4019 * [`Rc::from_raw`]
4020 * [`Rc::ptr_eq`]
4021 * [`Ordering::then`]
4022 * [`Ordering::then_with`]
4023 * [`BTreeMap::range`]
4024 * [`BTreeMap::range_mut`]
4025 * [`collections::Bound`]
4026 * [`process::abort`]
4027 * [`ptr::read_unaligned`]
4028 * [`ptr::write_unaligned`]
4029 * [`Result::expect_err`]
4030 * [`Cell::swap`]
4031 * [`Cell::replace`]
4032 * [`Cell::into_inner`]
4033 * [`Cell::take`]
4034
4035 Libraries
4036 ---------
4037
4038 * [`BTreeMap` and `BTreeSet` can iterate over ranges][27787]
4039 * [`Cell` can store non-`Copy` types][39793]. [RFC 1651]
4040 * [`String` implements `FromIterator<&char>`][40028]
4041 * `Box` [implements][40009] a number of new conversions:
4042   `From<Box<str>> for String`,
4043   `From<Box<[T]>> for Vec<T>`,
4044   `From<Box<CStr>> for CString`,
4045   `From<Box<OsStr>> for OsString`,
4046   `From<Box<Path>> for PathBuf`,
4047   `Into<Box<str>> for String`,
4048   `Into<Box<[T]>> for Vec<T>`,
4049   `Into<Box<CStr>> for CString`,
4050   `Into<Box<OsStr>> for OsString`,
4051   `Into<Box<Path>> for PathBuf`,
4052   `Default for Box<str>`,
4053   `Default for Box<CStr>`,
4054   `Default for Box<OsStr>`,
4055   `From<&CStr> for Box<CStr>`,
4056   `From<&OsStr> for Box<OsStr>`,
4057   `From<&Path> for Box<Path>`
4058 * [`ffi::FromBytesWithNulError` implements `Error` and `Display`][39960]
4059 * [Specialize `PartialOrd<A> for [A] where A: Ord`][39642]
4060 * [Slightly optimize `slice::sort`][39538]
4061 * [Add `ToString` trait specialization for `Cow<'a, str>` and `String`][39440]
4062 * [`Box<[T]>` implements `From<&[T]> where T: Copy`,
4063   `Box<str>` implements `From<&str>`][39438]
4064 * [`IpAddr` implements `From` for various arrays. `SocketAddr` implements
4065   `From<(I, u16)> where I: Into<IpAddr>`][39372]
4066 * [`format!` estimates the needed capacity before writing a string][39356]
4067 * [Support unprivileged symlink creation in Windows][38921]
4068 * [`PathBuf` implements `Default`][38764]
4069 * [Implement `PartialEq<[A]>` for `VecDeque<A>`][38661]
4070 * [`HashMap` resizes adaptively][38368] to guard against DOS attacks
4071   and poor hash functions.
4072
4073 Cargo
4074 -----
4075
4076 * [Add `cargo check --all`][cargo/3731]
4077 * [Add an option to ignore SSL revocation checking][cargo/3699]
4078 * [Add `cargo run --package`][cargo/3691]
4079 * [Add `required_features`][cargo/3667]
4080 * [Assume `build.rs` is a build script][cargo/3664]
4081 * [Find workspace via `workspace_root` link in containing member][cargo/3562]
4082
4083 Misc
4084 ----
4085
4086 * [Documentation is rendered with mdbook instead of the obsolete, in-tree
4087   `rustbook`][39633]
4088 * [The "Unstable Book" documents nightly-only features][ubook]
4089 * [Improve the style of the sidebar in rustdoc output][40265]
4090 * [Configure build correctly on 64-bit CPU's with the armhf ABI][40261]
4091 * [Fix MSP430 breakage due to `i128`][40257]
4092 * [Preliminary Solaris/SPARCv9 support][39903]
4093 * [`rustc` is linked statically on Windows MSVC targets][39837], allowing it to
4094   run without installing the MSVC runtime.
4095 * [`rustdoc --test` includes file names in test names][39788]
4096 * This release includes builds of `std` for `sparc64-unknown-linux-gnu`,
4097   `aarch64-unknown-linux-fuchsia`, and `x86_64-unknown-linux-fuchsia`.
4098 * [Initial support for `aarch64-unknown-freebsd`][39491]
4099 * [Initial support for `i686-unknown-netbsd`][39426]
4100 * [This release no longer includes the old makefile build system][39431]. Rust
4101   is built with a custom build system, written in Rust, and with Cargo.
4102 * [Add Debug implementations for libcollection structs][39002]
4103 * [`TypeId` implements `PartialOrd` and `Ord`][38981]
4104 * [`--test-threads=0` produces an error][38945]
4105 * [`rustup` installs documentation by default][40526]
4106 * [The Rust source includes NatVis visualizations][39843]. These can be used by
4107   WinDbg and Visual Studio to improve the debugging experience.
4108
4109 Compatibility Notes
4110 -------------------
4111
4112 * [Rust 1.17 does not correctly detect the MSVC 2017 linker][38584]. As a
4113   workaround, either use MSVC 2015 or run vcvars.bat.
4114 * [When coercing to an unsized type lifetimes must be equal][40319]. That is,
4115   disallow subtyping between `T` and `U` when `T: Unsize<U>`, e.g. coercing
4116   `&mut [&'a X; N]` to `&mut [&'b X]` requires `'a` be equal to `'b`. Soundness
4117   fix.
4118 * [`format!` and `Display::to_string` panic if an underlying formatting
4119   implementation returns an error][40117]. Previously the error was silently
4120   ignored. It is incorrect for `write_fmt` to return an error when writing
4121   to a string.
4122 * [In-tree crates are verified to be unstable][39851]. Previously, some minor
4123   crates were marked stable and could be accessed from the stable toolchain.
4124 * [Rust git source no longer includes vendored crates][39728]. Those that need
4125   to build with vendored crates should build from release tarballs.
4126 * [Fix inert attributes from `proc_macro_derives`][39572]
4127 * [During crate resolution, rustc prefers a crate in the sysroot if two crates
4128   are otherwise identical][39518]. Unlikely to be encountered outside the Rust
4129   build system.
4130 * [Fixed bugs around how type inference interacts with dead-code][39485]. The
4131   existing code generally ignores the type of dead-code unless a type-hint is
4132   provided; this can cause surprising inference interactions particularly around
4133   defaulting. The new code uniformly ignores the result type of dead-code.
4134 * [Tuple-struct constructors with private fields are no longer visible][38932]
4135 * [Lifetime parameters that do not appear in the arguments are now considered
4136   early-bound][38897], resolving a soundness bug (#[32330]). The
4137   `hr_lifetime_in_assoc_type` future-compatibility lint has been in effect since
4138   April of 2016.
4139 * [rustdoc: fix doctests with non-feature crate attributes][38161]
4140 * [Make transmuting from fn item types to pointer-sized types a hard
4141   error][34198]
4142
4143 [27787]: https://github.com/rust-lang/rust/issues/27787
4144 [32330]: https://github.com/rust-lang/rust/issues/32330
4145 [34198]: https://github.com/rust-lang/rust/pull/34198
4146 [38161]: https://github.com/rust-lang/rust/pull/38161
4147 [38368]: https://github.com/rust-lang/rust/pull/38368
4148 [38584]: https://github.com/rust-lang/rust/issues/38584
4149 [38661]: https://github.com/rust-lang/rust/pull/38661
4150 [38764]: https://github.com/rust-lang/rust/pull/38764
4151 [38864]: https://github.com/rust-lang/rust/issues/38864
4152 [38897]: https://github.com/rust-lang/rust/pull/38897
4153 [38921]: https://github.com/rust-lang/rust/pull/38921
4154 [38932]: https://github.com/rust-lang/rust/pull/38932
4155 [38945]: https://github.com/rust-lang/rust/pull/38945
4156 [38981]: https://github.com/rust-lang/rust/pull/38981
4157 [39002]: https://github.com/rust-lang/rust/pull/39002
4158 [39116]: https://github.com/rust-lang/rust/pull/39116
4159 [39193]: https://github.com/rust-lang/rust/pull/39193
4160 [39265]: https://github.com/rust-lang/rust/pull/39265
4161 [39356]: https://github.com/rust-lang/rust/pull/39356
4162 [39372]: https://github.com/rust-lang/rust/pull/39372
4163 [39426]: https://github.com/rust-lang/rust/pull/39426
4164 [39431]: https://github.com/rust-lang/rust/pull/39431
4165 [39438]: https://github.com/rust-lang/rust/pull/39438
4166 [39440]: https://github.com/rust-lang/rust/pull/39440
4167 [39485]: https://github.com/rust-lang/rust/pull/39485
4168 [39491]: https://github.com/rust-lang/rust/pull/39491
4169 [39518]: https://github.com/rust-lang/rust/pull/39518
4170 [39538]: https://github.com/rust-lang/rust/pull/39538
4171 [39572]: https://github.com/rust-lang/rust/pull/39572
4172 [39633]: https://github.com/rust-lang/rust/pull/39633
4173 [39642]: https://github.com/rust-lang/rust/pull/39642
4174 [39728]: https://github.com/rust-lang/rust/pull/39728
4175 [39761]: https://github.com/rust-lang/rust/pull/39761
4176 [39788]: https://github.com/rust-lang/rust/pull/39788
4177 [39793]: https://github.com/rust-lang/rust/pull/39793
4178 [39837]: https://github.com/rust-lang/rust/pull/39837
4179 [39843]: https://github.com/rust-lang/rust/pull/39843
4180 [39851]: https://github.com/rust-lang/rust/pull/39851
4181 [39903]: https://github.com/rust-lang/rust/pull/39903
4182 [39939]: https://github.com/rust-lang/rust/pull/39939
4183 [39953]: https://github.com/rust-lang/rust/pull/39953
4184 [39960]: https://github.com/rust-lang/rust/pull/39960
4185 [39990]: https://github.com/rust-lang/rust/pull/39990
4186 [39995]: https://github.com/rust-lang/rust/pull/39995
4187 [40008]: https://github.com/rust-lang/rust/pull/40008
4188 [40009]: https://github.com/rust-lang/rust/pull/40009
4189 [40027]: https://github.com/rust-lang/rust/pull/40027
4190 [40028]: https://github.com/rust-lang/rust/pull/40028
4191 [40037]: https://github.com/rust-lang/rust/pull/40037
4192 [40117]: https://github.com/rust-lang/rust/pull/40117
4193 [40166]: https://github.com/rust-lang/rust/pull/40166
4194 [40245]: https://github.com/rust-lang/rust/pull/40245
4195 [40257]: https://github.com/rust-lang/rust/pull/40257
4196 [40261]: https://github.com/rust-lang/rust/pull/40261
4197 [40265]: https://github.com/rust-lang/rust/pull/40265
4198 [40319]: https://github.com/rust-lang/rust/pull/40319
4199 [40336]: https://github.com/rust-lang/rust/pull/40336
4200 [40526]: https://github.com/rust-lang/rust/pull/40526
4201 [RFC 1623]: https://github.com/rust-lang/rfcs/blob/master/text/1623-static.md
4202 [RFC 1647]: https://github.com/rust-lang/rfcs/blob/master/text/1647-allow-self-in-where-clauses.md
4203 [RFC 1651]: https://github.com/rust-lang/rfcs/blob/master/text/1651-movecell.md
4204 [RFC 1682]: https://github.com/rust-lang/rfcs/blob/master/text/1682-field-init-shorthand.md
4205 [`Arc::from_raw`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.from_raw
4206 [`Arc::into_raw`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.into_raw
4207 [`Arc::ptr_eq`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.ptr_eq
4208 [`BTreeMap::range_mut`]: https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.range_mut
4209 [`BTreeMap::range`]: https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.range
4210 [`Cell::into_inner`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.into_inner
4211 [`Cell::replace`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.replace
4212 [`Cell::swap`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.swap
4213 [`Cell::take`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.take
4214 [`Ordering::then_with`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.then_with
4215 [`Ordering::then`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.then
4216 [`Rc::from_raw`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.from_raw
4217 [`Rc::into_raw`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.into_raw
4218 [`Rc::ptr_eq`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.ptr_eq
4219 [`Result::expect_err`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.expect_err
4220 [`collections::Bound`]: https://doc.rust-lang.org/std/collections/enum.Bound.html
4221 [`process::abort`]: https://doc.rust-lang.org/std/process/fn.abort.html
4222 [`ptr::read_unaligned`]: https://doc.rust-lang.org/std/ptr/fn.read_unaligned.html
4223 [`ptr::write_unaligned`]: https://doc.rust-lang.org/std/ptr/fn.write_unaligned.html
4224 [cargo/3562]: https://github.com/rust-lang/cargo/pull/3562
4225 [cargo/3664]: https://github.com/rust-lang/cargo/pull/3664
4226 [cargo/3667]: https://github.com/rust-lang/cargo/pull/3667
4227 [cargo/3691]: https://github.com/rust-lang/cargo/pull/3691
4228 [cargo/3699]: https://github.com/rust-lang/cargo/pull/3699
4229 [cargo/3731]: https://github.com/rust-lang/cargo/pull/3731
4230 [mdbook]: https://crates.io/crates/mdbook
4231 [ubook]: https://doc.rust-lang.org/unstable-book/
4232
4233
4234 Version 1.16.0 (2017-03-16)
4235 ===========================
4236
4237 Language
4238 --------
4239
4240 * [The compiler's `dead_code` lint now accounts for type aliases][38051].
4241 * [Uninhabitable enums (those without any variants) no longer permit wildcard
4242   match patterns][38069]
4243 * [Clean up semantics of `self` in an import list][38313]
4244 * [`Self` may appear in `impl` headers][38920]
4245 * [`Self` may appear in struct expressions][39282]
4246
4247 Compiler
4248 --------
4249
4250 * [`rustc` now supports `--emit=metadata`, which causes rustc to emit
4251   a `.rmeta` file containing only crate metadata][38571]. This can be
4252   used by tools like the Rust Language Service to perform
4253   metadata-only builds.
4254 * [Levenshtein based typo suggestions now work in most places, while
4255   previously they worked only for fields and sometimes for local
4256   variables][38927]. Together with the overhaul of "no
4257   resolution"/"unexpected resolution" errors (#[38154]) they result in
4258   large and systematic improvement in resolution diagnostics.
4259 * [Fix `transmute::<T, U>` where `T` requires a bigger alignment than
4260   `U`][38670]
4261 * [rustc: use -Xlinker when specifying an rpath with ',' in it][38798]
4262 * [`rustc` no longer attempts to provide "consider using an explicit
4263   lifetime" suggestions][37057]. They were inaccurate.
4264
4265 Stabilized APIs
4266 ---------------
4267
4268 * [`VecDeque::truncate`]
4269 * [`VecDeque::resize`]
4270 * [`String::insert_str`]
4271 * [`Duration::checked_add`]
4272 * [`Duration::checked_sub`]
4273 * [`Duration::checked_div`]
4274 * [`Duration::checked_mul`]
4275 * [`str::replacen`]
4276 * [`str::repeat`]
4277 * [`SocketAddr::is_ipv4`]
4278 * [`SocketAddr::is_ipv6`]
4279 * [`IpAddr::is_ipv4`]
4280 * [`IpAddr::is_ipv6`]
4281 * [`Vec::dedup_by`]
4282 * [`Vec::dedup_by_key`]
4283 * [`Result::unwrap_or_default`]
4284 * [`<*const T>::wrapping_offset`]
4285 * [`<*mut T>::wrapping_offset`]
4286 * `CommandExt::creation_flags`
4287 * [`File::set_permissions`]
4288 * [`String::split_off`]
4289
4290 Libraries
4291 ---------
4292
4293 * [`[T]::binary_search` and `[T]::binary_search_by_key` now take
4294   their argument by `Borrow` parameter][37761]
4295 * [All public types in std implement `Debug`][38006]
4296 * [`IpAddr` implements `From<Ipv4Addr>` and `From<Ipv6Addr>`][38327]
4297 * [`Ipv6Addr` implements `From<[u16; 8]>`][38131]
4298 * [Ctrl-Z returns from `Stdin.read()` when reading from the console on
4299   Windows][38274]
4300 * [std: Fix partial writes in `LineWriter`][38062]
4301 * [std: Clamp max read/write sizes on Unix][38062]
4302 * [Use more specific panic message for `&str` slicing errors][38066]
4303 * [`TcpListener::set_only_v6` is deprecated][38304]. This
4304   functionality cannot be achieved in std currently.
4305 * [`writeln!`, like `println!`, now accepts a form with no string
4306   or formatting arguments, to just print a newline][38469]
4307 * [Implement `iter::Sum` and `iter::Product` for `Result`][38580]
4308 * [Reduce the size of static data in `std_unicode::tables`][38781]
4309 * [`char::EscapeDebug`, `EscapeDefault`, `EscapeUnicode`,
4310   `CaseMappingIter`, `ToLowercase`, `ToUppercase`, implement
4311   `Display`][38909]
4312 * [`Duration` implements `Sum`][38712]
4313 * [`String` implements `ToSocketAddrs`][39048]
4314
4315 Cargo
4316 -----
4317
4318 * [The `cargo check` command does a type check of a project without
4319   building it][cargo/3296]
4320 * [crates.io will display CI badges from Travis and AppVeyor, if
4321   specified in Cargo.toml][cargo/3546]
4322 * [crates.io will display categories listed in Cargo.toml][cargo/3301]
4323 * [Compilation profiles accept integer values for `debug`, in addition
4324   to `true` and `false`. These are passed to `rustc` as the value to
4325   `-C debuginfo`][cargo/3534]
4326 * [Implement `cargo --version --verbose`][cargo/3604]
4327 * [All builds now output 'dep-info' build dependencies compatible with
4328   make and ninja][cargo/3557]
4329 * [Build all workspace members with `build --all`][cargo/3511]
4330 * [Document all workspace members with `doc --all`][cargo/3515]
4331 * [Path deps outside workspace are not members][cargo/3443]
4332
4333 Misc
4334 ----
4335
4336 * [`rustdoc` has a `--sysroot` argument that, like `rustc`, specifies
4337   the path to the Rust implementation][38589]
4338 * [The `armv7-linux-androideabi` target no longer enables NEON
4339   extensions, per Google's ABI guide][38413]
4340 * [The stock standard library can be compiled for Redox OS][38401]
4341 * [Rust has initial SPARC support][38726]. Tier 3. No builds
4342   available.
4343 * [Rust has experimental support for Nvidia PTX][38559]. Tier 3. No
4344   builds available.
4345 * [Fix backtraces on i686-pc-windows-gnu by disabling FPO][39379]
4346
4347 Compatibility Notes
4348 -------------------
4349
4350 * [Uninhabitable enums (those without any variants) no longer permit wildcard
4351   match patterns][38069]
4352 * In this release, references to uninhabited types can not be
4353   pattern-matched. This was accidentally allowed in 1.15.
4354 * [The compiler's `dead_code` lint now accounts for type aliases][38051].
4355 * [Ctrl-Z returns from `Stdin.read()` when reading from the console on
4356   Windows][38274]
4357 * [Clean up semantics of `self` in an import list][38313]
4358 * Reimplemented lifetime elision. This change was almost entirely compatible
4359   with existing code, but it did close a number of small bugs and loopholes,
4360   as well as being more accepting in some other [cases][41105].
4361
4362 [37057]: https://github.com/rust-lang/rust/pull/37057
4363 [37761]: https://github.com/rust-lang/rust/pull/37761
4364 [38006]: https://github.com/rust-lang/rust/pull/38006
4365 [38051]: https://github.com/rust-lang/rust/pull/38051
4366 [38062]: https://github.com/rust-lang/rust/pull/38062
4367 [38062]: https://github.com/rust-lang/rust/pull/38622
4368 [38066]: https://github.com/rust-lang/rust/pull/38066
4369 [38069]: https://github.com/rust-lang/rust/pull/38069
4370 [38131]: https://github.com/rust-lang/rust/pull/38131
4371 [38154]: https://github.com/rust-lang/rust/pull/38154
4372 [38274]: https://github.com/rust-lang/rust/pull/38274
4373 [38304]: https://github.com/rust-lang/rust/pull/38304
4374 [38313]: https://github.com/rust-lang/rust/pull/38313
4375 [38314]: https://github.com/rust-lang/rust/pull/38314
4376 [38327]: https://github.com/rust-lang/rust/pull/38327
4377 [38401]: https://github.com/rust-lang/rust/pull/38401
4378 [38413]: https://github.com/rust-lang/rust/pull/38413
4379 [38469]: https://github.com/rust-lang/rust/pull/38469
4380 [38559]: https://github.com/rust-lang/rust/pull/38559
4381 [38571]: https://github.com/rust-lang/rust/pull/38571
4382 [38580]: https://github.com/rust-lang/rust/pull/38580
4383 [38589]: https://github.com/rust-lang/rust/pull/38589
4384 [38670]: https://github.com/rust-lang/rust/pull/38670
4385 [38712]: https://github.com/rust-lang/rust/pull/38712
4386 [38726]: https://github.com/rust-lang/rust/pull/38726
4387 [38781]: https://github.com/rust-lang/rust/pull/38781
4388 [38798]: https://github.com/rust-lang/rust/pull/38798
4389 [38909]: https://github.com/rust-lang/rust/pull/38909
4390 [38920]: https://github.com/rust-lang/rust/pull/38920
4391 [38927]: https://github.com/rust-lang/rust/pull/38927
4392 [39048]: https://github.com/rust-lang/rust/pull/39048
4393 [39282]: https://github.com/rust-lang/rust/pull/39282
4394 [39379]: https://github.com/rust-lang/rust/pull/39379
4395 [41105]: https://github.com/rust-lang/rust/issues/41105
4396 [`<*const T>::wrapping_offset`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_offset
4397 [`<*mut T>::wrapping_offset`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_offset
4398 [`Duration::checked_add`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_add
4399 [`Duration::checked_div`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_div
4400 [`Duration::checked_mul`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_mul
4401 [`Duration::checked_sub`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_sub
4402 [`File::set_permissions`]: https://doc.rust-lang.org/std/fs/struct.File.html#method.set_permissions
4403 [`IpAddr::is_ipv4`]: https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_ipv4
4404 [`IpAddr::is_ipv6`]: https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_ipv6
4405 [`Result::unwrap_or_default`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.unwrap_or_default
4406 [`SocketAddr::is_ipv4`]: https://doc.rust-lang.org/std/net/enum.SocketAddr.html#method.is_ipv4
4407 [`SocketAddr::is_ipv6`]: https://doc.rust-lang.org/std/net/enum.SocketAddr.html#method.is_ipv6
4408 [`String::insert_str`]: https://doc.rust-lang.org/std/string/struct.String.html#method.insert_str
4409 [`String::split_off`]: https://doc.rust-lang.org/std/string/struct.String.html#method.split_off
4410 [`Vec::dedup_by_key`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.dedup_by_key
4411 [`Vec::dedup_by`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.dedup_by
4412 [`VecDeque::resize`]:  https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.resize
4413 [`VecDeque::truncate`]: https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.truncate
4414 [`str::repeat`]: https://doc.rust-lang.org/std/primitive.str.html#method.repeat
4415 [`str::replacen`]: https://doc.rust-lang.org/std/primitive.str.html#method.replacen
4416 [cargo/3296]: https://github.com/rust-lang/cargo/pull/3296
4417 [cargo/3301]: https://github.com/rust-lang/cargo/pull/3301
4418 [cargo/3443]: https://github.com/rust-lang/cargo/pull/3443
4419 [cargo/3511]: https://github.com/rust-lang/cargo/pull/3511
4420 [cargo/3515]: https://github.com/rust-lang/cargo/pull/3515
4421 [cargo/3534]: https://github.com/rust-lang/cargo/pull/3534
4422 [cargo/3546]: https://github.com/rust-lang/cargo/pull/3546
4423 [cargo/3557]: https://github.com/rust-lang/cargo/pull/3557
4424 [cargo/3604]: https://github.com/rust-lang/cargo/pull/3604
4425 [RFC 1623]: https://github.com/rust-lang/rfcs/blob/master/text/1623-static.md
4426
4427
4428 Version 1.15.1 (2017-02-09)
4429 ===========================
4430
4431 * [Fix IntoIter::as_mut_slice's signature][39466]
4432 * [Compile compiler builtins with `-fPIC` on 32-bit platforms][39523]
4433
4434 [39466]: https://github.com/rust-lang/rust/pull/39466
4435 [39523]: https://github.com/rust-lang/rust/pull/39523
4436
4437
4438 Version 1.15.0 (2017-02-02)
4439 ===========================
4440
4441 Language
4442 --------
4443
4444 * Basic procedural macros allowing custom `#[derive]`, aka "macros 1.1", are
4445   stable. This allows popular code-generating crates like Serde and Diesel to
4446   work ergonomically. [RFC 1681].
4447 * [Tuple structs may be empty. Unary and empty tuple structs may be instantiated
4448   with curly braces][36868]. Part of [RFC 1506].
4449 * [A number of minor changes to name resolution have been activated][37127].
4450   They add up to more consistent semantics, allowing for future evolution of
4451   Rust macros. Specified in [RFC 1560], see its section on ["changes"] for
4452   details of what is different. The breaking changes here have been transitioned
4453   through the [`legacy_imports`] lint since 1.14, with no known regressions.
4454 * [In `macro_rules`, `path` fragments can now be parsed as type parameter
4455   bounds][38279]
4456 * [`?Sized` can be used in `where` clauses][37791]
4457 * [There is now a limit on the size of monomorphized types and it can be
4458   modified with the `#![type_size_limit]` crate attribute, similarly to
4459   the `#![recursion_limit]` attribute][37789]
4460
4461 Compiler
4462 --------
4463
4464 * [On Windows, the compiler will apply dllimport attributes when linking to
4465   extern functions][37973]. Additional attributes and flags can control which
4466   library kind is linked and its name. [RFC 1717].
4467 * [Rust-ABI symbols are no longer exported from cdylibs][38117]
4468 * [The `--test` flag works with procedural macro crates][38107]
4469 * [Fix `extern "aapcs" fn` ABI][37814]
4470 * [The `-C no-stack-check` flag is deprecated][37636]. It does nothing.
4471 * [The `format!` expander recognizes incorrect `printf` and shell-style
4472   formatting directives and suggests the correct format][37613].
4473 * [Only report one error for all unused imports in an import list][37456]
4474
4475 Compiler Performance
4476 --------------------
4477
4478 * [Avoid unnecessary `mk_ty` calls in `Ty::super_fold_with`][37705]
4479 * [Avoid more unnecessary `mk_ty` calls in `Ty::super_fold_with`][37979]
4480 * [Don't clone in `UnificationTable::probe`][37848]
4481 * [Remove `scope_auxiliary` to cut RSS by 10%][37764]
4482 * [Use small vectors in type walker][37760]
4483 * [Macro expansion performance was improved][37701]
4484 * [Change `HirVec<P<T>>` to `HirVec<T>` in `hir::Expr`][37642]
4485 * [Replace FNV with a faster hash function][37229]
4486
4487 Stabilized APIs
4488 ---------------
4489
4490 * [`std::iter::Iterator::min_by`]
4491 * [`std::iter::Iterator::max_by`]
4492 * [`std::os::*::fs::FileExt`]
4493 * [`std::sync::atomic::Atomic*::get_mut`]
4494 * [`std::sync::atomic::Atomic*::into_inner`]
4495 * [`std::vec::IntoIter::as_slice`]
4496 * [`std::vec::IntoIter::as_mut_slice`]
4497 * [`std::sync::mpsc::Receiver::try_iter`]
4498 * [`std::os::unix::process::CommandExt::before_exec`]
4499 * [`std::rc::Rc::strong_count`]
4500 * [`std::rc::Rc::weak_count`]
4501 * [`std::sync::Arc::strong_count`]
4502 * [`std::sync::Arc::weak_count`]
4503 * [`std::char::encode_utf8`]
4504 * [`std::char::encode_utf16`]
4505 * [`std::cell::Ref::clone`]
4506 * [`std::io::Take::into_inner`]
4507
4508 Libraries
4509 ---------
4510
4511 * [The standard sorting algorithm has been rewritten for dramatic performance
4512   improvements][38192]. It is a hybrid merge sort, drawing influences from
4513   Timsort. Previously it was a naive merge sort.
4514 * [`Iterator::nth` no longer has a `Sized` bound][38134]
4515 * [`Extend<&T>` is specialized for `Vec` where `T: Copy`][38182] to improve
4516   performance.
4517 * [`chars().count()` is much faster][37888] and so are [`chars().last()`
4518   and `char_indices().last()`][37882]
4519 * [Fix ARM Objective-C ABI in `std::env::args`][38146]
4520 * [Chinese characters display correctly in `fmt::Debug`][37855]
4521 * [Derive `Default` for `Duration`][37699]
4522 * [Support creation of anonymous pipes on WinXP/2k][37677]
4523 * [`mpsc::RecvTimeoutError` implements `Error`][37527]
4524 * [Don't pass overlapped handles to processes][38835]
4525
4526 Cargo
4527 -----
4528
4529 * [In this release, Cargo build scripts no longer have access to the `OUT_DIR`
4530   environment variable at build time via `env!("OUT_DIR")`][cargo/3368]. They
4531   should instead check the variable at runtime with `std::env`. That the value
4532   was set at build time was a bug, and incorrect when cross-compiling. This
4533   change is known to cause breakage.
4534 * [Add `--all` flag to `cargo test`][cargo/3221]
4535 * [Compile statically against the MSVC CRT][cargo/3363]
4536 * [Mix feature flags into fingerprint/metadata shorthash][cargo/3102]
4537 * [Link OpenSSL statically on OSX][cargo/3311]
4538 * [Apply new fingerprinting to build dir outputs][cargo/3310]
4539 * [Test for bad path overrides with summaries][cargo/3336]
4540 * [Require `cargo install --vers` to take a semver version][cargo/3338]
4541 * [Fix retrying crate downloads for network errors][cargo/3348]
4542 * [Implement string lookup for `build.rustflags` config key][cargo/3356]
4543 * [Emit more info on --message-format=json][cargo/3319]
4544 * [Assume `build.rs` in the same directory as `Cargo.toml` is a build script][cargo/3361]
4545 * [Don't ignore errors in workspace manifest][cargo/3409]
4546 * [Fix `--message-format JSON` when rustc emits non-JSON warnings][cargo/3410]
4547
4548 Tooling
4549 -------
4550
4551 * [Test runners (binaries built with `--test`) now support a `--list` argument
4552   that lists the tests it contains][38185]
4553 * [Test runners now support a `--exact` argument that makes the test filter
4554   match exactly, instead of matching only a substring of the test name][38181]
4555 * [rustdoc supports a `--playground-url` flag][37763]
4556 * [rustdoc provides more details about `#[should_panic]` errors][37749]
4557
4558 Misc
4559 ----
4560
4561 * [The Rust build system is now written in Rust][37817]. The Makefiles may
4562   continue to be used in this release by passing `--disable-rustbuild` to the
4563   configure script, but they will be deleted soon. Note that the new build
4564   system uses a different on-disk layout that will likely affect any scripts
4565   building Rust.
4566 * [Rust supports i686-unknown-openbsd][38086]. Tier 3 support. No testing or
4567   releases.
4568 * [Rust supports the MSP430][37627]. Tier 3 support. No testing or releases.
4569 * [Rust supports the ARMv5TE architecture][37615]. Tier 3 support. No testing or
4570   releases.
4571
4572 Compatibility Notes
4573 -------------------
4574
4575 * [A number of minor changes to name resolution have been activated][37127].
4576   They add up to more consistent semantics, allowing for future evolution of
4577   Rust macros. Specified in [RFC 1560], see its section on ["changes"] for
4578   details of what is different. The breaking changes here have been transitioned
4579   through the [`legacy_imports`] lint since 1.14, with no known regressions.
4580 * [In this release, Cargo build scripts no longer have access to the `OUT_DIR`
4581   environment variable at build time via `env!("OUT_DIR")`][cargo/3368]. They
4582   should instead check the variable at runtime with `std::env`. That the value
4583   was set at build time was a bug, and incorrect when cross-compiling. This
4584   change is known to cause breakage.
4585 * [Higher-ranked lifetimes are no longer allowed to appear _only_ in associated
4586   types][33685]. The [`hr_lifetime_in_assoc_type` lint] has been a warning since
4587   1.10 and is now an error by default. It will become a hard error in the near
4588   future.
4589 * [The semantics relating modules to file system directories are changing in
4590   minor ways][37602]. This is captured in the new `legacy_directory_ownership`
4591   lint, which is a warning in this release, and will become a hard error in the
4592   future.
4593 * [Rust-ABI symbols are no longer exported from cdylibs][38117]
4594 * [Once `Peekable` peeks a `None` it will return that `None` without re-querying
4595   the underlying iterator][37834]
4596
4597 ["changes"]: https://github.com/rust-lang/rfcs/blob/master/text/1560-name-resolution.md#changes-to-name-resolution-rules
4598 [33685]: https://github.com/rust-lang/rust/issues/33685
4599 [36868]: https://github.com/rust-lang/rust/pull/36868
4600 [37127]: https://github.com/rust-lang/rust/pull/37127
4601 [37229]: https://github.com/rust-lang/rust/pull/37229
4602 [37456]: https://github.com/rust-lang/rust/pull/37456
4603 [37527]: https://github.com/rust-lang/rust/pull/37527
4604 [37602]: https://github.com/rust-lang/rust/pull/37602
4605 [37613]: https://github.com/rust-lang/rust/pull/37613
4606 [37615]: https://github.com/rust-lang/rust/pull/37615
4607 [37636]: https://github.com/rust-lang/rust/pull/37636
4608 [37627]: https://github.com/rust-lang/rust/pull/37627
4609 [37642]: https://github.com/rust-lang/rust/pull/37642
4610 [37677]: https://github.com/rust-lang/rust/pull/37677
4611 [37699]: https://github.com/rust-lang/rust/pull/37699
4612 [37701]: https://github.com/rust-lang/rust/pull/37701
4613 [37705]: https://github.com/rust-lang/rust/pull/37705
4614 [37749]: https://github.com/rust-lang/rust/pull/37749
4615 [37760]: https://github.com/rust-lang/rust/pull/37760
4616 [37763]: https://github.com/rust-lang/rust/pull/37763
4617 [37764]: https://github.com/rust-lang/rust/pull/37764
4618 [37789]: https://github.com/rust-lang/rust/pull/37789
4619 [37791]: https://github.com/rust-lang/rust/pull/37791
4620 [37814]: https://github.com/rust-lang/rust/pull/37814
4621 [37817]: https://github.com/rust-lang/rust/pull/37817
4622 [37834]: https://github.com/rust-lang/rust/pull/37834
4623 [37848]: https://github.com/rust-lang/rust/pull/37848
4624 [37855]: https://github.com/rust-lang/rust/pull/37855
4625 [37882]: https://github.com/rust-lang/rust/pull/37882
4626 [37888]: https://github.com/rust-lang/rust/pull/37888
4627 [37973]: https://github.com/rust-lang/rust/pull/37973
4628 [37979]: https://github.com/rust-lang/rust/pull/37979
4629 [38086]: https://github.com/rust-lang/rust/pull/38086
4630 [38107]: https://github.com/rust-lang/rust/pull/38107
4631 [38117]: https://github.com/rust-lang/rust/pull/38117
4632 [38134]: https://github.com/rust-lang/rust/pull/38134
4633 [38146]: https://github.com/rust-lang/rust/pull/38146
4634 [38181]: https://github.com/rust-lang/rust/pull/38181
4635 [38182]: https://github.com/rust-lang/rust/pull/38182
4636 [38185]: https://github.com/rust-lang/rust/pull/38185
4637 [38192]: https://github.com/rust-lang/rust/pull/38192
4638 [38279]: https://github.com/rust-lang/rust/pull/38279
4639 [38835]: https://github.com/rust-lang/rust/pull/38835
4640 [RFC 1492]: https://github.com/rust-lang/rfcs/blob/master/text/1492-dotdot-in-patterns.md
4641 [RFC 1506]: https://github.com/rust-lang/rfcs/blob/master/text/1506-adt-kinds.md
4642 [RFC 1560]: https://github.com/rust-lang/rfcs/blob/master/text/1560-name-resolution.md
4643 [RFC 1681]: https://github.com/rust-lang/rfcs/blob/master/text/1681-macros-1.1.md
4644 [RFC 1717]: https://github.com/rust-lang/rfcs/blob/master/text/1717-dllimport.md
4645 [`hr_lifetime_in_assoc_type` lint]: https://github.com/rust-lang/rust/issues/33685
4646 [`legacy_imports`]: https://github.com/rust-lang/rust/pull/38271
4647 [cargo/3102]: https://github.com/rust-lang/cargo/pull/3102
4648 [cargo/3221]: https://github.com/rust-lang/cargo/pull/3221
4649 [cargo/3310]: https://github.com/rust-lang/cargo/pull/3310
4650 [cargo/3311]: https://github.com/rust-lang/cargo/pull/3311
4651 [cargo/3319]: https://github.com/rust-lang/cargo/pull/3319
4652 [cargo/3336]: https://github.com/rust-lang/cargo/pull/3336
4653 [cargo/3338]: https://github.com/rust-lang/cargo/pull/3338
4654 [cargo/3348]: https://github.com/rust-lang/cargo/pull/3348
4655 [cargo/3356]: https://github.com/rust-lang/cargo/pull/3356
4656 [cargo/3361]: https://github.com/rust-lang/cargo/pull/3361
4657 [cargo/3363]: https://github.com/rust-lang/cargo/pull/3363
4658 [cargo/3368]: https://github.com/rust-lang/cargo/issues/3368
4659 [cargo/3409]: https://github.com/rust-lang/cargo/pull/3409
4660 [cargo/3410]: https://github.com/rust-lang/cargo/pull/3410
4661 [`std::iter::Iterator::min_by`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.min_by
4662 [`std::iter::Iterator::max_by`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.max_by
4663 [`std::os::*::fs::FileExt`]: https://doc.rust-lang.org/std/os/unix/fs/trait.FileExt.html
4664 [`std::sync::atomic::Atomic*::get_mut`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU8.html#method.get_mut
4665 [`std::sync::atomic::Atomic*::into_inner`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU8.html#method.into_inner
4666 [`std::vec::IntoIter::as_slice`]: https://doc.rust-lang.org/std/vec/struct.IntoIter.html#method.as_slice
4667 [`std::vec::IntoIter::as_mut_slice`]: https://doc.rust-lang.org/std/vec/struct.IntoIter.html#method.as_mut_slice
4668 [`std::sync::mpsc::Receiver::try_iter`]: https://doc.rust-lang.org/std/sync/mpsc/struct.Receiver.html#method.try_iter
4669 [`std::os::unix::process::CommandExt::before_exec`]: https://doc.rust-lang.org/std/os/unix/process/trait.CommandExt.html#tymethod.before_exec
4670 [`std::rc::Rc::strong_count`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.strong_count
4671 [`std::rc::Rc::weak_count`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.weak_count
4672 [`std::sync::Arc::strong_count`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.strong_count
4673 [`std::sync::Arc::weak_count`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.weak_count
4674 [`std::char::encode_utf8`]: https://doc.rust-lang.org/std/primitive.char.html#method.encode_utf8
4675 [`std::char::encode_utf16`]: https://doc.rust-lang.org/std/primitive.char.html#method.encode_utf16
4676 [`std::cell::Ref::clone`]: https://doc.rust-lang.org/std/cell/struct.Ref.html#method.clone
4677 [`std::io::Take::into_inner`]: https://doc.rust-lang.org/std/io/struct.Take.html#method.into_inner
4678
4679
4680 Version 1.14.0 (2016-12-22)
4681 ===========================
4682
4683 Language
4684 --------
4685
4686 * [`..` matches multiple tuple fields in enum variants, structs
4687   and tuples][36843]. [RFC 1492].
4688 * [Safe `fn` items can be coerced to `unsafe fn` pointers][37389]
4689 * [`use *` and `use ::*` both glob-import from the crate root][37367]
4690 * [It's now possible to call a `Vec<Box<Fn()>>` without explicit
4691   dereferencing][36822]
4692
4693 Compiler
4694 --------
4695
4696 * [Mark enums with non-zero discriminant as non-zero][37224]
4697 * [Lower-case `static mut` names are linted like other
4698   statics and consts][37162]
4699 * [Fix ICE on some macros in const integer positions
4700    (e.g. `[u8; m!()]`)][36819]
4701 * [Improve error message and snippet for "did you mean `x`"][36798]
4702 * [Add a panic-strategy field to the target specification][36794]
4703 * [Include LLVM version in `--version --verbose`][37200]
4704
4705 Compile-time Optimizations
4706 --------------------------
4707
4708 * [Improve macro expansion performance][37569]
4709 * [Shrink `Expr_::ExprInlineAsm`][37445]
4710 * [Replace all uses of SHA-256 with BLAKE2b][37439]
4711 * [Reduce the number of bytes hashed by `IchHasher`][37427]
4712 * [Avoid more allocations when compiling html5ever][37373]
4713 * [Use `SmallVector` in `CombineFields::instantiate`][37322]
4714 * [Avoid some allocations in the macro parser][37318]
4715 * [Use a faster deflate setting][37298]
4716 * [Add `ArrayVec` and `AccumulateVec` to reduce heap allocations
4717   during interning of slices][37270]
4718 * [Optimize `write_metadata`][37267]
4719 * [Don't process obligation forest cycles when stalled][37231]
4720 * [Avoid many `CrateConfig` clones][37161]
4721 * [Optimize `Substs::super_fold_with`][37108]
4722 * [Optimize `ObligationForest`'s `NodeState` handling][36993]
4723 * [Speed up `plug_leaks`][36917]
4724
4725 Libraries
4726 ---------
4727
4728 * [`println!()`, with no arguments, prints newline][36825].
4729   Previously, an empty string was required to achieve the same.
4730 * [`Wrapping` impls standard binary and unary operators, as well as
4731    the `Sum` and `Product` iterators][37356]
4732 * [Implement `From<Cow<str>> for String` and `From<Cow<[T]>> for
4733   Vec<T>`][37326]
4734 * [Improve `fold` performance for `chain`, `cloned`, `map`, and
4735   `VecDeque` iterators][37315]
4736 * [Improve `SipHasher` performance on small values][37312]
4737 * [Add Iterator trait TrustedLen to enable better FromIterator /
4738   Extend][37306]
4739 * [Expand `.zip()` specialization to `.map()` and `.cloned()`][37230]
4740 * [`ReadDir` implements `Debug`][37221]
4741 * [Implement `RefUnwindSafe` for atomic types][37178]
4742 * [Specialize `Vec::extend` to `Vec::extend_from_slice`][37094]
4743 * [Avoid allocations in `Decoder::read_str`][37064]
4744 * [`io::Error` implements `From<io::ErrorKind>`][37037]
4745 * [Impl `Debug` for raw pointers to unsized data][36880]
4746 * [Don't reuse `HashMap` random seeds][37470]
4747 * [The internal memory layout of `HashMap` is more cache-friendly, for
4748   significant improvements in some operations][36692]
4749 * [`HashMap` uses less memory on 32-bit architectures][36595]
4750 * [Impl `Add<{str, Cow<str>}>` for `Cow<str>`][36430]
4751
4752 Cargo
4753 -----
4754
4755 * [Expose rustc cfg values to build scripts][cargo/3243]
4756 * [Allow cargo to work with read-only `CARGO_HOME`][cargo/3259]
4757 * [Fix passing --features when testing multiple packages][cargo/3280]
4758 * [Use a single profile set per workspace][cargo/3249]
4759 * [Load `replace` sections from lock files][cargo/3220]
4760 * [Ignore `panic` configuration for test/bench profiles][cargo/3175]
4761
4762 Tooling
4763 -------
4764
4765 * [rustup is the recommended Rust installation method][1.14rustup]
4766 * This release includes host (rustc) builds for Linux on MIPS, PowerPC, and
4767   S390x. These are [tier 2] platforms and may have major defects. Follow the
4768   instructions on the website to install, or add the targets to an existing
4769   installation with `rustup target add`. The new target triples are:
4770   - `mips-unknown-linux-gnu`
4771   - `mipsel-unknown-linux-gnu`
4772   - `mips64-unknown-linux-gnuabi64`
4773   - `mips64el-unknown-linux-gnuabi64 `
4774   - `powerpc-unknown-linux-gnu`
4775   - `powerpc64-unknown-linux-gnu`
4776   - `powerpc64le-unknown-linux-gnu`
4777   - `s390x-unknown-linux-gnu `
4778 * This release includes target (std) builds for ARM Linux running MUSL
4779   libc. These are [tier 2] platforms and may have major defects. Add the
4780   following triples to an existing rustup installation with `rustup target add`:
4781   - `arm-unknown-linux-musleabi`
4782   - `arm-unknown-linux-musleabihf`
4783   - `armv7-unknown-linux-musleabihf`
4784 * This release includes [experimental support for WebAssembly][1.14wasm], via
4785   the `wasm32-unknown-emscripten` target. This target is known to have major
4786   defects. Please test, report, and fix.
4787 * rustup no longer installs documentation by default. Run `rustup
4788   component add rust-docs` to install.
4789 * [Fix line stepping in debugger][37310]
4790 * [Enable line number debuginfo in releases][37280]
4791
4792 Misc
4793 ----
4794
4795 * [Disable jemalloc on aarch64/powerpc/mips][37392]
4796 * [Add support for Fuchsia OS][37313]
4797 * [Detect local-rebuild by only MAJOR.MINOR version][37273]
4798
4799 Compatibility Notes
4800 -------------------
4801
4802 * [A number of forward-compatibility lints used by the compiler
4803   to gradually introduce language changes have been converted
4804   to deny by default][36894]:
4805   - ["use of inaccessible extern crate erroneously allowed"][36886]
4806   - ["type parameter default erroneously allowed in invalid location"][36887]
4807   - ["detects super or self keywords at the beginning of global path"][36888]
4808   - ["two overlapping inherent impls define an item with the same name
4809     were erroneously allowed"][36889]
4810   - ["floating-point constants cannot be used in patterns"][36890]
4811   - ["constants of struct or enum type can only be used in a pattern if
4812      the struct or enum has `#[derive(PartialEq, Eq)]`"][36891]
4813   - ["lifetimes or labels named `'_` were erroneously allowed"][36892]
4814 * [Prohibit patterns in trait methods without bodies][37378]
4815 * [The atomic `Ordering` enum may not be matched exhaustively][37351]
4816 * [Future-proofing `#[no_link]` breaks some obscure cases][37247]
4817 * [The `$crate` macro variable is accepted in fewer locations][37213]
4818 * [Impls specifying extra region requirements beyond the trait
4819   they implement are rejected][37167]
4820 * [Enums may not be unsized][37111]. Unsized enums are intended to
4821   work but never have. For now they are forbidden.
4822 * [Enforce the shadowing restrictions from RFC 1560 for today's macros][36767]
4823
4824 [tier 2]: https://forge.rust-lang.org/platform-support.html
4825 [1.14rustup]: https://internals.rust-lang.org/t/beta-testing-rustup-rs/3316/204
4826 [1.14wasm]: https://users.rust-lang.org/t/compiling-to-the-web-with-rust-and-emscripten/7627
4827 [36430]: https://github.com/rust-lang/rust/pull/36430
4828 [36595]: https://github.com/rust-lang/rust/pull/36595
4829 [36595]: https://github.com/rust-lang/rust/pull/36595
4830 [36692]: https://github.com/rust-lang/rust/pull/36692
4831 [36767]: https://github.com/rust-lang/rust/pull/36767
4832 [36794]: https://github.com/rust-lang/rust/pull/36794
4833 [36798]: https://github.com/rust-lang/rust/pull/36798
4834 [36819]: https://github.com/rust-lang/rust/pull/36819
4835 [36822]: https://github.com/rust-lang/rust/pull/36822
4836 [36825]: https://github.com/rust-lang/rust/pull/36825
4837 [36843]: https://github.com/rust-lang/rust/pull/36843
4838 [36880]: https://github.com/rust-lang/rust/pull/36880
4839 [36886]: https://github.com/rust-lang/rust/issues/36886
4840 [36887]: https://github.com/rust-lang/rust/issues/36887
4841 [36888]: https://github.com/rust-lang/rust/issues/36888
4842 [36889]: https://github.com/rust-lang/rust/issues/36889
4843 [36890]: https://github.com/rust-lang/rust/issues/36890
4844 [36891]: https://github.com/rust-lang/rust/issues/36891
4845 [36892]: https://github.com/rust-lang/rust/issues/36892
4846 [36894]: https://github.com/rust-lang/rust/pull/36894
4847 [36917]: https://github.com/rust-lang/rust/pull/36917
4848 [36993]: https://github.com/rust-lang/rust/pull/36993
4849 [37037]: https://github.com/rust-lang/rust/pull/37037
4850 [37064]: https://github.com/rust-lang/rust/pull/37064
4851 [37094]: https://github.com/rust-lang/rust/pull/37094
4852 [37108]: https://github.com/rust-lang/rust/pull/37108
4853 [37111]: https://github.com/rust-lang/rust/pull/37111
4854 [37161]: https://github.com/rust-lang/rust/pull/37161
4855 [37162]: https://github.com/rust-lang/rust/pull/37162
4856 [37167]: https://github.com/rust-lang/rust/pull/37167
4857 [37178]: https://github.com/rust-lang/rust/pull/37178
4858 [37200]: https://github.com/rust-lang/rust/pull/37200
4859 [37213]: https://github.com/rust-lang/rust/pull/37213
4860 [37221]: https://github.com/rust-lang/rust/pull/37221
4861 [37224]: https://github.com/rust-lang/rust/pull/37224
4862 [37230]: https://github.com/rust-lang/rust/pull/37230
4863 [37231]: https://github.com/rust-lang/rust/pull/37231
4864 [37247]: https://github.com/rust-lang/rust/pull/37247
4865 [37267]: https://github.com/rust-lang/rust/pull/37267
4866 [37270]: https://github.com/rust-lang/rust/pull/37270
4867 [37273]: https://github.com/rust-lang/rust/pull/37273
4868 [37280]: https://github.com/rust-lang/rust/pull/37280
4869 [37298]: https://github.com/rust-lang/rust/pull/37298
4870 [37306]: https://github.com/rust-lang/rust/pull/37306
4871 [37310]: https://github.com/rust-lang/rust/pull/37310
4872 [37312]: https://github.com/rust-lang/rust/pull/37312
4873 [37313]: https://github.com/rust-lang/rust/pull/37313
4874 [37315]: https://github.com/rust-lang/rust/pull/37315
4875 [37318]: https://github.com/rust-lang/rust/pull/37318
4876 [37322]: https://github.com/rust-lang/rust/pull/37322
4877 [37326]: https://github.com/rust-lang/rust/pull/37326
4878 [37351]: https://github.com/rust-lang/rust/pull/37351
4879 [37356]: https://github.com/rust-lang/rust/pull/37356
4880 [37367]: https://github.com/rust-lang/rust/pull/37367
4881 [37373]: https://github.com/rust-lang/rust/pull/37373
4882 [37378]: https://github.com/rust-lang/rust/pull/37378
4883 [37389]: https://github.com/rust-lang/rust/pull/37389
4884 [37392]: https://github.com/rust-lang/rust/pull/37392
4885 [37427]: https://github.com/rust-lang/rust/pull/37427
4886 [37439]: https://github.com/rust-lang/rust/pull/37439
4887 [37445]: https://github.com/rust-lang/rust/pull/37445
4888 [37470]: https://github.com/rust-lang/rust/pull/37470
4889 [37569]: https://github.com/rust-lang/rust/pull/37569
4890 [RFC 1492]: https://github.com/rust-lang/rfcs/blob/master/text/1492-dotdot-in-patterns.md
4891 [cargo/3175]: https://github.com/rust-lang/cargo/pull/3175
4892 [cargo/3220]: https://github.com/rust-lang/cargo/pull/3220
4893 [cargo/3243]: https://github.com/rust-lang/cargo/pull/3243
4894 [cargo/3249]: https://github.com/rust-lang/cargo/pull/3249
4895 [cargo/3259]: https://github.com/rust-lang/cargo/pull/3259
4896 [cargo/3280]: https://github.com/rust-lang/cargo/pull/3280
4897
4898
4899 Version 1.13.0 (2016-11-10)
4900 ===========================
4901
4902 Language
4903 --------
4904
4905 * [Stabilize the `?` operator][36995]. `?` is a simple way to propagate
4906   errors, like the `try!` macro, described in [RFC 0243].
4907 * [Stabilize macros in type position][36014]. Described in [RFC 873].
4908 * [Stabilize attributes on statements][36995]. Described in [RFC 0016].
4909 * [Fix `#[derive]` for empty tuple structs/variants][35728]
4910 * [Fix lifetime rules for 'if' conditions][36029]
4911 * [Avoid loading and parsing unconfigured non-inline modules][36482]
4912
4913 Compiler
4914 --------
4915
4916 * [Add the `-C link-arg` argument][36574]
4917 * [Remove the old AST-based backend from rustc_trans][35764]
4918 * [Don't enable NEON by default on armv7 Linux][35814]
4919 * [Fix debug line number info for macro expansions][35238]
4920 * [Do not emit "class method" debuginfo for types that are not
4921   DICompositeType][36008]
4922 * [Warn about multiple conflicting #[repr] hints][34623]
4923 * [When sizing DST, don't double-count nested struct prefixes][36351]
4924 * [Default RUST_MIN_STACK to 16MiB for now][36505]
4925 * [Improve rlib metadata format][36551]. Reduces rlib size significantly.
4926 * [Reject macros with empty repetitions to avoid infinite loop][36721]
4927 * [Expand macros without recursing to avoid stack overflows][36214]
4928
4929 Diagnostics
4930 -----------
4931
4932 * [Replace macro backtraces with labeled local uses][35702]
4933 * [Improve error message for misplaced doc comments][33922]
4934 * [Buffer unix and lock windows to prevent message interleaving][35975]
4935 * [Update lifetime errors to specifically note temporaries][36171]
4936 * [Special case a few colors for Windows][36178]
4937 * [Suggest `use self` when such an import resolves][36289]
4938 * [Be more specific when type parameter shadows primitive type][36338]
4939 * Many minor improvements
4940
4941 Compile-time Optimizations
4942 --------------------------
4943
4944 * [Compute and cache HIR hashes at beginning][35854]
4945 * [Don't hash types in loan paths][36004]
4946 * [Cache projections in trans][35761]
4947 * [Optimize the parser's last token handling][36527]
4948 * [Only instantiate #[inline] functions in codegen units referencing
4949   them][36524]. This leads to big improvements in cases where crates export
4950   define many inline functions without using them directly.
4951 * [Lazily allocate TypedArena's first chunk][36592]
4952 * [Don't allocate during default HashSet creation][36734]
4953
4954 Stabilized APIs
4955 ---------------
4956
4957 * [`checked_abs`]
4958 * [`wrapping_abs`]
4959 * [`overflowing_abs`]
4960 * [`RefCell::try_borrow`]
4961 * [`RefCell::try_borrow_mut`]
4962
4963 Libraries
4964 ---------
4965
4966 * [Add `assert_ne!` and `debug_assert_ne!`][35074]
4967 * [Make `vec_deque::Drain`, `hash_map::Drain`, and `hash_set::Drain`
4968   covariant][35354]
4969 * [Implement `AsRef<[T]>` for `std::slice::Iter`][35559]
4970 * [Implement `Debug` for `std::vec::IntoIter`][35707]
4971 * [`CString`: avoid excessive growth just to 0-terminate][35871]
4972 * [Implement `CoerceUnsized` for `{Cell, RefCell, UnsafeCell}`][35627]
4973 * [Use arc4rand on FreeBSD][35884]
4974 * [memrchr: Correct aligned offset computation][35969]
4975 * [Improve Demangling of Rust Symbols][36059]
4976 * [Use monotonic time in condition variables][35048]
4977 * [Implement `Debug` for `std::path::{Components,Iter}`][36101]
4978 * [Implement conversion traits for `char`][35755]
4979 * [Fix illegal instruction caused by overflow in channel cloning][36104]
4980 * [Zero first byte of CString on drop][36264]
4981 * [Inherit overflow checks for sum and product][36372]
4982 * [Add missing Eq implementations][36423]
4983 * [Implement `Debug` for `DirEntry`][36631]
4984 * [When `getaddrinfo` returns `EAI_SYSTEM` retrieve actual error from
4985   `errno`][36754]
4986 * [`SipHasher`] is deprecated. Use [`DefaultHasher`].
4987 * [Implement more traits for `std::io::ErrorKind`][35911]
4988 * [Optimize BinaryHeap bounds checking][36072]
4989 * [Work around pointer aliasing issue in `Vec::extend_from_slice`,
4990   `extend_with_element`][36355]
4991 * [Fix overflow checking in unsigned pow()][34942]
4992
4993 Cargo
4994 -----
4995
4996 * This release includes security fixes to both curl and OpenSSL.
4997 * [Fix transitive doctests when panic=abort][cargo/3021]
4998 * [Add --all-features flag to cargo][cargo/3038]
4999 * [Reject path-based dependencies in `cargo package`][cargo/3060]
5000 * [Don't parse the home directory more than once][cargo/3078]
5001 * [Don't try to generate Cargo.lock on empty workspaces][cargo/3092]
5002 * [Update OpenSSL to 1.0.2j][cargo/3121]
5003 * [Add license and license_file to cargo metadata output][cargo/3110]
5004 * [Make crates-io registry URL optional in config; ignore all changes to
5005   source.crates-io][cargo/3089]
5006 * [Don't download dependencies from other platforms][cargo/3123]
5007 * [Build transitive dev-dependencies when needed][cargo/3125]
5008 * [Add support for per-target rustflags in .cargo/config][cargo/3157]
5009 * [Avoid updating registry when adding existing deps][cargo/3144]
5010 * [Warn about path overrides that won't work][cargo/3136]
5011 * [Use workspaces during `cargo install`][cargo/3146]
5012 * [Leak mspdbsrv.exe processes on Windows][cargo/3162]
5013 * [Add --message-format flag][cargo/3000]
5014 * [Pass target environment for rustdoc][cargo/3205]
5015 * [Use `CommandExt::exec` for `cargo run` on Unix][cargo/2818]
5016 * [Update curl and curl-sys][cargo/3241]
5017 * [Call rustdoc test with the correct cfg flags of a package][cargo/3242]
5018
5019 Tooling
5020 -------
5021
5022 * [rustdoc: Add the `--sysroot` argument][36586]
5023 * [rustdoc: Fix a couple of issues with the search results][35655]
5024 * [rustdoc: remove the `!` from macro URLs and titles][35234]
5025 * [gdb: Fix pretty-printing special-cased Rust types][35585]
5026 * [rustdoc: Filter more incorrect methods inherited through Deref][36266]
5027
5028 Misc
5029 ----
5030
5031 * [Remove unmaintained style guide][35124]
5032 * [Add s390x support][36369]
5033 * [Initial work at Haiku OS support][36727]
5034 * [Add mips-uclibc targets][35734]
5035 * [Crate-ify compiler-rt into compiler-builtins][35021]
5036 * [Add rustc version info (git hash + date) to dist tarball][36213]
5037 * Many documentation improvements
5038
5039 Compatibility Notes
5040 -------------------
5041
5042 * [`SipHasher`] is deprecated. Use [`DefaultHasher`].
5043 * [Deny (by default) transmuting from fn item types to pointer-sized
5044   types][34923]. Continuing the long transition to zero-sized fn items,
5045   per [RFC 401].
5046 * [Fix `#[derive]` for empty tuple structs/variants][35728].
5047   Part of [RFC 1506].
5048 * [Issue deprecation warnings for safe accesses to extern statics][36173]
5049 * [Fix lifetime rules for 'if' conditions][36029].
5050 * [Inherit overflow checks for sum and product][36372].
5051 * [Forbid user-defined macros named "macro_rules"][36730].
5052
5053 [33922]: https://github.com/rust-lang/rust/pull/33922
5054 [34623]: https://github.com/rust-lang/rust/pull/34623
5055 [34923]: https://github.com/rust-lang/rust/pull/34923
5056 [34942]: https://github.com/rust-lang/rust/pull/34942
5057 [34982]: https://github.com/rust-lang/rust/pull/34982
5058 [35021]: https://github.com/rust-lang/rust/pull/35021
5059 [35048]: https://github.com/rust-lang/rust/pull/35048
5060 [35074]: https://github.com/rust-lang/rust/pull/35074
5061 [35124]: https://github.com/rust-lang/rust/pull/35124
5062 [35234]: https://github.com/rust-lang/rust/pull/35234
5063 [35238]: https://github.com/rust-lang/rust/pull/35238
5064 [35354]: https://github.com/rust-lang/rust/pull/35354
5065 [35559]: https://github.com/rust-lang/rust/pull/35559
5066 [35585]: https://github.com/rust-lang/rust/pull/35585
5067 [35627]: https://github.com/rust-lang/rust/pull/35627
5068 [35655]: https://github.com/rust-lang/rust/pull/35655
5069 [35702]: https://github.com/rust-lang/rust/pull/35702
5070 [35707]: https://github.com/rust-lang/rust/pull/35707
5071 [35728]: https://github.com/rust-lang/rust/pull/35728
5072 [35734]: https://github.com/rust-lang/rust/pull/35734
5073 [35755]: https://github.com/rust-lang/rust/pull/35755
5074 [35761]: https://github.com/rust-lang/rust/pull/35761
5075 [35764]: https://github.com/rust-lang/rust/pull/35764
5076 [35814]: https://github.com/rust-lang/rust/pull/35814
5077 [35854]: https://github.com/rust-lang/rust/pull/35854
5078 [35871]: https://github.com/rust-lang/rust/pull/35871
5079 [35884]: https://github.com/rust-lang/rust/pull/35884
5080 [35911]: https://github.com/rust-lang/rust/pull/35911
5081 [35969]: https://github.com/rust-lang/rust/pull/35969
5082 [35975]: https://github.com/rust-lang/rust/pull/35975
5083 [36004]: https://github.com/rust-lang/rust/pull/36004
5084 [36008]: https://github.com/rust-lang/rust/pull/36008
5085 [36014]: https://github.com/rust-lang/rust/pull/36014
5086 [36029]: https://github.com/rust-lang/rust/pull/36029
5087 [36059]: https://github.com/rust-lang/rust/pull/36059
5088 [36072]: https://github.com/rust-lang/rust/pull/36072
5089 [36101]: https://github.com/rust-lang/rust/pull/36101
5090 [36104]: https://github.com/rust-lang/rust/pull/36104
5091 [36171]: https://github.com/rust-lang/rust/pull/36171
5092 [36173]: https://github.com/rust-lang/rust/pull/36173
5093 [36178]: https://github.com/rust-lang/rust/pull/36178
5094 [36213]: https://github.com/rust-lang/rust/pull/36213
5095 [36214]: https://github.com/rust-lang/rust/pull/36214
5096 [36264]: https://github.com/rust-lang/rust/pull/36264
5097 [36266]: https://github.com/rust-lang/rust/pull/36266
5098 [36289]: https://github.com/rust-lang/rust/pull/36289
5099 [36338]: https://github.com/rust-lang/rust/pull/36338
5100 [36351]: https://github.com/rust-lang/rust/pull/36351
5101 [36355]: https://github.com/rust-lang/rust/pull/36355
5102 [36369]: https://github.com/rust-lang/rust/pull/36369
5103 [36372]: https://github.com/rust-lang/rust/pull/36372
5104 [36423]: https://github.com/rust-lang/rust/pull/36423
5105 [36482]: https://github.com/rust-lang/rust/pull/36482
5106 [36505]: https://github.com/rust-lang/rust/pull/36505
5107 [36524]: https://github.com/rust-lang/rust/pull/36524
5108 [36527]: https://github.com/rust-lang/rust/pull/36527
5109 [36551]: https://github.com/rust-lang/rust/pull/36551
5110 [36574]: https://github.com/rust-lang/rust/pull/36574
5111 [36586]: https://github.com/rust-lang/rust/pull/36586
5112 [36592]: https://github.com/rust-lang/rust/pull/36592
5113 [36631]: https://github.com/rust-lang/rust/pull/36631
5114 [36639]: https://github.com/rust-lang/rust/pull/36639
5115 [36721]: https://github.com/rust-lang/rust/pull/36721
5116 [36727]: https://github.com/rust-lang/rust/pull/36727
5117 [36730]: https://github.com/rust-lang/rust/pull/36730
5118 [36734]: https://github.com/rust-lang/rust/pull/36734
5119 [36754]: https://github.com/rust-lang/rust/pull/36754
5120 [36995]: https://github.com/rust-lang/rust/pull/36995
5121 [RFC 0016]: https://github.com/rust-lang/rfcs/blob/master/text/0016-more-attributes.md
5122 [RFC 0243]: https://github.com/rust-lang/rfcs/blob/master/text/0243-trait-based-exception-handling.md
5123 [RFC 1506]: https://github.com/rust-lang/rfcs/blob/master/text/1506-adt-kinds.md
5124 [RFC 401]: https://github.com/rust-lang/rfcs/blob/master/text/0401-coercions.md
5125 [RFC 873]: https://github.com/rust-lang/rfcs/blob/master/text/0873-type-macros.md
5126 [cargo/2818]: https://github.com/rust-lang/cargo/pull/2818
5127 [cargo/3000]: https://github.com/rust-lang/cargo/pull/3000
5128 [cargo/3021]: https://github.com/rust-lang/cargo/pull/3021
5129 [cargo/3038]: https://github.com/rust-lang/cargo/pull/3038
5130 [cargo/3060]: https://github.com/rust-lang/cargo/pull/3060
5131 [cargo/3078]: https://github.com/rust-lang/cargo/pull/3078
5132 [cargo/3089]: https://github.com/rust-lang/cargo/pull/3089
5133 [cargo/3092]: https://github.com/rust-lang/cargo/pull/3092
5134 [cargo/3110]: https://github.com/rust-lang/cargo/pull/3110
5135 [cargo/3121]: https://github.com/rust-lang/cargo/pull/3121
5136 [cargo/3123]: https://github.com/rust-lang/cargo/pull/3123
5137 [cargo/3125]: https://github.com/rust-lang/cargo/pull/3125
5138 [cargo/3136]: https://github.com/rust-lang/cargo/pull/3136
5139 [cargo/3144]: https://github.com/rust-lang/cargo/pull/3144
5140 [cargo/3146]: https://github.com/rust-lang/cargo/pull/3146
5141 [cargo/3157]: https://github.com/rust-lang/cargo/pull/3157
5142 [cargo/3162]: https://github.com/rust-lang/cargo/pull/3162
5143 [cargo/3205]: https://github.com/rust-lang/cargo/pull/3205
5144 [cargo/3241]: https://github.com/rust-lang/cargo/pull/3241
5145 [cargo/3242]: https://github.com/rust-lang/cargo/pull/3242
5146 [rustup]: https://www.rustup.rs
5147 [`checked_abs`]: https://doc.rust-lang.org/std/primitive.i32.html#method.checked_abs
5148 [`wrapping_abs`]: https://doc.rust-lang.org/std/primitive.i32.html#method.wrapping_abs
5149 [`overflowing_abs`]: https://doc.rust-lang.org/std/primitive.i32.html#method.overflowing_abs
5150 [`RefCell::try_borrow`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.try_borrow
5151 [`RefCell::try_borrow_mut`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.try_borrow_mut
5152 [`SipHasher`]: https://doc.rust-lang.org/std/hash/struct.SipHasher.html
5153 [`DefaultHasher`]: https://doc.rust-lang.org/std/collections/hash_map/struct.DefaultHasher.html
5154
5155
5156 Version 1.12.1 (2016-10-20)
5157 ===========================
5158
5159 Regression Fixes
5160 ----------------
5161
5162 * [ICE: 'rustc' panicked at 'assertion failed: concrete_substs.is_normalized_for_trans()' #36381][36381]
5163 * [Confusion with double negation and booleans][36856]
5164 * [rustc 1.12.0 fails with SIGSEGV in release mode (syn crate 0.8.0)][36875]
5165 * [Rustc 1.12.0 Windows build of `ethcore` crate fails with LLVM error][36924]
5166 * [1.12.0: High memory usage when linking in release mode with debug info][36926]
5167 * [Corrupted memory after updated to 1.12][36936]
5168 * ["Let NullaryConstructor = something;" causes internal compiler error: "tried to overwrite interned AdtDef"][37026]
5169 * [Fix ICE: inject bitcast if types mismatch for invokes/calls/stores][37112]
5170 * [debuginfo: Handle spread_arg case in MIR-trans in a more stable way.][37153]
5171
5172 [36381]: https://github.com/rust-lang/rust/issues/36381
5173 [36856]: https://github.com/rust-lang/rust/issues/36856
5174 [36875]: https://github.com/rust-lang/rust/issues/36875
5175 [36924]: https://github.com/rust-lang/rust/issues/36924
5176 [36926]: https://github.com/rust-lang/rust/issues/36926
5177 [36936]: https://github.com/rust-lang/rust/issues/36936
5178 [37026]: https://github.com/rust-lang/rust/issues/37026
5179 [37112]: https://github.com/rust-lang/rust/issues/37112
5180 [37153]: https://github.com/rust-lang/rust/issues/37153
5181
5182
5183 Version 1.12.0 (2016-09-29)
5184 ===========================
5185
5186 Highlights
5187 ----------
5188
5189 * [`rustc` translates code to LLVM IR via its own "middle" IR (MIR)](https://github.com/rust-lang/rust/pull/34096).
5190   This translation pass is far simpler than the previous AST->LLVM pass, and
5191   creates opportunities to perform new optimizations directly on the MIR. It
5192   was previously described [on the Rust blog](https://blog.rust-lang.org/2016/04/19/MIR.html).
5193 * [`rustc` presents a new, more readable error format, along with
5194   machine-readable JSON error output for use by IDEs](https://github.com/rust-lang/rust/pull/35401).
5195   Most common editors supporting Rust have been updated to work with it. It was
5196   previously described [on the Rust blog](https://blog.rust-lang.org/2016/08/10/Shape-of-errors-to-come.html).
5197
5198 Compiler
5199 --------
5200
5201 * [`rustc` translates code to LLVM IR via its own "middle" IR (MIR)](https://github.com/rust-lang/rust/pull/34096).
5202   This translation pass is far simpler than the previous AST->LLVM pass, and
5203   creates opportunities to perform new optimizations directly on the MIR. It
5204   was previously described [on the Rust blog](https://blog.rust-lang.org/2016/04/19/MIR.html).
5205 * [Print the Rust target name, not the LLVM target name, with
5206   `--print target-list`](https://github.com/rust-lang/rust/pull/35489)
5207 * [The computation of `TypeId` is correct in some cases where it was previously
5208   producing inconsistent results](https://github.com/rust-lang/rust/pull/35267)
5209 * [The `mips-unknown-linux-gnu` target uses hardware floating point by default](https://github.com/rust-lang/rust/pull/34910)
5210 * [The `rustc` arguments, `--print target-cpus`, `--print target-features`,
5211   `--print relocation-models`, and `--print code-models` print the available
5212   options to the `-C target-cpu`, `-C target-feature`, `-C relocation-model` and
5213   `-C code-model` code generation arguments](https://github.com/rust-lang/rust/pull/34845)
5214 * [`rustc` supports three new MUSL targets on ARM: `arm-unknown-linux-musleabi`,
5215   `arm-unknown-linux-musleabihf`, and `armv7-unknown-linux-musleabihf`](https://github.com/rust-lang/rust/pull/35060).
5216   These targets produce statically-linked binaries. There are no binary release
5217   builds yet though.
5218
5219 Diagnostics
5220 -----------
5221
5222 * [`rustc` presents a new, more readable error format, along with
5223   machine-readable JSON error output for use by IDEs](https://github.com/rust-lang/rust/pull/35401).
5224   Most common editors supporting Rust have been updated to work with it. It was
5225   previously described [on the Rust blog](https://blog.rust-lang.org/2016/08/10/Shape-of-errors-to-come.html).
5226 * [In error descriptions, references are now described in plain English,
5227   instead of as "&-ptr"](https://github.com/rust-lang/rust/pull/35611)
5228 * [In error type descriptions, unknown numeric types are named `{integer}` or
5229   `{float}` instead of `_`](https://github.com/rust-lang/rust/pull/35080)
5230 * [`rustc` emits a clearer error when inner attributes follow a doc comment](https://github.com/rust-lang/rust/pull/34676)
5231
5232 Language
5233 --------
5234
5235 * [`macro_rules!` invocations can be made within `macro_rules!` invocations](https://github.com/rust-lang/rust/pull/34925)
5236 * [`macro_rules!` meta-variables are hygienic](https://github.com/rust-lang/rust/pull/35453)
5237 * [`macro_rules!` `tt` matchers can be reparsed correctly, making them much more
5238   useful](https://github.com/rust-lang/rust/pull/34908)
5239 * [`macro_rules!` `stmt` matchers correctly consume the entire contents when
5240   inside non-braces invocations](https://github.com/rust-lang/rust/pull/34886)
5241 * [Semicolons are properly required as statement delimiters inside
5242   `macro_rules!` invocations](https://github.com/rust-lang/rust/pull/34660)
5243 * [`cfg_attr` works on `path` attributes](https://github.com/rust-lang/rust/pull/34546)
5244
5245 Stabilized APIs
5246 ---------------
5247
5248 * [`Cell::as_ptr`](https://doc.rust-lang.org/std/cell/struct.Cell.html#method.as_ptr)
5249 * [`RefCell::as_ptr`](https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.as_ptr)
5250 * [`IpAddr::is_unspecified`](https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_unspecified)
5251 * [`IpAddr::is_loopback`](https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_loopback)
5252 * [`IpAddr::is_multicast`](https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_multicast)
5253 * [`Ipv4Addr::is_unspecified`](https://doc.rust-lang.org/std/net/struct.Ipv4Addr.html#method.is_unspecified)
5254 * [`Ipv6Addr::octets`](https://doc.rust-lang.org/std/net/struct.Ipv6Addr.html#method.octets)
5255 * [`LinkedList::contains`](https://doc.rust-lang.org/std/collections/linked_list/struct.LinkedList.html#method.contains)
5256 * [`VecDeque::contains`](https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.contains)
5257 * [`ExitStatusExt::from_raw`](https://doc.rust-lang.org/std/os/unix/process/trait.ExitStatusExt.html#tymethod.from_raw).
5258   Both on Unix and Windows.
5259 * [`Receiver::recv_timeout`](https://doc.rust-lang.org/std/sync/mpsc/struct.Receiver.html#method.recv_timeout)
5260 * [`RecvTimeoutError`](https://doc.rust-lang.org/std/sync/mpsc/enum.RecvTimeoutError.html)
5261 * [`BinaryHeap::peek_mut`](https://doc.rust-lang.org/std/collections/binary_heap/struct.BinaryHeap.html#method.peek_mut)
5262 * [`PeekMut`](https://doc.rust-lang.org/std/collections/binary_heap/struct.PeekMut.html)
5263 * [`iter::Product`](https://doc.rust-lang.org/std/iter/trait.Product.html)
5264 * [`iter::Sum`](https://doc.rust-lang.org/std/iter/trait.Sum.html)
5265 * [`OccupiedEntry::remove_entry`](https://doc.rust-lang.org/std/collections/btree_map/struct.OccupiedEntry.html#method.remove_entry)
5266 * [`VacantEntry::into_key`](https://doc.rust-lang.org/std/collections/btree_map/struct.VacantEntry.html#method.into_key)
5267
5268 Libraries
5269 ---------
5270
5271 * [The `format!` macro and friends now allow a single argument to be formatted
5272   in multiple styles](https://github.com/rust-lang/rust/pull/33642)
5273 * [The lifetime bounds on `[T]::binary_search_by` and
5274   `[T]::binary_search_by_key` have been adjusted to be more flexible](https://github.com/rust-lang/rust/pull/34762)
5275 * [`Option` implements `From` for its contained type](https://github.com/rust-lang/rust/pull/34828)
5276 * [`Cell`, `RefCell` and `UnsafeCell` implement `From` for their contained type](https://github.com/rust-lang/rust/pull/35392)
5277 * [`RwLock` panics if the reader count overflows](https://github.com/rust-lang/rust/pull/35378)
5278 * [`vec_deque::Drain`, `hash_map::Drain` and `hash_set::Drain` are covariant](https://github.com/rust-lang/rust/pull/35354)
5279 * [`vec::Drain` and `binary_heap::Drain` are covariant](https://github.com/rust-lang/rust/pull/34951)
5280 * [`Cow<str>` implements `FromIterator` for `char`, `&str` and `String`](https://github.com/rust-lang/rust/pull/35064)
5281 * [Sockets on Linux are correctly closed in subprocesses via `SOCK_CLOEXEC`](https://github.com/rust-lang/rust/pull/34946)
5282 * [`hash_map::Entry`, `hash_map::VacantEntry` and `hash_map::OccupiedEntry`
5283   implement `Debug`](https://github.com/rust-lang/rust/pull/34937)
5284 * [`btree_map::Entry`, `btree_map::VacantEntry` and `btree_map::OccupiedEntry`
5285   implement `Debug`](https://github.com/rust-lang/rust/pull/34885)
5286 * [`String` implements `AddAssign`](https://github.com/rust-lang/rust/pull/34890)
5287 * [Variadic `extern fn` pointers implement the `Clone`, `PartialEq`, `Eq`,
5288   `PartialOrd`, `Ord`, `Hash`, `fmt::Pointer`, and `fmt::Debug` traits](https://github.com/rust-lang/rust/pull/34879)
5289 * [`FileType` implements `Debug`](https://github.com/rust-lang/rust/pull/34757)
5290 * [References to `Mutex` and `RwLock` are unwind-safe](https://github.com/rust-lang/rust/pull/34756)
5291 * [`mpsc::sync_channel` `Receiver`s return any available message before
5292   reporting a disconnect](https://github.com/rust-lang/rust/pull/34731)
5293 * [Unicode definitions have been updated to 9.0](https://github.com/rust-lang/rust/pull/34599)
5294 * [`env` iterators implement `DoubleEndedIterator`](https://github.com/rust-lang/rust/pull/33312)
5295
5296 Cargo
5297 -----
5298
5299 * [Support local mirrors of registries](https://github.com/rust-lang/cargo/pull/2857)
5300 * [Add support for command aliases](https://github.com/rust-lang/cargo/pull/2679)
5301 * [Allow `opt-level="s"` / `opt-level="z"` in profile overrides](https://github.com/rust-lang/cargo/pull/3007)
5302 * [Make `cargo doc --open --target` work as expected](https://github.com/rust-lang/cargo/pull/2988)
5303 * [Speed up noop registry updates](https://github.com/rust-lang/cargo/pull/2974)
5304 * [Update OpenSSL](https://github.com/rust-lang/cargo/pull/2971)
5305 * [Fix `--panic=abort` with plugins](https://github.com/rust-lang/cargo/pull/2954)
5306 * [Always pass `-C metadata` to the compiler](https://github.com/rust-lang/cargo/pull/2946)
5307 * [Fix depending on git repos with workspaces](https://github.com/rust-lang/cargo/pull/2938)
5308 * [Add a `--lib` flag to `cargo new`](https://github.com/rust-lang/cargo/pull/2921)
5309 * [Add `http.cainfo` for custom certs](https://github.com/rust-lang/cargo/pull/2917)
5310 * [Indicate the compilation profile after compiling](https://github.com/rust-lang/cargo/pull/2909)
5311 * [Allow enabling features for dependencies with `--features`](https://github.com/rust-lang/cargo/pull/2876)
5312 * [Add `--jobs` flag to `cargo package`](https://github.com/rust-lang/cargo/pull/2867)
5313 * [Add `--dry-run` to `cargo publish`](https://github.com/rust-lang/cargo/pull/2849)
5314 * [Add support for `RUSTDOCFLAGS`](https://github.com/rust-lang/cargo/pull/2794)
5315
5316 Performance
5317 -----------
5318
5319 * [`panic::catch_unwind` is more optimized](https://github.com/rust-lang/rust/pull/35444)
5320 * [`panic::catch_unwind` no longer accesses thread-local storage on entry](https://github.com/rust-lang/rust/pull/34866)
5321
5322 Tooling
5323 -------
5324
5325 * [Test binaries now support a `--test-threads` argument to specify the number
5326   of threads used to run tests, and which acts the same as the
5327   `RUST_TEST_THREADS` environment variable](https://github.com/rust-lang/rust/pull/35414)
5328 * [The test runner now emits a warning when tests run over 60 seconds](https://github.com/rust-lang/rust/pull/35405)
5329 * [rustdoc: Fix methods in search results](https://github.com/rust-lang/rust/pull/34752)
5330 * [`rust-lldb` warns about unsupported versions of LLDB](https://github.com/rust-lang/rust/pull/34646)
5331 * [Rust releases now come with source packages that can be installed by rustup
5332   via `rustup component add rust-src`](https://github.com/rust-lang/rust/pull/34366).
5333   The resulting source code can be used by tools and IDES, located in the
5334   sysroot under `lib/rustlib/src`.
5335
5336 Misc
5337 ----
5338
5339 * [The compiler can now be built against LLVM 3.9](https://github.com/rust-lang/rust/pull/35594)
5340 * Many minor improvements to the documentation.
5341 * [The Rust exception handling "personality" routine is now written in Rust](https://github.com/rust-lang/rust/pull/34832)
5342
5343 Compatibility Notes
5344 -------------------
5345
5346 * [When printing Windows `OsStr`s, unpaired surrogate codepoints are escaped
5347   with the lowercase format instead of the uppercase](https://github.com/rust-lang/rust/pull/35084)
5348 * [When formatting strings, if "precision" is specified, the "fill",
5349   "align" and "width" specifiers are no longer ignored](https://github.com/rust-lang/rust/pull/34544)
5350 * [The `Debug` impl for strings no longer escapes all non-ASCII characters](https://github.com/rust-lang/rust/pull/34485)
5351
5352
5353 Version 1.11.0 (2016-08-18)
5354 ===========================
5355
5356 Language
5357 --------
5358
5359 * [Support nested `cfg_attr` attributes](https://github.com/rust-lang/rust/pull/34216)
5360 * [Allow statement-generating braced macro invocations at the end of blocks](https://github.com/rust-lang/rust/pull/34436)
5361 * [Macros can be expanded inside of trait definitions](https://github.com/rust-lang/rust/pull/34213)
5362 * [`#[macro_use]` works properly when it is itself expanded from a macro](https://github.com/rust-lang/rust/pull/34032)
5363
5364 Stabilized APIs
5365 ---------------
5366
5367 * [`BinaryHeap::append`](https://doc.rust-lang.org/std/collections/binary_heap/struct.BinaryHeap.html#method.append)
5368 * [`BTreeMap::append`](https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.append)
5369 * [`BTreeMap::split_off`](https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.split_off)
5370 * [`BTreeSet::append`](https://doc.rust-lang.org/std/collections/btree_set/struct.BTreeSet.html#method.append)
5371 * [`BTreeSet::split_off`](https://doc.rust-lang.org/std/collections/btree_set/struct.BTreeSet.html#method.split_off)
5372 * [`f32::to_degrees`](https://doc.rust-lang.org/std/primitive.f32.html#method.to_degrees)
5373   (in libcore - previously stabilized in libstd)
5374 * [`f32::to_radians`](https://doc.rust-lang.org/std/primitive.f32.html#method.to_radians)
5375   (in libcore - previously stabilized in libstd)
5376 * [`f64::to_degrees`](https://doc.rust-lang.org/std/primitive.f64.html#method.to_degrees)
5377   (in libcore - previously stabilized in libstd)
5378 * [`f64::to_radians`](https://doc.rust-lang.org/std/primitive.f64.html#method.to_radians)
5379   (in libcore - previously stabilized in libstd)
5380 * [`Iterator::sum`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.sum)
5381 * [`Iterator::product`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.sum)
5382 * [`Cell::get_mut`](https://doc.rust-lang.org/std/cell/struct.Cell.html#method.get_mut)
5383 * [`RefCell::get_mut`](https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.get_mut)
5384
5385 Libraries
5386 ---------
5387
5388 * [The `thread_local!` macro supports multiple definitions in a single
5389    invocation, and can apply attributes](https://github.com/rust-lang/rust/pull/34077)
5390 * [`Cow` implements `Default`](https://github.com/rust-lang/rust/pull/34305)
5391 * [`Wrapping` implements binary, octal, lower-hex and upper-hex
5392   `Display` formatting](https://github.com/rust-lang/rust/pull/34190)
5393 * [The range types implement `Hash`](https://github.com/rust-lang/rust/pull/34180)
5394 * [`lookup_host` ignores unknown address types](https://github.com/rust-lang/rust/pull/34067)
5395 * [`assert_eq!` accepts a custom error message, like `assert!` does](https://github.com/rust-lang/rust/pull/33976)
5396 * [The main thread is now called "main" instead of "&lt;main&gt;"](https://github.com/rust-lang/rust/pull/33803)
5397
5398 Cargo
5399 -----
5400
5401 * [Disallow specifying features of transitive deps](https://github.com/rust-lang/cargo/pull/2821)
5402 * [Add color support for Windows consoles](https://github.com/rust-lang/cargo/pull/2804)
5403 * [Fix `harness = false` on `[lib]` sections](https://github.com/rust-lang/cargo/pull/2795)
5404 * [Don't panic when `links` contains a '.'](https://github.com/rust-lang/cargo/pull/2787)
5405 * [Build scripts can emit warnings](https://github.com/rust-lang/cargo/pull/2630),
5406   and `-vv` prints warnings for all crates.
5407 * [Ignore file locks on OS X NFS mounts](https://github.com/rust-lang/cargo/pull/2720)
5408 * [Don't warn about `package.metadata` keys](https://github.com/rust-lang/cargo/pull/2668).
5409   This provides room for expansion by arbitrary tools.
5410 * [Add support for cdylib crate types](https://github.com/rust-lang/cargo/pull/2741)
5411 * [Prevent publishing crates when files are dirty](https://github.com/rust-lang/cargo/pull/2781)
5412 * [Don't fetch all crates on clean](https://github.com/rust-lang/cargo/pull/2704)
5413 * [Propagate --color option to rustc](https://github.com/rust-lang/cargo/pull/2779)
5414 * [Fix `cargo doc --open` on Windows](https://github.com/rust-lang/cargo/pull/2780)
5415 * [Improve autocompletion](https://github.com/rust-lang/cargo/pull/2772)
5416 * [Configure colors of stderr as well as stdout](https://github.com/rust-lang/cargo/pull/2739)
5417
5418 Performance
5419 -----------
5420
5421 * [Caching projections speeds up type check dramatically for some
5422   workloads](https://github.com/rust-lang/rust/pull/33816)
5423 * [The default `HashMap` hasher is SipHash 1-3 instead of SipHash 2-4](https://github.com/rust-lang/rust/pull/33940)
5424   This hasher is faster, but is believed to provide sufficient
5425   protection from collision attacks.
5426 * [Comparison of `Ipv4Addr` is 10x faster](https://github.com/rust-lang/rust/pull/33891)
5427
5428 Rustdoc
5429 -------
5430
5431 * [Fix empty implementation section on some module pages](https://github.com/rust-lang/rust/pull/34536)
5432 * [Fix inlined renamed re-exports in import lists](https://github.com/rust-lang/rust/pull/34479)
5433 * [Fix search result layout for enum variants and struct fields](https://github.com/rust-lang/rust/pull/34477)
5434 * [Fix issues with source links to external crates](https://github.com/rust-lang/rust/pull/34387)
5435 * [Fix redirect pages for renamed re-exports](https://github.com/rust-lang/rust/pull/34245)
5436
5437 Tooling
5438 -------
5439
5440 * [rustc is better at finding the MSVC toolchain](https://github.com/rust-lang/rust/pull/34492)
5441 * [When emitting debug info, rustc emits frame pointers for closures,
5442   shims and glue, as it does for all other functions](https://github.com/rust-lang/rust/pull/33909)
5443 * [rust-lldb warns about unsupported versions of LLDB](https://github.com/rust-lang/rust/pull/34646)
5444 * Many more errors have been given error codes and extended
5445   explanations
5446 * API documentation continues to be improved, with many new examples
5447
5448 Misc
5449 ----
5450
5451 * [rustc no longer hangs when dependencies recursively re-export
5452   submodules](https://github.com/rust-lang/rust/pull/34542)
5453 * [rustc requires LLVM 3.7+](https://github.com/rust-lang/rust/pull/34104)
5454 * [The 'How Safe and Unsafe Interact' chapter of The Rustonomicon was
5455   rewritten](https://github.com/rust-lang/rust/pull/33895)
5456 * [rustc support 16-bit pointer sizes](https://github.com/rust-lang/rust/pull/33460).
5457   No targets use this yet, but it works toward AVR support.
5458
5459 Compatibility Notes
5460 -------------------
5461
5462 * [`const`s and `static`s may not have unsized types](https://github.com/rust-lang/rust/pull/34443)
5463 * [The new follow-set rules that place restrictions on `macro_rules!`
5464   in order to ensure syntax forward-compatibility have been enabled](https://github.com/rust-lang/rust/pull/33982)
5465   This was an [amendment to RFC 550](https://github.com/rust-lang/rfcs/pull/1384),
5466   and has been a warning since 1.10.
5467 * [`cfg` attribute process has been refactored to fix various bugs](https://github.com/rust-lang/rust/pull/33706).
5468   This causes breakage in some corner cases.
5469
5470
5471 Version 1.10.0 (2016-07-07)
5472 ===========================
5473
5474 Language
5475 --------
5476
5477 * [`Copy` types are required to have a trivial implementation of `Clone`](https://github.com/rust-lang/rust/pull/33420).
5478   [RFC 1521](https://github.com/rust-lang/rfcs/blob/master/text/1521-copy-clone-semantics.md).
5479 * [Single-variant enums support the `#[repr(..)]` attribute](https://github.com/rust-lang/rust/pull/33355).
5480 * [Fix `#[derive(RustcEncodable)]` in the presence of other `encode` methods](https://github.com/rust-lang/rust/pull/32908).
5481 * [`panic!` can be converted to a runtime abort with the
5482   `-C panic=abort` flag](https://github.com/rust-lang/rust/pull/32900).
5483   [RFC 1513](https://github.com/rust-lang/rfcs/blob/master/text/1513-less-unwinding.md).
5484 * [Add a new crate type, 'cdylib'](https://github.com/rust-lang/rust/pull/33553).
5485   cdylibs are dynamic libraries suitable for loading by non-Rust hosts.
5486   [RFC 1510](https://github.com/rust-lang/rfcs/blob/master/text/1510-cdylib.md).
5487   Note that Cargo does not yet directly support cdylibs.
5488
5489 Stabilized APIs
5490 ---------------
5491
5492 * `os::windows::fs::OpenOptionsExt::access_mode`
5493 * `os::windows::fs::OpenOptionsExt::share_mode`
5494 * `os::windows::fs::OpenOptionsExt::custom_flags`
5495 * `os::windows::fs::OpenOptionsExt::attributes`
5496 * `os::windows::fs::OpenOptionsExt::security_qos_flags`
5497 * `os::unix::fs::OpenOptionsExt::custom_flags`
5498 * [`sync::Weak::new`](http://doc.rust-lang.org/alloc/arc/struct.Weak.html#method.new)
5499 * `Default for sync::Weak`
5500 * [`panic::set_hook`](http://doc.rust-lang.org/std/panic/fn.set_hook.html)
5501 * [`panic::take_hook`](http://doc.rust-lang.org/std/panic/fn.take_hook.html)
5502 * [`panic::PanicInfo`](http://doc.rust-lang.org/std/panic/struct.PanicInfo.html)
5503 * [`panic::PanicInfo::payload`](http://doc.rust-lang.org/std/panic/struct.PanicInfo.html#method.payload)
5504 * [`panic::PanicInfo::location`](http://doc.rust-lang.org/std/panic/struct.PanicInfo.html#method.location)
5505 * [`panic::Location`](http://doc.rust-lang.org/std/panic/struct.Location.html)
5506 * [`panic::Location::file`](http://doc.rust-lang.org/std/panic/struct.Location.html#method.file)
5507 * [`panic::Location::line`](http://doc.rust-lang.org/std/panic/struct.Location.html#method.line)
5508 * [`ffi::CStr::from_bytes_with_nul`](http://doc.rust-lang.org/std/ffi/struct.CStr.html#method.from_bytes_with_nul)
5509 * [`ffi::CStr::from_bytes_with_nul_unchecked`](http://doc.rust-lang.org/std/ffi/struct.CStr.html#method.from_bytes_with_nul_unchecked)
5510 * [`ffi::FromBytesWithNulError`](http://doc.rust-lang.org/std/ffi/struct.FromBytesWithNulError.html)
5511 * [`fs::Metadata::modified`](http://doc.rust-lang.org/std/fs/struct.Metadata.html#method.modified)
5512 * [`fs::Metadata::accessed`](http://doc.rust-lang.org/std/fs/struct.Metadata.html#method.accessed)
5513 * [`fs::Metadata::created`](http://doc.rust-lang.org/std/fs/struct.Metadata.html#method.created)
5514 * `sync::atomic::Atomic{Usize,Isize,Bool,Ptr}::compare_exchange`
5515 * `sync::atomic::Atomic{Usize,Isize,Bool,Ptr}::compare_exchange_weak`
5516 * `collections::{btree,hash}_map::{Occupied,Vacant,}Entry::key`
5517 * `os::unix::net::{UnixStream, UnixListener, UnixDatagram, SocketAddr}`
5518 * [`SocketAddr::is_unnamed`](http://doc.rust-lang.org/std/os/unix/net/struct.SocketAddr.html#method.is_unnamed)
5519 * [`SocketAddr::as_pathname`](http://doc.rust-lang.org/std/os/unix/net/struct.SocketAddr.html#method.as_pathname)
5520 * [`UnixStream::connect`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.connect)
5521 * [`UnixStream::pair`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.pair)
5522 * [`UnixStream::try_clone`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.try_clone)
5523 * [`UnixStream::local_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.local_addr)
5524 * [`UnixStream::peer_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.peer_addr)
5525 * [`UnixStream::set_read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.read_timeout)
5526 * [`UnixStream::set_write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.write_timeout)
5527 * [`UnixStream::read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.read_timeout)
5528 * [`UnixStream::write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.write_timeout)
5529 * [`UnixStream::set_nonblocking`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.set_nonblocking)
5530 * [`UnixStream::take_error`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.take_error)
5531 * [`UnixStream::shutdown`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.shutdown)
5532 * Read/Write/RawFd impls for `UnixStream`
5533 * [`UnixListener::bind`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.bind)
5534 * [`UnixListener::accept`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.accept)
5535 * [`UnixListener::try_clone`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.try_clone)
5536 * [`UnixListener::local_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.local_addr)
5537 * [`UnixListener::set_nonblocking`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.set_nonblocking)
5538 * [`UnixListener::take_error`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.take_error)
5539 * [`UnixListener::incoming`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.incoming)
5540 * RawFd impls for `UnixListener`
5541 * [`UnixDatagram::bind`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.bind)
5542 * [`UnixDatagram::unbound`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.unbound)
5543 * [`UnixDatagram::pair`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.pair)
5544 * [`UnixDatagram::connect`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.connect)
5545 * [`UnixDatagram::try_clone`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.try_clone)
5546 * [`UnixDatagram::local_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.local_addr)
5547 * [`UnixDatagram::peer_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.peer_addr)
5548 * [`UnixDatagram::recv_from`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.recv_from)
5549 * [`UnixDatagram::recv`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.recv)
5550 * [`UnixDatagram::send_to`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.send_to)
5551 * [`UnixDatagram::send`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.send)
5552 * [`UnixDatagram::set_read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.set_read_timeout)
5553 * [`UnixDatagram::set_write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.set_write_timeout)
5554 * [`UnixDatagram::read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.read_timeout)
5555 * [`UnixDatagram::write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.write_timeout)
5556 * [`UnixDatagram::set_nonblocking`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.set_nonblocking)
5557 * [`UnixDatagram::take_error`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.take_error)
5558 * [`UnixDatagram::shutdown`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.shutdown)
5559 * RawFd impls for `UnixDatagram`
5560 * `{BTree,Hash}Map::values_mut`
5561 * [`<[_]>::binary_search_by_key`](http://doc.rust-lang.org/std/primitive.slice.html#method.binary_search_by_key)
5562
5563 Libraries
5564 ---------
5565
5566 * [The `abs_sub` method of floats is deprecated](https://github.com/rust-lang/rust/pull/33664).
5567   The semantics of this minor method are subtle and probably not what
5568   most people want.
5569 * [Add implementation of Ord for Cell<T> and RefCell<T> where T: Ord](https://github.com/rust-lang/rust/pull/33306).
5570 * [On Linux, if `HashMap`s can't be initialized with `getrandom` they
5571   will fall back to `/dev/urandom` temporarily to avoid blocking
5572   during early boot](https://github.com/rust-lang/rust/pull/33086).
5573 * [Implemented negation for wrapping numerals](https://github.com/rust-lang/rust/pull/33067).
5574 * [Implement `Clone` for `binary_heap::IntoIter`](https://github.com/rust-lang/rust/pull/33050).
5575 * [Implement `Display` and `Hash` for `std::num::Wrapping`](https://github.com/rust-lang/rust/pull/33023).
5576 * [Add `Default` implementation for `&CStr`, `CString`](https://github.com/rust-lang/rust/pull/32990).
5577 * [Implement `From<Vec<T>>` and `Into<Vec<T>>` for `VecDeque<T>`](https://github.com/rust-lang/rust/pull/32866).
5578 * [Implement `Default` for `UnsafeCell`, `fmt::Error`, `Condvar`,
5579   `Mutex`, `RwLock`](https://github.com/rust-lang/rust/pull/32785).
5580
5581 Cargo
5582 -----
5583 * [Cargo.toml supports the `profile.*.panic` option](https://github.com/rust-lang/cargo/pull/2687).
5584   This controls the runtime behavior of the `panic!` macro
5585   and can be either "unwind" (the default), or "abort".
5586   [RFC 1513](https://github.com/rust-lang/rfcs/blob/master/text/1513-less-unwinding.md).
5587 * [Don't throw away errors with `-p` arguments](https://github.com/rust-lang/cargo/pull/2723).
5588 * [Report status to stderr instead of stdout](https://github.com/rust-lang/cargo/pull/2693).
5589 * [Build scripts are passed a `CARGO_MANIFEST_LINKS` environment
5590   variable that corresponds to the `links` field of the manifest](https://github.com/rust-lang/cargo/pull/2710).
5591 * [Ban keywords from crate names](https://github.com/rust-lang/cargo/pull/2707).
5592 * [Canonicalize `CARGO_HOME` on Windows](https://github.com/rust-lang/cargo/pull/2604).
5593 * [Retry network requests](https://github.com/rust-lang/cargo/pull/2396).
5594   By default they are retried twice, which can be customized with the
5595   `net.retry` value in `.cargo/config`.
5596 * [Don't print extra error info for failing subcommands](https://github.com/rust-lang/cargo/pull/2674).
5597 * [Add `--force` flag to `cargo install`](https://github.com/rust-lang/cargo/pull/2405).
5598 * [Don't use `flock` on NFS mounts](https://github.com/rust-lang/cargo/pull/2623).
5599 * [Prefer building `cargo install` artifacts in temporary directories](https://github.com/rust-lang/cargo/pull/2610).
5600   Makes it possible to install multiple crates in parallel.
5601 * [Add `cargo test --doc`](https://github.com/rust-lang/cargo/pull/2578).
5602 * [Add `cargo --explain`](https://github.com/rust-lang/cargo/pull/2551).
5603 * [Don't print warnings when `-q` is passed](https://github.com/rust-lang/cargo/pull/2576).
5604 * [Add `cargo doc --lib` and `--bin`](https://github.com/rust-lang/cargo/pull/2577).
5605 * [Don't require build script output to be UTF-8](https://github.com/rust-lang/cargo/pull/2560).
5606 * [Correctly attempt multiple git usernames](https://github.com/rust-lang/cargo/pull/2584).
5607
5608 Performance
5609 -----------
5610
5611 * [rustc memory usage was reduced by refactoring the context used for
5612   type checking](https://github.com/rust-lang/rust/pull/33425).
5613 * [Speed up creation of `HashMap`s by caching the random keys used
5614   to initialize the hash state](https://github.com/rust-lang/rust/pull/33318).
5615 * [The `find` implementation for `Chain` iterators is 2x faster](https://github.com/rust-lang/rust/pull/33289).
5616 * [Trait selection optimizations speed up type checking by 15%](https://github.com/rust-lang/rust/pull/33138).
5617 * [Efficient trie lookup for boolean Unicode properties](https://github.com/rust-lang/rust/pull/33098).
5618   10x faster than the previous lookup tables.
5619 * [Special case `#[derive(Copy, Clone)]` to avoid bloat](https://github.com/rust-lang/rust/pull/31414).
5620
5621 Usability
5622 ---------
5623
5624 * Many incremental improvements to documentation and rustdoc.
5625 * [rustdoc: List blanket trait impls](https://github.com/rust-lang/rust/pull/33514).
5626 * [rustdoc: Clean up ABI rendering](https://github.com/rust-lang/rust/pull/33151).
5627 * [Indexing with the wrong type produces a more informative error](https://github.com/rust-lang/rust/pull/33401).
5628 * [Improve diagnostics for constants being used in irrefutable patterns](https://github.com/rust-lang/rust/pull/33406).
5629 * [When many method candidates are in scope limit the suggestions to 10](https://github.com/rust-lang/rust/pull/33338).
5630 * [Remove confusing suggestion when calling a `fn` type](https://github.com/rust-lang/rust/pull/33325).
5631 * [Do not suggest changing `&mut self` to `&mut mut self`](https://github.com/rust-lang/rust/pull/33319).
5632
5633 Misc
5634 ----
5635
5636 * [Update i686-linux-android features to match Android ABI](https://github.com/rust-lang/rust/pull/33651).
5637 * [Update aarch64-linux-android features to match Android ABI](https://github.com/rust-lang/rust/pull/33500).
5638 * [`std` no longer prints backtraces on platforms where the running
5639   module must be loaded with `env::current_exe`, which can't be relied
5640   on](https://github.com/rust-lang/rust/pull/33554).
5641 * This release includes std binaries for the i586-unknown-linux-gnu,
5642   i686-unknown-linux-musl, and armv7-linux-androideabi targets. The
5643   i586 target is for old x86 hardware without SSE2, and the armv7
5644   target is for Android running on modern ARM architectures.
5645 * [The `rust-gdb` and `rust-lldb` scripts are distributed on all
5646   Unix platforms](https://github.com/rust-lang/rust/pull/32835).
5647 * [On Unix the runtime aborts by calling `libc::abort` instead of
5648   generating an illegal instruction](https://github.com/rust-lang/rust/pull/31457).
5649 * [Rust is now bootstrapped from the previous release of Rust,
5650   instead of a snapshot from an arbitrary commit](https://github.com/rust-lang/rust/pull/32942).
5651
5652 Compatibility Notes
5653 -------------------
5654
5655 * [`AtomicBool` is now bool-sized, not word-sized](https://github.com/rust-lang/rust/pull/33579).
5656 * [`target_env` for Linux ARM targets is just `gnu`, not
5657   `gnueabihf`, `gnueabi`, etc](https://github.com/rust-lang/rust/pull/33403).
5658 * [Consistently panic on overflow in `Duration::new`](https://github.com/rust-lang/rust/pull/33072).
5659 * [Change `String::truncate` to panic less](https://github.com/rust-lang/rust/pull/32977).
5660 * [Add `:block` to the follow set for `:ty` and `:path`](https://github.com/rust-lang/rust/pull/32945).
5661   Affects how macros are parsed.
5662 * [Fix macro hygiene bug](https://github.com/rust-lang/rust/pull/32923).
5663 * [Feature-gated attributes on macro-generated macro invocations are
5664   now rejected](https://github.com/rust-lang/rust/pull/32791).
5665 * [Suppress fallback and ambiguity errors during type inference](https://github.com/rust-lang/rust/pull/32258).
5666   This caused some minor changes to type inference.
5667
5668
5669 Version 1.9.0 (2016-05-26)
5670 ==========================
5671
5672 Language
5673 --------
5674
5675 * The `#[deprecated]` attribute when applied to an API will generate
5676   warnings when used. The warnings may be suppressed with
5677   `#[allow(deprecated)]`. [RFC 1270].
5678 * [`fn` item types are zero sized, and each `fn` names a unique
5679   type][1.9fn]. This will break code that transmutes `fn`s, so calling
5680   `transmute` on a `fn` type will generate a warning for a few cycles,
5681   then will be converted to an error.
5682 * [Field and method resolution understand visibility, so private
5683   fields and methods cannot prevent the proper use of public fields
5684   and methods][1.9fv].
5685 * [The parser considers unicode codepoints in the
5686   `PATTERN_WHITE_SPACE` category to be whitespace][1.9ws].
5687
5688 Stabilized APIs
5689 ---------------
5690
5691 * [`std::panic`]
5692 * [`std::panic::catch_unwind`] (renamed from `recover`)
5693 * [`std::panic::resume_unwind`] (renamed from `propagate`)
5694 * [`std::panic::AssertUnwindSafe`] (renamed from `AssertRecoverSafe`)
5695 * [`std::panic::UnwindSafe`] (renamed from `RecoverSafe`)
5696 * [`str::is_char_boundary`]
5697 * [`<*const T>::as_ref`]
5698 * [`<*mut T>::as_ref`]
5699 * [`<*mut T>::as_mut`]
5700 * [`AsciiExt::make_ascii_uppercase`]
5701 * [`AsciiExt::make_ascii_lowercase`]
5702 * [`char::decode_utf16`]
5703 * [`char::DecodeUtf16`]
5704 * [`char::DecodeUtf16Error`]
5705 * [`char::DecodeUtf16Error::unpaired_surrogate`]
5706 * [`BTreeSet::take`]
5707 * [`BTreeSet::replace`]
5708 * [`BTreeSet::get`]
5709 * [`HashSet::take`]
5710 * [`HashSet::replace`]
5711 * [`HashSet::get`]
5712 * [`OsString::with_capacity`]
5713 * [`OsString::clear`]
5714 * [`OsString::capacity`]
5715 * [`OsString::reserve`]
5716 * [`OsString::reserve_exact`]
5717 * [`OsStr::is_empty`]
5718 * [`OsStr::len`]
5719 * [`std::os::unix::thread`]
5720 * [`RawPthread`]
5721 * [`JoinHandleExt`]
5722 * [`JoinHandleExt::as_pthread_t`]
5723 * [`JoinHandleExt::into_pthread_t`]
5724 * [`HashSet::hasher`]
5725 * [`HashMap::hasher`]
5726 * [`CommandExt::exec`]
5727 * [`File::try_clone`]
5728 * [`SocketAddr::set_ip`]
5729 * [`SocketAddr::set_port`]
5730 * [`SocketAddrV4::set_ip`]
5731 * [`SocketAddrV4::set_port`]
5732 * [`SocketAddrV6::set_ip`]
5733 * [`SocketAddrV6::set_port`]
5734 * [`SocketAddrV6::set_flowinfo`]
5735 * [`SocketAddrV6::set_scope_id`]
5736 * [`slice::copy_from_slice`]
5737 * [`ptr::read_volatile`]
5738 * [`ptr::write_volatile`]
5739 * [`OpenOptions::create_new`]
5740 * [`TcpStream::set_nodelay`]
5741 * [`TcpStream::nodelay`]
5742 * [`TcpStream::set_ttl`]
5743 * [`TcpStream::ttl`]
5744 * [`TcpStream::set_only_v6`]
5745 * [`TcpStream::only_v6`]
5746 * [`TcpStream::take_error`]
5747 * [`TcpStream::set_nonblocking`]
5748 * [`TcpListener::set_ttl`]
5749 * [`TcpListener::ttl`]
5750 * [`TcpListener::set_only_v6`]
5751 * [`TcpListener::only_v6`]
5752 * [`TcpListener::take_error`]
5753 * [`TcpListener::set_nonblocking`]
5754 * [`UdpSocket::set_broadcast`]
5755 * [`UdpSocket::broadcast`]
5756 * [`UdpSocket::set_multicast_loop_v4`]
5757 * [`UdpSocket::multicast_loop_v4`]
5758 * [`UdpSocket::set_multicast_ttl_v4`]
5759 * [`UdpSocket::multicast_ttl_v4`]
5760 * [`UdpSocket::set_multicast_loop_v6`]
5761 * [`UdpSocket::multicast_loop_v6`]
5762 * [`UdpSocket::set_multicast_ttl_v6`]
5763 * [`UdpSocket::multicast_ttl_v6`]
5764 * [`UdpSocket::set_ttl`]
5765 * [`UdpSocket::ttl`]
5766 * [`UdpSocket::set_only_v6`]
5767 * [`UdpSocket::only_v6`]
5768 * [`UdpSocket::join_multicast_v4`]
5769 * [`UdpSocket::join_multicast_v6`]
5770 * [`UdpSocket::leave_multicast_v4`]
5771 * [`UdpSocket::leave_multicast_v6`]
5772 * [`UdpSocket::take_error`]
5773 * [`UdpSocket::connect`]
5774 * [`UdpSocket::send`]
5775 * [`UdpSocket::recv`]
5776 * [`UdpSocket::set_nonblocking`]
5777
5778 Libraries
5779 ---------
5780
5781 * [`std::sync::Once` is poisoned if its initialization function
5782   fails][1.9o].
5783 * [`cell::Ref` and `cell::RefMut` can contain unsized types][1.9cu].
5784 * [Most types implement `fmt::Debug`][1.9db].
5785 * [The default buffer size used by `BufReader` and `BufWriter` was
5786   reduced to 8K, from 64K][1.9bf]. This is in line with the buffer size
5787   used by other languages.
5788 * [`Instant`, `SystemTime` and `Duration` implement `+=` and `-=`.
5789   `Duration` additionally implements `*=` and `/=`][1.9ta].
5790 * [`Skip` is a `DoubleEndedIterator`][1.9sk].
5791 * [`From<[u8; 4]>` is implemented for `Ipv4Addr`][1.9fi].
5792 * [`Chain` implements `BufRead`][1.9ch].
5793 * [`HashMap`, `HashSet` and iterators are covariant][1.9hc].
5794
5795 Cargo
5796 -----
5797
5798 * [Cargo can now run concurrently][1.9cc].
5799 * [Top-level overrides allow specific revisions of crates to be
5800   overridden through the entire crate graph][1.9ct].  This is intended
5801   to make upgrades easier for large projects, by allowing crates to be
5802   forked temporarily until they've been upgraded and republished.
5803 * [Cargo exports a `CARGO_PKG_AUTHORS` environment variable][1.9cp].
5804 * [Cargo will pass the contents of the `RUSTFLAGS` variable to `rustc`
5805   on the commandline][1.9cf]. `rustc` arguments can also be specified
5806   in the `build.rustflags` configuration key.
5807
5808 Performance
5809 -----------
5810
5811 * [The time complexity of comparing variables for equivalence during type
5812   unification is reduced from _O_(_n_!) to _O_(_n_)][1.9tu]. This leads
5813   to major compilation time improvement in some scenarios.
5814 * [`ToString` is specialized for `str`, giving it the same performance
5815   as `to_owned`][1.9ts].
5816 * [Spawning processes with `Command::output` no longer creates extra
5817   threads][1.9sp].
5818 * [`#[derive(PartialEq)]` and `#[derive(PartialOrd)]` emit less code
5819   for C-like enums][1.9cl].
5820
5821 Misc
5822 ----
5823
5824 * [Passing the `--quiet` flag to a test runner will produce
5825   much-abbreviated output][1.9q].
5826 * The Rust Project now publishes std binaries for the
5827   `mips-unknown-linux-musl`, `mipsel-unknown-linux-musl`, and
5828   `i586-pc-windows-msvc` targets.
5829
5830 Compatibility Notes
5831 -------------------
5832
5833 * [`std::sync::Once` is poisoned if its initialization function
5834   fails][1.9o].
5835 * [It is illegal to define methods with the same name in overlapping
5836   inherent `impl` blocks][1.9sn].
5837 * [`fn` item types are zero sized, and each `fn` names a unique
5838   type][1.9fn]. This will break code that transmutes `fn`s, so calling
5839   `transmute` on a `fn` type will generate a warning for a few cycles,
5840   then will be converted to an error.
5841 * [Improvements to const evaluation may trigger new errors when integer
5842   literals are out of range][1.9ce].
5843
5844
5845 [1.9bf]: https://github.com/rust-lang/rust/pull/32695
5846 [1.9cc]: https://github.com/rust-lang/cargo/pull/2486
5847 [1.9ce]: https://github.com/rust-lang/rust/pull/30587
5848 [1.9cf]: https://github.com/rust-lang/cargo/pull/2241
5849 [1.9ch]: https://github.com/rust-lang/rust/pull/32541
5850 [1.9cl]: https://github.com/rust-lang/rust/pull/31977
5851 [1.9cp]: https://github.com/rust-lang/cargo/pull/2465
5852 [1.9ct]: https://github.com/rust-lang/cargo/pull/2385
5853 [1.9cu]: https://github.com/rust-lang/rust/pull/32652
5854 [1.9db]: https://github.com/rust-lang/rust/pull/32054
5855 [1.9fi]: https://github.com/rust-lang/rust/pull/32050
5856 [1.9fn]: https://github.com/rust-lang/rust/pull/31710
5857 [1.9fv]: https://github.com/rust-lang/rust/pull/31938
5858 [1.9hc]: https://github.com/rust-lang/rust/pull/32635
5859 [1.9o]: https://github.com/rust-lang/rust/pull/32325
5860 [1.9q]: https://github.com/rust-lang/rust/pull/31887
5861 [1.9sk]: https://github.com/rust-lang/rust/pull/31700
5862 [1.9sn]: https://github.com/rust-lang/rust/pull/31925
5863 [1.9sp]: https://github.com/rust-lang/rust/pull/31618
5864 [1.9ta]: https://github.com/rust-lang/rust/pull/32448
5865 [1.9ts]: https://github.com/rust-lang/rust/pull/32586
5866 [1.9tu]: https://github.com/rust-lang/rust/pull/32062
5867 [1.9ws]: https://github.com/rust-lang/rust/pull/29734
5868 [RFC 1270]: https://github.com/rust-lang/rfcs/blob/master/text/1270-deprecation.md
5869 [`<*const T>::as_ref`]: http://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.as_ref
5870 [`<*mut T>::as_mut`]: http://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.as_mut
5871 [`<*mut T>::as_ref`]: http://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.as_ref
5872 [`slice::copy_from_slice`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.copy_from_slice
5873 [`AsciiExt::make_ascii_lowercase`]: http://doc.rust-lang.org/nightly/std/ascii/trait.AsciiExt.html#tymethod.make_ascii_lowercase
5874 [`AsciiExt::make_ascii_uppercase`]: http://doc.rust-lang.org/nightly/std/ascii/trait.AsciiExt.html#tymethod.make_ascii_uppercase
5875 [`BTreeSet::get`]: http://doc.rust-lang.org/nightly/collections/btree/set/struct.BTreeSet.html#method.get
5876 [`BTreeSet::replace`]: http://doc.rust-lang.org/nightly/collections/btree/set/struct.BTreeSet.html#method.replace
5877 [`BTreeSet::take`]: http://doc.rust-lang.org/nightly/collections/btree/set/struct.BTreeSet.html#method.take
5878 [`CommandExt::exec`]: http://doc.rust-lang.org/nightly/std/os/unix/process/trait.CommandExt.html#tymethod.exec
5879 [`File::try_clone`]: http://doc.rust-lang.org/nightly/std/fs/struct.File.html#method.try_clone
5880 [`HashMap::hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashMap.html#method.hasher
5881 [`HashSet::get`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.get
5882 [`HashSet::hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.hasher
5883 [`HashSet::replace`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.replace
5884 [`HashSet::take`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.take
5885 [`JoinHandleExt::as_pthread_t`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/trait.JoinHandleExt.html#tymethod.as_pthread_t
5886 [`JoinHandleExt::into_pthread_t`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/trait.JoinHandleExt.html#tymethod.into_pthread_t
5887 [`JoinHandleExt`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/trait.JoinHandleExt.html
5888 [`OpenOptions::create_new`]: http://doc.rust-lang.org/nightly/std/fs/struct.OpenOptions.html#method.create_new
5889 [`OsStr::is_empty`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsStr.html#method.is_empty
5890 [`OsStr::len`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsStr.html#method.len
5891 [`OsString::capacity`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.capacity
5892 [`OsString::clear`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.clear
5893 [`OsString::reserve_exact`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.reserve_exact
5894 [`OsString::reserve`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.reserve
5895 [`OsString::with_capacity`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.with_capacity
5896 [`RawPthread`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/type.RawPthread.html
5897 [`SocketAddr::set_ip`]: http://doc.rust-lang.org/nightly/std/net/enum.SocketAddr.html#method.set_ip
5898 [`SocketAddr::set_port`]: http://doc.rust-lang.org/nightly/std/net/enum.SocketAddr.html#method.set_port
5899 [`SocketAddrV4::set_ip`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV4.html#method.set_ip
5900 [`SocketAddrV4::set_port`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV4.html#method.set_port
5901 [`SocketAddrV6::set_flowinfo`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_flowinfo
5902 [`SocketAddrV6::set_ip`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_ip
5903 [`SocketAddrV6::set_port`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_port
5904 [`SocketAddrV6::set_scope_id`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_scope_id
5905 [`TcpListener::only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.only_v6
5906 [`TcpListener::set_nonblocking`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_nonblocking
5907 [`TcpListener::set_only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_only_v6
5908 [`TcpListener::set_ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_ttl
5909 [`TcpListener::take_error`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.take_error
5910 [`TcpListener::ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.ttl
5911 [`TcpStream::nodelay`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.nodelay
5912 [`TcpStream::only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.only_v6
5913 [`TcpStream::set_nodelay`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_nodelay
5914 [`TcpStream::set_nonblocking`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_nonblocking
5915 [`TcpStream::set_only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_only_v6
5916 [`TcpStream::set_ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_ttl
5917 [`TcpStream::take_error`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.take_error
5918 [`TcpStream::ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.ttl
5919 [`UdpSocket::broadcast`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.broadcast
5920 [`UdpSocket::connect`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.connect
5921 [`UdpSocket::join_multicast_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.join_multicast_v4
5922 [`UdpSocket::join_multicast_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.join_multicast_v6
5923 [`UdpSocket::leave_multicast_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.leave_multicast_v4
5924 [`UdpSocket::leave_multicast_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.leave_multicast_v6
5925 [`UdpSocket::multicast_loop_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_loop_v4
5926 [`UdpSocket::multicast_loop_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_loop_v6
5927 [`UdpSocket::multicast_ttl_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_ttl_v4
5928 [`UdpSocket::multicast_ttl_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_ttl_v6
5929 [`UdpSocket::only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.only_v6
5930 [`UdpSocket::recv`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.recv
5931 [`UdpSocket::send`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.send
5932 [`UdpSocket::set_broadcast`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_broadcast
5933 [`UdpSocket::set_multicast_loop_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_loop_v4
5934 [`UdpSocket::set_multicast_loop_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_loop_v6
5935 [`UdpSocket::set_multicast_ttl_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_ttl_v4
5936 [`UdpSocket::set_multicast_ttl_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_ttl_v6
5937 [`UdpSocket::set_nonblocking`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_nonblocking
5938 [`UdpSocket::set_only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_only_v6
5939 [`UdpSocket::set_ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_ttl
5940 [`UdpSocket::take_error`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.take_error
5941 [`UdpSocket::ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.ttl
5942 [`char::DecodeUtf16Error::unpaired_surrogate`]: http://doc.rust-lang.org/nightly/std/char/struct.DecodeUtf16Error.html#method.unpaired_surrogate
5943 [`char::DecodeUtf16Error`]: http://doc.rust-lang.org/nightly/std/char/struct.DecodeUtf16Error.html
5944 [`char::DecodeUtf16`]: http://doc.rust-lang.org/nightly/std/char/struct.DecodeUtf16.html
5945 [`char::decode_utf16`]: http://doc.rust-lang.org/nightly/std/char/fn.decode_utf16.html
5946 [`ptr::read_volatile`]: http://doc.rust-lang.org/nightly/std/ptr/fn.read_volatile.html
5947 [`ptr::write_volatile`]: http://doc.rust-lang.org/nightly/std/ptr/fn.write_volatile.html
5948 [`std::os::unix::thread`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/index.html
5949 [`std::panic::AssertUnwindSafe`]: http://doc.rust-lang.org/nightly/std/panic/struct.AssertUnwindSafe.html
5950 [`std::panic::UnwindSafe`]: http://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html
5951 [`std::panic::catch_unwind`]: http://doc.rust-lang.org/nightly/std/panic/fn.catch_unwind.html
5952 [`std::panic::resume_unwind`]: http://doc.rust-lang.org/nightly/std/panic/fn.resume_unwind.html
5953 [`std::panic`]: http://doc.rust-lang.org/nightly/std/panic/index.html
5954 [`str::is_char_boundary`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.is_char_boundary
5955
5956
5957 Version 1.8.0 (2016-04-14)
5958 ==========================
5959
5960 Language
5961 --------
5962
5963 * Rust supports overloading of compound assignment statements like
5964   `+=` by implementing the [`AddAssign`], [`SubAssign`],
5965   [`MulAssign`], [`DivAssign`], [`RemAssign`], [`BitAndAssign`],
5966   [`BitOrAssign`], [`BitXorAssign`], [`ShlAssign`], or [`ShrAssign`]
5967   traits. [RFC 953].
5968 * Empty structs can be defined with braces, as in `struct Foo { }`, in
5969   addition to the non-braced form, `struct Foo;`. [RFC 218].
5970
5971 Libraries
5972 ---------
5973
5974 * Stabilized APIs:
5975   * [`str::encode_utf16`] (renamed from `utf16_units`)
5976   * [`str::EncodeUtf16`] (renamed from `Utf16Units`)
5977   * [`Ref::map`]
5978   * [`RefMut::map`]
5979   * [`ptr::drop_in_place`]
5980   * [`time::Instant`]
5981   * [`time::SystemTime`]
5982   * [`Instant::now`]
5983   * [`Instant::duration_since`] (renamed from `duration_from_earlier`)
5984   * [`Instant::elapsed`]
5985   * [`SystemTime::now`]
5986   * [`SystemTime::duration_since`] (renamed from `duration_from_earlier`)
5987   * [`SystemTime::elapsed`]
5988   * Various `Add`/`Sub` impls for `Time` and `SystemTime`
5989   * [`SystemTimeError`]
5990   * [`SystemTimeError::duration`]
5991   * Various impls for `SystemTimeError`
5992   * [`UNIX_EPOCH`]
5993   * [`AddAssign`], [`SubAssign`], [`MulAssign`], [`DivAssign`],
5994     [`RemAssign`], [`BitAndAssign`], [`BitOrAssign`],
5995     [`BitXorAssign`], [`ShlAssign`], [`ShrAssign`].
5996 * [The `write!` and `writeln!` macros correctly emit errors if any of
5997   their arguments can't be formatted][1.8w].
5998 * [Various I/O functions support large files on 32-bit Linux][1.8l].
5999 * [The Unix-specific `raw` modules, which contain a number of
6000   redefined C types are deprecated][1.8r], including `os::raw::unix`,
6001   `os::raw::macos`, and `os::raw::linux`. These modules defined types
6002   such as `ino_t` and `dev_t`. The inconsistency of these definitions
6003   across platforms was making it difficult to implement `std`
6004   correctly. Those that need these definitions should use the `libc`
6005   crate. [RFC 1415].
6006 * The Unix-specific `MetadataExt` traits, including
6007   `os::unix::fs::MetadataExt`, which expose values such as inode
6008   numbers [no longer return platform-specific types][1.8r], but
6009   instead return widened integers. [RFC 1415].
6010 * [`btree_set::{IntoIter, Iter, Range}` are covariant][1.8cv].
6011 * [Atomic loads and stores are not volatile][1.8a].
6012 * [All types in `sync::mpsc` implement `fmt::Debug`][1.8mp].
6013
6014 Performance
6015 -----------
6016
6017 * [Inlining hash functions lead to a 3% compile-time improvement in
6018   some workloads][1.8h].
6019 * When using jemalloc, its symbols are [unprefixed so that it
6020   overrides the libc malloc implementation][1.8h]. This means that for
6021   rustc, LLVM is now using jemalloc, which results in a 6%
6022   compile-time improvement on a specific workload.
6023 * [Avoid quadratic growth in function size due to cleanups][1.8cu].
6024
6025 Misc
6026 ----
6027
6028 * [32-bit MSVC builds finally implement unwinding][1.8ms].
6029   i686-pc-windows-msvc is now considered a tier-1 platform.
6030 * [The `--print targets` flag prints a list of supported targets][1.8t].
6031 * [The `--print cfg` flag prints the `cfg`s defined for the current
6032   target][1.8cf].
6033 * [`rustc` can be built with an new Cargo-based build system, written
6034   in Rust][1.8b].  It will eventually replace Rust's Makefile-based
6035   build system. To enable it configure with `configure --rustbuild`.
6036 * [Errors for non-exhaustive `match` patterns now list up to 3 missing
6037   variants while also indicating the total number of missing variants
6038   if more than 3][1.8m].
6039 * [Executable stacks are disabled on Linux and BSD][1.8nx].
6040 * The Rust Project now publishes binary releases of the standard
6041   library for a number of tier-2 targets:
6042   `armv7-unknown-linux-gnueabihf`, `powerpc-unknown-linux-gnu`,
6043   `powerpc64-unknown-linux-gnu`, `powerpc64le-unknown-linux-gnu`
6044   `x86_64-rumprun-netbsd`. These can be installed with
6045   tools such as [multirust][1.8mr].
6046
6047 Cargo
6048 -----
6049
6050 * [`cargo init` creates a new Cargo project in the current
6051   directory][1.8ci].  It is otherwise like `cargo new`.
6052 * [Cargo has configuration keys for `-v` and
6053   `--color`][1.8cc]. `verbose` and `color`, respectively, go in the
6054   `[term]` section of `.cargo/config`.
6055 * [Configuration keys that evaluate to strings or integers can be set
6056   via environment variables][1.8ce]. For example the `build.jobs` key
6057   can be set via `CARGO_BUILD_JOBS`. Environment variables take
6058   precedence over config files.
6059 * [Target-specific dependencies support Rust `cfg` syntax for
6060   describing targets][1.8cfg] so that dependencies for multiple
6061   targets can be specified together. [RFC 1361].
6062 * [The environment variables `CARGO_TARGET_ROOT`, `RUSTC`, and
6063   `RUSTDOC` take precedence over the `build.target-dir`,
6064   `build.rustc`, and `build.rustdoc` configuration values][1.8cv].
6065 * [The child process tree is killed on Windows when Cargo is
6066   killed][1.8ck].
6067 * [The `build.target` configuration value sets the target platform,
6068   like `--target`][1.8ct].
6069
6070 Compatibility Notes
6071 -------------------
6072
6073 * [Unstable compiler flags have been further restricted][1.8u]. Since
6074   1.0 `-Z` flags have been considered unstable, and other flags that
6075   were considered unstable additionally required passing `-Z
6076   unstable-options` to access. Unlike unstable language and library
6077   features though, these options have been accessible on the stable
6078   release channel. Going forward, *new unstable flags will not be
6079   available on the stable release channel*, and old unstable flags
6080   will warn about their usage. In the future, all unstable flags will
6081   be unavailable on the stable release channel.
6082 * [It is no longer possible to `match` on empty enum variants using
6083   the `Variant(..)` syntax][1.8v]. This has been a warning since 1.6.
6084 * The Unix-specific `MetadataExt` traits, including
6085   `os::unix::fs::MetadataExt`, which expose values such as inode
6086   numbers [no longer return platform-specific types][1.8r], but
6087   instead return widened integers. [RFC 1415].
6088 * [Modules sourced from the filesystem cannot appear within arbitrary
6089   blocks, but only within other modules][1.8mf].
6090 * [`--cfg` compiler flags are parsed strictly as identifiers][1.8c].
6091 * On Unix, [stack overflow triggers a runtime abort instead of a
6092   SIGSEGV][1.8so].
6093 * [`Command::spawn` and its equivalents return an error if any of
6094   its command-line arguments contain interior `NUL`s][1.8n].
6095 * [Tuple and unit enum variants from other crates are in the type
6096   namespace][1.8tn].
6097 * [On Windows `rustc` emits `.lib` files for the `staticlib` library
6098   type instead of `.a` files][1.8st]. Additionally, for the MSVC
6099   toolchain, `rustc` emits import libraries named `foo.dll.lib`
6100   instead of `foo.lib`.
6101
6102
6103 [1.8a]: https://github.com/rust-lang/rust/pull/30962
6104 [1.8b]: https://github.com/rust-lang/rust/pull/31123
6105 [1.8c]: https://github.com/rust-lang/rust/pull/31530
6106 [1.8cc]: https://github.com/rust-lang/cargo/pull/2397
6107 [1.8ce]: https://github.com/rust-lang/cargo/pull/2398
6108 [1.8cf]: https://github.com/rust-lang/rust/pull/31278
6109 [1.8cfg]: https://github.com/rust-lang/cargo/pull/2328
6110 [1.8ci]: https://github.com/rust-lang/cargo/pull/2081
6111 [1.8ck]: https://github.com/rust-lang/cargo/pull/2370
6112 [1.8ct]: https://github.com/rust-lang/cargo/pull/2335
6113 [1.8cu]: https://github.com/rust-lang/rust/pull/31390
6114 [1.8cv]: https://github.com/rust-lang/cargo/issues/2365
6115 [1.8cv]: https://github.com/rust-lang/rust/pull/30998
6116 [1.8h]: https://github.com/rust-lang/rust/pull/31460
6117 [1.8l]: https://github.com/rust-lang/rust/pull/31668
6118 [1.8m]: https://github.com/rust-lang/rust/pull/31020
6119 [1.8mf]: https://github.com/rust-lang/rust/pull/31534
6120 [1.8mp]: https://github.com/rust-lang/rust/pull/30894
6121 [1.8mr]: https://users.rust-lang.org/t/multirust-0-8-with-cross-std-installation/4901
6122 [1.8ms]: https://github.com/rust-lang/rust/pull/30448
6123 [1.8n]: https://github.com/rust-lang/rust/pull/31056
6124 [1.8nx]: https://github.com/rust-lang/rust/pull/30859
6125 [1.8r]: https://github.com/rust-lang/rust/pull/31551
6126 [1.8so]: https://github.com/rust-lang/rust/pull/31333
6127 [1.8st]: https://github.com/rust-lang/rust/pull/29520
6128 [1.8t]: https://github.com/rust-lang/rust/pull/31358
6129 [1.8tn]: https://github.com/rust-lang/rust/pull/30882
6130 [1.8u]: https://github.com/rust-lang/rust/pull/31793
6131 [1.8v]: https://github.com/rust-lang/rust/pull/31757
6132 [1.8w]: https://github.com/rust-lang/rust/pull/31904
6133 [RFC 1361]: https://github.com/rust-lang/rfcs/blob/master/text/1361-cargo-cfg-dependencies.md
6134 [RFC 1415]: https://github.com/rust-lang/rfcs/blob/master/text/1415-trim-std-os.md
6135 [RFC 218]: https://github.com/rust-lang/rfcs/blob/master/text/0218-empty-struct-with-braces.md
6136 [RFC 953]: https://github.com/rust-lang/rfcs/blob/master/text/0953-op-assign.md
6137 [`AddAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.AddAssign.html
6138 [`BitAndAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.BitAndAssign.html
6139 [`BitOrAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.BitOrAssign.html
6140 [`BitXorAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.BitXorAssign.html
6141 [`DivAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.DivAssign.html
6142 [`Instant::duration_since`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html#method.duration_since
6143 [`Instant::elapsed`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html#method.elapsed
6144 [`Instant::now`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html#method.now
6145 [`MulAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.MulAssign.html
6146 [`Ref::map`]: http://doc.rust-lang.org/nightly/std/cell/struct.Ref.html#method.map
6147 [`RefMut::map`]: http://doc.rust-lang.org/nightly/std/cell/struct.RefMut.html#method.map
6148 [`RemAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.RemAssign.html
6149 [`ShlAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.ShlAssign.html
6150 [`ShrAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.ShrAssign.html
6151 [`SubAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.SubAssign.html
6152 [`SystemTime::duration_since`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html#method.duration_since
6153 [`SystemTime::elapsed`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html#method.elapsed
6154 [`SystemTime::now`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html#method.now
6155 [`SystemTimeError::duration`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTimeError.html#method.duration
6156 [`SystemTimeError`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTimeError.html
6157 [`UNIX_EPOCH`]: http://doc.rust-lang.org/nightly/std/time/constant.UNIX_EPOCH.html
6158 [`ptr::drop_in_place`]: http://doc.rust-lang.org/nightly/std/ptr/fn.drop_in_place.html
6159 [`str::EncodeUtf16`]: http://doc.rust-lang.org/nightly/std/str/struct.EncodeUtf16.html
6160 [`str::encode_utf16`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.encode_utf16
6161 [`time::Instant`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html
6162 [`time::SystemTime`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html
6163
6164
6165 Version 1.7.0 (2016-03-03)
6166 ==========================
6167
6168 Libraries
6169 ---------
6170
6171 * Stabilized APIs
6172   * `Path`
6173     * [`Path::strip_prefix`] (renamed from relative_from)
6174     * [`path::StripPrefixError`] (new error type returned from strip_prefix)
6175   * `Ipv4Addr`
6176     * [`Ipv4Addr::is_loopback`]
6177     * [`Ipv4Addr::is_private`]
6178     * [`Ipv4Addr::is_link_local`]
6179     * [`Ipv4Addr::is_multicast`]
6180     * [`Ipv4Addr::is_broadcast`]
6181     * [`Ipv4Addr::is_documentation`]
6182   * `Ipv6Addr`
6183     * [`Ipv6Addr::is_unspecified`]
6184     * [`Ipv6Addr::is_loopback`]
6185     * [`Ipv6Addr::is_multicast`]
6186   * `Vec`
6187     * [`Vec::as_slice`]
6188     * [`Vec::as_mut_slice`]
6189   * `String`
6190     * [`String::as_str`]
6191     * [`String::as_mut_str`]
6192   * Slices
6193     * `<[T]>::`[`clone_from_slice`], which now requires the two slices to
6194     be the same length
6195     * `<[T]>::`[`sort_by_key`]
6196   * checked, saturated, and overflowing operations
6197     * [`i32::checked_rem`], [`i32::checked_neg`], [`i32::checked_shl`], [`i32::checked_shr`]
6198     * [`i32::saturating_mul`]
6199     * [`i32::overflowing_add`], [`i32::overflowing_sub`], [`i32::overflowing_mul`], [`i32::overflowing_div`]
6200     * [`i32::overflowing_rem`], [`i32::overflowing_neg`], [`i32::overflowing_shl`], [`i32::overflowing_shr`]
6201     * [`u32::checked_rem`], [`u32::checked_neg`], [`u32::checked_shl`], [`u32::checked_shl`]
6202     * [`u32::saturating_mul`]
6203     * [`u32::overflowing_add`], [`u32::overflowing_sub`], [`u32::overflowing_mul`], [`u32::overflowing_div`]
6204     * [`u32::overflowing_rem`], [`u32::overflowing_neg`], [`u32::overflowing_shl`], [`u32::overflowing_shr`]
6205     * and checked, saturated, and overflowing operations for other primitive types
6206   * FFI
6207     * [`ffi::IntoStringError`]
6208     * [`CString::into_string`]
6209     * [`CString::into_bytes`]
6210     * [`CString::into_bytes_with_nul`]
6211     * `From<CString> for Vec<u8>`
6212   * `IntoStringError`
6213     * [`IntoStringError::into_cstring`]
6214     * [`IntoStringError::utf8_error`]
6215     * `Error for IntoStringError`
6216   * Hashing
6217     * [`std::hash::BuildHasher`]
6218     * [`BuildHasher::Hasher`]
6219     * [`BuildHasher::build_hasher`]
6220     * [`std::hash::BuildHasherDefault`]
6221     * [`HashMap::with_hasher`]
6222     * [`HashMap::with_capacity_and_hasher`]
6223     * [`HashSet::with_hasher`]
6224     * [`HashSet::with_capacity_and_hasher`]
6225     * [`std::collections::hash_map::RandomState`]
6226     * [`RandomState::new`]
6227 * [Validating UTF-8 is faster by a factor of between 7 and 14x for
6228   ASCII input][1.7utf8]. This means that creating `String`s and `str`s
6229   from bytes is faster.
6230 * [The performance of `LineWriter` (and thus `io::stdout`) was
6231   improved by using `memchr` to search for newlines][1.7m].
6232 * [`f32::to_degrees` and `f32::to_radians` are stable][1.7f]. The
6233   `f64` variants were stabilized previously.
6234 * [`BTreeMap` was rewritten to use less memory and improve the performance
6235   of insertion and iteration, the latter by as much as 5x][1.7bm].
6236 * [`BTreeSet` and its iterators, `Iter`, `IntoIter`, and `Range` are
6237   covariant over their contained type][1.7bt].
6238 * [`LinkedList` and its iterators, `Iter` and `IntoIter` are covariant
6239   over their contained type][1.7ll].
6240 * [`str::replace` now accepts a `Pattern`][1.7rp], like other string
6241   searching methods.
6242 * [`Any` is implemented for unsized types][1.7a].
6243 * [`Hash` is implemented for `Duration`][1.7h].
6244
6245 Misc
6246 ----
6247
6248 * [When running tests with `--test`, rustdoc will pass `--cfg`
6249   arguments to the compiler][1.7dt].
6250 * [The compiler is built with RPATH information by default][1.7rpa].
6251   This means that it will be possible to run `rustc` when installed in
6252   unusual configurations without configuring the dynamic linker search
6253   path explicitly.
6254 * [`rustc` passes `--enable-new-dtags` to GNU ld][1.7dta]. This makes
6255   any RPATH entries (emitted with `-C rpath`) *not* take precedence
6256   over `LD_LIBRARY_PATH`.
6257
6258 Cargo
6259 -----
6260
6261 * [`cargo rustc` accepts a `--profile` flag that runs `rustc` under
6262   any of the compilation profiles, 'dev', 'bench', or 'test'][1.7cp].
6263 * [The `rerun-if-changed` build script directive no longer causes the
6264   build script to incorrectly run twice in certain scenarios][1.7rr].
6265
6266 Compatibility Notes
6267 -------------------
6268
6269 * Soundness fixes to the interactions between associated types and
6270   lifetimes, specified in [RFC 1214], [now generate errors][1.7sf] for
6271   code that violates the new rules. This is a significant change that
6272   is known to break existing code, so it has emitted warnings for the
6273   new error cases since 1.4 to give crate authors time to adapt. The
6274   details of what is changing are subtle; read the RFC for more.
6275 * [Several bugs in the compiler's visibility calculations were
6276   fixed][1.7v]. Since this was found to break significant amounts of
6277   code, the new errors will be emitted as warnings for several release
6278   cycles, under the `private_in_public` lint.
6279 * Defaulted type parameters were accidentally accepted in positions
6280   that were not intended. In this release, [defaulted type parameters
6281   appearing outside of type definitions will generate a
6282   warning][1.7d], which will become an error in future releases.
6283 * [Parsing "." as a float results in an error instead of 0][1.7p].
6284   That is, `".".parse::<f32>()` returns `Err`, not `Ok(0.0)`.
6285 * [Borrows of closure parameters may not outlive the closure][1.7bc].
6286
6287 [1.7a]: https://github.com/rust-lang/rust/pull/30928
6288 [1.7bc]: https://github.com/rust-lang/rust/pull/30341
6289 [1.7bm]: https://github.com/rust-lang/rust/pull/30426
6290 [1.7bt]: https://github.com/rust-lang/rust/pull/30998
6291 [1.7cp]: https://github.com/rust-lang/cargo/pull/2224
6292 [1.7d]: https://github.com/rust-lang/rust/pull/30724
6293 [1.7dt]: https://github.com/rust-lang/rust/pull/30372
6294 [1.7dta]: https://github.com/rust-lang/rust/pull/30394
6295 [1.7f]: https://github.com/rust-lang/rust/pull/30672
6296 [1.7h]: https://github.com/rust-lang/rust/pull/30818
6297 [1.7ll]: https://github.com/rust-lang/rust/pull/30663
6298 [1.7m]: https://github.com/rust-lang/rust/pull/30381
6299 [1.7p]: https://github.com/rust-lang/rust/pull/30681
6300 [1.7rp]: https://github.com/rust-lang/rust/pull/29498
6301 [1.7rpa]: https://github.com/rust-lang/rust/pull/30353
6302 [1.7rr]: https://github.com/rust-lang/cargo/pull/2279
6303 [1.7sf]: https://github.com/rust-lang/rust/pull/30389
6304 [1.7utf8]: https://github.com/rust-lang/rust/pull/30740
6305 [1.7v]: https://github.com/rust-lang/rust/pull/29973
6306 [RFC 1214]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
6307 [`BuildHasher::Hasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hasher.html
6308 [`BuildHasher::build_hasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.BuildHasher.html#tymethod.build_hasher
6309 [`CString::into_bytes_with_nul`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_bytes_with_nul
6310 [`CString::into_bytes`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_bytes
6311 [`CString::into_string`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_string
6312 [`HashMap::with_capacity_and_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashMap.html#method.with_capacity_and_hasher
6313 [`HashMap::with_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashMap.html#method.with_hasher
6314 [`HashSet::with_capacity_and_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.with_capacity_and_hasher
6315 [`HashSet::with_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.with_hasher
6316 [`IntoStringError::into_cstring`]: http://doc.rust-lang.org/nightly/std/ffi/struct.IntoStringError.html#method.into_cstring
6317 [`IntoStringError::utf8_error`]: http://doc.rust-lang.org/nightly/std/ffi/struct.IntoStringError.html#method.utf8_error
6318 [`Ipv4Addr::is_broadcast`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_broadcast
6319 [`Ipv4Addr::is_documentation`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_documentation
6320 [`Ipv4Addr::is_link_local`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_link_local
6321 [`Ipv4Addr::is_loopback`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_loopback
6322 [`Ipv4Addr::is_multicast`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_multicast
6323 [`Ipv4Addr::is_private`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_private
6324 [`Ipv6Addr::is_loopback`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_loopback
6325 [`Ipv6Addr::is_multicast`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_multicast
6326 [`Ipv6Addr::is_unspecified`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_unspecified
6327 [`Path::strip_prefix`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.strip_prefix
6328 [`RandomState::new`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.RandomState.html#method.new
6329 [`String::as_mut_str`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.as_mut_str
6330 [`String::as_str`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.as_str
6331 [`Vec::as_mut_slice`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.as_mut_slice
6332 [`Vec::as_slice`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.as_slice
6333 [`clone_from_slice`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.clone_from_slice
6334 [`ffi::IntoStringError`]: http://doc.rust-lang.org/nightly/std/ffi/struct.IntoStringError.html
6335 [`i32::checked_neg`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_neg
6336 [`i32::checked_rem`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_rem
6337 [`i32::checked_shl`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_shl
6338 [`i32::checked_shr`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_shr
6339 [`i32::overflowing_add`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_add
6340 [`i32::overflowing_div`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_div
6341 [`i32::overflowing_mul`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_mul
6342 [`i32::overflowing_neg`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_neg
6343 [`i32::overflowing_rem`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_rem
6344 [`i32::overflowing_shl`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_shl
6345 [`i32::overflowing_shr`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_shr
6346 [`i32::overflowing_sub`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_sub
6347 [`i32::saturating_mul`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.saturating_mul
6348 [`path::StripPrefixError`]: http://doc.rust-lang.org/nightly/std/path/struct.StripPrefixError.html
6349 [`sort_by_key`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.sort_by_key
6350 [`std::collections::hash_map::RandomState`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.RandomState.html
6351 [`std::hash::BuildHasherDefault`]: http://doc.rust-lang.org/nightly/std/hash/struct.BuildHasherDefault.html
6352 [`std::hash::BuildHasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.BuildHasher.html
6353 [`u32::checked_neg`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_neg
6354 [`u32::checked_rem`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_rem
6355 [`u32::checked_neg`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_neg
6356 [`u32::checked_shl`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_shl
6357 [`u32::overflowing_add`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_add
6358 [`u32::overflowing_div`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_div
6359 [`u32::overflowing_mul`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_mul
6360 [`u32::overflowing_neg`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_neg
6361 [`u32::overflowing_rem`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_rem
6362 [`u32::overflowing_shl`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_shl
6363 [`u32::overflowing_shr`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_shr
6364 [`u32::overflowing_sub`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_sub
6365 [`u32::saturating_mul`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.saturating_mul
6366
6367
6368 Version 1.6.0 (2016-01-21)
6369 ==========================
6370
6371 Language
6372 --------
6373
6374 * The `#![no_std]` attribute causes a crate to not be linked to the
6375   standard library, but only the [core library][1.6co], as described
6376   in [RFC 1184]. The core library defines common types and traits but
6377   has no platform dependencies whatsoever, and is the basis for Rust
6378   software in environments that cannot support a full port of the
6379   standard library, such as operating systems. Most of the core
6380   library is now stable.
6381
6382 Libraries
6383 ---------
6384
6385 * Stabilized APIs:
6386   [`Read::read_exact`],
6387   [`ErrorKind::UnexpectedEof`] (renamed from `UnexpectedEOF`),
6388   [`fs::DirBuilder`], [`fs::DirBuilder::new`],
6389   [`fs::DirBuilder::recursive`], [`fs::DirBuilder::create`],
6390   [`os::unix::fs::DirBuilderExt`],
6391   [`os::unix::fs::DirBuilderExt::mode`], [`vec::Drain`],
6392   [`vec::Vec::drain`], [`string::Drain`], [`string::String::drain`],
6393   [`vec_deque::Drain`], [`vec_deque::VecDeque::drain`],
6394   [`collections::hash_map::Drain`],
6395   [`collections::hash_map::HashMap::drain`],
6396   [`collections::hash_set::Drain`],
6397   [`collections::hash_set::HashSet::drain`],
6398   [`collections::binary_heap::Drain`],
6399   [`collections::binary_heap::BinaryHeap::drain`],
6400   [`Vec::extend_from_slice`] (renamed from `push_all`),
6401   [`Mutex::get_mut`], [`Mutex::into_inner`], [`RwLock::get_mut`],
6402   [`RwLock::into_inner`],
6403   [`Iterator::min_by_key`] (renamed from `min_by`),
6404   [`Iterator::max_by_key`] (renamed from `max_by`).
6405 * The [core library][1.6co] is stable, as are most of its APIs.
6406 * [The `assert_eq!` macro supports arguments that don't implement
6407   `Sized`][1.6ae], such as arrays. In this way it behaves more like
6408   `assert!`.
6409 * Several timer functions that take duration in milliseconds [are
6410   deprecated in favor of those that take `Duration`][1.6ms]. These
6411   include `Condvar::wait_timeout_ms`, `thread::sleep_ms`, and
6412   `thread::park_timeout_ms`.
6413 * The algorithm by which `Vec` reserves additional elements was
6414   [tweaked to not allocate excessive space][1.6a] while still growing
6415   exponentially.
6416 * `From` conversions are [implemented from integers to floats][1.6f]
6417   in cases where the conversion is lossless. Thus they are not
6418   implemented for 32-bit ints to `f32`, nor for 64-bit ints to `f32`
6419   or `f64`. They are also not implemented for `isize` and `usize`
6420   because the implementations would be platform-specific. `From` is
6421   also implemented from `f32` to `f64`.
6422 * `From<&Path>` and `From<PathBuf>` are implemented for `Cow<Path>`.
6423 * `From<T>` is implemented for `Box<T>`, `Rc<T>` and `Arc<T>`.
6424 * `IntoIterator` is implemented for `&PathBuf` and `&Path`.
6425 * [`BinaryHeap` was refactored][1.6bh] for modest performance
6426   improvements.
6427 * Sorting slices that are already sorted [is 50% faster in some
6428   cases][1.6s].
6429
6430 Cargo
6431 -----
6432
6433 * Cargo will look in `$CARGO_HOME/bin` for subcommands [by default][1.6c].
6434 * Cargo build scripts can specify their dependencies by emitting the
6435   [`rerun-if-changed`][1.6rr] key.
6436 * crates.io will reject publication of crates with dependencies that
6437   have a wildcard version constraint. Crates with wildcard
6438   dependencies were seen to cause a variety of problems, as described
6439   in [RFC 1241]. Since 1.5 publication of such crates has emitted a
6440   warning.
6441 * `cargo clean` [accepts a `--release` flag][1.6cc] to clean the
6442   release folder.  A variety of artifacts that Cargo failed to clean
6443   are now correctly deleted.
6444
6445 Misc
6446 ----
6447
6448 * The `unreachable_code` lint [warns when a function call's argument
6449   diverges][1.6dv].
6450 * The parser indicates [failures that may be caused by
6451   confusingly-similar Unicode characters][1.6uc]
6452 * Certain macro errors [are reported at definition time][1.6m], not
6453   expansion.
6454
6455 Compatibility Notes
6456 -------------------
6457
6458 * The compiler no longer makes use of the [`RUST_PATH`][1.6rp]
6459   environment variable when locating crates. This was a pre-cargo
6460   feature for integrating with the package manager that was
6461   accidentally never removed.
6462 * [A number of bugs were fixed in the privacy checker][1.6p] that
6463   could cause previously-accepted code to break.
6464 * [Modules and unit/tuple structs may not share the same name][1.6ts].
6465 * [Bugs in pattern matching unit structs were fixed][1.6us]. The tuple
6466   struct pattern syntax (`Foo(..)`) can no longer be used to match
6467   unit structs. This is a warning now, but will become an error in
6468   future releases. Patterns that share the same name as a const are
6469   now an error.
6470 * A bug was fixed that causes [rustc not to apply default type
6471   parameters][1.6xc] when resolving certain method implementations of
6472   traits defined in other crates.
6473
6474 [1.6a]: https://github.com/rust-lang/rust/pull/29454
6475 [1.6ae]: https://github.com/rust-lang/rust/pull/29770
6476 [1.6bh]: https://github.com/rust-lang/rust/pull/29811
6477 [1.6c]: https://github.com/rust-lang/cargo/pull/2192
6478 [1.6cc]: https://github.com/rust-lang/cargo/pull/2131
6479 [1.6co]: http://doc.rust-lang.org/core/index.html
6480 [1.6dv]: https://github.com/rust-lang/rust/pull/30000
6481 [1.6f]: https://github.com/rust-lang/rust/pull/29129
6482 [1.6m]: https://github.com/rust-lang/rust/pull/29828
6483 [1.6ms]: https://github.com/rust-lang/rust/pull/29604
6484 [1.6p]: https://github.com/rust-lang/rust/pull/29726
6485 [1.6rp]: https://github.com/rust-lang/rust/pull/30034
6486 [1.6rr]: https://github.com/rust-lang/cargo/pull/2134
6487 [1.6s]: https://github.com/rust-lang/rust/pull/29675
6488 [1.6ts]: https://github.com/rust-lang/rust/issues/21546
6489 [1.6uc]: https://github.com/rust-lang/rust/pull/29837
6490 [1.6us]: https://github.com/rust-lang/rust/pull/29383
6491 [1.6xc]: https://github.com/rust-lang/rust/issues/30123
6492 [RFC 1184]: https://github.com/rust-lang/rfcs/blob/master/text/1184-stabilize-no_std.md
6493 [RFC 1241]: https://github.com/rust-lang/rfcs/blob/master/text/1241-no-wildcard-deps.md
6494 [`ErrorKind::UnexpectedEof`]: http://doc.rust-lang.org/nightly/std/io/enum.ErrorKind.html#variant.UnexpectedEof
6495 [`Iterator::max_by_key`]: http://doc.rust-lang.org/nightly/std/iter/trait.Iterator.html#method.max_by_key
6496 [`Iterator::min_by_key`]: http://doc.rust-lang.org/nightly/std/iter/trait.Iterator.html#method.min_by_key
6497 [`Mutex::get_mut`]: http://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html#method.get_mut
6498 [`Mutex::into_inner`]: http://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html#method.into_inner
6499 [`Read::read_exact`]: http://doc.rust-lang.org/nightly/std/io/trait.Read.html#method.read_exact
6500 [`RwLock::get_mut`]: http://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html#method.get_mut
6501 [`RwLock::into_inner`]: http://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html#method.into_inner
6502 [`Vec::extend_from_slice`]: http://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html#method.extend_from_slice
6503 [`collections::binary_heap::BinaryHeap::drain`]: http://doc.rust-lang.org/nightly/std/collections/binary_heap/struct.BinaryHeap.html#method.drain
6504 [`collections::binary_heap::Drain`]: http://doc.rust-lang.org/nightly/std/collections/binary_heap/struct.Drain.html
6505 [`collections::hash_map::Drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.Drain.html
6506 [`collections::hash_map::HashMap::drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.HashMap.html#method.drain
6507 [`collections::hash_set::Drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_set/struct.Drain.html
6508 [`collections::hash_set::HashSet::drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_set/struct.HashSet.html#method.drain
6509 [`fs::DirBuilder::create`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html#method.create
6510 [`fs::DirBuilder::new`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html#method.new
6511 [`fs::DirBuilder::recursive`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html#method.recursive
6512 [`fs::DirBuilder`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html
6513 [`os::unix::fs::DirBuilderExt::mode`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.DirBuilderExt.html#tymethod.mode
6514 [`os::unix::fs::DirBuilderExt`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.DirBuilderExt.html
6515 [`string::Drain`]: http://doc.rust-lang.org/nightly/std/string/struct.Drain.html
6516 [`string::String::drain`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.drain
6517 [`vec::Drain`]: http://doc.rust-lang.org/nightly/std/vec/struct.Drain.html
6518 [`vec::Vec::drain`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.drain
6519 [`vec_deque::Drain`]: http://doc.rust-lang.org/nightly/std/collections/vec_deque/struct.Drain.html
6520 [`vec_deque::VecDeque::drain`]: http://doc.rust-lang.org/nightly/std/collections/vec_deque/struct.VecDeque.html#method.drain
6521
6522
6523 Version 1.5.0 (2015-12-10)
6524 ==========================
6525
6526 * ~700 changes, numerous bugfixes
6527
6528 Highlights
6529 ----------
6530
6531 * Stabilized APIs:
6532   [`BinaryHeap::from`], [`BinaryHeap::into_sorted_vec`],
6533   [`BinaryHeap::into_vec`], [`Condvar::wait_timeout`],
6534   [`FileTypeExt::is_block_device`], [`FileTypeExt::is_char_device`],
6535   [`FileTypeExt::is_fifo`], [`FileTypeExt::is_socket`],
6536   [`FileTypeExt`], [`Formatter::alternate`], [`Formatter::fill`],
6537   [`Formatter::precision`], [`Formatter::sign_aware_zero_pad`],
6538   [`Formatter::sign_minus`], [`Formatter::sign_plus`],
6539   [`Formatter::width`], [`Iterator::cmp`], [`Iterator::eq`],
6540   [`Iterator::ge`], [`Iterator::gt`], [`Iterator::le`],
6541   [`Iterator::lt`], [`Iterator::ne`], [`Iterator::partial_cmp`],
6542   [`Path::canonicalize`], [`Path::exists`], [`Path::is_dir`],
6543   [`Path::is_file`], [`Path::metadata`], [`Path::read_dir`],
6544   [`Path::read_link`], [`Path::symlink_metadata`],
6545   [`Utf8Error::valid_up_to`], [`Vec::resize`],
6546   [`VecDeque::as_mut_slices`], [`VecDeque::as_slices`],
6547   [`VecDeque::insert`], [`VecDeque::shrink_to_fit`],
6548   [`VecDeque::swap_remove_back`], [`VecDeque::swap_remove_front`],
6549   [`slice::split_first_mut`], [`slice::split_first`],
6550   [`slice::split_last_mut`], [`slice::split_last`],
6551   [`char::from_u32_unchecked`], [`fs::canonicalize`],
6552   [`str::MatchIndices`], [`str::RMatchIndices`],
6553   [`str::match_indices`], [`str::rmatch_indices`],
6554   [`str::slice_mut_unchecked`], [`string::ParseError`].
6555 * Rust applications hosted on crates.io can be installed locally to
6556   `~/.cargo/bin` with the [`cargo install`] command. Among other
6557   things this makes it easier to augment Cargo with new subcommands:
6558   when a binary named e.g. `cargo-foo` is found in `$PATH` it can be
6559   invoked as `cargo foo`.
6560 * Crates with wildcard (`*`) dependencies will [emit warnings when
6561   published][1.5w]. In 1.6 it will no longer be possible to publish
6562   crates with wildcard dependencies.
6563
6564 Breaking Changes
6565 ----------------
6566
6567 * The rules determining when a particular lifetime must outlive
6568   a particular value (known as '[dropck]') have been [modified
6569   to not rely on parametricity][1.5p].
6570 * [Implementations of `AsRef` and `AsMut` were added to `Box`, `Rc`,
6571   and `Arc`][1.5a]. Because these smart pointer types implement
6572   `Deref`, this causes breakage in cases where the interior type
6573   contains methods of the same name.
6574 * [Correct a bug in Rc/Arc][1.5c] that caused [dropck] to be unaware
6575   that they could drop their content. Soundness fix.
6576 * All method invocations are [properly checked][1.5wf1] for
6577   [well-formedness][1.5wf2]. Soundness fix.
6578 * Traits whose supertraits contain `Self` are [not object
6579   safe][1.5o]. Soundness fix.
6580 * Target specifications support a [`no_default_libraries`][1.5nd]
6581   setting that controls whether `-nodefaultlibs` is passed to the
6582   linker, and in turn the `is_like_windows` setting no longer affects
6583   the `-nodefaultlibs` flag.
6584 * `#[derive(Show)]`, long-deprecated, [has been removed][1.5ds].
6585 * The `#[inline]` and `#[repr]` attributes [can only appear
6586   in valid locations][1.5at].
6587 * Native libraries linked from the local crate are [passed to
6588   the linker before native libraries from upstream crates][1.5nl].
6589 * Two rarely-used attributes, `#[no_debug]` and
6590   `#[omit_gdb_pretty_printer_section]` [are feature gated][1.5fg].
6591 * Negation of unsigned integers, which has been a warning for
6592   several releases, [is now behind a feature gate and will
6593   generate errors][1.5nu].
6594 * The parser accidentally accepted visibility modifiers on
6595   enum variants, a bug [which has been fixed][1.5ev].
6596 * [A bug was fixed that allowed `use` statements to import unstable
6597   features][1.5use].
6598
6599 Language
6600 --------
6601
6602 * When evaluating expressions at compile-time that are not
6603   compile-time constants (const-evaluating expressions in non-const
6604   contexts), incorrect code such as overlong bitshifts and arithmetic
6605   overflow will [generate a warning instead of an error][1.5ce],
6606   delaying the error until runtime. This will allow the
6607   const-evaluator to be expanded in the future backwards-compatibly.
6608 * The `improper_ctypes` lint [no longer warns about using `isize` and
6609   `usize` in FFI][1.5ict].
6610
6611 Libraries
6612 ---------
6613
6614 * `Arc<T>` and `Rc<T>` are [covariant with respect to `T` instead of
6615   invariant][1.5c].
6616 * `Default` is [implemented for mutable slices][1.5d].
6617 * `FromStr` is [implemented for `SockAddrV4` and `SockAddrV6`][1.5s].
6618 * There are now `From` conversions [between floating point
6619   types][1.5f] where the conversions are lossless.
6620 * There are now `From` conversions [between integer types][1.5i] where
6621   the conversions are lossless.
6622 * [`fs::Metadata` implements `Clone`][1.5fs].
6623 * The `parse` method [accepts a leading "+" when parsing
6624   integers][1.5pi].
6625 * [`AsMut` is implemented for `Vec`][1.5am].
6626 * The `clone_from` implementations for `String` and `BinaryHeap` [have
6627   been optimized][1.5cf] and no longer rely on the default impl.
6628 * The `extern "Rust"`, `extern "C"`, `unsafe extern "Rust"` and
6629   `unsafe extern "C"` function types now [implement `Clone`,
6630   `PartialEq`, `Eq`, `PartialOrd`, `Ord`, `Hash`, `fmt::Pointer`, and
6631   `fmt::Debug` for up to 12 arguments][1.5fp].
6632 * [Dropping `Vec`s is much faster in unoptimized builds when the
6633   element types don't implement `Drop`][1.5dv].
6634 * A bug that caused in incorrect behavior when [combining `VecDeque`
6635   with zero-sized types][1.5vdz] was resolved.
6636 * [`PartialOrd` for slices is faster][1.5po].
6637
6638 Miscellaneous
6639 -------------
6640
6641 * [Crate metadata size was reduced by 20%][1.5md].
6642 * [Improvements to code generation reduced the size of libcore by 3.3
6643   MB and rustc's memory usage by 18MB][1.5m].
6644 * [Improvements to deref translation increased performance in
6645   unoptimized builds][1.5dr].
6646 * Various errors in trait resolution [are deduplicated to only be
6647   reported once][1.5te].
6648 * Rust has preliminary [support for rumprun kernels][1.5rr].
6649 * Rust has preliminary [support for NetBSD on amd64][1.5na].
6650
6651 [1.5use]: https://github.com/rust-lang/rust/pull/28364
6652 [1.5po]: https://github.com/rust-lang/rust/pull/28436
6653 [1.5ev]: https://github.com/rust-lang/rust/pull/28442
6654 [1.5nu]: https://github.com/rust-lang/rust/pull/28468
6655 [1.5dr]: https://github.com/rust-lang/rust/pull/28491
6656 [1.5vdz]: https://github.com/rust-lang/rust/pull/28494
6657 [1.5md]: https://github.com/rust-lang/rust/pull/28521
6658 [1.5fg]: https://github.com/rust-lang/rust/pull/28522
6659 [1.5dv]: https://github.com/rust-lang/rust/pull/28531
6660 [1.5na]: https://github.com/rust-lang/rust/pull/28543
6661 [1.5fp]: https://github.com/rust-lang/rust/pull/28560
6662 [1.5rr]: https://github.com/rust-lang/rust/pull/28593
6663 [1.5cf]: https://github.com/rust-lang/rust/pull/28602
6664 [1.5nl]: https://github.com/rust-lang/rust/pull/28605
6665 [1.5te]: https://github.com/rust-lang/rust/pull/28645
6666 [1.5at]: https://github.com/rust-lang/rust/pull/28650
6667 [1.5am]: https://github.com/rust-lang/rust/pull/28663
6668 [1.5m]: https://github.com/rust-lang/rust/pull/28778
6669 [1.5ict]: https://github.com/rust-lang/rust/pull/28779
6670 [1.5a]: https://github.com/rust-lang/rust/pull/28811
6671 [1.5pi]: https://github.com/rust-lang/rust/pull/28826
6672 [1.5ce]: https://github.com/rust-lang/rfcs/blob/master/text/1229-compile-time-asserts.md
6673 [1.5p]: https://github.com/rust-lang/rfcs/blob/master/text/1238-nonparametric-dropck.md
6674 [1.5i]: https://github.com/rust-lang/rust/pull/28921
6675 [1.5fs]: https://github.com/rust-lang/rust/pull/29021
6676 [1.5f]: https://github.com/rust-lang/rust/pull/29129
6677 [1.5ds]: https://github.com/rust-lang/rust/pull/29148
6678 [1.5s]: https://github.com/rust-lang/rust/pull/29190
6679 [1.5d]: https://github.com/rust-lang/rust/pull/29245
6680 [1.5o]: https://github.com/rust-lang/rust/pull/29259
6681 [1.5nd]: https://github.com/rust-lang/rust/pull/28578
6682 [1.5wf2]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
6683 [1.5wf1]: https://github.com/rust-lang/rust/pull/28669
6684 [dropck]: https://doc.rust-lang.org/nightly/nomicon/dropck.html
6685 [1.5c]: https://github.com/rust-lang/rust/pull/29110
6686 [1.5w]: https://github.com/rust-lang/rfcs/blob/master/text/1241-no-wildcard-deps.md
6687 [`cargo install`]: https://github.com/rust-lang/rfcs/blob/master/text/1200-cargo-install.md
6688 [`BinaryHeap::from`]: http://doc.rust-lang.org/nightly/std/convert/trait.From.html#method.from
6689 [`BinaryHeap::into_sorted_vec`]: http://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html#method.into_sorted_vec
6690 [`BinaryHeap::into_vec`]: http://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html#method.into_vec
6691 [`Condvar::wait_timeout`]: http://doc.rust-lang.org/nightly/std/sync/struct.Condvar.html#method.wait_timeout
6692 [`FileTypeExt::is_block_device`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_block_device
6693 [`FileTypeExt::is_char_device`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_char_device
6694 [`FileTypeExt::is_fifo`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_fifo
6695 [`FileTypeExt::is_socket`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_socket
6696 [`FileTypeExt`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html
6697 [`Formatter::alternate`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.alternate
6698 [`Formatter::fill`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.fill
6699 [`Formatter::precision`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.precision
6700 [`Formatter::sign_aware_zero_pad`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.sign_aware_zero_pad
6701 [`Formatter::sign_minus`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.sign_minus
6702 [`Formatter::sign_plus`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.sign_plus
6703 [`Formatter::width`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.width
6704 [`Iterator::cmp`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.cmp
6705 [`Iterator::eq`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.eq
6706 [`Iterator::ge`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.ge
6707 [`Iterator::gt`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.gt
6708 [`Iterator::le`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.le
6709 [`Iterator::lt`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.lt
6710 [`Iterator::ne`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.ne
6711 [`Iterator::partial_cmp`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.partial_cmp
6712 [`Path::canonicalize`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.canonicalize
6713 [`Path::exists`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.exists
6714 [`Path::is_dir`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.is_dir
6715 [`Path::is_file`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.is_file
6716 [`Path::metadata`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.metadata
6717 [`Path::read_dir`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.read_dir
6718 [`Path::read_link`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.read_link
6719 [`Path::symlink_metadata`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.symlink_metadata
6720 [`Utf8Error::valid_up_to`]: http://doc.rust-lang.org/nightly/core/str/struct.Utf8Error.html#method.valid_up_to
6721 [`Vec::resize`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.resize
6722 [`VecDeque::as_mut_slices`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.as_mut_slices
6723 [`VecDeque::as_slices`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.as_slices
6724 [`VecDeque::insert`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.insert
6725 [`VecDeque::shrink_to_fit`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.shrink_to_fit
6726 [`VecDeque::swap_remove_back`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.swap_remove_back
6727 [`VecDeque::swap_remove_front`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.swap_remove_front
6728 [`slice::split_first_mut`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_first_mut
6729 [`slice::split_first`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_first
6730 [`slice::split_last_mut`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_last_mut
6731 [`slice::split_last`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_last
6732 [`char::from_u32_unchecked`]: http://doc.rust-lang.org/nightly/std/char/fn.from_u32_unchecked.html
6733 [`fs::canonicalize`]: http://doc.rust-lang.org/nightly/std/fs/fn.canonicalize.html
6734 [`str::MatchIndices`]: http://doc.rust-lang.org/nightly/std/str/struct.MatchIndices.html
6735 [`str::RMatchIndices`]: http://doc.rust-lang.org/nightly/std/str/struct.RMatchIndices.html
6736 [`str::match_indices`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.match_indices
6737 [`str::rmatch_indices`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.rmatch_indices
6738 [`str::slice_mut_unchecked`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.slice_mut_unchecked
6739 [`string::ParseError`]: http://doc.rust-lang.org/nightly/std/string/enum.ParseError.html
6740
6741 Version 1.4.0 (2015-10-29)
6742 ==========================
6743
6744 * ~1200 changes, numerous bugfixes
6745
6746 Highlights
6747 ----------
6748
6749 * Windows builds targeting the 64-bit MSVC ABI and linker (instead of
6750   GNU) are now supported and recommended for use.
6751
6752 Breaking Changes
6753 ----------------
6754
6755 * [Several changes have been made to fix type soundness and improve
6756   the behavior of associated types][sound]. See [RFC 1214]. Although
6757   we have mostly introduced these changes as warnings this release, to
6758   become errors next release, there are still some scenarios that will
6759   see immediate breakage.
6760 * [The `str::lines` and `BufRead::lines` iterators treat `\r\n` as
6761   line breaks in addition to `\n`][crlf].
6762 * [Loans of `'static` lifetime extend to the end of a function][stat].
6763 * [`str::parse` no longer introduces avoidable rounding error when
6764   parsing floating point numbers. Together with earlier changes to
6765   float formatting/output, "round trips" like f.to_string().parse()
6766   now preserve the value of f exactly. Additionally, leading plus
6767   signs are now accepted][fp3].
6768
6769
6770 Language
6771 --------
6772
6773 * `use` statements that import multiple items [can now rename
6774   them][i], as in `use foo::{bar as kitten, baz as puppy}`.
6775 * [Binops work correctly on fat pointers][binfat].
6776 * `pub extern crate`, which does not behave as expected, [issues a
6777   warning][pec] until a better solution is found.
6778
6779 Libraries
6780 ---------
6781
6782 * [Many APIs were stabilized][stab]: `<Box<str>>::into_string`,
6783   [`Arc::downgrade`], [`Arc::get_mut`], [`Arc::make_mut`],
6784   [`Arc::try_unwrap`], [`Box::from_raw`], [`Box::into_raw`], [`CStr::to_str`],
6785   [`CStr::to_string_lossy`], [`CString::from_raw`], [`CString::into_raw`],
6786   [`IntoRawFd::into_raw_fd`], [`IntoRawFd`],
6787   `IntoRawHandle::into_raw_handle`, `IntoRawHandle`,
6788   `IntoRawSocket::into_raw_socket`, `IntoRawSocket`, [`Rc::downgrade`],
6789   [`Rc::get_mut`], [`Rc::make_mut`], [`Rc::try_unwrap`], [`Result::expect`],
6790   [`String::into_boxed_str`], [`TcpStream::read_timeout`],
6791   [`TcpStream::set_read_timeout`], [`TcpStream::set_write_timeout`],
6792   [`TcpStream::write_timeout`], [`UdpSocket::read_timeout`],
6793   [`UdpSocket::set_read_timeout`], [`UdpSocket::set_write_timeout`],
6794   [`UdpSocket::write_timeout`], `Vec::append`, `Vec::split_off`,
6795   [`VecDeque::append`], [`VecDeque::retain`], [`VecDeque::split_off`],
6796   [`rc::Weak::upgrade`], [`rc::Weak`], [`slice::Iter::as_slice`],
6797   [`slice::IterMut::into_slice`], [`str::CharIndices::as_str`],
6798   [`str::Chars::as_str`], [`str::split_at_mut`], [`str::split_at`],
6799   [`sync::Weak::upgrade`], [`sync::Weak`], [`thread::park_timeout`],
6800   [`thread::sleep`].
6801 * [Some APIs were deprecated][dep]: `BTreeMap::with_b`,
6802   `BTreeSet::with_b`, `Option::as_mut_slice`, `Option::as_slice`,
6803   `Result::as_mut_slice`, `Result::as_slice`, `f32::from_str_radix`,
6804   `f64::from_str_radix`.
6805 * [Reverse-searching strings is faster with the 'two-way'
6806   algorithm][s].
6807 * [`std::io::copy` allows `?Sized` arguments][cc].
6808 * The `Windows`, `Chunks`, and `ChunksMut` iterators over slices all
6809   [override `count`, `nth` and `last` with an O(1)
6810   implementation][it].
6811 * [`Default` is implemented for arrays up to `[T; 32]`][d].
6812 * [`IntoRawFd` has been added to the Unix-specific prelude,
6813   `IntoRawSocket` and `IntoRawHandle` to the Windows-specific
6814   prelude][pr].
6815 * [`Extend<String>` and `FromIterator<String` are both implemented for
6816   `String`][es].
6817 * [`IntoIterator` is implemented for references to `Option` and
6818   `Result`][into2].
6819 * [`HashMap` and `HashSet` implement `Extend<&T>` where `T:
6820   Copy`][ext] as part of [RFC 839]. This will cause type inference
6821   breakage in rare situations.
6822 * [`BinaryHeap` implements `Debug`][bh2].
6823 * [`Borrow` and `BorrowMut` are implemented for fixed-size
6824   arrays][bm].
6825 * [`extern fn`s with the "Rust" and "C" ABIs implement common
6826   traits including `Eq`, `Ord`, `Debug`, `Hash`][fp].
6827 * [String comparison is faster][faststr].
6828 * `&mut T` where `T: std::fmt::Write` [also implements
6829   `std::fmt::Write`][mutw].
6830 * [A stable regression in `VecDeque::push_back` and other
6831   capacity-altering methods that caused panics for zero-sized types
6832   was fixed][vd].
6833 * [Function pointers implement traits for up to 12 parameters][fp2].
6834
6835 Miscellaneous
6836 -------------
6837
6838 * The compiler [no longer uses the 'morestack' feature to prevent
6839   stack overflow][mm]. Instead it uses guard pages and stack
6840   probes (though stack probes are not yet implemented on any platform
6841   but Windows).
6842 * [The compiler matches traits faster when projections are involved][p].
6843 * The 'improper_ctypes' lint [no longer warns about use of `isize` and
6844   `usize`][ffi].
6845 * [Cargo now displays useful information about what its doing during
6846   `cargo update`][cu].
6847
6848 [`Arc::downgrade`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.downgrade
6849 [`Arc::make_mut`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.make_mut
6850 [`Arc::get_mut`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.get_mut
6851 [`Arc::try_unwrap`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.try_unwrap
6852 [`Box::from_raw`]: http://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html#method.from_raw
6853 [`Box::into_raw`]: http://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html#method.into_raw
6854 [`CStr::to_str`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html#method.to_str
6855 [`CStr::to_string_lossy`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html#method.to_string_lossy
6856 [`CString::from_raw`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.from_raw
6857 [`CString::into_raw`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_raw
6858 [`IntoRawFd::into_raw_fd`]: http://doc.rust-lang.org/nightly/std/os/unix/io/trait.IntoRawFd.html#tymethod.into_raw_fd
6859 [`IntoRawFd`]: http://doc.rust-lang.org/nightly/std/os/unix/io/trait.IntoRawFd.html
6860 [`Rc::downgrade`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.downgrade
6861 [`Rc::get_mut`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.get_mut
6862 [`Rc::make_mut`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.make_mut
6863 [`Rc::try_unwrap`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.try_unwrap
6864 [`Result::expect`]: http://doc.rust-lang.org/nightly/core/result/enum.Result.html#method.expect
6865 [`String::into_boxed_str`]: http://doc.rust-lang.org/nightly/collections/string/struct.String.html#method.into_boxed_str
6866 [`TcpStream::read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.read_timeout
6867 [`TcpStream::set_read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_read_timeout
6868 [`TcpStream::write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.write_timeout
6869 [`TcpStream::set_write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_write_timeout
6870 [`UdpSocket::read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.read_timeout
6871 [`UdpSocket::set_read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_read_timeout
6872 [`UdpSocket::write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.write_timeout
6873 [`UdpSocket::set_write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_write_timeout
6874 [`VecDeque::append`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.append
6875 [`VecDeque::retain`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.retain
6876 [`VecDeque::split_off`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.split_off
6877 [`rc::Weak::upgrade`]: http://doc.rust-lang.org/nightly/std/rc/struct.Weak.html#method.upgrade
6878 [`rc::Weak`]: http://doc.rust-lang.org/nightly/std/rc/struct.Weak.html
6879 [`slice::Iter::as_slice`]: http://doc.rust-lang.org/nightly/std/slice/struct.Iter.html#method.as_slice
6880 [`slice::IterMut::into_slice`]: http://doc.rust-lang.org/nightly/std/slice/struct.IterMut.html#method.into_slice
6881 [`str::CharIndices::as_str`]: http://doc.rust-lang.org/nightly/std/str/struct.CharIndices.html#method.as_str
6882 [`str::Chars::as_str`]: http://doc.rust-lang.org/nightly/std/str/struct.Chars.html#method.as_str
6883 [`str::split_at_mut`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_at_mut
6884 [`str::split_at`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_at
6885 [`sync::Weak::upgrade`]: http://doc.rust-lang.org/nightly/std/sync/struct.Weak.html#method.upgrade
6886 [`sync::Weak`]: http://doc.rust-lang.org/nightly/std/sync/struct.Weak.html
6887 [`thread::park_timeout`]: http://doc.rust-lang.org/nightly/std/thread/fn.park_timeout.html
6888 [`thread::sleep`]: http://doc.rust-lang.org/nightly/std/thread/fn.sleep.html
6889 [bh2]: https://github.com/rust-lang/rust/pull/28156
6890 [binfat]: https://github.com/rust-lang/rust/pull/28270
6891 [bm]: https://github.com/rust-lang/rust/pull/28197
6892 [cc]: https://github.com/rust-lang/rust/pull/27531
6893 [crlf]: https://github.com/rust-lang/rust/pull/28034
6894 [cu]: https://github.com/rust-lang/cargo/pull/1931
6895 [d]: https://github.com/rust-lang/rust/pull/27825
6896 [dep]: https://github.com/rust-lang/rust/pull/28339
6897 [es]: https://github.com/rust-lang/rust/pull/27956
6898 [ext]: https://github.com/rust-lang/rust/pull/28094
6899 [faststr]: https://github.com/rust-lang/rust/pull/28338
6900 [ffi]: https://github.com/rust-lang/rust/pull/28779
6901 [fp]: https://github.com/rust-lang/rust/pull/28268
6902 [fp2]: https://github.com/rust-lang/rust/pull/28560
6903 [fp3]: https://github.com/rust-lang/rust/pull/27307
6904 [i]: https://github.com/rust-lang/rust/pull/27451
6905 [into2]: https://github.com/rust-lang/rust/pull/28039
6906 [it]: https://github.com/rust-lang/rust/pull/27652
6907 [mm]: https://github.com/rust-lang/rust/pull/27338
6908 [mutw]: https://github.com/rust-lang/rust/pull/28368
6909 [sound]: https://github.com/rust-lang/rust/pull/27641
6910 [p]: https://github.com/rust-lang/rust/pull/27866
6911 [pec]: https://github.com/rust-lang/rust/pull/28486
6912 [pr]: https://github.com/rust-lang/rust/pull/27896
6913 [RFC 839]: https://github.com/rust-lang/rfcs/blob/master/text/0839-embrace-extend-extinguish.md
6914 [RFC 1214]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
6915 [s]: https://github.com/rust-lang/rust/pull/27474
6916 [stab]: https://github.com/rust-lang/rust/pull/28339
6917 [stat]: https://github.com/rust-lang/rust/pull/28321
6918 [vd]: https://github.com/rust-lang/rust/pull/28494
6919
6920 Version 1.3.0 (2015-09-17)
6921 ==============================
6922
6923 * ~900 changes, numerous bugfixes
6924
6925 Highlights
6926 ----------
6927
6928 * The [new object lifetime defaults][nold] have been [turned
6929   on][nold2] after a cycle of warnings about the change. Now types
6930   like `&'a Box<Trait>` (or `&'a Rc<Trait>`, etc) will change from
6931   being interpreted as `&'a Box<Trait+'a>` to `&'a
6932   Box<Trait+'static>`.
6933 * [The Rustonomicon][nom] is a new book in the official documentation
6934   that dives into writing unsafe Rust.
6935 * The [`Duration`] API, [has been stabilized][ds]. This basic unit of
6936   timekeeping is employed by other std APIs, as well as out-of-tree
6937   time crates.
6938
6939 Breaking Changes
6940 ----------------
6941
6942 * The [new object lifetime defaults][nold] have been [turned
6943   on][nold2] after a cycle of warnings about the change.
6944 * There is a known [regression][lr] in how object lifetime elision is
6945   interpreted, the proper solution for which is undetermined.
6946 * The `#[prelude_import]` attribute, an internal implementation
6947   detail, was accidentally stabilized previously. [It has been put
6948   behind the `prelude_import` feature gate][pi]. This change is
6949   believed to break no existing code.
6950 * The behavior of [`size_of_val`][dst1] and [`align_of_val`][dst2] is
6951   [more sane for dynamically sized types][dst3]. Code that relied on
6952   the previous behavior is thought to be broken.
6953 * The `dropck` rules, which checks that destructors can't access
6954   destroyed values, [have been updated][dropck] to match the
6955   [RFC][dropckrfc]. This fixes some soundness holes, and as such will
6956   cause some previously-compiling code to no longer build.
6957
6958 Language
6959 --------
6960
6961 * The [new object lifetime defaults][nold] have been [turned
6962   on][nold2] after a cycle of warnings about the change.
6963 * Semicolons may [now follow types and paths in
6964   macros](https://github.com/rust-lang/rust/pull/27000).
6965 * The behavior of [`size_of_val`][dst1] and [`align_of_val`][dst2] is
6966   [more sane for dynamically sized types][dst3]. Code that relied on
6967   the previous behavior is not known to exist, and suspected to be
6968   broken.
6969 * `'static` variables [may now be recursive][st].
6970 * `ref` bindings choose between [`Deref`] and [`DerefMut`]
6971   implementations correctly.
6972 * The `dropck` rules, which checks that destructors can't access
6973   destroyed values, [have been updated][dropck] to match the
6974   [RFC][dropckrfc].
6975
6976 Libraries
6977 ---------
6978
6979 * The [`Duration`] API, [has been stabilized][ds], as well as the
6980   `std::time` module, which presently contains only `Duration`.
6981 * `Box<str>` and `Box<[T]>` both implement `Clone`.
6982 * The owned C string, [`CString`], implements [`Borrow`] and the
6983   borrowed C string, [`CStr`], implements [`ToOwned`]. The two of
6984   these allow C strings to be borrowed and cloned in generic code.
6985 * [`CStr`] implements [`Debug`].
6986 * [`AtomicPtr`] implements [`Debug`].
6987 * [`Error`] trait objects [can be downcast to their concrete types][e]
6988   in many common configurations, using the [`is`], [`downcast`],
6989   [`downcast_ref`] and [`downcast_mut`] methods, similarly to the
6990   [`Any`] trait.
6991 * Searching for substrings now [employs the two-way algorithm][search]
6992   instead of doing a naive search. This gives major speedups to a
6993   number of methods, including [`contains`][sc], [`find`][sf],
6994   [`rfind`][srf], [`split`][ss]. [`starts_with`][ssw] and
6995   [`ends_with`][sew] are also faster.
6996 * The performance of `PartialEq` for slices is [much faster][ps].
6997 * The [`Hash`] trait offers the default method, [`hash_slice`], which
6998   is overridden and optimized by the implementations for scalars.
6999 * The [`Hasher`] trait now has a number of specialized `write_*`
7000   methods for primitive types, for efficiency.
7001 * The I/O-specific error type, [`std::io::Error`][ie], gained a set of
7002   methods for accessing the 'inner error', if any: [`get_ref`][iegr],
7003   [`get_mut`][iegm], [`into_inner`][ieii]. As well, the implementation
7004   of [`std::error::Error::cause`][iec] also delegates to the inner
7005   error.
7006 * [`process::Child`][pc] gained the [`id`] method, which returns a
7007   `u32` representing the platform-specific process identifier.
7008 * The [`connect`] method on slices is deprecated, replaced by the new
7009   [`join`] method (note that both of these are on the *unstable*
7010   [`SliceConcatExt`] trait, but through the magic of the prelude are
7011   available to stable code anyway).
7012 * The [`Div`] operator is implemented for [`Wrapping`] types.
7013 * [`DerefMut` is implemented for `String`][dms].
7014 * Performance of SipHash (the default hasher for `HashMap`) is
7015   [better for long data][sh].
7016 * [`AtomicPtr`] implements [`Send`].
7017 * The [`read_to_end`] implementations for [`Stdin`] and [`File`]
7018   are now [specialized to use uninitialized buffers for increased
7019   performance][rte].
7020 * Lifetime parameters of foreign functions [are now resolved
7021   properly][f].
7022
7023 Misc
7024 ----
7025
7026 * Rust can now, with some coercion, [produce programs that run on
7027   Windows XP][xp], though XP is not considered a supported platform.
7028 * Porting Rust on Windows from the GNU toolchain to MSVC continues
7029   ([1][win1], [2][win2], [3][win3], [4][win4]). It is still not
7030   recommended for use in 1.3, though should be fully-functional
7031   in the [64-bit 1.4 beta][b14].
7032 * On Fedora-based systems installation will [properly configure the
7033   dynamic linker][fl].
7034 * The compiler gained many new extended error descriptions, which can
7035   be accessed with the `--explain` flag.
7036 * The `dropck` pass, which checks that destructors can't access
7037   destroyed values, [has been rewritten][dropck]. This fixes some
7038   soundness holes, and as such will cause some previously-compiling
7039   code to no longer build.
7040 * `rustc` now uses [LLVM to write archive files where possible][ar].
7041   Eventually this will eliminate the compiler's dependency on the ar
7042   utility.
7043 * Rust has [preliminary support for i686 FreeBSD][fb] (it has long
7044   supported FreeBSD on x86_64).
7045 * The [`unused_mut`][lum], [`unconditional_recursion`][lur],
7046   [`improper_ctypes`][lic], and [`negate_unsigned`][lnu] lints are
7047   more strict.
7048 * If landing pads are disabled (with `-Z no-landing-pads`), [`panic!`
7049   will kill the process instead of leaking][nlp].
7050
7051 [`Any`]: http://doc.rust-lang.org/nightly/std/any/trait.Any.html
7052 [`AtomicPtr`]: http://doc.rust-lang.org/nightly/std/sync/atomic/struct.AtomicPtr.html
7053 [`Borrow`]: http://doc.rust-lang.org/nightly/std/borrow/trait.Borrow.html
7054 [`CStr`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html
7055 [`CString`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html
7056 [`Debug`]: http://doc.rust-lang.org/nightly/std/fmt/trait.Debug.html
7057 [`DerefMut`]: http://doc.rust-lang.org/nightly/std/ops/trait.DerefMut.html
7058 [`Deref`]: http://doc.rust-lang.org/nightly/std/ops/trait.Deref.html
7059 [`Div`]: http://doc.rust-lang.org/nightly/std/ops/trait.Div.html
7060 [`Duration`]: http://doc.rust-lang.org/nightly/std/time/struct.Duration.html
7061 [`Error`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html
7062 [`File`]: http://doc.rust-lang.org/nightly/std/fs/struct.File.html
7063 [`Hash`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html
7064 [`Hasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hasher.html
7065 [`Send`]: http://doc.rust-lang.org/nightly/std/marker/trait.Send.html
7066 [`SliceConcatExt`]: http://doc.rust-lang.org/nightly/std/slice/trait.SliceConcatExt.html
7067 [`Stdin`]: http://doc.rust-lang.org/nightly/std/io/struct.Stdin.html
7068 [`ToOwned`]: http://doc.rust-lang.org/nightly/std/borrow/trait.ToOwned.html
7069 [`Wrapping`]: http://doc.rust-lang.org/nightly/std/num/struct.Wrapping.html
7070 [`connect`]: http://doc.rust-lang.org/nightly/std/slice/trait.SliceConcatExt.html#method.connect
7071 [`downcast_mut`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.downcast_mut
7072 [`downcast_ref`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.downcast_ref
7073 [`downcast`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.downcast
7074 [`hash_slice`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html#method.hash_slice
7075 [`id`]: http://doc.rust-lang.org/nightly/std/process/struct.Child.html#method.id
7076 [`is`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.is
7077 [`join`]: http://doc.rust-lang.org/nightly/std/slice/trait.SliceConcatExt.html#method.join
7078 [`read_to_end`]: http://doc.rust-lang.org/nightly/std/io/trait.Read.html#method.read_to_end
7079 [ar]: https://github.com/rust-lang/rust/pull/26926
7080 [b14]: https://static.rust-lang.org/dist/rust-beta-x86_64-pc-windows-msvc.msi
7081 [dms]: https://github.com/rust-lang/rust/pull/26241
7082 [dropck]: https://github.com/rust-lang/rust/pull/27261
7083 [dropckrfc]: https://github.com/rust-lang/rfcs/blob/master/text/0769-sound-generic-drop.md
7084 [ds]: https://github.com/rust-lang/rust/pull/26818
7085 [dst1]: http://doc.rust-lang.org/nightly/std/mem/fn.size_of_val.html
7086 [dst2]: http://doc.rust-lang.org/nightly/std/mem/fn.align_of_val.html
7087 [dst3]: https://github.com/rust-lang/rust/pull/27351
7088 [e]: https://github.com/rust-lang/rust/pull/24793
7089 [f]: https://github.com/rust-lang/rust/pull/26588
7090 [fb]: https://github.com/rust-lang/rust/pull/26959
7091 [fl]: https://github.com/rust-lang/rust-installer/pull/41
7092 [hs]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html#method.hash_slice
7093 [ie]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html
7094 [iec]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.cause
7095 [iegm]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.get_mut
7096 [iegr]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.get_ref
7097 [ieii]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.into_inner
7098 [lic]: https://github.com/rust-lang/rust/pull/26583
7099 [lnu]: https://github.com/rust-lang/rust/pull/27026
7100 [lr]: https://github.com/rust-lang/rust/issues/27248
7101 [lum]: https://github.com/rust-lang/rust/pull/26378
7102 [lur]: https://github.com/rust-lang/rust/pull/26783
7103 [nlp]: https://github.com/rust-lang/rust/pull/27176
7104 [nold2]: https://github.com/rust-lang/rust/pull/27045
7105 [nold]: https://github.com/rust-lang/rfcs/blob/master/text/1156-adjust-default-object-bounds.md
7106 [nom]: http://doc.rust-lang.org/nightly/nomicon/
7107 [pc]: http://doc.rust-lang.org/nightly/std/process/struct.Child.html
7108 [pi]: https://github.com/rust-lang/rust/pull/26699
7109 [ps]: https://github.com/rust-lang/rust/pull/26884
7110 [rte]: https://github.com/rust-lang/rust/pull/26950
7111 [sc]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.contains
7112 [search]: https://github.com/rust-lang/rust/pull/26327
7113 [sew]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.ends_with
7114 [sf]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.find
7115 [sh]: https://github.com/rust-lang/rust/pull/27280
7116 [srf]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.rfind
7117 [ss]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split
7118 [ssw]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.starts_with
7119 [st]: https://github.com/rust-lang/rust/pull/26630
7120 [win1]: https://github.com/rust-lang/rust/pull/26569
7121 [win2]: https://github.com/rust-lang/rust/pull/26741
7122 [win3]: https://github.com/rust-lang/rust/pull/26741
7123 [win4]: https://github.com/rust-lang/rust/pull/27210
7124 [xp]: https://github.com/rust-lang/rust/pull/26569
7125
7126 Version 1.2.0 (2015-08-07)
7127 ==========================
7128
7129 * ~1200 changes, numerous bugfixes
7130
7131 Highlights
7132 ----------
7133
7134 * [Dynamically-sized-type coercions][dst] allow smart pointer types
7135   like `Rc` to contain types without a fixed size, arrays and trait
7136   objects, finally enabling use of `Rc<[T]>` and completing the
7137   implementation of DST.
7138 * [Parallel codegen][parcodegen] is now working again, which can
7139   substantially speed up large builds in debug mode; It also gets
7140   another ~33% speedup when bootstrapping on a 4 core machine (using 8
7141   jobs). It's not enabled by default, but will be "in the near
7142   future". It can be activated with the `-C codegen-units=N` flag to
7143   `rustc`.
7144 * This is the first release with [experimental support for linking
7145   with the MSVC linker and lib C on Windows (instead of using the GNU
7146   variants via MinGW)][win]. It is yet recommended only for the most
7147   intrepid Rustaceans.
7148 * Benchmark compilations are showing a 30% improvement in
7149   bootstrapping over 1.1.
7150
7151 Breaking Changes
7152 ----------------
7153
7154 * The [`to_uppercase`] and [`to_lowercase`] methods on `char` now do
7155   unicode case mapping, which is a previously-planned change in
7156   behavior and considered a bugfix.
7157 * [`mem::align_of`] now specifies [the *minimum alignment* for
7158   T][align], which is usually the alignment programs are interested
7159   in, and the same value reported by clang's
7160   `alignof`. [`mem::min_align_of`] is deprecated. This is not known to
7161   break real code.
7162 * [The `#[packed]` attribute is no longer silently accepted by the
7163   compiler][packed]. This attribute did nothing and code that
7164   mentioned it likely did not work as intended.
7165 * Associated type defaults are [now behind the
7166   `associated_type_defaults` feature gate][ad]. In 1.1 associated type
7167   defaults *did not work*, but could be mentioned syntactically. As
7168   such this breakage has minimal impact.
7169
7170 Language
7171 --------
7172
7173 * Patterns with `ref mut` now correctly invoke [`DerefMut`] when
7174   matching against dereferenceable values.
7175
7176 Libraries
7177 ---------
7178
7179 * The [`Extend`] trait, which grows a collection from an iterator, is
7180   implemented over iterators of references, for `String`, `Vec`,
7181   `LinkedList`, `VecDeque`, `EnumSet`, `BinaryHeap`, `VecMap`,
7182   `BTreeSet` and `BTreeMap`. [RFC][extend-rfc].
7183 * The [`iter::once`] function returns an iterator that yields a single
7184   element, and [`iter::empty`] returns an iterator that yields no
7185   elements.
7186 * The [`matches`] and [`rmatches`] methods on `str` return iterators
7187   over substring matches.
7188 * [`Cell`] and [`RefCell`] both implement `Eq`.
7189 * A number of methods for wrapping arithmetic are added to the
7190   integral types, [`wrapping_div`], [`wrapping_rem`],
7191   [`wrapping_neg`], [`wrapping_shl`], [`wrapping_shr`]. These are in
7192   addition to the existing [`wrapping_add`], [`wrapping_sub`], and
7193   [`wrapping_mul`] methods, and alternatives to the [`Wrapping`]
7194   type.. It is illegal for the default arithmetic operations in Rust
7195   to overflow; the desire to wrap must be explicit.
7196 * The `{:#?}` formatting specifier [displays the alternate,
7197   pretty-printed][debugfmt] form of the `Debug` formatter. This
7198   feature was actually introduced prior to 1.0 with little
7199   fanfare.
7200 * [`fmt::Formatter`] implements [`fmt::Write`], a `fmt`-specific trait
7201   for writing data to formatted strings, similar to [`io::Write`].
7202 * [`fmt::Formatter`] adds 'debug builder' methods, [`debug_struct`],
7203   [`debug_tuple`], [`debug_list`], [`debug_set`], [`debug_map`]. These
7204   are used by code generators to emit implementations of [`Debug`].
7205 * `str` has new [`to_uppercase`][strup] and [`to_lowercase`][strlow]
7206   methods that convert case, following Unicode case mapping.
7207 * It is now easier to handle poisoned locks. The [`PoisonError`]
7208   type, returned by failing lock operations, exposes `into_inner`,
7209   `get_ref`, and `get_mut`, which all give access to the inner lock
7210   guard, and allow the poisoned lock to continue to operate. The
7211   `is_poisoned` method of [`RwLock`] and [`Mutex`] can poll for a
7212   poisoned lock without attempting to take the lock.
7213 * On Unix the [`FromRawFd`] trait is implemented for [`Stdio`], and
7214   [`AsRawFd`] for [`ChildStdin`], [`ChildStdout`], [`ChildStderr`].
7215   On Windows the `FromRawHandle` trait is implemented for `Stdio`,
7216   and `AsRawHandle` for `ChildStdin`, `ChildStdout`,
7217   `ChildStderr`.
7218 * [`io::ErrorKind`] has a new variant, `InvalidData`, which indicates
7219   malformed input.
7220
7221 Misc
7222 ----
7223
7224 * `rustc` employs smarter heuristics for guessing at [typos].
7225 * `rustc` emits more efficient code for [no-op conversions between
7226   unsafe pointers][nop].
7227 * Fat pointers are now [passed in pairs of immediate arguments][fat],
7228   resulting in faster compile times and smaller code.
7229
7230 [`Extend`]: https://doc.rust-lang.org/nightly/std/iter/trait.Extend.html
7231 [extend-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0839-embrace-extend-extinguish.md
7232 [`iter::once`]: https://doc.rust-lang.org/nightly/std/iter/fn.once.html
7233 [`iter::empty`]: https://doc.rust-lang.org/nightly/std/iter/fn.empty.html
7234 [`matches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.matches
7235 [`rmatches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.rmatches
7236 [`Cell`]: https://doc.rust-lang.org/nightly/std/cell/struct.Cell.html
7237 [`RefCell`]: https://doc.rust-lang.org/nightly/std/cell/struct.RefCell.html
7238 [`wrapping_add`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_add
7239 [`wrapping_sub`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_sub
7240 [`wrapping_mul`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_mul
7241 [`wrapping_div`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_div
7242 [`wrapping_rem`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_rem
7243 [`wrapping_neg`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_neg
7244 [`wrapping_shl`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_shl
7245 [`wrapping_shr`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_shr
7246 [`Wrapping`]: https://doc.rust-lang.org/nightly/std/num/struct.Wrapping.html
7247 [`fmt::Formatter`]: https://doc.rust-lang.org/nightly/std/fmt/struct.Formatter.html
7248 [`fmt::Write`]: https://doc.rust-lang.org/nightly/std/fmt/trait.Write.html
7249 [`io::Write`]: https://doc.rust-lang.org/nightly/std/io/trait.Write.html
7250 [`debug_struct`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_struct
7251 [`debug_tuple`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_tuple
7252 [`debug_list`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_list
7253 [`debug_set`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_set
7254 [`debug_map`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_map
7255 [`Debug`]: https://doc.rust-lang.org/nightly/std/fmt/trait.Debug.html
7256 [strup]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.to_uppercase
7257 [strlow]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.to_lowercase
7258 [`to_uppercase`]: https://doc.rust-lang.org/nightly/std/primitive.char.html#method.to_uppercase
7259 [`to_lowercase`]: https://doc.rust-lang.org/nightly/std/primitive.char.html#method.to_lowercase
7260 [`PoisonError`]: https://doc.rust-lang.org/nightly/std/sync/struct.PoisonError.html
7261 [`RwLock`]: https://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html
7262 [`Mutex`]: https://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html
7263 [`FromRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.FromRawFd.html
7264 [`AsRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.AsRawFd.html
7265 [`Stdio`]: https://doc.rust-lang.org/nightly/std/process/struct.Stdio.html
7266 [`ChildStdin`]: https://doc.rust-lang.org/nightly/std/process/struct.ChildStdin.html
7267 [`ChildStdout`]: https://doc.rust-lang.org/nightly/std/process/struct.ChildStdout.html
7268 [`ChildStderr`]: https://doc.rust-lang.org/nightly/std/process/struct.ChildStderr.html
7269 [`io::ErrorKind`]: https://doc.rust-lang.org/nightly/std/io/enum.ErrorKind.html
7270 [debugfmt]: https://www.reddit.com/r/rust/comments/3ceaui/psa_produces_prettyprinted_debug_output/
7271 [`DerefMut`]: https://doc.rust-lang.org/nightly/std/ops/trait.DerefMut.html
7272 [`mem::align_of`]: https://doc.rust-lang.org/nightly/std/mem/fn.align_of.html
7273 [align]: https://github.com/rust-lang/rust/pull/25646
7274 [`mem::min_align_of`]: https://doc.rust-lang.org/nightly/std/mem/fn.min_align_of.html
7275 [typos]: https://github.com/rust-lang/rust/pull/26087
7276 [nop]: https://github.com/rust-lang/rust/pull/26336
7277 [fat]: https://github.com/rust-lang/rust/pull/26411
7278 [dst]: https://github.com/rust-lang/rfcs/blob/master/text/0982-dst-coercion.md
7279 [parcodegen]: https://github.com/rust-lang/rust/pull/26018
7280 [packed]: https://github.com/rust-lang/rust/pull/25541
7281 [ad]: https://github.com/rust-lang/rust/pull/27382
7282 [win]: https://github.com/rust-lang/rust/pull/25350
7283
7284 Version 1.1.0 (2015-06-25)
7285 =========================
7286
7287 * ~850 changes, numerous bugfixes
7288
7289 Highlights
7290 ----------
7291
7292 * The [`std::fs` module has been expanded][fs] to expand the set of
7293   functionality exposed:
7294   * `DirEntry` now supports optimizations like `file_type` and `metadata` which
7295     don't incur a syscall on some platforms.
7296   * A `symlink_metadata` function has been added.
7297   * The `fs::Metadata` structure now lowers to its OS counterpart, providing
7298     access to all underlying information.
7299 * The compiler now contains extended explanations of many errors. When an error
7300   with an explanation occurs the compiler suggests using the `--explain` flag
7301   to read the explanation. Error explanations are also [available online][err-index].
7302 * Thanks to multiple [improvements][sk] to [type checking][pre], as
7303   well as other work, the time to bootstrap the compiler decreased by
7304   32%.
7305
7306 Libraries
7307 ---------
7308
7309 * The [`str::split_whitespace`] method splits a string on unicode
7310   whitespace boundaries.
7311 * On both Windows and Unix, new extension traits provide conversion of
7312   I/O types to and from the underlying system handles. On Unix, these
7313   traits are [`FromRawFd`] and [`AsRawFd`], on Windows `FromRawHandle`
7314   and `AsRawHandle`. These are implemented for `File`, `TcpStream`,
7315   `TcpListener`, and `UpdSocket`. Further implementations for
7316   `std::process` will be stabilized later.
7317 * On Unix, [`std::os::unix::symlink`] creates symlinks. On
7318   Windows, symlinks can be created with
7319   `std::os::windows::symlink_dir` and
7320   `std::os::windows::symlink_file`.
7321 * The `mpsc::Receiver` type can now be converted into an iterator with
7322   `into_iter` on the [`IntoIterator`] trait.
7323 * `Ipv4Addr` can be created from `u32` with the `From<u32>`
7324   implementation of the [`From`] trait.
7325 * The `Debug` implementation for `RangeFull` [creates output that is
7326   more consistent with other implementations][rf].
7327 * [`Debug` is implemented for `File`][file].
7328 * The `Default` implementation for `Arc` [no longer requires `Sync +
7329   Send`][arc].
7330 * [The `Iterator` methods `count`, `nth`, and `last` have been
7331   overridden for slices to have O(1) performance instead of O(n)][si].
7332 * Incorrect handling of paths on Windows has been improved in both the
7333   compiler and the standard library.
7334 * [`AtomicPtr` gained a `Default` implementation][ap].
7335 * In accordance with Rust's policy on arithmetic overflow `abs` now
7336   [panics on overflow when debug assertions are enabled][abs].
7337 * The [`Cloned`] iterator, which was accidentally left unstable for
7338   1.0 [has been stabilized][c].
7339 * The [`Incoming`] iterator, which iterates over incoming TCP
7340   connections, and which was accidentally unnamable in 1.0, [is now
7341   properly exported][inc].
7342 * [`BinaryHeap`] no longer corrupts itself [when functions called by
7343   `sift_up` or `sift_down` panic][bh].
7344 * The [`split_off`] method of `LinkedList` [no longer corrupts
7345   the list in certain scenarios][ll].
7346
7347 Misc
7348 ----
7349
7350 * Type checking performance [has improved notably][sk] with
7351   [multiple improvements][pre].
7352 * The compiler [suggests code changes][ch] for more errors.
7353 * rustc and it's build system have experimental support for [building
7354   toolchains against MUSL][m] instead of glibc on Linux.
7355 * The compiler defines the `target_env` cfg value, which is used for
7356   distinguishing toolchains that are otherwise for the same
7357   platform. Presently this is set to `gnu` for common GNU Linux
7358   targets and for MinGW targets, and `musl` for MUSL Linux targets.
7359 * The [`cargo rustc`][crc] command invokes a build with custom flags
7360   to rustc.
7361 * [Android executables are always position independent][pie].
7362 * [The `drop_with_repr_extern` lint warns about mixing `repr(C)`
7363   with `Drop`][drop].
7364
7365 [`str::split_whitespace`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_whitespace
7366 [`FromRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.FromRawFd.html
7367 [`AsRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.AsRawFd.html
7368 [`std::os::unix::symlink`]: https://doc.rust-lang.org/nightly/std/os/unix/fs/fn.symlink.html
7369 [`IntoIterator`]: https://doc.rust-lang.org/nightly/std/iter/trait.IntoIterator.html
7370 [`From`]: https://doc.rust-lang.org/nightly/std/convert/trait.From.html
7371 [rf]: https://github.com/rust-lang/rust/pull/24491
7372 [err-index]: https://doc.rust-lang.org/error-index.html
7373 [sk]: https://github.com/rust-lang/rust/pull/24615
7374 [pre]: https://github.com/rust-lang/rust/pull/25323
7375 [file]: https://github.com/rust-lang/rust/pull/24598
7376 [ch]: https://github.com/rust-lang/rust/pull/24683
7377 [arc]: https://github.com/rust-lang/rust/pull/24695
7378 [si]: https://github.com/rust-lang/rust/pull/24701
7379 [ap]: https://github.com/rust-lang/rust/pull/24834
7380 [m]: https://github.com/rust-lang/rust/pull/24777
7381 [fs]: https://github.com/rust-lang/rfcs/blob/master/text/1044-io-fs-2.1.md
7382 [crc]: https://github.com/rust-lang/cargo/pull/1568
7383 [pie]: https://github.com/rust-lang/rust/pull/24953
7384 [abs]: https://github.com/rust-lang/rust/pull/25441
7385 [c]: https://github.com/rust-lang/rust/pull/25496
7386 [`Cloned`]: https://doc.rust-lang.org/nightly/std/iter/struct.Cloned.html
7387 [`Incoming`]: https://doc.rust-lang.org/nightly/std/net/struct.Incoming.html
7388 [inc]: https://github.com/rust-lang/rust/pull/25522
7389 [bh]: https://github.com/rust-lang/rust/pull/25856
7390 [`BinaryHeap`]: https://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html
7391 [ll]: https://github.com/rust-lang/rust/pull/26022
7392 [`split_off`]: https://doc.rust-lang.org/nightly/collections/linked_list/struct.LinkedList.html#method.split_off
7393 [drop]: https://github.com/rust-lang/rust/pull/24935
7394
7395 Version 1.0.0 (2015-05-15)
7396 ========================
7397
7398 * ~1500 changes, numerous bugfixes
7399
7400 Highlights
7401 ----------
7402
7403 * The vast majority of the standard library is now `#[stable]`. It is
7404   no longer possible to use unstable features with a stable build of
7405   the compiler.
7406 * Many popular crates on [crates.io] now work on the stable release
7407   channel.
7408 * Arithmetic on basic integer types now [checks for overflow in debug
7409   builds][overflow].
7410
7411 Language
7412 --------
7413
7414 * Several [restrictions have been added to trait coherence][coh] in
7415   order to make it easier for upstream authors to change traits
7416   without breaking downstream code.
7417 * Digits of binary and octal literals are [lexed more eagerly][lex] to
7418   improve error messages and macro behavior. For example, `0b1234` is
7419   now lexed as `0b1234` instead of two tokens, `0b1` and `234`.
7420 * Trait bounds [are always invariant][inv], eliminating the need for
7421   the `PhantomFn` and `MarkerTrait` lang items, which have been
7422   removed.
7423 * ["-" is no longer a valid character in crate names][cr], the `extern crate
7424   "foo" as bar` syntax has been replaced with `extern crate foo as
7425   bar`, and Cargo now automatically translates "-" in *package* names
7426   to underscore for the crate name.
7427 * [Lifetime shadowing is an error][lt].
7428 * [`Send` no longer implies `'static`][send-rfc].
7429 * [UFCS now supports trait-less associated paths][moar-ufcs] like
7430   `MyType::default()`.
7431 * Primitive types [now have inherent methods][prim-inherent],
7432   obviating the need for extension traits like `SliceExt`.
7433 * Methods with `Self: Sized` in their `where` clause are [considered
7434   object-safe][self-sized], allowing many extension traits like
7435   `IteratorExt` to be merged into the traits they extended.
7436 * You can now [refer to associated types][assoc-where] whose
7437   corresponding trait bounds appear only in a `where` clause.
7438 * The final bits of [OIBIT landed][oibit-final], meaning that traits
7439   like `Send` and `Sync` are now library-defined.
7440 * A [Reflect trait][reflect] was introduced, which means that
7441   downcasting via the `Any` trait is effectively limited to concrete
7442   types. This helps retain the potentially-important "parametricity"
7443   property: generic code cannot behave differently for different type
7444   arguments except in minor ways.
7445 * The `unsafe_destructor` feature is now deprecated in favor of the
7446   [new `dropck`][dropck]. This change is a major reduction in unsafe
7447   code.
7448
7449 Libraries
7450 ---------
7451
7452 * The `thread_local` module [has been renamed to `std::thread`][th].
7453 * The methods of `IteratorExt` [have been moved to the `Iterator`
7454   trait itself][ie].
7455 * Several traits that implement Rust's conventions for type
7456   conversions, `AsMut`, `AsRef`, `From`, and `Into` have been
7457   [centralized in the `std::convert` module][con].
7458 * The `FromError` trait [was removed in favor of `From`][fe].
7459 * The basic sleep function [has moved to
7460   `std::thread::sleep_ms`][slp].
7461 * The `splitn` function now takes an `n` parameter that represents the
7462   number of items yielded by the returned iterator [instead of the
7463   number of 'splits'][spl].
7464 * [On Unix, all file descriptors are `CLOEXEC` by default][clo].
7465 * [Derived implementations of `PartialOrd` now order enums according
7466   to their explicitly-assigned discriminants][po].
7467 * [Methods for searching strings are generic over `Pattern`s][pat],
7468   implemented presently by `&char`, `&str`, `FnMut(char) -> bool` and
7469   some others.
7470 * [In method resolution, object methods are resolved before inherent
7471   methods][meth].
7472 * [`String::from_str` has been deprecated in favor of the `From` impl,
7473   `String::from`][sf].
7474 * [`io::Error` implements `Sync`][ios].
7475 * [The `words` method on `&str` has been replaced with
7476   `split_whitespace`][sw], to avoid answering the tricky question, 'what is
7477   a word?'
7478 * The new path and IO modules are complete and `#[stable]`. This
7479   was the major library focus for this cycle.
7480 * The path API was [revised][path-normalize] to normalize `.`,
7481   adjusting the tradeoffs in favor of the most common usage.
7482 * A large number of remaining APIs in `std` were also stabilized
7483   during this cycle; about 75% of the non-deprecated API surface
7484   is now stable.
7485 * The new [string pattern API][string-pattern] landed, which makes
7486   the string slice API much more internally consistent and flexible.
7487 * A new set of [generic conversion traits][conversion] replaced
7488   many existing ad hoc traits.
7489 * Generic numeric traits were [completely removed][num-traits]. This
7490   was made possible thanks to inherent methods for primitive types,
7491   and the removal gives maximal flexibility for designing a numeric
7492   hierarchy in the future.
7493 * The `Fn` traits are now related via [inheritance][fn-inherit]
7494   and provide ergonomic [blanket implementations][fn-blanket].
7495 * The `Index` and `IndexMut` traits were changed to
7496   [take the index by value][index-value], enabling code like
7497   `hash_map["string"]` to work.
7498 * `Copy` now [inherits][copy-clone] from `Clone`, meaning that all
7499   `Copy` data is known to be `Clone` as well.
7500
7501 Misc
7502 ----
7503
7504 * Many errors now have extended explanations that can be accessed with
7505   the `--explain` flag to `rustc`.
7506 * Many new examples have been added to the standard library
7507   documentation.
7508 * rustdoc has received a number of improvements focused on completion
7509   and polish.
7510 * Metadata was tuned, shrinking binaries [by 27%][metadata-shrink].
7511 * Much headway was made on ecosystem-wide CI, making it possible
7512   to [compare builds for breakage][ci-compare].
7513
7514
7515 [crates.io]: http://crates.io
7516 [clo]: https://github.com/rust-lang/rust/pull/24034
7517 [coh]: https://github.com/rust-lang/rfcs/blob/master/text/1023-rebalancing-coherence.md
7518 [con]: https://github.com/rust-lang/rust/pull/23875
7519 [cr]: https://github.com/rust-lang/rust/pull/23419
7520 [fe]: https://github.com/rust-lang/rust/pull/23879
7521 [ie]: https://github.com/rust-lang/rust/pull/23300
7522 [inv]: https://github.com/rust-lang/rust/pull/23938
7523 [ios]: https://github.com/rust-lang/rust/pull/24133
7524 [lex]: https://github.com/rust-lang/rfcs/blob/master/text/0879-small-base-lexing.md
7525 [lt]: https://github.com/rust-lang/rust/pull/24057
7526 [meth]: https://github.com/rust-lang/rust/pull/24056
7527 [pat]: https://github.com/rust-lang/rfcs/blob/master/text/0528-string-patterns.md
7528 [po]: https://github.com/rust-lang/rust/pull/24270
7529 [sf]: https://github.com/rust-lang/rust/pull/24517
7530 [slp]: https://github.com/rust-lang/rust/pull/23949
7531 [spl]: https://github.com/rust-lang/rfcs/blob/master/text/0979-align-splitn-with-other-languages.md
7532 [sw]: https://github.com/rust-lang/rfcs/blob/master/text/1054-str-words.md
7533 [th]: https://github.com/rust-lang/rfcs/blob/master/text/0909-move-thread-local-to-std-thread.md
7534 [send-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0458-send-improvements.md
7535 [moar-ufcs]: https://github.com/rust-lang/rust/pull/22172
7536 [prim-inherent]: https://github.com/rust-lang/rust/pull/23104
7537 [overflow]: https://github.com/rust-lang/rfcs/blob/master/text/0560-integer-overflow.md
7538 [metadata-shrink]: https://github.com/rust-lang/rust/pull/22971
7539 [self-sized]: https://github.com/rust-lang/rust/pull/22301
7540 [assoc-where]: https://github.com/rust-lang/rust/pull/22512
7541 [string-pattern]: https://github.com/rust-lang/rust/pull/22466
7542 [oibit-final]: https://github.com/rust-lang/rust/pull/21689
7543 [reflect]: https://github.com/rust-lang/rust/pull/23712
7544 [conversion]: https://github.com/rust-lang/rfcs/pull/529
7545 [num-traits]: https://github.com/rust-lang/rust/pull/23549
7546 [index-value]: https://github.com/rust-lang/rust/pull/23601
7547 [dropck]: https://github.com/rust-lang/rfcs/pull/769
7548 [ci-compare]: https://gist.github.com/brson/a30a77836fbec057cbee
7549 [fn-inherit]: https://github.com/rust-lang/rust/pull/23282
7550 [fn-blanket]: https://github.com/rust-lang/rust/pull/23895
7551 [copy-clone]: https://github.com/rust-lang/rust/pull/23860
7552 [path-normalize]: https://github.com/rust-lang/rust/pull/23229
7553
7554
7555 Version 1.0.0-alpha.2 (2015-02-20)
7556 =====================================
7557
7558 * ~1300 changes, numerous bugfixes
7559
7560 * Highlights
7561
7562     * The various I/O modules were [overhauled][io-rfc] to reduce
7563       unnecessary abstractions and provide better interoperation with
7564       the underlying platform. The old `io` module remains temporarily
7565       at `std::old_io`.
7566     * The standard library now [participates in feature gating][feat],
7567       so use of unstable libraries now requires a `#![feature(...)]`
7568       attribute. The impact of this change is [described on the
7569       forum][feat-forum]. [RFC][feat-rfc].
7570
7571 * Language
7572
7573     * `for` loops [now operate on the `IntoIterator` trait][into],
7574       which eliminates the need to call `.iter()`, etc. to iterate
7575       over collections. There are some new subtleties to remember
7576       though regarding what sort of iterators various types yield, in
7577       particular that `for foo in bar { }` yields values from a move
7578       iterator, destroying the original collection. [RFC][into-rfc].
7579     * Objects now have [default lifetime bounds][obj], so you don't
7580       have to write `Box<Trait+'static>` when you don't care about
7581       storing references. [RFC][obj-rfc].
7582     * In types that implement `Drop`, [lifetimes must outlive the
7583       value][drop]. This will soon make it possible to safely
7584       implement `Drop` for types where `#[unsafe_destructor]` is now
7585       required. Read the [gorgeous RFC][drop-rfc] for details.
7586     * The fully qualified <T as Trait>::X syntax lets you set the Self
7587       type for a trait method or associated type. [RFC][ufcs-rfc].
7588     * References to types that implement `Deref<U>` now [automatically
7589       coerce to references][deref] to the dereferenced type `U`,
7590       e.g. `&T where T: Deref<U>` automatically coerces to `&U`. This
7591       should eliminate many unsightly uses of `&*`, as when converting
7592       from references to vectors into references to
7593       slices. [RFC][deref-rfc].
7594     * The explicit [closure kind syntax][close] (`|&:|`, `|&mut:|`,
7595       `|:|`) is obsolete and closure kind is inferred from context.
7596     * [`Self` is a keyword][Self].
7597
7598 * Libraries
7599
7600     * The `Show` and `String` formatting traits [have been
7601       renamed][fmt] to `Debug` and `Display` to more clearly reflect
7602       their related purposes. Automatically getting a string
7603       conversion to use with `format!("{:?}", something_to_debug)` is
7604       now written `#[derive(Debug)]`.
7605     * Abstract [OS-specific string types][osstr], `std::ff::{OsString,
7606       OsStr}`, provide strings in platform-specific encodings for easier
7607       interop with system APIs. [RFC][osstr-rfc].
7608     * The `boxed::into_raw` and `Box::from_raw` functions [convert
7609       between `Box<T>` and `*mut T`][boxraw], a common pattern for
7610       creating raw pointers.
7611
7612 * Tooling
7613
7614     * Certain long error messages of the form 'expected foo found bar'
7615       are now [split neatly across multiple
7616       lines][multiline]. Examples in the PR.
7617     * On Unix Rust can be [uninstalled][un] by running
7618       `/usr/local/lib/rustlib/uninstall.sh`.
7619     * The `#[rustc_on_unimplemented]` attribute, requiring the
7620       'on_unimplemented' feature, lets rustc [display custom error
7621       messages when a trait is expected to be implemented for a type
7622       but is not][onun].
7623
7624 * Misc
7625
7626     * Rust is tested against a [LALR grammar][lalr], which parses
7627       almost all the Rust files that rustc does.
7628
7629 [boxraw]: https://github.com/rust-lang/rust/pull/21318
7630 [close]: https://github.com/rust-lang/rust/pull/21843
7631 [deref]: https://github.com/rust-lang/rust/pull/21351
7632 [deref-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0241-deref-conversions.md
7633 [drop]: https://github.com/rust-lang/rust/pull/21972
7634 [drop-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0769-sound-generic-drop.md
7635 [feat]: https://github.com/rust-lang/rust/pull/21248
7636 [feat-forum]: https://users.rust-lang.org/t/psa-important-info-about-rustcs-new-feature-staging/82/5
7637 [feat-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0507-release-channels.md
7638 [fmt]: https://github.com/rust-lang/rust/pull/21457
7639 [into]: https://github.com/rust-lang/rust/pull/20790
7640 [into-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0235-collections-conventions.md#intoiterator-and-iterable
7641 [io-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0517-io-os-reform.md
7642 [lalr]: https://github.com/rust-lang/rust/pull/21452
7643 [multiline]: https://github.com/rust-lang/rust/pull/19870
7644 [obj]: https://github.com/rust-lang/rust/pull/22230
7645 [obj-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0599-default-object-bound.md
7646 [onun]: https://github.com/rust-lang/rust/pull/20889
7647 [osstr]: https://github.com/rust-lang/rust/pull/21488
7648 [osstr-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0517-io-os-reform.md
7649 [Self]: https://github.com/rust-lang/rust/pull/22158
7650 [ufcs-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0132-ufcs.md
7651 [un]: https://github.com/rust-lang/rust/pull/22256
7652
7653
7654 Version 1.0.0-alpha (2015-01-09)
7655 ==================================
7656
7657   * ~2400 changes, numerous bugfixes
7658
7659   * Highlights
7660
7661     * The language itself is considered feature complete for 1.0,
7662       though there will be many usability improvements and bugfixes
7663       before the final release.
7664     * Nearly 50% of the public API surface of the standard library has
7665       been declared 'stable'. Those interfaces are unlikely to change
7666       before 1.0.
7667     * The long-running debate over integer types has been
7668       [settled][ints]: Rust will ship with types named `isize` and
7669       `usize`, rather than `int` and `uint`, for pointer-sized
7670       integers. Guidelines will be rolled out during the alpha cycle.
7671     * Most crates that are not `std` have been moved out of the Rust
7672       distribution into the Cargo ecosystem so they can evolve
7673       separately and don't need to be stabilized as quickly, including
7674       'time', 'getopts', 'num', 'regex', and 'term'.
7675     * Documentation continues to be expanded with more API coverage, more
7676       examples, and more in-depth explanations. The guides have been
7677       consolidated into [The Rust Programming Language][trpl].
7678     * "[Rust By Example][rbe]" is now maintained by the Rust team.
7679     * All official Rust binary installers now come with [Cargo], the
7680       Rust package manager.
7681
7682 * Language
7683
7684     * Closures have been [completely redesigned][unboxed] to be
7685       implemented in terms of traits, can now be used as generic type
7686       bounds and thus monomorphized and inlined, or via an opaque
7687       pointer (boxed) as in the old system. The new system is often
7688       referred to as 'unboxed' closures.
7689     * Traits now support [associated types][assoc], allowing families
7690       of related types to be defined together and used generically in
7691       powerful ways.
7692     * Enum variants are [namespaced by their type names][enum].
7693     * [`where` clauses][where] provide a more versatile and attractive
7694       syntax for specifying generic bounds, though the previous syntax
7695       remains valid.
7696     * Rust again picks a [fallback][fb] (either i32 or f64) for uninferred
7697       numeric types.
7698     * Rust [no longer has a runtime][rt] of any description, and only
7699       supports OS threads, not green threads.
7700     * At long last, Rust has been overhauled for 'dynamically-sized
7701       types' ([DST]), which integrates 'fat pointers' (object types,
7702       arrays, and `str`) more deeply into the type system, making it
7703       more consistent.
7704     * Rust now has a general [range syntax][range], `i..j`, `i..`, and
7705       `..j` that produce range types and which, when combined with the
7706       `Index` operator and multidispatch, leads to a convenient slice
7707       notation, `[i..j]`.
7708     * The new range syntax revealed an ambiguity in the fixed-length
7709       array syntax, so now fixed length arrays [are written `[T;
7710       N]`][arrays].
7711     * The `Copy` trait is no longer implemented automatically. Unsafe
7712       pointers no longer implement `Sync` and `Send` so types
7713       containing them don't automatically either. `Sync` and `Send`
7714       are now 'unsafe traits' so one can "forcibly" implement them via
7715       `unsafe impl` if a type confirms to the requirements for them
7716       even though the internals do not (e.g. structs containing unsafe
7717       pointers like `Arc`). These changes are intended to prevent some
7718       footguns and are collectively known as [opt-in built-in
7719       traits][oibit] (though `Sync` and `Send` will soon become pure
7720       library types unknown to the compiler).
7721     * Operator traits now take their operands [by value][ops], and
7722       comparison traits can use multidispatch to compare one type
7723       against multiple other types, allowing e.g. `String` to be
7724       compared with `&str`.
7725     * `if let` and `while let` are no longer feature-gated.
7726     * Rust has adopted a more [uniform syntax for escaping unicode
7727       characters][unicode].
7728     * `macro_rules!` [has been declared stable][mac]. Though it is a
7729       flawed system it is sufficiently popular that it must be usable
7730       for 1.0. Effort has gone into [future-proofing][mac-future] it
7731       in ways that will allow other macro systems to be developed in
7732       parallel, and won't otherwise impact the evolution of the
7733       language.
7734     * The prelude has been [pared back significantly][prelude] such
7735       that it is the minimum necessary to support the most pervasive
7736       code patterns, and through [generalized where clauses][where]
7737       many of the prelude extension traits have been consolidated.
7738     * Rust's rudimentary reflection [has been removed][refl], as it
7739       incurred too much code generation for little benefit.
7740     * [Struct variants][structvars] are no longer feature-gated.
7741     * Trait bounds can be [polymorphic over lifetimes][hrtb]. Also
7742       known as 'higher-ranked trait bounds', this crucially allows
7743       unboxed closures to work.
7744     * Macros invocations surrounded by parens or square brackets and
7745       not terminated by a semicolon are [parsed as
7746       expressions][macros], which makes expressions like `vec![1i32,
7747       2, 3].len()` work as expected.
7748     * Trait objects now implement their traits automatically, and
7749       traits that can be coerced to objects now must be [object
7750       safe][objsafe].
7751     * Automatically deriving traits is now done with `#[derive(...)]`
7752       not `#[deriving(...)]` for [consistency with other naming
7753       conventions][derive].
7754     * Importing the containing module or enum at the same time as
7755       items or variants they contain is [now done with `self` instead
7756       of `mod`][self], as in use `foo::{self, bar}`
7757     * Glob imports are no longer feature-gated.
7758     * The `box` operator and `box` patterns have been feature-gated
7759       pending a redesign. For now unique boxes should be allocated
7760       like other containers, with `Box::new`.
7761
7762 * Libraries
7763
7764     * A [series][coll1] of [efforts][coll2] to establish
7765       [conventions][coll3] for collections types has resulted in API
7766       improvements throughout the standard library.
7767     * New [APIs for error handling][err] provide ergonomic interop
7768       between error types, and [new conventions][err-conv] describe
7769       more clearly the recommended error handling strategies in Rust.
7770     * The `fail!` macro has been renamed to [`panic!`][panic] so that
7771       it is easier to discuss failure in the context of error handling
7772       without making clarifications as to whether you are referring to
7773       the 'fail' macro or failure more generally.
7774     * On Linux, `OsRng` prefers the new, more reliable `getrandom`
7775       syscall when available.
7776     * The 'serialize' crate has been renamed 'rustc-serialize' and
7777       moved out of the distribution to Cargo. Although it is widely
7778       used now, it is expected to be superseded in the near future.
7779     * The `Show` formatter, typically implemented with
7780       `#[derive(Show)]` is [now requested with the `{:?}`
7781       specifier][show] and is intended for use by all types, for uses
7782       such as `println!` debugging. The new `String` formatter must be
7783       implemented by hand, uses the `{}` specifier, and is intended
7784       for full-fidelity conversions of things that can logically be
7785       represented as strings.
7786
7787 * Tooling
7788
7789     * [Flexible target specification][flex] allows rustc's code
7790       generation to be configured to support otherwise-unsupported
7791       platforms.
7792     * Rust comes with rust-gdb and rust-lldb scripts that launch their
7793       respective debuggers with Rust-appropriate pretty-printing.
7794     * The Windows installation of Rust is distributed with the
7795       MinGW components currently required to link binaries on that
7796       platform.
7797
7798 * Misc
7799
7800     * Nullable enum optimizations have been extended to more types so
7801       that e.g. `Option<Vec<T>>` and `Option<String>` take up no more
7802       space than the inner types themselves.
7803     * Work has begun on supporting AArch64.
7804
7805 [Cargo]: https://crates.io
7806 [unboxed]: http://smallcultfollowing.com/babysteps/blog/2014/11/26/purging-proc/
7807 [enum]: https://github.com/rust-lang/rfcs/blob/master/text/0390-enum-namespacing.md
7808 [flex]: https://github.com/rust-lang/rfcs/blob/master/text/0131-target-specification.md
7809 [err]: https://github.com/rust-lang/rfcs/blob/master/text/0201-error-chaining.md
7810 [err-conv]: https://github.com/rust-lang/rfcs/blob/master/text/0236-error-conventions.md
7811 [rt]: https://github.com/rust-lang/rfcs/blob/master/text/0230-remove-runtime.md
7812 [mac]: https://github.com/rust-lang/rfcs/blob/master/text/0453-macro-reform.md
7813 [mac-future]: https://github.com/rust-lang/rfcs/pull/550
7814 [DST]: http://smallcultfollowing.com/babysteps/blog/2014/01/05/dst-take-5/
7815 [coll1]: https://github.com/rust-lang/rfcs/blob/master/text/0235-collections-conventions.md
7816 [coll2]: https://github.com/rust-lang/rfcs/blob/master/text/0509-collections-reform-part-2.md
7817 [coll3]: https://github.com/rust-lang/rfcs/blob/master/text/0216-collection-views.md
7818 [ops]: https://github.com/rust-lang/rfcs/blob/master/text/0439-cmp-ops-reform.md
7819 [prelude]: https://github.com/rust-lang/rfcs/blob/master/text/0503-prelude-stabilization.md
7820 [where]: https://github.com/rust-lang/rfcs/blob/master/text/0135-where.md
7821 [refl]: https://github.com/rust-lang/rfcs/blob/master/text/0379-remove-reflection.md
7822 [panic]: https://github.com/rust-lang/rfcs/blob/master/text/0221-panic.md
7823 [structvars]: https://github.com/rust-lang/rfcs/blob/master/text/0418-struct-variants.md
7824 [hrtb]: https://github.com/rust-lang/rfcs/blob/master/text/0387-higher-ranked-trait-bounds.md
7825 [unicode]: https://github.com/rust-lang/rfcs/blob/master/text/0446-es6-unicode-escapes.md
7826 [oibit]: https://github.com/rust-lang/rfcs/blob/master/text/0019-opt-in-builtin-traits.md
7827 [macros]: https://github.com/rust-lang/rfcs/blob/master/text/0378-expr-macros.md
7828 [range]: https://github.com/rust-lang/rfcs/blob/master/text/0439-cmp-ops-reform.md#indexing-and-slicing
7829 [arrays]: https://github.com/rust-lang/rfcs/blob/master/text/0520-new-array-repeat-syntax.md
7830 [show]: https://github.com/rust-lang/rfcs/blob/master/text/0504-show-stabilization.md
7831 [derive]: https://github.com/rust-lang/rfcs/blob/master/text/0534-deriving2derive.md
7832 [self]: https://github.com/rust-lang/rfcs/blob/master/text/0532-self-in-use.md
7833 [fb]: https://github.com/rust-lang/rfcs/blob/master/text/0212-restore-int-fallback.md
7834 [objsafe]: https://github.com/rust-lang/rfcs/blob/master/text/0255-object-safety.md
7835 [assoc]: https://github.com/rust-lang/rfcs/blob/master/text/0195-associated-items.md
7836 [ints]: https://github.com/rust-lang/rfcs/pull/544#issuecomment-68760871
7837 [trpl]: https://doc.rust-lang.org/book/index.html
7838 [rbe]: http://rustbyexample.com/
7839
7840
7841 Version 0.12.0 (2014-10-09)
7842 =============================
7843
7844   * ~1900 changes, numerous bugfixes
7845
7846   * Highlights
7847
7848     * The introductory documentation (now called The Rust Guide) has
7849       been completely rewritten, as have a number of supplementary
7850       guides.
7851     * Rust's package manager, Cargo, continues to improve and is
7852       sometimes considered to be quite awesome.
7853     * Many API's in `std` have been reviewed and updated for
7854       consistency with the in-development Rust coding
7855       guidelines. The standard library documentation tracks
7856       stabilization progress.
7857     * Minor libraries have been moved out-of-tree to the rust-lang org
7858       on GitHub: uuid, semver, glob, num, hexfloat, fourcc. They can
7859       be installed with Cargo.
7860     * Lifetime elision allows lifetime annotations to be left off of
7861       function declarations in many common scenarios.
7862     * Rust now works on 64-bit Windows.
7863
7864   * Language
7865     * Indexing can be overloaded with the `Index` and `IndexMut`
7866       traits.
7867     * The `if let` construct takes a branch only if the `let` pattern
7868       matches, currently behind the 'if_let' feature gate.
7869     * 'where clauses', a more flexible syntax for specifying trait
7870       bounds that is more aesthetic, have been added for traits and
7871       free functions. Where clauses will in the future make it
7872       possible to constrain associated types, which would be
7873       impossible with the existing syntax.
7874     * A new slicing syntax (e.g. `[0..4]`) has been introduced behind
7875       the 'slicing_syntax' feature gate, and can be overloaded with
7876       the `Slice` or `SliceMut` traits.
7877     * The syntax for matching of sub-slices has been changed to use a
7878       postfix `..` instead of prefix (.e.g. `[a, b, c..]`), for
7879       consistency with other uses of `..` and to future-proof
7880       potential additional uses of the syntax.
7881     * The syntax for matching inclusive ranges in patterns has changed
7882       from `0..3` to `0...4` to be consistent with the exclusive range
7883       syntax for slicing.
7884     * Matching of sub-slices in non-tail positions (e.g.  `[a.., b,
7885       c]`) has been put behind the 'advanced_slice_patterns' feature
7886       gate and may be removed in the future.
7887     * Components of tuples and tuple structs can be extracted using
7888       the `value.0` syntax, currently behind the `tuple_indexing`
7889       feature gate.
7890     * The `#[crate_id]` attribute is no longer supported; versioning
7891       is handled by the package manager.
7892     * Renaming crate imports are now written `extern crate foo as bar`
7893       instead of `extern crate bar = foo`.
7894     * Renaming use statements are now written `use foo as bar` instead
7895       of `use bar = foo`.
7896     * `let` and `match` bindings and argument names in macros are now
7897       hygienic.
7898     * The new, more efficient, closure types ('unboxed closures') have
7899       been added under a feature gate, 'unboxed_closures'. These will
7900       soon replace the existing closure types, once higher-ranked
7901       trait lifetimes are added to the language.
7902     * `move` has been added as a keyword, for indicating closures
7903       that capture by value.
7904     * Mutation and assignment is no longer allowed in pattern guards.
7905     * Generic structs and enums can now have trait bounds.
7906     * The `Share` trait is now called `Sync` to free up the term
7907       'shared' to refer to 'shared reference' (the default reference
7908       type.
7909     * Dynamically-sized types have been mostly implemented,
7910       unifying the behavior of fat-pointer types with the rest of the
7911       type system.
7912     * As part of dynamically-sized types, the `Sized` trait has been
7913       introduced, which qualifying types implement by default, and
7914       which type parameters expect by default. To specify that a type
7915       parameter does not need to be sized, write `<Sized? T>`. Most
7916       types are `Sized`, notable exceptions being unsized arrays
7917       (`[T]`) and trait types.
7918     * Closures can return `!`, as in `|| -> !` or `proc() -> !`.
7919     * Lifetime bounds can now be applied to type parameters and object
7920       types.
7921     * The old, reference counted GC type, `Gc<T>` which was once
7922       denoted by the `@` sigil, has finally been removed. GC will be
7923       revisited in the future.
7924
7925   * Libraries
7926     * Library documentation has been improved for a number of modules.
7927     * Bit-vectors, collections::bitv has been modernized.
7928     * The url crate is deprecated in favor of
7929       http://github.com/servo/rust-url, which can be installed with
7930       Cargo.
7931     * Most I/O stream types can be cloned and subsequently closed from
7932       a different thread.
7933     * A `std::time::Duration` type has been added for use in I/O
7934       methods that rely on timers, as well as in the 'time' crate's
7935       `Timespec` arithmetic.
7936     * The runtime I/O abstraction layer that enabled the green thread
7937       scheduler to do non-thread-blocking I/O has been removed, along
7938       with the libuv-based implementation employed by the green thread
7939       scheduler. This will greatly simplify the future I/O work.
7940     * `collections::btree` has been rewritten to have a more
7941       idiomatic and efficient design.
7942
7943   * Tooling
7944     * rustdoc output now indicates the stability levels of API's.
7945     * The `--crate-name` flag can specify the name of the crate
7946       being compiled, like `#[crate_name]`.
7947     * The `-C metadata` specifies additional metadata to hash into
7948       symbol names, and `-C extra-filename` specifies additional
7949       information to put into the output filename, for use by the
7950       package manager for versioning.
7951     * debug info generation has continued to improve and should be
7952       more reliable under both gdb and lldb.
7953     * rustc has experimental support for compiling in parallel
7954       using the `-C codegen-units` flag.
7955     * rustc no longer encodes rpath information into binaries by
7956       default.
7957
7958   * Misc
7959     * Stack usage has been optimized with LLVM lifetime annotations.
7960     * Official Rust binaries on Linux are more compatible with older
7961       kernels and distributions, built on CentOS 5.10.
7962
7963
7964 Version 0.11.0 (2014-07-02)
7965 ==========================
7966
7967   * ~1700 changes, numerous bugfixes
7968
7969   * Language
7970     * ~[T] has been removed from the language. This type is superseded by
7971       the Vec<T> type.
7972     * ~str has been removed from the language. This type is superseded by
7973       the String type.
7974     * ~T has been removed from the language. This type is superseded by the
7975       Box<T> type.
7976     * @T has been removed from the language. This type is superseded by the
7977       standard library's std::gc::Gc<T> type.
7978     * Struct fields are now all private by default.
7979     * Vector indices and shift amounts are both required to be a `uint`
7980       instead of any integral type.
7981     * Byte character, byte string, and raw byte string literals are now all
7982       supported by prefixing the normal literal with a `b`.
7983     * Multiple ABIs are no longer allowed in an ABI string
7984     * The syntax for lifetimes on closures/procedures has been tweaked
7985       slightly: `<'a>|A, B|: 'b + K -> T`
7986     * Floating point modulus has been removed from the language; however it
7987       is still provided by a library implementation.
7988     * Private enum variants are now disallowed.
7989     * The `priv` keyword has been removed from the language.
7990     * A closure can no longer be invoked through a &-pointer.
7991     * The `use foo, bar, baz;` syntax has been removed from the language.
7992     * The transmute intrinsic no longer works on type parameters.
7993     * Statics now allow blocks/items in their definition.
7994     * Trait bounds are separated from objects with + instead of : now.
7995     * Objects can no longer be read while they are mutably borrowed.
7996     * The address of a static is now marked as insignificant unless the
7997       #[inline(never)] attribute is placed it.
7998     * The #[unsafe_destructor] attribute is now behind a feature gate.
7999     * Struct literals are no longer allowed in ambiguous positions such as
8000       if, while, match, and for..in.
8001     * Declaration of lang items and intrinsics are now feature-gated by
8002       default.
8003     * Integral literals no longer default to `int`, and floating point
8004       literals no longer default to `f64`. Literals must be suffixed with an
8005       appropriate type if inference cannot determine the type of the
8006       literal.
8007     * The Box<T> type is no longer implicitly borrowed to &mut T.
8008     * Procedures are now required to not capture borrowed references.
8009
8010   * Libraries
8011     * The standard library is now a "facade" over a number of underlying
8012       libraries. This means that development on the standard library should
8013       be speedier due to smaller crates, as well as a clearer line between
8014       all dependencies.
8015     * A new library, libcore, lives under the standard library's facade
8016       which is Rust's "0-assumption" library, suitable for embedded and
8017       kernel development for example.
8018     * A regex crate has been added to the standard distribution. This crate
8019       includes statically compiled regular expressions.
8020     * The unwrap/unwrap_err methods on Result require a Show bound for
8021       better error messages.
8022     * The return types of the std::comm primitives have been centralized
8023       around the Result type.
8024     * A number of I/O primitives have gained the ability to time out their
8025       operations.
8026     * A number of I/O primitives have gained the ability to close their
8027       reading/writing halves to cancel pending operations.
8028     * Reverse iterator methods have been removed in favor of `rev()` on
8029       their forward-iteration counterparts.
8030     * A bitflags! macro has been added to enable easy interop with C and
8031       management of bit flags.
8032     * A debug_assert! macro is now provided which is disabled when
8033       `--cfg ndebug` is passed to the compiler.
8034     * A graphviz crate has been added for creating .dot files.
8035     * The std::cast module has been migrated into std::mem.
8036     * The std::local_data api has been migrated from freestanding functions
8037       to being based on methods.
8038     * The Pod trait has been renamed to Copy.
8039     * jemalloc has been added as the default allocator for types.
8040     * The API for allocating memory has been changed to use proper alignment
8041       and sized deallocation
8042     * Connecting a TcpStream or binding a TcpListener is now based on a
8043       string address and a u16 port. This allows connecting to a hostname as
8044       opposed to an IP.
8045     * The Reader trait now contains a core method, read_at_least(), which
8046       correctly handles many repeated 0-length reads.
8047     * The process-spawning API is now centered around a builder-style
8048       Command struct.
8049     * The :? printing qualifier has been moved from the standard library to
8050       an external libdebug crate.
8051     * Eq/Ord have been renamed to PartialEq/PartialOrd. TotalEq/TotalOrd
8052       have been renamed to Eq/Ord.
8053     * The select/plural methods have been removed from format!. The escapes
8054       for { and } have also changed from \{ and \} to {{ and }},
8055       respectively.
8056     * The TaskBuilder API has been re-worked to be a true builder, and
8057       extension traits for spawning native/green tasks have been added.
8058
8059   * Tooling
8060     * All breaking changes to the language or libraries now have their
8061       commit message annotated with `[breaking-change]` to allow for easy
8062       discovery of breaking changes.
8063     * The compiler will now try to suggest how to annotate lifetimes if a
8064       lifetime-related error occurs.
8065     * Debug info continues to be improved greatly with general bug fixes and
8066       better support for situations like link time optimization (LTO).
8067     * Usage of syntax extensions when cross-compiling has been fixed.
8068     * Functionality equivalent to GCC & Clang's -ffunction-sections,
8069       -fdata-sections and --gc-sections has been enabled by default
8070     * The compiler is now stricter about where it will load module files
8071       from when a module is declared via `mod foo;`.
8072     * The #[phase(syntax)] attribute has been renamed to #[phase(plugin)].
8073       Syntax extensions are now discovered via a "plugin registrar" type
8074       which will be extended in the future to other various plugins.
8075     * Lints have been restructured to allow for dynamically loadable lints.
8076     * A number of rustdoc improvements:
8077       * The HTML output has been visually redesigned.
8078       * Markdown is now powered by hoedown instead of sundown.
8079       * Searching heuristics have been greatly improved.
8080       * The search index has been reduced in size by a great amount.
8081       * Cross-crate documentation via `pub use` has been greatly improved.
8082       * Primitive types are now hyperlinked and documented.
8083     * Documentation has been moved from static.rust-lang.org/doc to
8084       doc.rust-lang.org
8085     * A new sandbox, play.rust-lang.org, is available for running and
8086       sharing rust code examples on-line.
8087     * Unused attributes are now more robustly warned about.
8088     * The dead_code lint now warns about unused struct fields.
8089     * Cross-compiling to iOS is now supported.
8090     * Cross-compiling to mipsel is now supported.
8091     * Stability attributes are now inherited by default and no longer apply
8092       to intra-crate usage, only inter-crate usage.
8093     * Error message related to non-exhaustive match expressions have been
8094       greatly improved.
8095
8096
8097 Version 0.10 (2014-04-03)
8098 =========================
8099
8100   * ~1500 changes, numerous bugfixes
8101
8102   * Language
8103     * A new RFC process is now in place for modifying the language.
8104     * Patterns with `@`-pointers have been removed from the language.
8105     * Patterns with unique vectors (`~[T]`) have been removed from the
8106       language.
8107     * Patterns with unique strings (`~str`) have been removed from the
8108       language.
8109     * `@str` has been removed from the language.
8110     * `@[T]` has been removed from the language.
8111     * `@self` has been removed from the language.
8112     * `@Trait` has been removed from the language.
8113     * Headers on `~` allocations which contain `@` boxes inside the type for
8114       reference counting have been removed.
8115     * The semantics around the lifetimes of temporary expressions have changed,
8116       see #3511 and #11585 for more information.
8117     * Cross-crate syntax extensions are now possible, but feature gated. See
8118       #11151 for more information. This includes both `macro_rules!` macros as
8119       well as syntax extensions such as `format!`.
8120     * New lint modes have been added, and older ones have been turned on to be
8121       warn-by-default.
8122       * Unnecessary parentheses
8123       * Uppercase statics
8124       * Camel Case types
8125       * Uppercase variables
8126       * Publicly visible private types
8127       * `#[deriving]` with raw pointers
8128     * Unsafe functions can no longer be coerced to closures.
8129     * Various obscure macros such as `log_syntax!` are now behind feature gates.
8130     * The `#[simd]` attribute is now behind a feature gate.
8131     * Visibility is no longer allowed on `extern crate` statements, and
8132       unnecessary visibility (`priv`) is no longer allowed on `use` statements.
8133     * Trailing commas are now allowed in argument lists and tuple patterns.
8134     * The `do` keyword has been removed, it is now a reserved keyword.
8135     * Default type parameters have been implemented, but are feature gated.
8136     * Borrowed variables through captures in closures are now considered soundly.
8137     * `extern mod` is now `extern crate`
8138     * The `Freeze` trait has been removed.
8139     * The `Share` trait has been added for types that can be shared among
8140       threads.
8141     * Labels in macros are now hygienic.
8142     * Expression/statement macro invocations can be delimited with `{}` now.
8143     * Treatment of types allowed in `static mut` locations has been tweaked.
8144     * The `*` and `.` operators are now overloadable through the `Deref` and
8145       `DerefMut` traits.
8146     * `~Trait` and `proc` no longer have `Send` bounds by default.
8147     * Partial type hints are now supported with the `_` type marker.
8148     * An `Unsafe` type was introduced for interior mutability. It is now
8149       considered undefined to transmute from `&T` to `&mut T` without using the
8150       `Unsafe` type.
8151     * The #[linkage] attribute was implemented for extern statics/functions.
8152     * The inner attribute syntax has changed from `#[foo];` to `#![foo]`.
8153     * `Pod` was renamed to `Copy`.
8154
8155   * Libraries
8156     * The `libextra` library has been removed. It has now been decomposed into
8157       component libraries with smaller and more focused nuggets of
8158       functionality. The full list of libraries can be found on the
8159       documentation index page.
8160     * std: `std::condition` has been removed. All I/O errors are now propagated
8161       through the `Result` type. In order to assist with error handling, a
8162       `try!` macro for unwrapping errors with an early return and a lint for
8163       unused results has been added. See #12039 for more information.
8164     * std: The `vec` module has been renamed to `slice`.
8165     * std: A new vector type, `Vec<T>`, has been added in preparation for DST.
8166       This will become the only growable vector in the future.
8167     * std: `std::io` now has more public re-exports. Types such as `BufferedReader`
8168       are now found at `std::io::BufferedReader` instead of
8169       `std::io::buffered::BufferedReader`.
8170     * std: `print` and `println` are no longer in the prelude, the `print!` and
8171       `println!` macros are intended to be used instead.
8172     * std: `Rc` now has a `Weak` pointer for breaking cycles, and it no longer
8173       attempts to statically prevent cycles.
8174     * std: The standard distribution is adopting the policy of pushing failure
8175       to the user rather than failing in libraries. Many functions (such as
8176       `slice::last()`) now return `Option<T>` instead of `T` + failing.
8177     * std: `fmt::Default` has been renamed to `fmt::Show`, and it now has a new
8178       deriving mode: `#[deriving(Show)]`.
8179     * std: `ToStr` is now implemented for all types implementing `Show`.
8180     * std: The formatting trait methods now take `&self` instead of `&T`
8181     * std: The `invert()` method on iterators has been renamed to `rev()`
8182     * std: `std::num` has seen a reduction in the genericity of its traits,
8183       consolidating functionality into a few core traits.
8184     * std: Backtraces are now printed on task failure if the environment
8185       variable `RUST_BACKTRACE` is present.
8186     * std: Naming conventions for iterators have been standardized. More details
8187       can be found on the wiki's style guide.
8188     * std: `eof()` has been removed from the `Reader` trait. Specific types may
8189       still implement the function.
8190     * std: Networking types are now cloneable to allow simultaneous reads/writes.
8191     * std: `assert_approx_eq!` has been removed
8192     * std: The `e` and `E` formatting specifiers for floats have been added to
8193       print them in exponential notation.
8194     * std: The `Times` trait has been removed
8195     * std: Indications of variance and opting out of builtin bounds is done
8196       through marker types in `std::kinds::marker` now
8197     * std: `hash` has been rewritten, `IterBytes` has been removed, and
8198       `#[deriving(Hash)]` is now possible.
8199     * std: `SharedChan` has been removed, `Sender` is now cloneable.
8200     * std: `Chan` and `Port` were renamed to `Sender` and `Receiver`.
8201     * std: `Chan::new` is now `channel()`.
8202     * std: A new synchronous channel type has been implemented.
8203     * std: A `select!` macro is now provided for selecting over `Receiver`s.
8204     * std: `hashmap` and `trie` have been moved to `libcollections`
8205     * std: `run` has been rolled into `io::process`
8206     * std: `assert_eq!` now uses `{}` instead of `{:?}`
8207     * std: The equality and comparison traits have seen some reorganization.
8208     * std: `rand` has moved to `librand`.
8209     * std: `to_{lower,upper}case` has been implemented for `char`.
8210     * std: Logging has been moved to `liblog`.
8211     * collections: `HashMap` has been rewritten for higher performance and less
8212       memory usage.
8213     * native: The default runtime is now `libnative`. If `libgreen` is desired,
8214       it can be booted manually. The runtime guide has more information and
8215       examples.
8216     * native: All I/O functionality except signals has been implemented.
8217     * green: Task spawning with `libgreen` has been optimized with stack caching
8218       and various trimming of code.
8219     * green: Tasks spawned by `libgreen` now have an unmapped guard page.
8220     * sync: The `extra::sync` module has been updated to modern rust (and moved
8221       to the `sync` library), tweaking and improving various interfaces while
8222       dropping redundant functionality.
8223     * sync: A new `Barrier` type has been added to the `sync` library.
8224     * sync: An efficient mutex for native and green tasks has been implemented.
8225     * serialize: The `base64` module has seen some improvement. It treats
8226       newlines better, has non-string error values, and has seen general
8227       cleanup.
8228     * fourcc: A `fourcc!` macro was introduced
8229     * hexfloat: A `hexfloat!` macro was implemented for specifying floats via a
8230       hexadecimal literal.
8231
8232   * Tooling
8233     * `rustpkg` has been deprecated and removed from the main repository. Its
8234       replacement, `cargo`, is under development.
8235     * Nightly builds of rust are now available
8236     * The memory usage of rustc has been improved many times throughout this
8237       release cycle.
8238     * The build process supports disabling rpath support for the rustc binary
8239       itself.
8240     * Code generation has improved in some cases, giving more information to the
8241       LLVM optimization passes to enable more extensive optimizations.
8242     * Debuginfo compatibility with lldb on OSX has been restored.
8243     * The master branch is now gated on an android bot, making building for
8244       android much more reliable.
8245     * Output flags have been centralized into one `--emit` flag.
8246     * Crate type flags have been centralized into one `--crate-type` flag.
8247     * Codegen flags have been consolidated behind a `-C` flag.
8248     * Linking against outdated crates now has improved error messages.
8249     * Error messages with lifetimes will often suggest how to annotate the
8250       function to fix the error.
8251     * Many more types are documented in the standard library, and new guides
8252       were written.
8253     * Many `rustdoc` improvements:
8254       * code blocks are syntax highlighted.
8255       * render standalone markdown files.
8256       * the --test flag tests all code blocks by default.
8257       * exported macros are displayed.
8258       * re-exported types have their documentation inlined at the location of the
8259         first re-export.
8260       * search works across crates that have been rendered to the same output
8261         directory.
8262
8263
8264 Version 0.9 (2014-01-09)
8265 ==========================
8266
8267    * ~1800 changes, numerous bugfixes
8268
8269    * Language
8270       * The `float` type has been removed. Use `f32` or `f64` instead.
8271       * A new facility for enabling experimental features (feature gating) has
8272         been added, using the crate-level `#[feature(foo)]` attribute.
8273       * Managed boxes (@) are now behind a feature gate
8274         (`#[feature(managed_boxes)]`) in preparation for future removal. Use the
8275         standard library's `Gc` or `Rc` types instead.
8276       * `@mut` has been removed. Use `std::cell::{Cell, RefCell}` instead.
8277       * Jumping back to the top of a loop is now done with `continue` instead of
8278         `loop`.
8279       * Strings can no longer be mutated through index assignment.
8280       * Raw strings can be created via the basic `r"foo"` syntax or with matched
8281         hash delimiters, as in `r###"foo"###`.
8282       * `~fn` is now written `proc (args) -> retval { ... }` and may only be
8283         called once.
8284       * The `&fn` type is now written `|args| -> ret` to match the literal form.
8285       * `@fn`s have been removed.
8286       * `do` only works with procs in order to make it obvious what the cost
8287         of `do` is.
8288       * Single-element tuple-like structs can no longer be dereferenced to
8289         obtain the inner value. A more comprehensive solution for overloading
8290         the dereference operator will be provided in the future.
8291       * The `#[link(...)]` attribute has been replaced with
8292         `#[crate_id = "name#vers"]`.
8293       * Empty `impl`s must be terminated with empty braces and may not be
8294         terminated with a semicolon.
8295       * Keywords are no longer allowed as lifetime names; the `self` lifetime
8296         no longer has any special meaning.
8297       * The old `fmt!` string formatting macro has been removed.
8298       * `printf!` and `printfln!` (old-style formatting) removed in favor of
8299         `print!` and `println!`.
8300       * `mut` works in patterns now, as in `let (mut x, y) = (1, 2);`.
8301       * The `extern mod foo (name = "bar")` syntax has been removed. Use
8302         `extern mod foo = "bar"` instead.
8303       * New reserved keywords: `alignof`, `offsetof`, `sizeof`.
8304       * Macros can have attributes.
8305       * Macros can expand to items with attributes.
8306       * Macros can expand to multiple items.
8307       * The `asm!` macro is feature-gated (`#[feature(asm)]`).
8308       * Comments may be nested.
8309       * Values automatically coerce to trait objects they implement, without
8310         an explicit `as`.
8311       * Enum discriminants are no longer an entire word but as small as needed to
8312         contain all the variants. The `repr` attribute can be used to override
8313         the discriminant size, as in `#[repr(int)]` for integer-sized, and
8314         `#[repr(C)]` to match C enums.
8315       * Non-string literals are not allowed in attributes (they never worked).
8316       * The FFI now supports variadic functions.
8317       * Octal numeric literals, as in `0o7777`.
8318       * The `concat!` syntax extension performs compile-time string concatenation.
8319       * The `#[fixed_stack_segment]` and `#[rust_stack]` attributes have been
8320         removed as Rust no longer uses segmented stacks.
8321       * Non-ascii identifiers are feature-gated (`#[feature(non_ascii_idents)]`).
8322       * Ignoring all fields of an enum variant or tuple-struct is done with `..`,
8323         not `*`; ignoring remaining fields of a struct is also done with `..`,
8324         not `_`; ignoring a slice of a vector is done with `..`, not `.._`.
8325       * `rustc` supports the "win64" calling convention via `extern "win64"`.
8326       * `rustc` supports the "system" calling convention, which defaults to the
8327         preferred convention for the target platform, "stdcall" on 32-bit Windows,
8328         "C" elsewhere.
8329       * The `type_overflow` lint (default: warn) checks literals for overflow.
8330       * The `unsafe_block` lint (default: allow) checks for usage of `unsafe`.
8331       * The `attribute_usage` lint (default: warn) warns about unknown
8332         attributes.
8333       * The `unknown_features` lint (default: warn) warns about unknown
8334         feature gates.
8335       * The `dead_code` lint (default: warn) checks for dead code.
8336       * Rust libraries can be linked statically to one another
8337       * `#[link_args]` is behind the `link_args` feature gate.
8338       * Native libraries are now linked with `#[link(name = "foo")]`
8339       * Native libraries can be statically linked to a rust crate
8340         (`#[link(name = "foo", kind = "static")]`).
8341       * Native OS X frameworks are now officially supported
8342         (`#[link(name = "foo", kind = "framework")]`).
8343       * The `#[thread_local]` attribute creates thread-local (not task-local)
8344         variables. Currently behind the `thread_local` feature gate.
8345       * The `return` keyword may be used in closures.
8346       * Types that can be copied via a memcpy implement the `Pod` kind.
8347       * The `cfg` attribute can now be used on struct fields and enum variants.
8348
8349    * Libraries
8350       * std: The `option` and `result` API's have been overhauled to make them
8351         simpler, more consistent, and more composable.
8352       * std: The entire `std::io` module has been replaced with one that is
8353         more comprehensive and that properly interfaces with the underlying
8354         scheduler. File, TCP, UDP, Unix sockets, pipes, and timers are all
8355         implemented.
8356       * std: `io::util` contains a number of useful implementations of
8357         `Reader` and `Writer`, including `NullReader`, `NullWriter`,
8358         `ZeroReader`, `TeeReader`.
8359       * std: The reference counted pointer type `extra::rc` moved into std.
8360       * std: The `Gc` type in the `gc` module will replace `@` (it is currently
8361         just a wrapper around it).
8362       * std: The `Either` type has been removed.
8363       * std: `fmt::Default` can be implemented for any type to provide default
8364         formatting to the `format!` macro, as in `format!("{}", myfoo)`.
8365       * std: The `rand` API continues to be tweaked.
8366       * std: The `rust_begin_unwind` function, useful for inserting breakpoints
8367         on failure in gdb, is now named `rust_fail`.
8368       * std: The `each_key` and `each_value` methods on `HashMap` have been
8369         replaced by the `keys` and `values` iterators.
8370       * std: Functions dealing with type size and alignment have moved from the
8371         `sys` module to the `mem` module.
8372       * std: The `path` module was written and API changed.
8373       * std: `str::from_utf8` has been changed to cast instead of allocate.
8374       * std: `starts_with` and `ends_with` methods added to vectors via the
8375         `ImmutableEqVector` trait, which is in the prelude.
8376       * std: Vectors can be indexed with the `get_opt` method, which returns `None`
8377         if the index is out of bounds.
8378       * std: Task failure no longer propagates between tasks, as the model was
8379         complex, expensive, and incompatible with thread-based tasks.
8380       * std: The `Any` type can be used for dynamic typing.
8381       * std: `~Any` can be passed to the `fail!` macro and retrieved via
8382         `task::try`.
8383       * std: Methods that produce iterators generally do not have an `_iter`
8384         suffix now.
8385       * std: `cell::Cell` and `cell::RefCell` can be used to introduce mutability
8386         roots (mutable fields, etc.). Use instead of e.g. `@mut`.
8387       * std: `util::ignore` renamed to `prelude::drop`.
8388       * std: Slices have `sort` and `sort_by` methods via the `MutableVector`
8389         trait.
8390       * std: `vec::raw` has seen a lot of cleanup and API changes.
8391       * std: The standard library no longer includes any C++ code, and very
8392         minimal C, eliminating the dependency on libstdc++.
8393       * std: Runtime scheduling and I/O functionality has been factored out into
8394         extensible interfaces and is now implemented by two different crates:
8395         libnative, for native threading and I/O; and libgreen, for green threading
8396         and I/O. This paves the way for using the standard library in more limited
8397         embedded environments.
8398       * std: The `comm` module has been rewritten to be much faster, have a
8399         simpler, more consistent API, and to work for both native and green
8400         threading.
8401       * std: All libuv dependencies have been moved into the rustuv crate.
8402       * native: New implementations of runtime scheduling on top of OS threads.
8403       * native: New native implementations of TCP, UDP, file I/O, process spawning,
8404         and other I/O.
8405       * green: The green thread scheduler and message passing types are almost
8406         entirely lock-free.
8407       * extra: The `flatpipes` module had bitrotted and was removed.
8408       * extra: All crypto functions have been removed and Rust now has a policy of
8409         not reimplementing crypto in the standard library. In the future crypto
8410         will be provided by external crates with bindings to established libraries.
8411       * extra: `c_vec` has been modernized.
8412       * extra: The `sort` module has been removed. Use the `sort` method on
8413         mutable slices.
8414
8415    * Tooling
8416       * The `rust` and `rusti` commands have been removed, due to lack of
8417         maintenance.
8418       * `rustdoc` was completely rewritten.
8419       * `rustdoc` can test code examples in documentation.
8420       * `rustpkg` can test packages with the argument, 'test'.
8421       * `rustpkg` supports arbitrary dependencies, including C libraries.
8422       * `rustc`'s support for generating debug info is improved again.
8423       * `rustc` has better error reporting for unbalanced delimiters.
8424       * `rustc`'s JIT support was removed due to bitrot.
8425       * Executables and static libraries can be built with LTO (-Z lto)
8426       * `rustc` adds a `--dep-info` flag for communicating dependencies to
8427         build tools.
8428
8429
8430 Version 0.8 (2013-09-26)
8431 ============================
8432
8433    * ~2200 changes, numerous bugfixes
8434
8435    * Language
8436       * The `for` loop syntax has changed to work with the `Iterator` trait.
8437       * At long last, unwinding works on Windows.
8438       * Default methods are ready for use.
8439       * Many trait inheritance bugs fixed.
8440       * Owned and borrowed trait objects work more reliably.
8441       * `copy` is no longer a keyword. It has been replaced by the `Clone` trait.
8442       * rustc can omit emission of code for the `debug!` macro if it is passed
8443         `--cfg ndebug`
8444       * mod.rs is now "blessed". When loading `mod foo;`, rustc will now look
8445         for foo.rs, then foo/mod.rs, and will generate an error when both are
8446         present.
8447       * Strings no longer contain trailing nulls. The new `std::c_str` module
8448         provides new mechanisms for converting to C strings.
8449       * The type of foreign functions is now `extern "C" fn` instead of `*u8'.
8450       * The FFI has been overhauled such that foreign functions are called directly,
8451         instead of through a stack-switching wrapper.
8452       * Calling a foreign function must be done through a Rust function with the
8453         `#[fixed_stack_segment]` attribute.
8454       * The `externfn!` macro can be used to declare both a foreign function and
8455         a `#[fixed_stack_segment]` wrapper at once.
8456       * `pub` and `priv` modifiers on `extern` blocks are no longer parsed.
8457       * `unsafe` is no longer allowed on extern fns - they are all unsafe.
8458       * `priv` is disallowed everywhere except for struct fields and enum variants.
8459       * `&T` (besides `&'static T`) is no longer allowed in `@T`.
8460       * `ref` bindings in irrefutable patterns work correctly now.
8461       * `char` is now prevented from containing invalid code points.
8462       * Casting to `bool` is no longer allowed.
8463       * `\0` is now accepted as an escape in chars and strings.
8464       * `yield` is a reserved keyword.
8465       * `typeof` is a reserved keyword.
8466       * Crates may be imported by URL with `extern mod foo = "url";`.
8467       * Explicit enum discriminants may be given as uints as in `enum E { V = 0u }`
8468       * Static vectors can be initialized with repeating elements,
8469         e.g. `static foo: [u8, .. 100]: [0, .. 100];`.
8470       * Static structs can be initialized with functional record update,
8471         e.g. `static foo: Foo = Foo { a: 5, .. bar };`.
8472       * `cfg!` can be used to conditionally execute code based on the crate
8473         configuration, similarly to `#[cfg(...)]`.
8474       * The `unnecessary_qualification` lint detects unneeded module
8475         prefixes (default: allow).
8476       * Arithmetic operations have been implemented on the SIMD types in
8477         `std::unstable::simd`.
8478       * Exchange allocation headers were removed, reducing memory usage.
8479       * `format!` implements a completely new, extensible, and higher-performance
8480         string formatting system. It will replace `fmt!`.
8481       * `print!` and `println!` write formatted strings (using the `format!`
8482         extension) to stdout.
8483       * `write!` and `writeln!` write formatted strings (using the `format!`
8484         extension) to the new Writers in `std::rt::io`.
8485       * The library section in which a function or static is placed may
8486         be specified with `#[link_section = "..."]`.
8487       * The `proto!` syntax extension for defining bounded message protocols
8488         was removed.
8489       * `macro_rules!` is hygienic for `let` declarations.
8490       * The `#[export_name]` attribute specifies the name of a symbol.
8491       * `unreachable!` can be used to indicate unreachable code, and fails
8492         if executed.
8493
8494    * Libraries
8495       * std: Transitioned to the new runtime, written in Rust.
8496       * std: Added an experimental I/O library, `rt::io`, based on the new
8497         runtime.
8498       * std: A new generic `range` function was added to the prelude, replacing
8499         `uint::range` and friends.
8500       * std: `range_rev` no longer exists. Since range is an iterator it can be
8501         reversed with `range(lo, hi).invert()`.
8502       * std: The `chain` method on option renamed to `and_then`; `unwrap_or_default`
8503         renamed to `unwrap_or`.
8504       * std: The `iterator` module was renamed to `iter`.
8505       * std: Integral types now support the `checked_add`, `checked_sub`, and
8506         `checked_mul` operations for detecting overflow.
8507       * std: Many methods in `str`, `vec`, `option, `result` were renamed for
8508         consistency.
8509       * std: Methods are standardizing on conventions for casting methods:
8510         `to_foo` for copying, `into_foo` for moving, `as_foo` for temporary
8511         and cheap casts.
8512       * std: The `CString` type in `c_str` provides new ways to convert to and
8513         from C strings.
8514       * std: `DoubleEndedIterator` can yield elements in two directions.
8515       * std: The `mut_split` method on vectors partitions an `&mut [T]` into
8516         two splices.
8517       * std: `str::from_bytes` renamed to `str::from_utf8`.
8518       * std: `pop_opt` and `shift_opt` methods added to vectors.
8519       * std: The task-local data interface no longer uses @, and keys are
8520         no longer function pointers.
8521       * std: The `swap_unwrap` method of `Option` renamed to `take_unwrap`.
8522       * std: Added `SharedPort` to `comm`.
8523       * std: `Eq` has a default method for `ne`; only `eq` is required
8524         in implementations.
8525       * std: `Ord` has default methods for `le`, `gt` and `ge`; only `lt`
8526         is required in implementations.
8527       * std: `is_utf8` performance is improved, impacting many string functions.
8528       * std: `os::MemoryMap` provides cross-platform mmap.
8529       * std: `ptr::offset` is now unsafe, but also more optimized. Offsets that
8530         are not 'in-bounds' are considered undefined.
8531       * std: Many freestanding functions in `vec` removed in favor of methods.
8532       * std: Many freestanding functions on scalar types removed in favor of
8533         methods.
8534       * std: Many options to task builders were removed since they don't make
8535         sense in the new scheduler design.
8536       * std: More containers implement `FromIterator` so can be created by the
8537         `collect` method.
8538       * std: More complete atomic types in `unstable::atomics`.
8539       * std: `comm::PortSet` removed.
8540       * std: Mutating methods in the `Set` and `Map` traits have been moved into
8541         the `MutableSet` and `MutableMap` traits. `Container::is_empty`,
8542         `Map::contains_key`, `MutableMap::insert`, and `MutableMap::remove` have
8543         default implementations.
8544       * std: Various `from_str` functions were removed in favor of a generic
8545         `from_str` which is available in the prelude.
8546       * std: `util::unreachable` removed in favor of the `unreachable!` macro.
8547       * extra: `dlist`, the doubly-linked list was modernized.
8548       * extra: Added a `hex` module with `ToHex` and `FromHex` traits.
8549       * extra: Added `glob` module, replacing `std::os::glob`.
8550       * extra: `rope` was removed.
8551       * extra: `deque` was renamed to `ringbuf`. `RingBuf` implements `Deque`.
8552       * extra: `net`, and `timer` were removed. The experimental replacements
8553         are `std::rt::io::net` and `std::rt::io::timer`.
8554       * extra: Iterators implemented for `SmallIntMap`.
8555       * extra: Iterators implemented for `Bitv` and `BitvSet`.
8556       * extra: `SmallIntSet` removed. Use `BitvSet`.
8557       * extra: Performance of JSON parsing greatly improved.
8558       * extra: `semver` updated to SemVer 2.0.0.
8559       * extra: `term` handles more terminals correctly.
8560       * extra: `dbg` module removed.
8561       * extra: `par` module removed.
8562       * extra: `future` was cleaned up, with some method renames.
8563       * extra: Most free functions in `getopts` were converted to methods.
8564
8565    * Other
8566       * rustc's debug info generation (`-Z debug-info`) is greatly improved.
8567       * rustc accepts `--target-cpu` to compile to a specific CPU architecture,
8568         similarly to gcc's `--march` flag.
8569       * rustc's performance compiling small crates is much better.
8570       * rustpkg has received many improvements.
8571       * rustpkg supports git tags as package IDs.
8572       * rustpkg builds into target-specific directories so it can be used for
8573         cross-compiling.
8574       * The number of concurrent test tasks is controlled by the environment
8575         variable RUST_TEST_TASKS.
8576       * The test harness can now report metrics for benchmarks.
8577       * All tools have man pages.
8578       * Programs compiled with `--test` now support the `-h` and `--help` flags.
8579       * The runtime uses jemalloc for allocations.
8580       * Segmented stacks are temporarily disabled as part of the transition to
8581         the new runtime. Stack overflows are possible!
8582       * A new documentation backend, rustdoc_ng, is available for use. It is
8583         still invoked through the normal `rustdoc` command.
8584
8585
8586 Version 0.7 (2013-07-03)
8587 =======================
8588
8589    * ~2000 changes, numerous bugfixes
8590
8591    * Language
8592       * `impl`s no longer accept a visibility qualifier. Put them on methods
8593         instead.
8594       * The borrow checker has been rewritten with flow-sensitivity, fixing
8595         many bugs and inconveniences.
8596       * The `self` parameter no longer implicitly means `&'self self`,
8597         and can be explicitly marked with a lifetime.
8598       * Overloadable compound operators (`+=`, etc.) have been temporarily
8599         removed due to bugs.
8600       * The `for` loop protocol now requires `for`-iterators to return `bool`
8601         so they compose better.
8602       * The `Durable` trait is replaced with the `'static` bounds.
8603       * Trait default methods work more often.
8604       * Structs with the `#[packed]` attribute have byte alignment and
8605         no padding between fields.
8606       * Type parameters bound by `Copy` must now be copied explicitly with
8607         the `copy` keyword.
8608       * It is now illegal to move out of a dereferenced unsafe pointer.
8609       * `Option<~T>` is now represented as a nullable pointer.
8610       * `@mut` does dynamic borrow checks correctly.
8611       * The `main` function is only detected at the topmost level of the crate.
8612         The `#[main]` attribute is still valid anywhere.
8613       * Struct fields may no longer be mutable. Use inherited mutability.
8614       * The `#[no_send]` attribute makes a type that would otherwise be
8615         `Send`, not.
8616       * The `#[no_freeze]` attribute makes a type that would otherwise be
8617         `Freeze`, not.
8618       * Unbounded recursion will abort the process after reaching the limit
8619         specified by the `RUST_MAX_STACK` environment variable (default: 1GB).
8620       * The `vecs_implicitly_copyable` lint mode has been removed. Vectors
8621         are never implicitly copyable.
8622       * `#[static_assert]` makes compile-time assertions about static bools.
8623       * At long last, 'argument modes' no longer exist.
8624       * The rarely used `use mod` statement no longer exists.
8625
8626    * Syntax extensions
8627       * `fail!` and `assert!` accept `~str`, `&'static str` or `fmt!`-style
8628         argument list.
8629       * `Encodable`, `Decodable`, `Ord`, `TotalOrd`, `TotalEq`, `DeepClone`,
8630         `Rand`, `Zero` and `ToStr` can all be automatically derived with
8631         `#[deriving(...)]`.
8632       * The `bytes!` macro returns a vector of bytes for string, u8, char,
8633         and unsuffixed integer literals.
8634
8635    * Libraries
8636       * The `core` crate was renamed to `std`.
8637       * The `std` crate was renamed to `extra`.
8638       * More and improved documentation.
8639       * std: `iterator` module for external iterator objects.
8640       * Many old-style (internal, higher-order function) iterators replaced by
8641         implementations of `Iterator`.
8642       * std: Many old internal vector and string iterators,
8643         incl. `any`, `all`. removed.
8644       * std: The `finalize` method of `Drop` renamed to `drop`.
8645       * std: The `drop` method now takes `&mut self` instead of `&self`.
8646       * std: The prelude no longer re-exports any modules, only types and traits.
8647       * std: Prelude additions: `print`, `println`, `FromStr`, `ApproxEq`, `Equiv`,
8648         `Iterator`, `IteratorUtil`, many numeric traits, many tuple traits.
8649       * std: New numeric traits: `Fractional`, `Real`, `RealExt`, `Integer`, `Ratio`,
8650         `Algebraic`, `Trigonometric`, `Exponential`, `Primitive`.
8651       * std: Tuple traits and accessors defined for up to 12-tuples, e.g.
8652         `(0, 1, 2).n2()` or `(0, 1, 2).n2_ref()`.
8653       * std: Many types implement `Clone`.
8654       * std: `path` type renamed to `Path`.
8655       * std: `mut` module and `Mut` type removed.
8656       * std: Many standalone functions removed in favor of methods and iterators
8657         in `vec`, `str`. In the future methods will also work as functions.
8658       * std: `reinterpret_cast` removed. Use `transmute`.
8659       * std: ascii string handling in `std::ascii`.
8660       * std: `Rand` is implemented for ~/@.
8661       * std: `run` module for spawning processes overhauled.
8662       * std: Various atomic types added to `unstable::atomic`.
8663       * std: Various types implement `Zero`.
8664       * std: `LinearMap` and `LinearSet` renamed to `HashMap` and `HashSet`.
8665       * std: Borrowed pointer functions moved from `ptr` to `borrow`.
8666       * std: Added `os::mkdir_recursive`.
8667       * std: Added `os::glob` function performs filesystems globs.
8668       * std: `FuzzyEq` renamed to `ApproxEq`.
8669       * std: `Map` now defines `pop` and `swap` methods.
8670       * std: `Cell` constructors converted to static methods.
8671       * extra: `rc` module adds the reference counted pointers, `Rc` and `RcMut`.
8672       * extra: `flate` module moved from `std` to `extra`.
8673       * extra: `fileinput` module for iterating over a series of files.
8674       * extra: `Complex` number type and `complex` module.
8675       * extra: `Rational` number type and `rational` module.
8676       * extra: `BigInt`, `BigUint` implement numeric and comparison traits.
8677       * extra: `term` uses terminfo now, is more correct.
8678       * extra: `arc` functions converted to methods.
8679       * extra: Implementation of fixed output size variations of SHA-2.
8680
8681    * Tooling
8682       * `unused_variables` lint mode for unused variables (default: warn).
8683       * `unused_unsafe` lint mode for detecting unnecessary `unsafe` blocks
8684         (default: warn).
8685       * `unused_mut` lint mode for identifying unused `mut` qualifiers
8686         (default: warn).
8687       * `dead_assignment` lint mode for unread variables (default: warn).
8688       * `unnecessary_allocation` lint mode detects some heap allocations that are
8689         immediately borrowed so could be written without allocating (default: warn).
8690       * `missing_doc` lint mode (default: allow).
8691       * `unreachable_code` lint mode (default: warn).
8692       * The `rusti` command has been rewritten and a number of bugs addressed.
8693       * rustc outputs in color on more terminals.
8694       * rustc accepts a `--link-args` flag to pass arguments to the linker.
8695       * rustc accepts a `-Z print-link-args` flag for debugging linkage.
8696       * Compiling with `-g` will make the binary record information about
8697         dynamic borrowcheck failures for debugging.
8698       * rustdoc has a nicer stylesheet.
8699       * Various improvements to rustdoc.
8700       * Improvements to rustpkg (see the detailed release notes).
8701
8702
8703 Version 0.6 (2013-04-03)
8704 ========================
8705
8706    * ~2100 changes, numerous bugfixes
8707
8708    * Syntax changes
8709       * The self type parameter in traits is now spelled `Self`
8710       * The `self` parameter in trait and impl methods must now be explicitly
8711         named (for example: `fn f(&self) { }`). Implicit self is deprecated.
8712       * Static methods no longer require the `static` keyword and instead
8713         are distinguished by the lack of a `self` parameter
8714       * Replaced the `Durable` trait with the `'static` lifetime
8715       * The old closure type syntax with the trailing sigil has been
8716         removed in favor of the more consistent leading sigil
8717       * `super` is a keyword, and may be prefixed to paths
8718       * Trait bounds are separated with `+` instead of whitespace
8719       * Traits are implemented with `impl Trait for Type`
8720         instead of `impl Type: Trait`
8721       * Lifetime syntax is now `&'l foo` instead of `&l/foo`
8722       * The `export` keyword has finally been removed
8723       * The `move` keyword has been removed (see "Semantic changes")
8724       * The interior mutability qualifier on vectors, `[mut T]`, has been
8725         removed. Use `&mut [T]`, etc.
8726       * `mut` is no longer valid in `~mut T`. Use inherited mutability
8727       * `fail` is no longer a keyword. Use `fail!()`
8728       * `assert` is no longer a keyword. Use `assert!()`
8729       * `log` is no longer a keyword. use `debug!`, etc.
8730       * 1-tuples may be represented as `(T,)`
8731       * Struct fields may no longer be `mut`. Use inherited mutability,
8732         `@mut T`, `core::mut` or `core::cell`
8733       * `extern mod { ... }` is no longer valid syntax for foreign
8734         function modules. Use extern blocks: `extern { ... }`
8735       * Newtype enums removed. Use tuple-structs.
8736       * Trait implementations no longer support visibility modifiers
8737       * Pattern matching over vectors improved and expanded
8738       * `const` renamed to `static` to correspond to lifetime name,
8739         and make room for future `static mut` unsafe mutable globals.
8740       * Replaced `#[deriving_eq]` with `#[deriving(Eq)]`, etc.
8741       * `Clone` implementations can be automatically generated with
8742         `#[deriving(Clone)]`
8743       * Casts to traits must use a pointer sigil, e.g. `@foo as @Bar`
8744         instead of `foo as Bar`.
8745       * Fixed length vector types are now written as `[int, .. 3]`
8746         instead of `[int * 3]`.
8747       * Fixed length vector types can express the length as a constant
8748         expression. (ex: `[int, .. GL_BUFFER_SIZE - 2]`)
8749
8750    * Semantic changes
8751       * Types with owned pointers or custom destructors move by default,
8752         eliminating the `move` keyword
8753       * All foreign functions are considered unsafe
8754       * &mut is now unaliasable
8755       * Writes to borrowed @mut pointers are prevented dynamically
8756       * () has size 0
8757       * The name of the main function can be customized using #[main]
8758       * The default type of an inferred closure is &fn instead of @fn
8759       * `use` statements may no longer be "chained" - they cannot import
8760         identifiers imported by previous `use` statements
8761       * `use` statements are crate relative, importing from the "top"
8762         of the crate by default. Paths may be prefixed with `super::`
8763         or `self::` to change the search behavior.
8764       * Method visibility is inherited from the implementation declaration
8765       * Structural records have been removed
8766       * Many more types can be used in static items, including enums
8767         'static-lifetime pointers and vectors
8768       * Pattern matching over vectors improved and expanded
8769       * Typechecking of closure types has been overhauled to
8770         improve inference and eliminate unsoundness
8771       * Macros leave scope at the end of modules, unless that module is
8772         tagged with #[macro_escape]
8773
8774    * Libraries
8775       * Added big integers to `std::bigint`
8776       * Removed `core::oldcomm` module
8777       * Added pipe-based `core::comm` module
8778       * Numeric traits have been reorganized under `core::num`
8779       * `vec::slice` finally returns a slice
8780       * `debug!` and friends don't require a format string, e.g. `debug!(Foo)`
8781       * Containers reorganized around traits in `core::container`
8782       * `core::dvec` removed, `~[T]` is a drop-in replacement
8783       * `core::send_map` renamed to `core::hashmap`
8784       * `std::map` removed; replaced with `core::hashmap`
8785       * `std::treemap` reimplemented as an owned balanced tree
8786       * `std::deque` and `std::smallintmap` reimplemented as owned containers
8787       * `core::trie` added as a fast ordered map for integer keys
8788       * Set types added to `core::hashmap`, `core::trie` and `std::treemap`
8789       * `Ord` split into `Ord` and `TotalOrd`. `Ord` is still used to
8790         overload the comparison operators, whereas `TotalOrd` is used
8791         by certain container types
8792
8793    * Other
8794       * Replaced the 'cargo' package manager with 'rustpkg'
8795       * Added all-purpose 'rust' tool
8796       * `rustc --test` now supports benchmarks with the `#[bench]` attribute
8797       * rustc now *attempts* to offer spelling suggestions
8798       * Improved support for ARM and Android
8799       * Preliminary MIPS backend
8800       * Improved foreign function ABI implementation for x86, x86_64
8801       * Various memory usage improvements
8802       * Rust code may be embedded in foreign code under limited circumstances
8803       * Inline assembler supported by new asm!() syntax extension.
8804
8805
8806 Version 0.5 (2012-12-21)
8807 ===========================
8808
8809    * ~900 changes, numerous bugfixes
8810
8811    * Syntax changes
8812       * Removed `<-` move operator
8813       * Completed the transition from the `#fmt` extension syntax to `fmt!`
8814       * Removed old fixed length vector syntax - `[T]/N`
8815       * New token-based quasi-quoters, `quote_tokens!`, `quote_expr!`, etc.
8816       * Macros may now expand to items and statements
8817       * `a.b()` is always parsed as a method call, never as a field projection
8818       * `Eq` and `IterBytes` implementations can be automatically generated
8819         with `#[deriving_eq]` and `#[deriving_iter_bytes]` respectively
8820       * Removed the special crate language for `.rc` files
8821       * Function arguments may consist of any irrefutable pattern
8822
8823    * Semantic changes
8824       * `&` and `~` pointers may point to objects
8825       * Tuple structs - `struct Foo(Bar, Baz)`. Will replace newtype enums.
8826       * Enum variants may be structs
8827       * Destructors can be added to all nominal types with the Drop trait
8828       * Structs and nullary enum variants may be constants
8829       * Values that cannot be implicitly copied are now automatically moved
8830         without writing `move` explicitly
8831       * `&T` may now be coerced to `*T`
8832       * Coercions happen in `let` statements as well as function calls
8833       * `use` statements now take crate-relative paths
8834       * The module and type namespaces have been merged so that static
8835         method names can be resolved under the trait in which they are
8836         declared
8837
8838    * Improved support for language features
8839       * Trait inheritance works in many scenarios
8840       * More support for explicit self arguments in methods - `self`, `&self`
8841         `@self`, and `~self` all generally work as expected
8842       * Static methods work in more situations
8843       * Experimental: Traits may declare default methods for the implementations
8844         to use
8845
8846    * Libraries
8847       * New condition handling system in `core::condition`
8848       * Timsort added to `std::sort`
8849       * New priority queue, `std::priority_queue`
8850       * Pipes for serializable types, `std::flatpipes'
8851       * Serialization overhauled to be trait-based
8852       * Expanded `getopts` definitions
8853       * Moved futures to `std`
8854       * More functions are pure now
8855       * `core::comm` renamed to `oldcomm`. Still deprecated
8856       * `rustdoc` and `cargo` are libraries now
8857
8858    * Misc
8859       * Added a preliminary REPL, `rusti`
8860       * License changed from MIT to dual MIT/APL2
8861
8862
8863 Version 0.4 (2012-10-15)
8864 ==========================
8865
8866    * ~2000 changes, numerous bugfixes
8867
8868    * Syntax
8869       * All keywords are now strict and may not be used as identifiers anywhere
8870       * Keyword removal: 'again', 'import', 'check', 'new', 'owned', 'send',
8871         'of', 'with', 'to', 'class'.
8872       * Classes are replaced with simpler structs
8873       * Explicit method self types
8874       * `ret` became `return` and `alt` became `match`
8875       * `import` is now `use`; `use is now `extern mod`
8876       * `extern mod { ... }` is now `extern { ... }`
8877       * `use mod` is the recommended way to import modules
8878       * `pub` and `priv` replace deprecated export lists
8879       * The syntax of `match` pattern arms now uses fat arrow (=>)
8880       * `main` no longer accepts an args vector; use `os::args` instead
8881
8882    * Semantics
8883       * Trait implementations are now coherent, ala Haskell typeclasses
8884       * Trait methods may be static
8885       * Argument modes are deprecated
8886       * Borrowed pointers are much more mature and recommended for use
8887       * Strings and vectors in the static region are stored in constant memory
8888       * Typestate was removed
8889       * Resolution rewritten to be more reliable
8890       * Support for 'dual-mode' data structures (freezing and thawing)
8891
8892    * Libraries
8893       * Most binary operators can now be overloaded via the traits in
8894         `core::ops'
8895       * `std::net::url` for representing URLs
8896       * Sendable hash maps in `core::send_map`
8897       * `core::task' gained a (currently unsafe) task-local storage API
8898
8899    * Concurrency
8900       * An efficient new intertask communication primitive called the pipe,
8901         along with a number of higher-level channel types, in `core::pipes`
8902       * `std::arc`, an atomically reference counted, immutable, shared memory
8903         type
8904       * `std::sync`, various exotic synchronization tools based on arcs and pipes
8905       * Futures are now based on pipes and sendable
8906       * More robust linked task failure
8907       * Improved task builder API
8908
8909    * Other
8910       * Improved error reporting
8911       * Preliminary JIT support
8912       * Preliminary work on precise GC
8913       * Extensive architectural improvements to rustc
8914       * Begun a transition away from buggy C++-based reflection (shape) code to
8915         Rust-based (visitor) code
8916       * All hash functions and tables converted to secure, randomized SipHash
8917
8918
8919 Version 0.3  (2012-07-12)
8920 ========================
8921
8922    * ~1900 changes, numerous bugfixes
8923
8924    * New coding conveniences
8925       * Integer-literal suffix inference
8926       * Per-item control over warnings, errors
8927       * #[cfg(windows)] and #[cfg(unix)] attributes
8928       * Documentation comments
8929       * More compact closure syntax
8930       * 'do' expressions for treating higher-order functions as
8931         control structures
8932       * *-patterns (wildcard extended to all constructor fields)
8933
8934    * Semantic cleanup
8935       * Name resolution pass and exhaustiveness checker rewritten
8936       * Region pointers and borrow checking supersede alias
8937         analysis
8938       * Init-ness checking is now provided by a region-based liveness
8939         pass instead of the typestate pass; same for last-use analysis
8940       * Extensive work on region pointers
8941
8942    * Experimental new language features
8943       * Slices and fixed-size, interior-allocated vectors
8944       * #!-comments for lang versioning, shell execution
8945       * Destructors and iface implementation for classes;
8946         type-parameterized classes and class methods
8947       * 'const' type kind for types that can be used to implement
8948         shared-memory concurrency patterns
8949
8950    * Type reflection
8951
8952    * Removal of various obsolete features
8953       * Keywords: 'be', 'prove', 'syntax', 'note', 'mutable', 'bind',
8954                  'crust', 'native' (now 'extern'), 'cont' (now 'again')
8955
8956       * Constructs: do-while loops ('do' repurposed), fn binding,
8957                     resources (replaced by destructors)
8958
8959    * Compiler reorganization
8960       * Syntax-layer of compiler split into separate crate
8961       * Clang (from LLVM project) integrated into build
8962       * Typechecker split into sub-modules
8963
8964    * New library code
8965       * New time functions
8966       * Extension methods for many built-in types
8967       * Arc: atomic-refcount read-only / exclusive-use shared cells
8968       * Par: parallel map and search routines
8969       * Extensive work on libuv interface
8970       * Much vector code moved to libraries
8971       * Syntax extensions: #line, #col, #file, #mod, #stringify,
8972         #include, #include_str, #include_bin
8973
8974    * Tool improvements
8975       * Cargo automatically resolves dependencies
8976
8977
8978 Version 0.2  (2012-03-29)
8979 =========================
8980
8981    * >1500 changes, numerous bugfixes
8982
8983    * New docs and doc tooling
8984
8985    * New port: FreeBSD x86_64
8986
8987    * Compilation model enhancements
8988       * Generics now specialized, multiply instantiated
8989       * Functions now inlined across separate crates
8990
8991    * Scheduling, stack and threading fixes
8992       * Noticeably improved message-passing performance
8993       * Explicit schedulers
8994       * Callbacks from C
8995       * Helgrind clean
8996
8997    * Experimental new language features
8998       * Operator overloading
8999       * Region pointers
9000       * Classes
9001
9002    * Various language extensions
9003       * C-callback function types: 'crust fn ...'
9004       * Infinite-loop construct: 'loop { ... }'
9005       * Shorten 'mutable' to 'mut'
9006       * Required mutable-local qualifier: 'let mut ...'
9007       * Basic glob-exporting: 'export foo::*;'
9008       * Alt now exhaustive, 'alt check' for runtime-checked
9009       * Block-function form of 'for' loop, with 'break' and 'ret'.
9010
9011    * New library code
9012       * AST quasi-quote syntax extension
9013       * Revived libuv interface
9014       * New modules: core::{future, iter}, std::arena
9015       * Merged per-platform std::{os*, fs*} to core::{libc, os}
9016       * Extensive cleanup, regularization in libstd, libcore
9017
9018
9019 Version 0.1  (2012-01-20)
9020 ===============================
9021
9022    * Most language features work, including:
9023       * Unique pointers, unique closures, move semantics
9024       * Interface-constrained generics
9025       * Static interface dispatch
9026       * Stack growth
9027       * Multithread task scheduling
9028       * Typestate predicates
9029       * Failure unwinding, destructors
9030       * Pattern matching and destructuring assignment
9031       * Lightweight block-lambda syntax
9032       * Preliminary macro-by-example
9033
9034    * Compiler works with the following configurations:
9035       * Linux: x86 and x86_64 hosts and targets
9036       * macOS: x86 and x86_64 hosts and targets
9037       * Windows: x86 hosts and targets
9038
9039    * Cross compilation / multi-target configuration supported.
9040
9041    * Preliminary API-documentation and package-management tools included.
9042
9043 Known issues:
9044
9045    * Documentation is incomplete.
9046
9047    * Performance is below intended target.
9048
9049    * Standard library APIs are subject to extensive change, reorganization.
9050
9051    * Language-level versioning is not yet operational - future code will
9052      break unexpectedly.