]> git.proxmox.com Git - rustc.git/blob - RELEASES.md
New upstream version 1.43.0+dfsg1
[rustc.git] / RELEASES.md
1 Version 1.43.0 (2020-04-23)
2 ==========================
3
4 Language
5 --------
6 - [Fixed using binary operations with `&{number}` (e.g. `&1.0`) not having
7 the type inferred correctly.][68129]
8 - [Attributes such as `#[cfg()]` can now be used on `if` expressions.][69201]
9
10 **Syntax only changes**
11 - [Allow `type Foo: Ord` syntactically.][69361]
12 - [Fuse associated and extern items up to defaultness.][69194]
13 - [Syntactically allow `self` in all `fn` contexts.][68764]
14 - [Merge `fn` syntax + cleanup item parsing.][68728]
15 - [`item` macro fragments can be interpolated into `trait`s, `impl`s, and `extern` blocks.][69366]
16 For example, you may now write:
17 ```rust
18 macro_rules! mac_trait {
19 ($i:item) => {
20 trait T { $i }
21 }
22 }
23 mac_trait! {
24 fn foo() {}
25 }
26 ```
27
28 These are still rejected *semantically*, so you will likely receive an error but
29 these changes can be seen and parsed by macros and
30 conditional compilation.
31
32
33 Compiler
34 --------
35 - [You can now pass multiple lint flags to rustc to override the previous
36 flags.][67885] For example; `rustc -D unused -A unused-variables` denies
37 everything in the `unused` lint group except `unused-variables` which
38 is explicitly allowed. However, passing `rustc -A unused-variables -D unused` denies
39 everything in the `unused` lint group **including** `unused-variables` since
40 the allow flag is specified before the deny flag (and therefore overridden).
41 - [rustc will now prefer your system MinGW libraries over its bundled libraries
42 if they are available on `windows-gnu`.][67429]
43 - [rustc now buffers errors/warnings printed in JSON.][69227]
44
45 Libraries
46 ---------
47 - [`Arc<[T; N]>`, `Box<[T; N]>`, and `Rc<[T; N]>`, now implement
48 `TryFrom<Arc<[T]>>`,`TryFrom<Box<[T]>>`, and `TryFrom<Rc<[T]>>`
49 respectively.][69538] **Note** These conversions are only available when `N`
50 is `0..=32`.
51 - [You can now use associated constants on floats and integers directly, rather
52 than having to import the module.][68952] e.g. You can now write `u32::MAX` or
53 `f32::NAN` with no imports.
54 - [`u8::is_ascii` is now `const`.][68984]
55 - [`String` now implements `AsMut<str>`.][68742]
56 - [Added the `primitive` module to `std` and `core`.][67637] This module
57 reexports Rust's primitive types. This is mainly useful in macros
58 where you want avoid these types being shadowed.
59 - [Relaxed some of the trait bounds on `HashMap` and `HashSet`.][67642]
60 - [`string::FromUtf8Error` now implements `Clone + Eq`.][68738]
61
62 Stabilized APIs
63 ---------------
64 - [`Once::is_completed`]
65 - [`f32::LOG10_2`]
66 - [`f32::LOG2_10`]
67 - [`f64::LOG10_2`]
68 - [`f64::LOG2_10`]
69 - [`iter::once_with`]
70
71 Cargo
72 -----
73 - [You can now set config `[profile]`s in your `.cargo/config`, or through
74 your environment.][cargo/7823]
75 - [Cargo will now set `CARGO_BIN_EXE_<name>` pointing to a binary's
76 executable path when running integration tests or benchmarks.][cargo/7697]
77 `<name>` is the name of your binary as-is e.g. If you wanted the executable
78 path for a binary named `my-program`you would use `env!("CARGO_BIN_EXE_my-program")`.
79
80 Misc
81 ----
82 - [Certain checks in the `const_err` lint were deemed unrelated to const
83 evaluation][69185], and have been moved to the `unconditional_panic` and
84 `arithmetic_overflow` lints.
85
86 Compatibility Notes
87 -------------------
88
89 - [Having trailing syntax in the `assert!` macro is now a hard error.][69548] This
90 has been a warning since 1.36.0.
91 - [Fixed `Self` not having the correctly inferred type.][69340] This incorrectly
92 led to some instances being accepted, and now correctly emits a hard error.
93
94 [69340]: https://github.com/rust-lang/rust/pull/69340
95
96 Internal Only
97 -------------
98 These changes provide no direct user facing benefits, but represent significant
99 improvements to the internals and overall performance of `rustc` and
100 related tools.
101
102 - [All components are now built with `opt-level=3` instead of `2`.][67878]
103 - [Improved how rustc generates drop code.][67332]
104 - [Improved performance from `#[inline]`-ing certain hot functions.][69256]
105 - [traits: preallocate 2 Vecs of known initial size][69022]
106 - [Avoid exponential behaviour when relating types][68772]
107 - [Skip `Drop` terminators for enum variants without drop glue][68943]
108 - [Improve performance of coherence checks][68966]
109 - [Deduplicate types in the generator witness][68672]
110 - [Invert control in struct_lint_level.][68725]
111
112 [67332]: https://github.com/rust-lang/rust/pull/67332/
113 [67429]: https://github.com/rust-lang/rust/pull/67429/
114 [67637]: https://github.com/rust-lang/rust/pull/67637/
115 [67642]: https://github.com/rust-lang/rust/pull/67642/
116 [67878]: https://github.com/rust-lang/rust/pull/67878/
117 [67885]: https://github.com/rust-lang/rust/pull/67885/
118 [68129]: https://github.com/rust-lang/rust/pull/68129/
119 [68672]: https://github.com/rust-lang/rust/pull/68672/
120 [68725]: https://github.com/rust-lang/rust/pull/68725/
121 [68728]: https://github.com/rust-lang/rust/pull/68728/
122 [68738]: https://github.com/rust-lang/rust/pull/68738/
123 [68742]: https://github.com/rust-lang/rust/pull/68742/
124 [68764]: https://github.com/rust-lang/rust/pull/68764/
125 [68772]: https://github.com/rust-lang/rust/pull/68772/
126 [68943]: https://github.com/rust-lang/rust/pull/68943/
127 [68952]: https://github.com/rust-lang/rust/pull/68952/
128 [68966]: https://github.com/rust-lang/rust/pull/68966/
129 [68984]: https://github.com/rust-lang/rust/pull/68984/
130 [69022]: https://github.com/rust-lang/rust/pull/69022/
131 [69185]: https://github.com/rust-lang/rust/pull/69185/
132 [69194]: https://github.com/rust-lang/rust/pull/69194/
133 [69201]: https://github.com/rust-lang/rust/pull/69201/
134 [69227]: https://github.com/rust-lang/rust/pull/69227/
135 [69548]: https://github.com/rust-lang/rust/pull/69548/
136 [69256]: https://github.com/rust-lang/rust/pull/69256/
137 [69361]: https://github.com/rust-lang/rust/pull/69361/
138 [69366]: https://github.com/rust-lang/rust/pull/69366/
139 [69538]: https://github.com/rust-lang/rust/pull/69538/
140 [cargo/7823]: https://github.com/rust-lang/cargo/pull/7823
141 [cargo/7697]: https://github.com/rust-lang/cargo/pull/7697
142 [`Once::is_completed`]: https://doc.rust-lang.org/std/sync/struct.Once.html#method.is_completed
143 [`f32::LOG10_2`]: https://doc.rust-lang.org/std/f32/consts/constant.LOG10_2.html
144 [`f32::LOG2_10`]: https://doc.rust-lang.org/std/f32/consts/constant.LOG2_10.html
145 [`f64::LOG10_2`]: https://doc.rust-lang.org/std/f64/consts/constant.LOG10_2.html
146 [`f64::LOG2_10`]: https://doc.rust-lang.org/std/f64/consts/constant.LOG2_10.html
147 [`iter::once_with`]: https://doc.rust-lang.org/std/iter/fn.once_with.html
148
149
150 Version 1.42.0 (2020-03-12)
151 ==========================
152
153 Language
154 --------
155 - [You can now use the slice pattern syntax with subslices.][67712] e.g.
156 ```rust
157 fn foo(words: &[&str]) {
158 match words {
159 ["Hello", "World", "!", ..] => println!("Hello World!"),
160 ["Foo", "Bar", ..] => println!("Baz"),
161 rest => println!("{:?}", rest),
162 }
163 }
164 ```
165 - [You can now use `#[repr(transparent)]` on univariant `enum`s.][68122] Meaning
166 that you can create an enum that has the exact layout and ABI of the type
167 it contains.
168 - [There are some *syntax-only* changes:][67131]
169 - `default` is syntactically allowed before items in `trait` definitions.
170 - Items in `impl`s (i.e. `const`s, `type`s, and `fn`s) may syntactically
171 leave out their bodies in favor of `;`.
172 - Bounds on associated types in `impl`s are now syntactically allowed
173 (e.g. `type Foo: Ord;`).
174 - `...` (the C-variadic type) may occur syntactically directly as the type of
175 any function parameter.
176
177 These are still rejected *semantically*, so you will likely receive an error
178 but these changes can be seen and parsed by procedural macros and
179 conditional compilation.
180
181 Compiler
182 --------
183 - [Added tier 2\* support for `armv7a-none-eabi`.][68253]
184 - [Added tier 2 support for `riscv64gc-unknown-linux-gnu`.][68339]
185 - [`Option::{expect,unwrap}` and
186 `Result::{expect, expect_err, unwrap, unwrap_err}` now produce panic messages
187 pointing to the location where they were called, rather than
188 `core`'s internals. ][67887]
189
190 \* Refer to Rust's [platform support page][forge-platform-support] for more
191 information on Rust's tiered platform support.
192
193 Libraries
194 ---------
195 - [`iter::Empty<T>` now implements `Send` and `Sync` for any `T`.][68348]
196 - [`Pin::{map_unchecked, map_unchecked_mut}` no longer require the return type
197 to implement `Sized`.][67935]
198 - [`io::Cursor` now derives `PartialEq` and `Eq`.][67233]
199 - [`Layout::new` is now `const`.][66254]
200 - [Added Standard Library support for `riscv64gc-unknown-linux-gnu`.][66899]
201
202
203 Stabilized APIs
204 ---------------
205 - [`CondVar::wait_while`]
206 - [`CondVar::wait_timeout_while`]
207 - [`DebugMap::key`]
208 - [`DebugMap::value`]
209 - [`ManuallyDrop::take`]
210 - [`matches!`]
211 - [`ptr::slice_from_raw_parts_mut`]
212 - [`ptr::slice_from_raw_parts`]
213
214 Cargo
215 -----
216 - [You no longer need to include `extern crate proc_macro;` to be able to
217 `use proc_macro;` in the `2018` edition.][cargo/7700]
218
219 Compatibility Notes
220 -------------------
221 - [`Error::description` has been deprecated, and its use will now produce a
222 warning.][66919] It's recommended to use `Display`/`to_string` instead.
223
224 [68253]: https://github.com/rust-lang/rust/pull/68253/
225 [68348]: https://github.com/rust-lang/rust/pull/68348/
226 [67935]: https://github.com/rust-lang/rust/pull/67935/
227 [68339]: https://github.com/rust-lang/rust/pull/68339/
228 [68122]: https://github.com/rust-lang/rust/pull/68122/
229 [67712]: https://github.com/rust-lang/rust/pull/67712/
230 [67887]: https://github.com/rust-lang/rust/pull/67887/
231 [67131]: https://github.com/rust-lang/rust/pull/67131/
232 [67233]: https://github.com/rust-lang/rust/pull/67233/
233 [66899]: https://github.com/rust-lang/rust/pull/66899/
234 [66919]: https://github.com/rust-lang/rust/pull/66919/
235 [66254]: https://github.com/rust-lang/rust/pull/66254/
236 [cargo/7700]: https://github.com/rust-lang/cargo/pull/7700
237 [`DebugMap::key`]: https://doc.rust-lang.org/stable/std/fmt/struct.DebugMap.html#method.key
238 [`DebugMap::value`]: https://doc.rust-lang.org/stable/std/fmt/struct.DebugMap.html#method.value
239 [`ManuallyDrop::take`]: https://doc.rust-lang.org/stable/std/mem/struct.ManuallyDrop.html#method.take
240 [`matches!`]: https://doc.rust-lang.org/stable/std/macro.matches.html
241 [`ptr::slice_from_raw_parts_mut`]: https://doc.rust-lang.org/stable/std/ptr/fn.slice_from_raw_parts_mut.html
242 [`ptr::slice_from_raw_parts`]: https://doc.rust-lang.org/stable/std/ptr/fn.slice_from_raw_parts.html
243 [`CondVar::wait_while`]: https://doc.rust-lang.org/stable/std/sync/struct.Condvar.html#method.wait_while
244 [`CondVar::wait_timeout_while`]: https://doc.rust-lang.org/stable/std/sync/struct.Condvar.html#method.wait_timeout_while
245
246
247 Version 1.41.1 (2020-02-27)
248 ===========================
249
250 * [Always check types of static items][69145]
251 * [Always check lifetime bounds of `Copy` impls][69145]
252 * [Fix miscompilation in callers of `Layout::repeat`][69225]
253
254 [69225]: https://github.com/rust-lang/rust/issues/69225
255 [69145]: https://github.com/rust-lang/rust/pull/69145
256
257
258 Version 1.41.0 (2020-01-30)
259 ===========================
260
261 Language
262 --------
263
264 - [You can now pass type parameters to foreign items when implementing
265 traits.][65879] E.g. You can now write `impl<T> From<Foo> for Vec<T> {}`.
266 - [You can now arbitrarily nest receiver types in the `self` position.][64325] E.g. you can
267 now write `fn foo(self: Box<Box<Self>>) {}`. Previously only `Self`, `&Self`,
268 `&mut Self`, `Arc<Self>`, `Rc<Self>`, and `Box<Self>` were allowed.
269 - [You can now use any valid identifier in a `format_args` macro.][66847]
270 Previously identifiers starting with an underscore were not allowed.
271 - [Visibility modifiers (e.g. `pub`) are now syntactically allowed on trait items and
272 enum variants.][66183] These are still rejected semantically, but
273 can be seen and parsed by procedural macros and conditional compilation.
274
275 Compiler
276 --------
277
278 - [Rustc will now warn if you have unused loop `'label`s.][66325]
279 - [Removed support for the `i686-unknown-dragonfly` target.][67255]
280 - [Added tier 3 support\* for the `riscv64gc-unknown-linux-gnu` target.][66661]
281 - [You can now pass an arguments file passing the `@path` syntax
282 to rustc.][66172] Note that the format differs somewhat from what is
283 found in other tooling; please see [the documentation][argfile-docs] for
284 more information.
285 - [You can now provide `--extern` flag without a path, indicating that it is
286 available from the search path or specified with an `-L` flag.][64882]
287
288 \* Refer to Rust's [platform support page][forge-platform-support] for more
289 information on Rust's tiered platform support.
290
291 [argfile-docs]: https://doc.rust-lang.org/nightly/rustc/command-line-arguments.html#path-load-command-line-flags-from-a-path
292
293 Libraries
294 ---------
295
296 - [The `core::panic` module is now stable.][66771] It was already stable
297 through `std`.
298 - [`NonZero*` numerics now implement `From<NonZero*>` if it's a smaller integer
299 width.][66277] E.g. `NonZeroU16` now implements `From<NonZeroU8>`.
300 - [`MaybeUninit<T>` now implements `fmt::Debug`.][65013]
301
302 Stabilized APIs
303 ---------------
304
305 - [`Result::map_or`]
306 - [`Result::map_or_else`]
307 - [`std::rc::Weak::weak_count`]
308 - [`std::rc::Weak::strong_count`]
309 - [`std::sync::Weak::weak_count`]
310 - [`std::sync::Weak::strong_count`]
311
312 Cargo
313 -----
314
315 - [Cargo will now document all the private items for binary crates
316 by default.][cargo/7593]
317 - [`cargo-install` will now reinstall the package if it detects that it is out
318 of date.][cargo/7560]
319 - [Cargo.lock now uses a more git friendly format that should help to reduce
320 merge conflicts.][cargo/7579]
321 - [You can now override specific dependencies's build settings][cargo/7591] E.g.
322 `[profile.dev.package.image] opt-level = 2` sets the `image` crate's
323 optimisation level to `2` for debug builds. You can also use
324 `[profile.<profile>.build-override]` to override build scripts and
325 their dependencies.
326
327 Misc
328 ----
329
330 - [You can now specify `edition` in documentation code blocks to compile the block
331 for that edition.][66238] E.g. `edition2018` tells rustdoc that the code sample
332 should be compiled the 2018 edition of Rust.
333 - [You can now provide custom themes to rustdoc with `--theme`, and check the
334 current theme with `--check-theme`.][54733]
335 - [You can use `#[cfg(doc)]` to compile an item when building documentation.][61351]
336
337 Compatibility Notes
338 -------------------
339
340 - [As previously announced 1.41.0 will be the last tier 1 release for 32-bit
341 Apple targets.][apple-32bit-drop] This means that the source code is still
342 available to build, but the targets are no longer being tested and release
343 binaries for those platforms will no longer be distributed by the Rust project.
344 Please refer to the linked blog post for more information.
345
346 [54733]: https://github.com/rust-lang/rust/pull/54733/
347 [61351]: https://github.com/rust-lang/rust/pull/61351/
348 [67255]: https://github.com/rust-lang/rust/pull/67255/
349 [66661]: https://github.com/rust-lang/rust/pull/66661/
350 [66771]: https://github.com/rust-lang/rust/pull/66771/
351 [66847]: https://github.com/rust-lang/rust/pull/66847/
352 [66238]: https://github.com/rust-lang/rust/pull/66238/
353 [66277]: https://github.com/rust-lang/rust/pull/66277/
354 [66325]: https://github.com/rust-lang/rust/pull/66325/
355 [66172]: https://github.com/rust-lang/rust/pull/66172/
356 [66183]: https://github.com/rust-lang/rust/pull/66183/
357 [65879]: https://github.com/rust-lang/rust/pull/65879/
358 [65013]: https://github.com/rust-lang/rust/pull/65013/
359 [64882]: https://github.com/rust-lang/rust/pull/64882/
360 [64325]: https://github.com/rust-lang/rust/pull/64325/
361 [cargo/7560]: https://github.com/rust-lang/cargo/pull/7560/
362 [cargo/7579]: https://github.com/rust-lang/cargo/pull/7579/
363 [cargo/7591]: https://github.com/rust-lang/cargo/pull/7591/
364 [cargo/7593]: https://github.com/rust-lang/cargo/pull/7593/
365 [`Result::map_or_else`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.map_or_else
366 [`Result::map_or`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.map_or
367 [`std::rc::Weak::weak_count`]: https://doc.rust-lang.org/std/rc/struct.Weak.html#method.weak_count
368 [`std::rc::Weak::strong_count`]: https://doc.rust-lang.org/std/rc/struct.Weak.html#method.strong_count
369 [`std::sync::Weak::weak_count`]: https://doc.rust-lang.org/std/sync/struct.Weak.html#method.weak_count
370 [`std::sync::Weak::strong_count`]: https://doc.rust-lang.org/std/sync/struct.Weak.html#method.strong_count
371 [apple-32bit-drop]: https://blog.rust-lang.org/2020/01/03/reducing-support-for-32-bit-apple-targets.html
372
373 Version 1.40.0 (2019-12-19)
374 ===========================
375
376 Language
377 --------
378 - [You can now use tuple `struct`s and tuple `enum` variant's constructors in
379 `const` contexts.][65188] e.g.
380
381 ```rust
382 pub struct Point(i32, i32);
383
384 const ORIGIN: Point = {
385 let constructor = Point;
386
387 constructor(0, 0)
388 };
389 ```
390
391 - [You can now mark `struct`s, `enum`s, and `enum` variants with the `#[non_exhaustive]` attribute to
392 indicate that there may be variants or fields added in the future.][64639]
393 For example this requires adding a wild-card branch (`_ => {}`) to any match
394 statements on a non-exhaustive `enum`. [(RFC 2008)]
395 - [You can now use function-like procedural macros in `extern` blocks and in
396 type positions.][63931] e.g. `type Generated = macro!();`
397 - [Function-like and attribute procedural macros can now emit
398 `macro_rules!` items, so you can now have your macros generate macros.][64035]
399 - [The `meta` pattern matcher in `macro_rules!` now correctly matches the modern
400 attribute syntax.][63674] For example `(#[$m:meta])` now matches `#[attr]`,
401 `#[attr{tokens}]`, `#[attr[tokens]]`, and `#[attr(tokens)]`.
402
403 Compiler
404 --------
405 - [Added tier 3 support\* for the
406 `thumbv7neon-unknown-linux-musleabihf` target.][66103]
407 - [Added tier 3 support for the
408 `aarch64-unknown-none-softfloat` target.][64589]
409 - [Added tier 3 support for the `mips64-unknown-linux-muslabi64`, and
410 `mips64el-unknown-linux-muslabi64` targets.][65843]
411
412 \* Refer to Rust's [platform support page][forge-platform-support] for more
413 information on Rust's tiered platform support.
414
415 Libraries
416 ---------
417 - [The `is_power_of_two` method on unsigned numeric types is now a `const` function.][65092]
418
419 Stabilized APIs
420 ---------------
421 - [`BTreeMap::get_key_value`]
422 - [`HashMap::get_key_value`]
423 - [`Option::as_deref_mut`]
424 - [`Option::as_deref`]
425 - [`Option::flatten`]
426 - [`UdpSocket::peer_addr`]
427 - [`f32::to_be_bytes`]
428 - [`f32::to_le_bytes`]
429 - [`f32::to_ne_bytes`]
430 - [`f64::to_be_bytes`]
431 - [`f64::to_le_bytes`]
432 - [`f64::to_ne_bytes`]
433 - [`f32::from_be_bytes`]
434 - [`f32::from_le_bytes`]
435 - [`f32::from_ne_bytes`]
436 - [`f64::from_be_bytes`]
437 - [`f64::from_le_bytes`]
438 - [`f64::from_ne_bytes`]
439 - [`mem::take`]
440 - [`slice::repeat`]
441 - [`todo!`]
442
443 Cargo
444 -----
445 - [Cargo will now always display warnings, rather than only on
446 fresh builds.][cargo/7450]
447 - [Feature flags (except `--all-features`) passed to a virtual workspace will
448 now produce an error.][cargo/7507] Previously these flags were ignored.
449 - [You can now publish `dev-dependencies` without including
450 a `version`.][cargo/7333]
451
452 Misc
453 ----
454 - [You can now specify the `#[cfg(doctest)]` attribute to include an item only
455 when running documentation tests with `rustdoc`.][63803]
456
457 Compatibility Notes
458 -------------------
459 - [As previously announced, any previous NLL warnings in the 2015 edition are
460 now hard errors.][64221]
461 - [The `include!` macro will now warn if it failed to include the
462 entire file.][64284] The `include!` macro unintentionally only includes the
463 first _expression_ in a file, and this can be unintuitive. This will become
464 either a hard error in a future release, or the behavior may be fixed to include all expressions as expected.
465 - [Using `#[inline]` on function prototypes and consts now emits a warning under
466 `unused_attribute` lint.][65294] Using `#[inline]` anywhere else inside traits
467 or `extern` blocks now correctly emits a hard error.
468
469 [65294]: https://github.com/rust-lang/rust/pull/65294/
470 [66103]: https://github.com/rust-lang/rust/pull/66103/
471 [65843]: https://github.com/rust-lang/rust/pull/65843/
472 [65188]: https://github.com/rust-lang/rust/pull/65188/
473 [65092]: https://github.com/rust-lang/rust/pull/65092/
474 [64589]: https://github.com/rust-lang/rust/pull/64589/
475 [64639]: https://github.com/rust-lang/rust/pull/64639/
476 [64221]: https://github.com/rust-lang/rust/pull/64221/
477 [64284]: https://github.com/rust-lang/rust/pull/64284/
478 [63931]: https://github.com/rust-lang/rust/pull/63931/
479 [64035]: https://github.com/rust-lang/rust/pull/64035/
480 [63674]: https://github.com/rust-lang/rust/pull/63674/
481 [63803]: https://github.com/rust-lang/rust/pull/63803/
482 [cargo/7450]: https://github.com/rust-lang/cargo/pull/7450/
483 [cargo/7507]: https://github.com/rust-lang/cargo/pull/7507/
484 [cargo/7525]: https://github.com/rust-lang/cargo/pull/7525/
485 [cargo/7333]: https://github.com/rust-lang/cargo/pull/7333/
486 [(rfc 2008)]: https://rust-lang.github.io/rfcs/2008-non-exhaustive.html
487 [`f32::to_be_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_be_bytes
488 [`f32::to_le_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_le_bytes
489 [`f32::to_ne_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_ne_bytes
490 [`f64::to_be_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_be_bytes
491 [`f64::to_le_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_le_bytes
492 [`f64::to_ne_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_ne_bytes
493 [`f32::from_be_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.from_be_bytes
494 [`f32::from_le_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.from_le_bytes
495 [`f32::from_ne_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.from_ne_bytes
496 [`f64::from_be_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.from_be_bytes
497 [`f64::from_le_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.from_le_bytes
498 [`f64::from_ne_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.from_ne_bytes
499 [`option::flatten`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.flatten
500 [`option::as_deref`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.as_deref
501 [`option::as_deref_mut`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.as_deref_mut
502 [`hashmap::get_key_value`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.get_key_value
503 [`btreemap::get_key_value`]: https://doc.rust-lang.org/std/collections/struct.BTreeMap.html#method.get_key_value
504 [`slice::repeat`]: https://doc.rust-lang.org/std/primitive.slice.html#method.repeat
505 [`mem::take`]: https://doc.rust-lang.org/std/mem/fn.take.html
506 [`udpsocket::peer_addr`]: https://doc.rust-lang.org/std/net/struct.UdpSocket.html#method.peer_addr
507 [`todo!`]: https://doc.rust-lang.org/std/macro.todo.html
508
509
510 Version 1.39.0 (2019-11-07)
511 ===========================
512
513 Language
514 --------
515 - [You can now create `async` functions and blocks with `async fn`, `async move {}`, and
516 `async {}` respectively, and you can now call `.await` on async expressions.][63209]
517 - [You can now use certain attributes on function, closure, and function pointer
518 parameters.][64010] These attributes include `cfg`, `cfg_attr`, `allow`, `warn`,
519 `deny`, `forbid` as well as inert helper attributes used by procedural macro
520 attributes applied to items. e.g.
521 ```rust
522 fn len(
523 #[cfg(windows)] slice: &[u16],
524 #[cfg(not(windows))] slice: &[u8],
525 ) -> usize {
526 slice.len()
527 }
528 ```
529 - [You can now take shared references to bind-by-move patterns in the `if` guards
530 of `match` arms.][63118] e.g.
531 ```rust
532 fn main() {
533 let array: Box<[u8; 4]> = Box::new([1, 2, 3, 4]);
534
535 match array {
536 nums
537 // ---- `nums` is bound by move.
538 if nums.iter().sum::<u8>() == 10
539 // ^------ `.iter()` implicitly takes a reference to `nums`.
540 => {
541 drop(nums);
542 // ----------- Legal as `nums` was bound by move and so we have ownership.
543 }
544 _ => unreachable!(),
545 }
546 }
547 ```
548
549
550
551 Compiler
552 --------
553 - [Added tier 3\* support for the `i686-unknown-uefi` target.][64334]
554 - [Added tier 3 support for the `sparc64-unknown-openbsd` target.][63595]
555 - [rustc will now trim code snippets in diagnostics to fit in your terminal.][63402]
556 **Note** Cargo currently doesn't use this feature. Refer to
557 [cargo#7315][cargo/7315] to track this feature's progress.
558 - [You can now pass `--show-output` argument to test binaries to print the
559 output of successful tests.][62600]
560
561
562 \* Refer to Rust's [platform support page][forge-platform-support] for more
563 information on Rust's tiered platform support.
564
565 Libraries
566 ---------
567 - [`Vec::new` and `String::new` are now `const` functions.][64028]
568 - [`LinkedList::new` is now a `const` function.][63684]
569 - [`str::len`, `[T]::len` and `str::as_bytes` are now `const` functions.][63770]
570 - [The `abs`, `wrapping_abs`, and `overflowing_abs` numeric functions are
571 now `const`.][63786]
572
573 Stabilized APIs
574 ---------------
575 - [`Pin::into_inner`]
576 - [`Instant::checked_duration_since`]
577 - [`Instant::saturating_duration_since`]
578
579 Cargo
580 -----
581 - [You can now publish git dependencies if supplied with a `version`.][cargo/7237]
582 - [The `--all` flag has been renamed to `--workspace`.][cargo/7241] Using
583 `--all` is now deprecated.
584
585 Misc
586 ----
587 - [You can now pass `-Clinker` to rustdoc to control the linker used
588 for compiling doctests.][63834]
589
590 Compatibility Notes
591 -------------------
592 - [Code that was previously accepted by the old borrow checker, but rejected by
593 the NLL borrow checker is now a hard error in Rust 2018.][63565] This was
594 previously a warning, and will also become a hard error in the Rust 2015
595 edition in the 1.40.0 release.
596 - [`rustdoc` now requires `rustc` to be installed and in the same directory to
597 run tests.][63827] This should improve performance when running a large
598 amount of doctests.
599 - [The `try!` macro will now issue a deprecation warning.][62672] It is
600 recommended to use the `?` operator instead.
601 - [`asinh(-0.0)` now correctly returns `-0.0`.][63698] Previously this
602 returned `0.0`.
603
604 [62600]: https://github.com/rust-lang/rust/pull/62600/
605 [62672]: https://github.com/rust-lang/rust/pull/62672/
606 [63118]: https://github.com/rust-lang/rust/pull/63118/
607 [63209]: https://github.com/rust-lang/rust/pull/63209/
608 [63402]: https://github.com/rust-lang/rust/pull/63402/
609 [63565]: https://github.com/rust-lang/rust/pull/63565/
610 [63595]: https://github.com/rust-lang/rust/pull/63595/
611 [63684]: https://github.com/rust-lang/rust/pull/63684/
612 [63698]: https://github.com/rust-lang/rust/pull/63698/
613 [63770]: https://github.com/rust-lang/rust/pull/63770/
614 [63786]: https://github.com/rust-lang/rust/pull/63786/
615 [63827]: https://github.com/rust-lang/rust/pull/63827/
616 [63834]: https://github.com/rust-lang/rust/pull/63834/
617 [63927]: https://github.com/rust-lang/rust/pull/63927/
618 [63933]: https://github.com/rust-lang/rust/pull/63933/
619 [63934]: https://github.com/rust-lang/rust/pull/63934/
620 [63938]: https://github.com/rust-lang/rust/pull/63938/
621 [63940]: https://github.com/rust-lang/rust/pull/63940/
622 [63941]: https://github.com/rust-lang/rust/pull/63941/
623 [63945]: https://github.com/rust-lang/rust/pull/63945/
624 [64010]: https://github.com/rust-lang/rust/pull/64010/
625 [64028]: https://github.com/rust-lang/rust/pull/64028/
626 [64334]: https://github.com/rust-lang/rust/pull/64334/
627 [cargo/7237]: https://github.com/rust-lang/cargo/pull/7237/
628 [cargo/7241]: https://github.com/rust-lang/cargo/pull/7241/
629 [cargo/7315]: https://github.com/rust-lang/cargo/pull/7315/
630 [`Pin::into_inner`]: https://doc.rust-lang.org/std/pin/struct.Pin.html#method.into_inner
631 [`Instant::checked_duration_since`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.checked_duration_since
632 [`Instant::saturating_duration_since`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.saturating_duration_since
633
634 Version 1.38.0 (2019-09-26)
635 ==========================
636
637 Language
638 --------
639 - [The `#[global_allocator]` attribute can now be used in submodules.][62735]
640 - [The `#[deprecated]` attribute can now be used on macros.][62042]
641
642 Compiler
643 --------
644 - [Added pipelined compilation support to `rustc`.][62766] This will
645 improve compilation times in some cases. For further information please refer
646 to the [_"Evaluating pipelined rustc compilation"_][pipeline-internals] thread.
647 - [Added tier 3\* support for the `aarch64-uwp-windows-msvc`, `i686-uwp-windows-gnu`,
648 `i686-uwp-windows-msvc`, `x86_64-uwp-windows-gnu`, and
649 `x86_64-uwp-windows-msvc` targets.][60260]
650 - [Added tier 3 support for the `armv7-unknown-linux-gnueabi` and
651 `armv7-unknown-linux-musleabi` targets.][63107]
652 - [Added tier 3 support for the `hexagon-unknown-linux-musl` target.][62814]
653 - [Added tier 3 support for the `riscv32i-unknown-none-elf` target.][62784]
654
655 \* Refer to Rust's [platform support page][forge-platform-support] for more
656 information on Rust's tiered platform support.
657
658 Libraries
659 ---------
660 - [`ascii::EscapeDefault` now implements `Clone` and `Display`.][63421]
661 - [Derive macros for prelude traits (e.g. `Clone`, `Debug`, `Hash`) are now
662 available at the same path as the trait.][63056] (e.g. The `Clone` derive macro
663 is available at `std::clone::Clone`). This also makes all built-in macros
664 available in `std`/`core` root. e.g. `std::include_bytes!`.
665 - [`str::Chars` now implements `Debug`.][63000]
666 - [`slice::{concat, connect, join}` now accepts `&[T]` in addition to `&T`.][62528]
667 - [`*const T` and `*mut T` now implement `marker::Unpin`.][62583]
668 - [`Arc<[T]>` and `Rc<[T]>` now implement `FromIterator<T>`.][61953]
669 - [Added euclidean remainder and division operations (`div_euclid`,
670 `rem_euclid`) to all numeric primitives.][61884] Additionally `checked`,
671 `overflowing`, and `wrapping` versions are available for all
672 integer primitives.
673 - [`thread::AccessError` now implements `Clone`, `Copy`, `Eq`, `Error`, and
674 `PartialEq`.][61491]
675 - [`iter::{StepBy, Peekable, Take}` now implement `DoubleEndedIterator`.][61457]
676
677 Stabilized APIs
678 ---------------
679 - [`<*const T>::cast`]
680 - [`<*mut T>::cast`]
681 - [`Duration::as_secs_f32`]
682 - [`Duration::as_secs_f64`]
683 - [`Duration::div_f32`]
684 - [`Duration::div_f64`]
685 - [`Duration::from_secs_f32`]
686 - [`Duration::from_secs_f64`]
687 - [`Duration::mul_f32`]
688 - [`Duration::mul_f64`]
689 - [`any::type_name`]
690
691 Cargo
692 -----
693 - [Added pipelined compilation support to `cargo`.][cargo/7143]
694 - [You can now pass the `--features` option multiple times to enable
695 multiple features.][cargo/7084]
696
697 Misc
698 ----
699 - [`rustc` will now warn about some incorrect uses of
700 `mem::{uninitialized, zeroed}` that are known to cause undefined behaviour.][63346]
701
702 Compatibility Notes
703 -------------------
704 - The [`x86_64-unknown-uefi` platform can not be built][62785] with rustc
705 1.38.0.
706 - The [`armv7-unknown-linux-gnueabihf` platform is known to have
707 issues][62896] with certain crates such as libc.
708
709 [60260]: https://github.com/rust-lang/rust/pull/60260/
710 [61457]: https://github.com/rust-lang/rust/pull/61457/
711 [61491]: https://github.com/rust-lang/rust/pull/61491/
712 [61884]: https://github.com/rust-lang/rust/pull/61884/
713 [61953]: https://github.com/rust-lang/rust/pull/61953/
714 [62042]: https://github.com/rust-lang/rust/pull/62042/
715 [62528]: https://github.com/rust-lang/rust/pull/62528/
716 [62583]: https://github.com/rust-lang/rust/pull/62583/
717 [62735]: https://github.com/rust-lang/rust/pull/62735/
718 [62766]: https://github.com/rust-lang/rust/pull/62766/
719 [62784]: https://github.com/rust-lang/rust/pull/62784/
720 [62785]: https://github.com/rust-lang/rust/issues/62785/
721 [62814]: https://github.com/rust-lang/rust/pull/62814/
722 [62896]: https://github.com/rust-lang/rust/issues/62896/
723 [63000]: https://github.com/rust-lang/rust/pull/63000/
724 [63056]: https://github.com/rust-lang/rust/pull/63056/
725 [63107]: https://github.com/rust-lang/rust/pull/63107/
726 [63346]: https://github.com/rust-lang/rust/pull/63346/
727 [63421]: https://github.com/rust-lang/rust/pull/63421/
728 [cargo/7084]: https://github.com/rust-lang/cargo/pull/7084/
729 [cargo/7143]: https://github.com/rust-lang/cargo/pull/7143/
730 [`<*const T>::cast`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.cast
731 [`<*mut T>::cast`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.cast
732 [`Duration::as_secs_f32`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_secs_f32
733 [`Duration::as_secs_f64`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_secs_f64
734 [`Duration::div_f32`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.div_f32
735 [`Duration::div_f64`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.div_f64
736 [`Duration::from_secs_f32`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.from_secs_f32
737 [`Duration::from_secs_f64`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.from_secs_f64
738 [`Duration::mul_f32`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.mul_f32
739 [`Duration::mul_f64`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.mul_f64
740 [`any::type_name`]: https://doc.rust-lang.org/std/any/fn.type_name.html
741 [forge-platform-support]: https://forge.rust-lang.org/platform-support.html
742 [pipeline-internals]: https://internals.rust-lang.org/t/evaluating-pipelined-rustc-compilation/10199
743
744 Version 1.37.0 (2019-08-15)
745 ==========================
746
747 Language
748 --------
749 - `#[must_use]` will now warn if the type is contained in a [tuple][61100],
750 [`Box`][62228], or an [array][62235] and unused.
751 - [You can now use the `cfg` and `cfg_attr` attributes on
752 generic parameters.][61547]
753 - [You can now use enum variants through type alias.][61682] e.g. You can
754 write the following:
755 ```rust
756 type MyOption = Option<u8>;
757
758 fn increment_or_zero(x: MyOption) -> u8 {
759 match x {
760 MyOption::Some(y) => y + 1,
761 MyOption::None => 0,
762 }
763 }
764 ```
765 - [You can now use `_` as an identifier for consts.][61347] e.g. You can write
766 `const _: u32 = 5;`.
767 - [You can now use `#[repr(align(X)]` on enums.][61229]
768 - [The `?` Kleene macro operator is now available in the
769 2015 edition.][60932]
770
771 Compiler
772 --------
773 - [You can now enable Profile-Guided Optimization with the `-C profile-generate`
774 and `-C profile-use` flags.][61268] For more information on how to use profile
775 guided optimization, please refer to the [rustc book][rustc-book-pgo].
776 - [The `rust-lldb` wrapper script should now work again.][61827]
777
778 Libraries
779 ---------
780 - [`mem::MaybeUninit<T>` is now ABI-compatible with `T`.][61802]
781
782 Stabilized APIs
783 ---------------
784 - [`BufReader::buffer`]
785 - [`BufWriter::buffer`]
786 - [`Cell::from_mut`]
787 - [`Cell<[T]>::as_slice_of_cells`][`Cell<slice>::as_slice_of_cells`]
788 - [`DoubleEndedIterator::nth_back`]
789 - [`Option::xor`]
790 - [`Wrapping::reverse_bits`]
791 - [`i128::reverse_bits`]
792 - [`i16::reverse_bits`]
793 - [`i32::reverse_bits`]
794 - [`i64::reverse_bits`]
795 - [`i8::reverse_bits`]
796 - [`isize::reverse_bits`]
797 - [`slice::copy_within`]
798 - [`u128::reverse_bits`]
799 - [`u16::reverse_bits`]
800 - [`u32::reverse_bits`]
801 - [`u64::reverse_bits`]
802 - [`u8::reverse_bits`]
803 - [`usize::reverse_bits`]
804
805 Cargo
806 -----
807 - [`Cargo.lock` files are now included by default when publishing executable crates
808 with executables.][cargo/7026]
809 - [You can now specify `default-run="foo"` in `[package]` to specify the
810 default executable to use for `cargo run`.][cargo/7056]
811
812 Misc
813 ----
814
815 Compatibility Notes
816 -------------------
817 - [Using `...` for inclusive range patterns will now warn by default.][61342]
818 Please transition your code to using the `..=` syntax for inclusive
819 ranges instead.
820 - [Using a trait object without the `dyn` will now warn by default.][61203]
821 Please transition your code to use `dyn Trait` for trait objects instead.
822
823 [62228]: https://github.com/rust-lang/rust/pull/62228/
824 [62235]: https://github.com/rust-lang/rust/pull/62235/
825 [61802]: https://github.com/rust-lang/rust/pull/61802/
826 [61827]: https://github.com/rust-lang/rust/pull/61827/
827 [61547]: https://github.com/rust-lang/rust/pull/61547/
828 [61682]: https://github.com/rust-lang/rust/pull/61682/
829 [61268]: https://github.com/rust-lang/rust/pull/61268/
830 [61342]: https://github.com/rust-lang/rust/pull/61342/
831 [61347]: https://github.com/rust-lang/rust/pull/61347/
832 [61100]: https://github.com/rust-lang/rust/pull/61100/
833 [61203]: https://github.com/rust-lang/rust/pull/61203/
834 [61229]: https://github.com/rust-lang/rust/pull/61229/
835 [60932]: https://github.com/rust-lang/rust/pull/60932/
836 [cargo/7026]: https://github.com/rust-lang/cargo/pull/7026/
837 [cargo/7056]: https://github.com/rust-lang/cargo/pull/7056/
838 [`BufReader::buffer`]: https://doc.rust-lang.org/std/io/struct.BufReader.html#method.buffer
839 [`BufWriter::buffer`]: https://doc.rust-lang.org/std/io/struct.BufWriter.html#method.buffer
840 [`Cell::from_mut`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.from_mut
841 [`Cell<slice>::as_slice_of_cells`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.as_slice_of_cells
842 [`DoubleEndedIterator::nth_back`]: https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html#method.nth_back
843 [`Option::xor`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.xor
844 [`RefCell::try_borrow_unguarded`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.try_borrow_unguarded
845 [`Wrapping::reverse_bits`]: https://doc.rust-lang.org/std/num/struct.Wrapping.html#method.reverse_bits
846 [`i128::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i128.html#method.reverse_bits
847 [`i16::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i16.html#method.reverse_bits
848 [`i32::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i32.html#method.reverse_bits
849 [`i64::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i64.html#method.reverse_bits
850 [`i8::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i8.html#method.reverse_bits
851 [`isize::reverse_bits`]: https://doc.rust-lang.org/std/primitive.isize.html#method.reverse_bits
852 [`slice::copy_within`]: https://doc.rust-lang.org/std/primitive.slice.html#method.copy_within
853 [`u128::reverse_bits`]: https://doc.rust-lang.org/std/primitive.u128.html#method.reverse_bits
854 [`u16::reverse_bits`]: https://doc.rust-lang.org/std/primitive.u16.html#method.reverse_bits
855 [`u32::reverse_bits`]: https://doc.rust-lang.org/std/primitive.u32.html#method.reverse_bits
856 [`u64::reverse_bits`]: https://doc.rust-lang.org/std/primitive.u64.html#method.reverse_bits
857 [`u8::reverse_bits`]: https://doc.rust-lang.org/std/primitive.u8.html#method.reverse_bits
858 [`usize::reverse_bits`]: https://doc.rust-lang.org/std/primitive.usize.html#method.reverse_bits
859 [rustc-book-pgo]: https://doc.rust-lang.org/rustc/profile-guided-optimization.html
860
861
862 Version 1.36.0 (2019-07-04)
863 ==========================
864
865 Language
866 --------
867 - [Non-Lexical Lifetimes are now enabled on the 2015 edition.][59114]
868 - [The order of traits in trait objects no longer affects the semantics of that
869 object.][59445] e.g. `dyn Send + fmt::Debug` is now equivalent to
870 `dyn fmt::Debug + Send`, where this was previously not the case.
871
872 Libraries
873 ---------
874 - [`HashMap`'s implementation has been replaced with `hashbrown::HashMap` implementation.][58623]
875 - [`TryFromSliceError` now implements `From<Infallible>`.][60318]
876 - [`mem::needs_drop` is now available as a const fn.][60364]
877 - [`alloc::Layout::from_size_align_unchecked` is now available as a const fn.][60370]
878 - [`String` now implements `BorrowMut<str>`.][60404]
879 - [`io::Cursor` now implements `Default`.][60234]
880 - [Both `NonNull::{dangling, cast}` are now const fns.][60244]
881 - [The `alloc` crate is now stable.][59675] `alloc` allows you to use a subset
882 of `std` (e.g. `Vec`, `Box`, `Arc`) in `#![no_std]` environments if the
883 environment has access to heap memory allocation.
884 - [`String` now implements `From<&String>`.][59825]
885 - [You can now pass multiple arguments to the `dbg!` macro.][59826] `dbg!` will
886 return a tuple of each argument when there is multiple arguments.
887 - [`Result::{is_err, is_ok}` are now `#[must_use]` and will produce a warning if
888 not used.][59648]
889
890 Stabilized APIs
891 ---------------
892 - [`VecDeque::rotate_left`]
893 - [`VecDeque::rotate_right`]
894 - [`Iterator::copied`]
895 - [`io::IoSlice`]
896 - [`io::IoSliceMut`]
897 - [`Read::read_vectored`]
898 - [`Write::write_vectored`]
899 - [`str::as_mut_ptr`]
900 - [`mem::MaybeUninit`]
901 - [`pointer::align_offset`]
902 - [`future::Future`]
903 - [`task::Context`]
904 - [`task::RawWaker`]
905 - [`task::RawWakerVTable`]
906 - [`task::Waker`]
907 - [`task::Poll`]
908
909 Cargo
910 -----
911 - [Cargo will now produce an error if you attempt to use the name of a required dependency as a feature.][cargo/6860]
912 - [You can now pass the `--offline` flag to run cargo without accessing the network.][cargo/6934]
913
914 You can find further change's in [Cargo's 1.36.0 release notes][cargo-1-36-0].
915
916 Clippy
917 ------
918 There have been numerous additions and fixes to clippy, see [Clippy's 1.36.0 release notes][clippy-1-36-0] for more details.
919
920 Misc
921 ----
922
923 Compatibility Notes
924 -------------------
925 - With the stabilisation of `mem::MaybeUninit`, `mem::uninitialized` use is no
926 longer recommended, and will be deprecated in 1.39.0.
927
928 [60318]: https://github.com/rust-lang/rust/pull/60318/
929 [60364]: https://github.com/rust-lang/rust/pull/60364/
930 [60370]: https://github.com/rust-lang/rust/pull/60370/
931 [60404]: https://github.com/rust-lang/rust/pull/60404/
932 [60234]: https://github.com/rust-lang/rust/pull/60234/
933 [60244]: https://github.com/rust-lang/rust/pull/60244/
934 [58623]: https://github.com/rust-lang/rust/pull/58623/
935 [59648]: https://github.com/rust-lang/rust/pull/59648/
936 [59675]: https://github.com/rust-lang/rust/pull/59675/
937 [59825]: https://github.com/rust-lang/rust/pull/59825/
938 [59826]: https://github.com/rust-lang/rust/pull/59826/
939 [59445]: https://github.com/rust-lang/rust/pull/59445/
940 [59114]: https://github.com/rust-lang/rust/pull/59114/
941 [cargo/6860]: https://github.com/rust-lang/cargo/pull/6860/
942 [cargo/6934]: https://github.com/rust-lang/cargo/pull/6934/
943 [`VecDeque::rotate_left`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.rotate_left
944 [`VecDeque::rotate_right`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.rotate_right
945 [`Iterator::copied`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#tymethod.copied
946 [`io::IoSlice`]: https://doc.rust-lang.org/std/io/struct.IoSlice.html
947 [`io::IoSliceMut`]: https://doc.rust-lang.org/std/io/struct.IoSliceMut.html
948 [`Read::read_vectored`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_vectored
949 [`Write::write_vectored`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_vectored
950 [`str::as_mut_ptr`]: https://doc.rust-lang.org/std/primitive.str.html#method.as_mut_ptr
951 [`mem::MaybeUninit`]: https://doc.rust-lang.org/std/mem/union.MaybeUninit.html
952 [`pointer::align_offset`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.align_offset
953 [`future::Future`]: https://doc.rust-lang.org/std/future/trait.Future.html
954 [`task::Context`]: https://doc.rust-lang.org/beta/std/task/struct.Context.html
955 [`task::RawWaker`]: https://doc.rust-lang.org/beta/std/task/struct.RawWaker.html
956 [`task::RawWakerVTable`]: https://doc.rust-lang.org/beta/std/task/struct.RawWakerVTable.html
957 [`task::Waker`]: https://doc.rust-lang.org/beta/std/task/struct.Waker.html
958 [`task::Poll`]: https://doc.rust-lang.org/beta/std/task/enum.Poll.html
959 [clippy-1-36-0]: https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-136
960 [cargo-1-36-0]: https://github.com/rust-lang/cargo/blob/master/CHANGELOG.md#cargo-136-2019-07-04
961
962
963 Version 1.35.0 (2019-05-23)
964 ==========================
965
966 Language
967 --------
968 - [`FnOnce`, `FnMut`, and the `Fn` traits are now implemented for `Box<FnOnce>`,
969 `Box<FnMut>`, and `Box<Fn>` respectively.][59500]
970 - [You can now coerce closures into unsafe function pointers.][59580] e.g.
971 ```rust
972 unsafe fn call_unsafe(func: unsafe fn()) {
973 func()
974 }
975
976 pub fn main() {
977 unsafe { call_unsafe(|| {}); }
978 }
979 ```
980
981
982 Compiler
983 --------
984 - [Added the `armv6-unknown-freebsd-gnueabihf` and
985 `armv7-unknown-freebsd-gnueabihf` targets.][58080]
986 - [Added the `wasm32-unknown-wasi` target.][59464]
987
988
989 Libraries
990 ---------
991 - [`Thread` will now show its ID in `Debug` output.][59460]
992 - [`StdinLock`, `StdoutLock`, and `StderrLock` now implement `AsRawFd`.][59512]
993 - [`alloc::System` now implements `Default`.][59451]
994 - [Expanded `Debug` output (`{:#?}`) for structs now has a trailing comma on the
995 last field.][59076]
996 - [`char::{ToLowercase, ToUppercase}` now
997 implement `ExactSizeIterator`.][58778]
998 - [All `NonZero` numeric types now implement `FromStr`.][58717]
999 - [Removed the `Read` trait bounds
1000 on the `BufReader::{get_ref, get_mut, into_inner}` methods.][58423]
1001 - [You can now call the `dbg!` macro without any parameters to print the file
1002 and line where it is called.][57847]
1003 - [In place ASCII case conversions are now up to 4× faster.][59283]
1004 e.g. `str::make_ascii_lowercase`
1005 - [`hash_map::{OccupiedEntry, VacantEntry}` now implement `Sync`
1006 and `Send`.][58369]
1007
1008 Stabilized APIs
1009 ---------------
1010 - [`f32::copysign`]
1011 - [`f64::copysign`]
1012 - [`RefCell::replace_with`]
1013 - [`RefCell::map_split`]
1014 - [`ptr::hash`]
1015 - [`Range::contains`]
1016 - [`RangeFrom::contains`]
1017 - [`RangeTo::contains`]
1018 - [`RangeInclusive::contains`]
1019 - [`RangeToInclusive::contains`]
1020 - [`Option::copied`]
1021
1022 Cargo
1023 -----
1024 - [You can now set `cargo:rustc-cdylib-link-arg` at build time to pass custom
1025 linker arguments when building a `cdylib`.][cargo/6298] Its usage is highly
1026 platform specific.
1027
1028 Misc
1029 ----
1030 - [The Rust toolchain is now available natively for musl based distros.][58575]
1031
1032 [59460]: https://github.com/rust-lang/rust/pull/59460/
1033 [59464]: https://github.com/rust-lang/rust/pull/59464/
1034 [59500]: https://github.com/rust-lang/rust/pull/59500/
1035 [59512]: https://github.com/rust-lang/rust/pull/59512/
1036 [59580]: https://github.com/rust-lang/rust/pull/59580/
1037 [59283]: https://github.com/rust-lang/rust/pull/59283/
1038 [59451]: https://github.com/rust-lang/rust/pull/59451/
1039 [59076]: https://github.com/rust-lang/rust/pull/59076/
1040 [58778]: https://github.com/rust-lang/rust/pull/58778/
1041 [58717]: https://github.com/rust-lang/rust/pull/58717/
1042 [58369]: https://github.com/rust-lang/rust/pull/58369/
1043 [58423]: https://github.com/rust-lang/rust/pull/58423/
1044 [58080]: https://github.com/rust-lang/rust/pull/58080/
1045 [57847]: https://github.com/rust-lang/rust/pull/57847/
1046 [58575]: https://github.com/rust-lang/rust/pull/58575
1047 [cargo/6298]: https://github.com/rust-lang/cargo/pull/6298/
1048 [`f32::copysign`]: https://doc.rust-lang.org/stable/std/primitive.f32.html#method.copysign
1049 [`f64::copysign`]: https://doc.rust-lang.org/stable/std/primitive.f64.html#method.copysign
1050 [`RefCell::replace_with`]: https://doc.rust-lang.org/stable/std/cell/struct.RefCell.html#method.replace_with
1051 [`RefCell::map_split`]: https://doc.rust-lang.org/stable/std/cell/struct.RefCell.html#method.map_split
1052 [`ptr::hash`]: https://doc.rust-lang.org/stable/std/ptr/fn.hash.html
1053 [`Range::contains`]: https://doc.rust-lang.org/std/ops/struct.Range.html#method.contains
1054 [`RangeFrom::contains`]: https://doc.rust-lang.org/std/ops/struct.RangeFrom.html#method.contains
1055 [`RangeTo::contains`]: https://doc.rust-lang.org/std/ops/struct.RangeTo.html#method.contains
1056 [`RangeInclusive::contains`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html#method.contains
1057 [`RangeToInclusive::contains`]: https://doc.rust-lang.org/std/ops/struct.RangeToInclusive.html#method.contains
1058 [`Option::copied`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.copied
1059
1060 Version 1.34.2 (2019-05-14)
1061 ===========================
1062
1063 * [Destabilize the `Error::type_id` function due to a security
1064 vulnerability][60785] ([CVE-2019-12083])
1065
1066 [60785]: https://github.com/rust-lang/rust/pull/60785
1067 [CVE-2019-12083]: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-12083
1068
1069 Version 1.34.1 (2019-04-25)
1070 ===========================
1071
1072 * [Fix false positives for the `redundant_closure` Clippy lint][clippy/3821]
1073 * [Fix false positives for the `missing_const_for_fn` Clippy lint][clippy/3844]
1074 * [Fix Clippy panic when checking some macros][clippy/3805]
1075
1076 [clippy/3821]: https://github.com/rust-lang/rust-clippy/pull/3821
1077 [clippy/3844]: https://github.com/rust-lang/rust-clippy/pull/3844
1078 [clippy/3805]: https://github.com/rust-lang/rust-clippy/pull/3805
1079
1080 Version 1.34.0 (2019-04-11)
1081 ==========================
1082
1083 Language
1084 --------
1085 - [You can now use `#[deprecated = "reason"]`][58166] as a shorthand for
1086 `#[deprecated(note = "reason")]`. This was previously allowed by mistake
1087 but had no effect.
1088 - [You can now accept token streams in `#[attr()]`,`#[attr[]]`, and
1089 `#[attr{}]` procedural macros.][57367]
1090 - [You can now write `extern crate self as foo;`][57407] to import your
1091 crate's root into the extern prelude.
1092
1093
1094 Compiler
1095 --------
1096 - [You can now target `riscv64imac-unknown-none-elf` and
1097 `riscv64gc-unknown-none-elf`.][58406]
1098 - [You can now enable linker plugin LTO optimisations with
1099 `-C linker-plugin-lto`.][58057] This allows rustc to compile your Rust code
1100 into LLVM bitcode allowing LLVM to perform LTO optimisations across C/C++ FFI
1101 boundaries.
1102 - [You can now target `powerpc64-unknown-freebsd`.][57809]
1103
1104
1105 Libraries
1106 ---------
1107 - [The trait bounds have been removed on some of `HashMap<K, V, S>`'s and
1108 `HashSet<T, S>`'s basic methods.][58370] Most notably you no longer require
1109 the `Hash` trait to create an iterator.
1110 - [The `Ord` trait bounds have been removed on some of `BinaryHeap<T>`'s basic
1111 methods.][58421] Most notably you no longer require the `Ord` trait to create
1112 an iterator.
1113 - [The methods `overflowing_neg` and `wrapping_neg` are now `const` functions
1114 for all numeric types.][58044]
1115 - [Indexing a `str` is now generic over all types that
1116 implement `SliceIndex<str>`.][57604]
1117 - [`str::trim`, `str::trim_matches`, `str::trim_{start, end}`, and
1118 `str::trim_{start, end}_matches` are now `#[must_use]`][57106] and will
1119 produce a warning if their returning type is unused.
1120 - [The methods `checked_pow`, `saturating_pow`, `wrapping_pow`, and
1121 `overflowing_pow` are now available for all numeric types.][57873] These are
1122 equivalent to methods such as `wrapping_add` for the `pow` operation.
1123
1124
1125 Stabilized APIs
1126 ---------------
1127
1128 #### std & core
1129 * [`Any::type_id`]
1130 * [`Error::type_id`]
1131 * [`atomic::AtomicI16`]
1132 * [`atomic::AtomicI32`]
1133 * [`atomic::AtomicI64`]
1134 * [`atomic::AtomicI8`]
1135 * [`atomic::AtomicU16`]
1136 * [`atomic::AtomicU32`]
1137 * [`atomic::AtomicU64`]
1138 * [`atomic::AtomicU8`]
1139 * [`convert::Infallible`]
1140 * [`convert::TryFrom`]
1141 * [`convert::TryInto`]
1142 * [`iter::from_fn`]
1143 * [`iter::successors`]
1144 * [`num::NonZeroI128`]
1145 * [`num::NonZeroI16`]
1146 * [`num::NonZeroI32`]
1147 * [`num::NonZeroI64`]
1148 * [`num::NonZeroI8`]
1149 * [`num::NonZeroIsize`]
1150 * [`slice::sort_by_cached_key`]
1151 * [`str::escape_debug`]
1152 * [`str::escape_default`]
1153 * [`str::escape_unicode`]
1154 * [`str::split_ascii_whitespace`]
1155
1156 #### std
1157 * [`Instant::checked_add`]
1158 * [`Instant::checked_sub`]
1159 * [`SystemTime::checked_add`]
1160 * [`SystemTime::checked_sub`]
1161
1162 Cargo
1163 -----
1164 - [You can now use alternative registries to crates.io.][cargo/6654]
1165
1166 Misc
1167 ----
1168 - [You can now use the `?` operator in your documentation tests without manually
1169 adding `fn main() -> Result<(), _> {}`.][56470]
1170
1171 Compatibility Notes
1172 -------------------
1173 - [`Command::before_exec` is being replaced by the unsafe method
1174 `Command::pre_exec`][58059] and will be deprecated with Rust 1.37.0.
1175 - [Use of `ATOMIC_{BOOL, ISIZE, USIZE}_INIT` is now deprecated][57425] as you
1176 can now use `const` functions in `static` variables.
1177
1178 [58370]: https://github.com/rust-lang/rust/pull/58370/
1179 [58406]: https://github.com/rust-lang/rust/pull/58406/
1180 [58421]: https://github.com/rust-lang/rust/pull/58421/
1181 [58166]: https://github.com/rust-lang/rust/pull/58166/
1182 [58044]: https://github.com/rust-lang/rust/pull/58044/
1183 [58057]: https://github.com/rust-lang/rust/pull/58057/
1184 [58059]: https://github.com/rust-lang/rust/pull/58059/
1185 [57809]: https://github.com/rust-lang/rust/pull/57809/
1186 [57873]: https://github.com/rust-lang/rust/pull/57873/
1187 [57604]: https://github.com/rust-lang/rust/pull/57604/
1188 [57367]: https://github.com/rust-lang/rust/pull/57367/
1189 [57407]: https://github.com/rust-lang/rust/pull/57407/
1190 [57425]: https://github.com/rust-lang/rust/pull/57425/
1191 [57106]: https://github.com/rust-lang/rust/pull/57106/
1192 [56470]: https://github.com/rust-lang/rust/pull/56470/
1193 [cargo/6654]: https://github.com/rust-lang/cargo/pull/6654/
1194 [`Any::type_id`]: https://doc.rust-lang.org/std/any/trait.Any.html#tymethod.type_id
1195 [`Error::type_id`]: https://doc.rust-lang.org/std/error/trait.Error.html#method.type_id
1196 [`atomic::AtomicI16`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicI16.html
1197 [`atomic::AtomicI32`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicI32.html
1198 [`atomic::AtomicI64`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicI64.html
1199 [`atomic::AtomicI8`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicI8.html
1200 [`atomic::AtomicU16`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU16.html
1201 [`atomic::AtomicU32`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU32.html
1202 [`atomic::AtomicU64`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU64.html
1203 [`atomic::AtomicU8`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU8.html
1204 [`convert::Infallible`]: https://doc.rust-lang.org/std/convert/enum.Infallible.html
1205 [`convert::TryFrom`]: https://doc.rust-lang.org/std/convert/trait.TryFrom.html
1206 [`convert::TryInto`]: https://doc.rust-lang.org/std/convert/trait.TryInto.html
1207 [`iter::from_fn`]: https://doc.rust-lang.org/std/iter/fn.from_fn.html
1208 [`iter::successors`]: https://doc.rust-lang.org/std/iter/fn.successors.html
1209 [`num::NonZeroI128`]: https://doc.rust-lang.org/std/num/struct.NonZeroI128.html
1210 [`num::NonZeroI16`]: https://doc.rust-lang.org/std/num/struct.NonZeroI16.html
1211 [`num::NonZeroI32`]: https://doc.rust-lang.org/std/num/struct.NonZeroI32.html
1212 [`num::NonZeroI64`]: https://doc.rust-lang.org/std/num/struct.NonZeroI64.html
1213 [`num::NonZeroI8`]: https://doc.rust-lang.org/std/num/struct.NonZeroI8.html
1214 [`num::NonZeroIsize`]: https://doc.rust-lang.org/std/num/struct.NonZeroIsize.html
1215 [`slice::sort_by_cached_key`]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_by_cached_key
1216 [`str::escape_debug`]: https://doc.rust-lang.org/std/primitive.str.html#method.escape_debug
1217 [`str::escape_default`]: https://doc.rust-lang.org/std/primitive.str.html#method.escape_default
1218 [`str::escape_unicode`]: https://doc.rust-lang.org/std/primitive.str.html#method.escape_unicode
1219 [`str::split_ascii_whitespace`]: https://doc.rust-lang.org/std/primitive.str.html#method.split_ascii_whitespace
1220 [`Instant::checked_add`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.checked_add
1221 [`Instant::checked_sub`]: https://doc.rust-lang.org/std/time/struct.Instant.html#method.checked_sub
1222 [`SystemTime::checked_add`]: https://doc.rust-lang.org/std/time/struct.SystemTime.html#method.checked_add
1223 [`SystemTime::checked_sub`]: https://doc.rust-lang.org/std/time/struct.SystemTime.html#method.checked_sub
1224
1225
1226 Version 1.33.0 (2019-02-28)
1227 ==========================
1228
1229 Language
1230 --------
1231 - [You can now use the `cfg(target_vendor)` attribute.][57465] E.g.
1232 `#[cfg(target_vendor="apple")] fn main() { println!("Hello Apple!"); }`
1233 - [Integer patterns such as in a match expression can now be exhaustive.][56362]
1234 E.g. You can have match statement on a `u8` that covers `0..=255` and
1235 you would no longer be required to have a `_ => unreachable!()` case.
1236 - [You can now have multiple patterns in `if let` and `while let`
1237 expressions.][57532] You can do this with the same syntax as a `match`
1238 expression. E.g.
1239 ```rust
1240 enum Creature {
1241 Crab(String),
1242 Lobster(String),
1243 Person(String),
1244 }
1245
1246 fn main() {
1247 let state = Creature::Crab("Ferris");
1248
1249 if let Creature::Crab(name) | Creature::Person(name) = state {
1250 println!("This creature's name is: {}", name);
1251 }
1252 }
1253 ```
1254 - [You can now have irrefutable `if let` and `while let` patterns.][57535] Using
1255 this feature will by default produce a warning as this behaviour can be
1256 unintuitive. E.g. `if let _ = 5 {}`
1257 - [You can now use `let` bindings, assignments, expression statements,
1258 and irrefutable pattern destructuring in const functions.][57175]
1259 - [You can now call unsafe const functions.][57067] E.g.
1260 ```rust
1261 const unsafe fn foo() -> i32 { 5 }
1262 const fn bar() -> i32 {
1263 unsafe { foo() }
1264 }
1265 ```
1266 - [You can now specify multiple attributes in a `cfg_attr` attribute.][57332]
1267 E.g. `#[cfg_attr(all(), must_use, optimize)]`
1268 - [You can now specify a specific alignment with the `#[repr(packed)]`
1269 attribute.][57049] E.g. `#[repr(packed(2))] struct Foo(i16, i32);` is a struct
1270 with an alignment of 2 bytes and a size of 6 bytes.
1271 - [You can now import an item from a module as an `_`.][56303] This allows you to
1272 import a trait's impls, and not have the name in the namespace. E.g.
1273 ```rust
1274 use std::io::Read as _;
1275
1276 // Allowed as there is only one `Read` in the module.
1277 pub trait Read {}
1278 ```
1279 - [You may now use `Rc`, `Arc`, and `Pin` as method receivers][56805].
1280
1281 Compiler
1282 --------
1283 - [You can now set a linker flavor for `rustc` with the `-Clinker-flavor`
1284 command line argument.][56351]
1285 - [The minimum required LLVM version has been bumped to 6.0.][56642]
1286 - [Added support for the PowerPC64 architecture on FreeBSD.][57615]
1287 - [The `x86_64-fortanix-unknown-sgx` target support has been upgraded to
1288 tier 2 support.][57130] Visit the [platform support][platform-support] page for
1289 information on Rust's platform support.
1290 - [Added support for the `thumbv7neon-linux-androideabi` and
1291 `thumbv7neon-unknown-linux-gnueabihf` targets.][56947]
1292 - [Added support for the `x86_64-unknown-uefi` target.][56769]
1293
1294 Libraries
1295 ---------
1296 - [The methods `overflowing_{add, sub, mul, shl, shr}` are now `const`
1297 functions for all numeric types.][57566]
1298 - [The methods `rotate_left`, `rotate_right`, and `wrapping_{add, sub, mul, shl, shr}`
1299 are now `const` functions for all numeric types.][57105]
1300 - [The methods `is_positive` and `is_negative` are now `const` functions for
1301 all signed numeric types.][57105]
1302 - [The `get` method for all `NonZero` types is now `const`.][57167]
1303 - [The methods `count_ones`, `count_zeros`, `leading_zeros`, `trailing_zeros`,
1304 `swap_bytes`, `from_be`, `from_le`, `to_be`, `to_le` are now `const` for all
1305 numeric types.][57234]
1306 - [`Ipv4Addr::new` is now a `const` function][57234]
1307
1308 Stabilized APIs
1309 ---------------
1310 - [`unix::FileExt::read_exact_at`]
1311 - [`unix::FileExt::write_all_at`]
1312 - [`Option::transpose`]
1313 - [`Result::transpose`]
1314 - [`convert::identity`]
1315 - [`pin::Pin`]
1316 - [`marker::Unpin`]
1317 - [`marker::PhantomPinned`]
1318 - [`Vec::resize_with`]
1319 - [`VecDeque::resize_with`]
1320 - [`Duration::as_millis`]
1321 - [`Duration::as_micros`]
1322 - [`Duration::as_nanos`]
1323
1324
1325 Cargo
1326 -----
1327 - [You can now publish crates that require a feature flag to compile with
1328 `cargo publish --features` or `cargo publish --all-features`.][cargo/6453]
1329 - [Cargo should now rebuild a crate if a file was modified during the initial
1330 build.][cargo/6484]
1331
1332 Compatibility Notes
1333 -------------------
1334 - The methods `str::{trim_left, trim_right, trim_left_matches, trim_right_matches}`
1335 are now deprecated in the standard library, and their usage will now produce a warning.
1336 Please use the `str::{trim_start, trim_end, trim_start_matches, trim_end_matches}`
1337 methods instead.
1338 - The `Error::cause` method has been deprecated in favor of `Error::source` which supports
1339 downcasting.
1340 - [Libtest no longer creates a new thread for each test when
1341 `--test-threads=1`. It also runs the tests in deterministic order][56243]
1342
1343 [55982]: https://github.com/rust-lang/rust/pull/55982/
1344 [56243]: https://github.com/rust-lang/rust/pull/56243
1345 [56303]: https://github.com/rust-lang/rust/pull/56303/
1346 [56351]: https://github.com/rust-lang/rust/pull/56351/
1347 [56362]: https://github.com/rust-lang/rust/pull/56362
1348 [56642]: https://github.com/rust-lang/rust/pull/56642/
1349 [56769]: https://github.com/rust-lang/rust/pull/56769/
1350 [56805]: https://github.com/rust-lang/rust/pull/56805
1351 [56947]: https://github.com/rust-lang/rust/pull/56947/
1352 [57049]: https://github.com/rust-lang/rust/pull/57049/
1353 [57067]: https://github.com/rust-lang/rust/pull/57067/
1354 [57105]: https://github.com/rust-lang/rust/pull/57105
1355 [57130]: https://github.com/rust-lang/rust/pull/57130/
1356 [57167]: https://github.com/rust-lang/rust/pull/57167/
1357 [57175]: https://github.com/rust-lang/rust/pull/57175/
1358 [57234]: https://github.com/rust-lang/rust/pull/57234/
1359 [57332]: https://github.com/rust-lang/rust/pull/57332/
1360 [57465]: https://github.com/rust-lang/rust/pull/57465/
1361 [57532]: https://github.com/rust-lang/rust/pull/57532/
1362 [57535]: https://github.com/rust-lang/rust/pull/57535/
1363 [57566]: https://github.com/rust-lang/rust/pull/57566/
1364 [57615]: https://github.com/rust-lang/rust/pull/57615/
1365 [cargo/6453]: https://github.com/rust-lang/cargo/pull/6453/
1366 [cargo/6484]: https://github.com/rust-lang/cargo/pull/6484/
1367 [`unix::FileExt::read_exact_at`]: https://doc.rust-lang.org/std/os/unix/fs/trait.FileExt.html#method.read_exact_at
1368 [`unix::FileExt::write_all_at`]: https://doc.rust-lang.org/std/os/unix/fs/trait.FileExt.html#method.write_all_at
1369 [`Option::transpose`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.transpose
1370 [`Result::transpose`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.transpose
1371 [`convert::identity`]: https://doc.rust-lang.org/std/convert/fn.identity.html
1372 [`pin::Pin`]: https://doc.rust-lang.org/std/pin/struct.Pin.html
1373 [`marker::Unpin`]: https://doc.rust-lang.org/stable/std/marker/trait.Unpin.html
1374 [`marker::PhantomPinned`]: https://doc.rust-lang.org/nightly/std/marker/struct.PhantomPinned.html
1375 [`Vec::resize_with`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.resize_with
1376 [`VecDeque::resize_with`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.resize_with
1377 [`Duration::as_millis`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_millis
1378 [`Duration::as_micros`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_micros
1379 [`Duration::as_nanos`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_nanos
1380 [platform-support]: https://forge.rust-lang.org/platform-support.html
1381
1382 Version 1.32.0 (2019-01-17)
1383 ==========================
1384
1385 Language
1386 --------
1387 #### 2018 edition
1388 - [You can now use the `?` operator in macro definitions.][56245] The `?`
1389 operator allows you to specify zero or one repetitions similar to the `*` and
1390 `+` operators.
1391 - [Module paths with no leading keyword like `super`, `self`, or `crate`, will
1392 now always resolve to the item (`enum`, `struct`, etc.) available in the
1393 module if present, before resolving to a external crate or an item the prelude.][56759]
1394 E.g.
1395 ```rust
1396 enum Color { Red, Green, Blue }
1397
1398 use Color::*;
1399 ```
1400
1401 #### All editions
1402 - [You can now match against `PhantomData<T>` types.][55837]
1403 - [You can now match against literals in macros with the `literal`
1404 specifier.][56072] This will match against a literal of any type.
1405 E.g. `1`, `'A'`, `"Hello World"`
1406 - [Self can now be used as a constructor and pattern for unit and tuple structs.][56365] E.g.
1407 ```rust
1408 struct Point(i32, i32);
1409
1410 impl Point {
1411 pub fn new(x: i32, y: i32) -> Self {
1412 Self(x, y)
1413 }
1414
1415 pub fn is_origin(&self) -> bool {
1416 match self {
1417 Self(0, 0) => true,
1418 _ => false,
1419 }
1420 }
1421 }
1422 ```
1423 - [Self can also now be used in type definitions.][56366] E.g.
1424 ```rust
1425 enum List<T>
1426 where
1427 Self: PartialOrd<Self> // can write `Self` instead of `List<T>`
1428 {
1429 Nil,
1430 Cons(T, Box<Self>) // likewise here
1431 }
1432 ```
1433 - [You can now mark traits with `#[must_use]`.][55663] This provides a warning if
1434 a `impl Trait` or `dyn Trait` is returned and unused in the program.
1435
1436 Compiler
1437 --------
1438 - [The default allocator has changed from jemalloc to the default allocator on
1439 your system.][55238] The compiler itself on Linux & macOS will still use
1440 jemalloc, but programs compiled with it will use the system allocator.
1441 - [Added the `aarch64-pc-windows-msvc` target.][55702]
1442
1443 Libraries
1444 ---------
1445 - [`PathBuf` now implements `FromStr`.][55148]
1446 - [`Box<[T]>` now implements `FromIterator<T>`.][55843]
1447 - [The `dbg!` macro has been stabilized.][56395] This macro enables you to
1448 easily debug expressions in your rust program. E.g.
1449 ```rust
1450 let a = 2;
1451 let b = dbg!(a * 2) + 1;
1452 // ^-- prints: [src/main.rs:4] a * 2 = 4
1453 assert_eq!(b, 5);
1454 ```
1455
1456 The following APIs are now `const` functions and can be used in a
1457 `const` context.
1458
1459 - [`Cell::as_ptr`]
1460 - [`UnsafeCell::get`]
1461 - [`char::is_ascii`]
1462 - [`iter::empty`]
1463 - [`ManuallyDrop::new`]
1464 - [`ManuallyDrop::into_inner`]
1465 - [`RangeInclusive::start`]
1466 - [`RangeInclusive::end`]
1467 - [`NonNull::as_ptr`]
1468 - [`slice::as_ptr`]
1469 - [`str::as_ptr`]
1470 - [`Duration::as_secs`]
1471 - [`Duration::subsec_millis`]
1472 - [`Duration::subsec_micros`]
1473 - [`Duration::subsec_nanos`]
1474 - [`CStr::as_ptr`]
1475 - [`Ipv4Addr::is_unspecified`]
1476 - [`Ipv6Addr::new`]
1477 - [`Ipv6Addr::octets`]
1478
1479 Stabilized APIs
1480 ---------------
1481 - [`i8::to_be_bytes`]
1482 - [`i8::to_le_bytes`]
1483 - [`i8::to_ne_bytes`]
1484 - [`i8::from_be_bytes`]
1485 - [`i8::from_le_bytes`]
1486 - [`i8::from_ne_bytes`]
1487 - [`i16::to_be_bytes`]
1488 - [`i16::to_le_bytes`]
1489 - [`i16::to_ne_bytes`]
1490 - [`i16::from_be_bytes`]
1491 - [`i16::from_le_bytes`]
1492 - [`i16::from_ne_bytes`]
1493 - [`i32::to_be_bytes`]
1494 - [`i32::to_le_bytes`]
1495 - [`i32::to_ne_bytes`]
1496 - [`i32::from_be_bytes`]
1497 - [`i32::from_le_bytes`]
1498 - [`i32::from_ne_bytes`]
1499 - [`i64::to_be_bytes`]
1500 - [`i64::to_le_bytes`]
1501 - [`i64::to_ne_bytes`]
1502 - [`i64::from_be_bytes`]
1503 - [`i64::from_le_bytes`]
1504 - [`i64::from_ne_bytes`]
1505 - [`i128::to_be_bytes`]
1506 - [`i128::to_le_bytes`]
1507 - [`i128::to_ne_bytes`]
1508 - [`i128::from_be_bytes`]
1509 - [`i128::from_le_bytes`]
1510 - [`i128::from_ne_bytes`]
1511 - [`isize::to_be_bytes`]
1512 - [`isize::to_le_bytes`]
1513 - [`isize::to_ne_bytes`]
1514 - [`isize::from_be_bytes`]
1515 - [`isize::from_le_bytes`]
1516 - [`isize::from_ne_bytes`]
1517 - [`u8::to_be_bytes`]
1518 - [`u8::to_le_bytes`]
1519 - [`u8::to_ne_bytes`]
1520 - [`u8::from_be_bytes`]
1521 - [`u8::from_le_bytes`]
1522 - [`u8::from_ne_bytes`]
1523 - [`u16::to_be_bytes`]
1524 - [`u16::to_le_bytes`]
1525 - [`u16::to_ne_bytes`]
1526 - [`u16::from_be_bytes`]
1527 - [`u16::from_le_bytes`]
1528 - [`u16::from_ne_bytes`]
1529 - [`u32::to_be_bytes`]
1530 - [`u32::to_le_bytes`]
1531 - [`u32::to_ne_bytes`]
1532 - [`u32::from_be_bytes`]
1533 - [`u32::from_le_bytes`]
1534 - [`u32::from_ne_bytes`]
1535 - [`u64::to_be_bytes`]
1536 - [`u64::to_le_bytes`]
1537 - [`u64::to_ne_bytes`]
1538 - [`u64::from_be_bytes`]
1539 - [`u64::from_le_bytes`]
1540 - [`u64::from_ne_bytes`]
1541 - [`u128::to_be_bytes`]
1542 - [`u128::to_le_bytes`]
1543 - [`u128::to_ne_bytes`]
1544 - [`u128::from_be_bytes`]
1545 - [`u128::from_le_bytes`]
1546 - [`u128::from_ne_bytes`]
1547 - [`usize::to_be_bytes`]
1548 - [`usize::to_le_bytes`]
1549 - [`usize::to_ne_bytes`]
1550 - [`usize::from_be_bytes`]
1551 - [`usize::from_le_bytes`]
1552 - [`usize::from_ne_bytes`]
1553
1554 Cargo
1555 -----
1556 - [You can now run `cargo c` as an alias for `cargo check`.][cargo/6218]
1557 - [Usernames are now allowed in alt registry URLs.][cargo/6242]
1558
1559 Misc
1560 ----
1561 - [`libproc_macro` has been added to the `rust-src` distribution.][55280]
1562
1563 Compatibility Notes
1564 -------------------
1565 - [The argument types for AVX's
1566 `_mm256_stream_si256`, `_mm256_stream_pd`, `_mm256_stream_ps`][55610] have
1567 been changed from `*const` to `*mut` as the previous implementation
1568 was unsound.
1569
1570
1571 [55148]: https://github.com/rust-lang/rust/pull/55148/
1572 [55238]: https://github.com/rust-lang/rust/pull/55238/
1573 [55280]: https://github.com/rust-lang/rust/pull/55280/
1574 [55610]: https://github.com/rust-lang/rust/pull/55610/
1575 [55663]: https://github.com/rust-lang/rust/pull/55663/
1576 [55702]: https://github.com/rust-lang/rust/pull/55702/
1577 [55837]: https://github.com/rust-lang/rust/pull/55837/
1578 [55843]: https://github.com/rust-lang/rust/pull/55843/
1579 [56072]: https://github.com/rust-lang/rust/pull/56072/
1580 [56245]: https://github.com/rust-lang/rust/pull/56245/
1581 [56365]: https://github.com/rust-lang/rust/pull/56365/
1582 [56366]: https://github.com/rust-lang/rust/pull/56366/
1583 [56395]: https://github.com/rust-lang/rust/pull/56395/
1584 [56759]: https://github.com/rust-lang/rust/pull/56759/
1585 [cargo/6218]: https://github.com/rust-lang/cargo/pull/6218/
1586 [cargo/6242]: https://github.com/rust-lang/cargo/pull/6242/
1587 [`CStr::as_ptr`]: https://doc.rust-lang.org/std/ffi/struct.CStr.html#method.as_ptr
1588 [`Cell::as_ptr`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.as_ptr
1589 [`Duration::as_secs`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_secs
1590 [`Duration::subsec_micros`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_micros
1591 [`Duration::subsec_millis`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_millis
1592 [`Duration::subsec_nanos`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_nanos
1593 [`Ipv4Addr::is_unspecified`]: https://doc.rust-lang.org/std/net/struct.Ipv4Addr.html#method.is_unspecified
1594 [`Ipv6Addr::new`]: https://doc.rust-lang.org/std/net/struct.Ipv6Addr.html#method.new
1595 [`Ipv6Addr::octets`]: https://doc.rust-lang.org/std/net/struct.Ipv6Addr.html#method.octets
1596 [`ManuallyDrop::into_inner`]: https://doc.rust-lang.org/std/mem/struct.ManuallyDrop.html#method.into_inner
1597 [`ManuallyDrop::new`]: https://doc.rust-lang.org/std/mem/struct.ManuallyDrop.html#method.new
1598 [`NonNull::as_ptr`]: https://doc.rust-lang.org/std/ptr/struct.NonNull.html#method.as_ptr
1599 [`RangeInclusive::end`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html#method.end
1600 [`RangeInclusive::start`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html#method.start
1601 [`UnsafeCell::get`]: https://doc.rust-lang.org/std/cell/struct.UnsafeCell.html#method.get
1602 [`slice::as_ptr`]: https://doc.rust-lang.org/std/primitive.slice.html#method.as_ptr
1603 [`char::is_ascii`]: https://doc.rust-lang.org/std/primitive.char.html#method.is_ascii
1604 [`i128::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.from_be_bytes
1605 [`i128::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.from_le_bytes
1606 [`i128::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.from_ne_bytes
1607 [`i128::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.to_be_bytes
1608 [`i128::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.to_le_bytes
1609 [`i128::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i128.html#method.to_ne_bytes
1610 [`i16::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_be_bytes
1611 [`i16::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_le_bytes
1612 [`i16::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.from_ne_bytes
1613 [`i16::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.to_be_bytes
1614 [`i16::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.to_le_bytes
1615 [`i16::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i16.html#method.to_ne_bytes
1616 [`i32::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.from_be_bytes
1617 [`i32::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.from_le_bytes
1618 [`i32::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.from_ne_bytes
1619 [`i32::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.to_be_bytes
1620 [`i32::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.to_le_bytes
1621 [`i32::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i32.html#method.to_ne_bytes
1622 [`i64::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.from_be_bytes
1623 [`i64::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.from_le_bytes
1624 [`i64::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.from_ne_bytes
1625 [`i64::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.to_be_bytes
1626 [`i64::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.to_le_bytes
1627 [`i64::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i64.html#method.to_ne_bytes
1628 [`i8::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.from_be_bytes
1629 [`i8::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.from_le_bytes
1630 [`i8::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.from_ne_bytes
1631 [`i8::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.to_be_bytes
1632 [`i8::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.to_le_bytes
1633 [`i8::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.to_ne_bytes
1634 [`isize::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.from_be_bytes
1635 [`isize::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.from_le_bytes
1636 [`isize::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.from_ne_bytes
1637 [`isize::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.to_be_bytes
1638 [`isize::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.to_le_bytes
1639 [`isize::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.isize.html#method.to_ne_bytes
1640 [`iter::empty`]: https://doc.rust-lang.org/std/iter/fn.empty.html
1641 [`str::as_ptr`]: https://doc.rust-lang.org/std/primitive.str.html#method.as_ptr
1642 [`u128::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.from_be_bytes
1643 [`u128::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.from_le_bytes
1644 [`u128::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.from_ne_bytes
1645 [`u128::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.to_be_bytes
1646 [`u128::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.to_le_bytes
1647 [`u128::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u128.html#method.to_ne_bytes
1648 [`u16::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.from_be_bytes
1649 [`u16::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.from_le_bytes
1650 [`u16::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.from_ne_bytes
1651 [`u16::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.to_be_bytes
1652 [`u16::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.to_le_bytes
1653 [`u16::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u16.html#method.to_ne_bytes
1654 [`u32::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.from_be_bytes
1655 [`u32::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.from_le_bytes
1656 [`u32::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.from_ne_bytes
1657 [`u32::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.to_be_bytes
1658 [`u32::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.to_le_bytes
1659 [`u32::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u32.html#method.to_ne_bytes
1660 [`u64::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.from_be_bytes
1661 [`u64::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.from_le_bytes
1662 [`u64::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.from_ne_bytes
1663 [`u64::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.to_be_bytes
1664 [`u64::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.to_le_bytes
1665 [`u64::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u64.html#method.to_ne_bytes
1666 [`u8::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.from_be_bytes
1667 [`u8::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.from_le_bytes
1668 [`u8::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.from_ne_bytes
1669 [`u8::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.to_be_bytes
1670 [`u8::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.to_le_bytes
1671 [`u8::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.u8.html#method.to_ne_bytes
1672 [`usize::from_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.from_be_bytes
1673 [`usize::from_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.from_le_bytes
1674 [`usize::from_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.from_ne_bytes
1675 [`usize::to_be_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.to_be_bytes
1676 [`usize::to_le_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.to_le_bytes
1677 [`usize::to_ne_bytes`]: https://doc.rust-lang.org/stable/std/primitive.usize.html#method.to_ne_bytes
1678
1679
1680 Version 1.31.1 (2018-12-20)
1681 ===========================
1682
1683 - [Fix Rust failing to build on `powerpc-unknown-netbsd`][56562]
1684 - [Fix broken go-to-definition in RLS][rls/1171]
1685 - [Fix infinite loop on hover in RLS][rls/1170]
1686
1687 [56562]: https://github.com/rust-lang/rust/pull/56562
1688 [rls/1171]: https://github.com/rust-lang/rls/issues/1171
1689 [rls/1170]: https://github.com/rust-lang/rls/pull/1170
1690
1691 Version 1.31.0 (2018-12-06)
1692 ==========================
1693
1694 Language
1695 --------
1696 - 🎉 [This version marks the release of the 2018 edition of Rust.][54057] 🎉
1697 - [New lifetime elision rules now allow for eliding lifetimes in functions and
1698 impl headers.][54778] E.g. `impl<'a> Reader for BufReader<'a> {}` can now be
1699 `impl Reader for BufReader<'_> {}`. Lifetimes are still required to be defined
1700 in structs.
1701 - [You can now define and use `const` functions.][54835] These are currently
1702 a strict minimal subset of the [const fn RFC][RFC-911]. Refer to the
1703 [language reference][const-reference] for what exactly is available.
1704 - [You can now use tool lints, which allow you to scope lints from external
1705 tools using attributes.][54870] E.g. `#[allow(clippy::filter_map)]`.
1706 - [`#[no_mangle]` and `#[export_name]` attributes can now be located anywhere in
1707 a crate, not just in exported functions.][54451]
1708 - [You can now use parentheses in pattern matches.][54497]
1709
1710 Compiler
1711 --------
1712 - [Updated musl to 1.1.20][54430]
1713
1714 Libraries
1715 ---------
1716 - [You can now convert `num::NonZero*` types to their raw equivalents using the
1717 `From` trait.][54240] E.g. `u8` now implements `From<NonZeroU8>`.
1718 - [You can now convert a `&Option<T>` into `Option<&T>` and `&mut Option<T>`
1719 into `Option<&mut T>` using the `From` trait.][53218]
1720 - [You can now multiply (`*`) a `time::Duration` by a `u32`.][52813]
1721
1722
1723 Stabilized APIs
1724 ---------------
1725 - [`slice::align_to`]
1726 - [`slice::align_to_mut`]
1727 - [`slice::chunks_exact`]
1728 - [`slice::chunks_exact_mut`]
1729 - [`slice::rchunks`]
1730 - [`slice::rchunks_mut`]
1731 - [`slice::rchunks_exact`]
1732 - [`slice::rchunks_exact_mut`]
1733 - [`Option::replace`]
1734
1735 Cargo
1736 -----
1737 - [Cargo will now download crates in parallel using HTTP/2.][cargo/6005]
1738 - [You can now rename packages in your Cargo.toml][cargo/6319] We have a guide
1739 on [how to use the `package` key in your dependencies.][cargo-rename-reference]
1740
1741 [52813]: https://github.com/rust-lang/rust/pull/52813/
1742 [53218]: https://github.com/rust-lang/rust/pull/53218/
1743 [53555]: https://github.com/rust-lang/rust/issues/53555/
1744 [54057]: https://github.com/rust-lang/rust/pull/54057/
1745 [54240]: https://github.com/rust-lang/rust/pull/54240/
1746 [54430]: https://github.com/rust-lang/rust/pull/54430/
1747 [54451]: https://github.com/rust-lang/rust/pull/54451/
1748 [54497]: https://github.com/rust-lang/rust/pull/54497/
1749 [54778]: https://github.com/rust-lang/rust/pull/54778/
1750 [54835]: https://github.com/rust-lang/rust/pull/54835/
1751 [54870]: https://github.com/rust-lang/rust/pull/54870/
1752 [RFC-911]: https://github.com/rust-lang/rfcs/pull/911
1753 [`Option::replace`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.replace
1754 [`slice::align_to_mut`]: https://doc.rust-lang.org/std/primitive.slice.html#method.align_to_mut
1755 [`slice::align_to`]: https://doc.rust-lang.org/std/primitive.slice.html#method.align_to
1756 [`slice::chunks_exact_mut`]: https://doc.rust-lang.org/std/primitive.slice.html#method.chunks_exact_mut
1757 [`slice::chunks_exact`]: https://doc.rust-lang.org/std/primitive.slice.html#method.chunks_exact
1758 [`slice::rchunks_exact_mut`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rchunks_mut
1759 [`slice::rchunks_exact`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rchunks_exact
1760 [`slice::rchunks_mut`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rchunks_mut
1761 [`slice::rchunks`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rchunks
1762 [cargo/6005]: https://github.com/rust-lang/cargo/pull/6005/
1763 [cargo/6319]: https://github.com/rust-lang/cargo/pull/6319/
1764 [cargo-rename-reference]: https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#renaming-dependencies-in-cargotoml
1765 [const-reference]: https://doc.rust-lang.org/reference/items/functions.html#const-functions
1766
1767 Version 1.30.1 (2018-11-08)
1768 ===========================
1769
1770 - [Fixed overflow ICE in rustdoc][54199]
1771 - [Cap Cargo progress bar width at 60 in MSYS terminals][cargo/6122]
1772
1773 [54199]: https://github.com/rust-lang/rust/pull/54199
1774 [cargo/6122]: https://github.com/rust-lang/cargo/pull/6122
1775
1776 Version 1.30.0 (2018-10-25)
1777 ==========================
1778
1779 Language
1780 --------
1781 - [Procedural macros are now available.][52081] These kinds of macros allow for
1782 more powerful code generation. There is a [new chapter available][proc-macros]
1783 in the Rust Programming Language book that goes further in depth.
1784 - [You can now use keywords as identifiers using the raw identifiers
1785 syntax (`r#`),][53236] e.g. `let r#for = true;`
1786 - [Using anonymous parameters in traits is now deprecated with a warning and
1787 will be a hard error in the 2018 edition.][53272]
1788 - [You can now use `crate` in paths.][54404] This allows you to refer to the
1789 crate root in the path, e.g. `use crate::foo;` refers to `foo` in `src/lib.rs`.
1790 - [Using a external crate no longer requires being prefixed with `::`.][54404]
1791 Previously, using a external crate in a module without a use statement
1792 required `let json = ::serde_json::from_str(foo);` but can now be written
1793 as `let json = serde_json::from_str(foo);`.
1794 - [You can now apply the `#[used]` attribute to static items to prevent the
1795 compiler from optimising them away, even if they appear to be unused,][51363]
1796 e.g. `#[used] static FOO: u32 = 1;`
1797 - [You can now import and reexport macros from other crates with the `use`
1798 syntax.][50911] Macros exported with `#[macro_export]` are now placed into
1799 the root module of the crate. If your macro relies on calling other local
1800 macros, it is recommended to export with the
1801 `#[macro_export(local_inner_macros)]` attribute so users won't have to import
1802 those macros.
1803 - [You can now catch visibility keywords (e.g. `pub`, `pub(crate)`) in macros
1804 using the `vis` specifier.][53370]
1805 - [Non-macro attributes now allow all forms of literals, not just
1806 strings.][53044] Previously, you would write `#[attr("true")]`, and you can now
1807 write `#[attr(true)]`.
1808 - [You can now specify a function to handle a panic in the Rust runtime with the
1809 `#[panic_handler]` attribute.][51366]
1810
1811 Compiler
1812 --------
1813 - [Added the `riscv32imc-unknown-none-elf` target.][53822]
1814 - [Added the `aarch64-unknown-netbsd` target][53165]
1815
1816 Libraries
1817 ---------
1818 - [`ManuallyDrop` now allows the inner type to be unsized.][53033]
1819
1820 Stabilized APIs
1821 ---------------
1822 - [`Ipv4Addr::BROADCAST`]
1823 - [`Ipv4Addr::LOCALHOST`]
1824 - [`Ipv4Addr::UNSPECIFIED`]
1825 - [`Ipv6Addr::LOCALHOST`]
1826 - [`Ipv6Addr::UNSPECIFIED`]
1827 - [`Iterator::find_map`]
1828
1829 The following methods are replacement methods for `trim_left`, `trim_right`,
1830 `trim_left_matches`, and `trim_right_matches`, which will be deprecated
1831 in 1.33.0:
1832 - [`str::trim_end_matches`]
1833 - [`str::trim_end`]
1834 - [`str::trim_start_matches`]
1835 - [`str::trim_start`]
1836
1837 Cargo
1838 ----
1839 - [`cargo run` doesn't require specifying a package in workspaces.][cargo/5877]
1840 - [`cargo doc` now supports `--message-format=json`.][cargo/5878] This is
1841 equivalent to calling `rustdoc --error-format=json`.
1842 - [Cargo will now provide a progress bar for builds.][cargo/5995]
1843
1844 Misc
1845 ----
1846 - [`rustdoc` allows you to specify what edition to treat your code as with the
1847 `--edition` option.][54057]
1848 - [`rustdoc` now has the `--color` (specify whether to output color) and
1849 `--error-format` (specify error format, e.g. `json`) options.][53003]
1850 - [We now distribute a `rust-gdbgui` script that invokes `gdbgui` with Rust
1851 debug symbols.][53774]
1852 - [Attributes from Rust tools such as `rustfmt` or `clippy` are now
1853 available,][53459] e.g. `#[rustfmt::skip]` will skip formatting the next item.
1854
1855 [50911]: https://github.com/rust-lang/rust/pull/50911/
1856 [51363]: https://github.com/rust-lang/rust/pull/51363/
1857 [51366]: https://github.com/rust-lang/rust/pull/51366/
1858 [52081]: https://github.com/rust-lang/rust/pull/52081/
1859 [53003]: https://github.com/rust-lang/rust/pull/53003/
1860 [53033]: https://github.com/rust-lang/rust/pull/53033/
1861 [53044]: https://github.com/rust-lang/rust/pull/53044/
1862 [53165]: https://github.com/rust-lang/rust/pull/53165/
1863 [53213]: https://github.com/rust-lang/rust/pull/53213/
1864 [53236]: https://github.com/rust-lang/rust/pull/53236/
1865 [53272]: https://github.com/rust-lang/rust/pull/53272/
1866 [53370]: https://github.com/rust-lang/rust/pull/53370/
1867 [53459]: https://github.com/rust-lang/rust/pull/53459/
1868 [53774]: https://github.com/rust-lang/rust/pull/53774/
1869 [53822]: https://github.com/rust-lang/rust/pull/53822/
1870 [54057]: https://github.com/rust-lang/rust/pull/54057/
1871 [54146]: https://github.com/rust-lang/rust/pull/54146/
1872 [54404]: https://github.com/rust-lang/rust/pull/54404/
1873 [cargo/5877]: https://github.com/rust-lang/cargo/pull/5877/
1874 [cargo/5878]: https://github.com/rust-lang/cargo/pull/5878/
1875 [cargo/5995]: https://github.com/rust-lang/cargo/pull/5995/
1876 [proc-macros]: https://doc.rust-lang.org/nightly/book/2018-edition/ch19-06-macros.html
1877
1878 [`Ipv4Addr::BROADCAST`]: https://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#associatedconstant.BROADCAST
1879 [`Ipv4Addr::LOCALHOST`]: https://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#associatedconstant.LOCALHOST
1880 [`Ipv4Addr::UNSPECIFIED`]: https://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#associatedconstant.UNSPECIFIED
1881 [`Ipv6Addr::LOCALHOST`]: https://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#associatedconstant.LOCALHOST
1882 [`Ipv6Addr::UNSPECIFIED`]: https://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#associatedconstant.UNSPECIFIED
1883 [`Iterator::find_map`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.find_map
1884 [`str::trim_end_matches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.trim_end_matches
1885 [`str::trim_end`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.trim_end
1886 [`str::trim_start_matches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.trim_start_matches
1887 [`str::trim_start`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.trim_start
1888
1889
1890 Version 1.29.2 (2018-10-11)
1891 ===========================
1892
1893 - [Workaround for an aliasing-related LLVM bug, which caused miscompilation.][54639]
1894 - The `rls-preview` component on the windows-gnu targets has been restored.
1895
1896 [54639]: https://github.com/rust-lang/rust/pull/54639
1897
1898
1899 Version 1.29.1 (2018-09-25)
1900 ===========================
1901
1902 Security Notes
1903 --------------
1904
1905 - The standard library's `str::repeat` function contained an out of bounds write
1906 caused by an integer overflow. This has been fixed by deterministically
1907 panicking when an overflow happens.
1908
1909 Thank you to Scott McMurray for responsibly disclosing this vulnerability to
1910 us.
1911
1912
1913 Version 1.29.0 (2018-09-13)
1914 ==========================
1915
1916 Compiler
1917 --------
1918 - [Bumped minimum LLVM version to 5.0.][51899]
1919 - [Added `powerpc64le-unknown-linux-musl` target.][51619]
1920 - [Added `aarch64-unknown-hermit` and `x86_64-unknown-hermit` targets.][52861]
1921
1922 Libraries
1923 ---------
1924 - [`Once::call_once` no longer requires `Once` to be `'static`.][52239]
1925 - [`BuildHasherDefault` now implements `PartialEq` and `Eq`.][52402]
1926 - [`Box<CStr>`, `Box<OsStr>`, and `Box<Path>` now implement `Clone`.][51912]
1927 - [Implemented `PartialEq<&str>` for `OsString` and `PartialEq<OsString>`
1928 for `&str`.][51178]
1929 - [`Cell<T>` now allows `T` to be unsized.][50494]
1930 - [`SocketAddr` is now stable on Redox.][52656]
1931
1932 Stabilized APIs
1933 ---------------
1934 - [`Arc::downcast`]
1935 - [`Iterator::flatten`]
1936 - [`Rc::downcast`]
1937
1938 Cargo
1939 -----
1940 - [Cargo can silently fix some bad lockfiles.][cargo/5831] You can use
1941 `--locked` to disable this behavior.
1942 - [`cargo-install` will now allow you to cross compile an install
1943 using `--target`.][cargo/5614]
1944 - [Added the `cargo-fix` subcommand to automatically move project code from
1945 2015 edition to 2018.][cargo/5723]
1946 - [`cargo doc` can now optionally document private types using the
1947 `--document-private-items` flag.][cargo/5543]
1948
1949 Misc
1950 ----
1951 - [`rustdoc` now has the `--cap-lints` option which demotes all lints above
1952 the specified level to that level.][52354] For example `--cap-lints warn`
1953 will demote `deny` and `forbid` lints to `warn`.
1954 - [`rustc` and `rustdoc` will now have the exit code of `1` if compilation
1955 fails and `101` if there is a panic.][52197]
1956 - [A preview of clippy has been made available through rustup.][51122]
1957 You can install the preview with `rustup component add clippy-preview`.
1958
1959 Compatibility Notes
1960 -------------------
1961 - [`str::{slice_unchecked, slice_unchecked_mut}` are now deprecated.][51807]
1962 Use `str::get_unchecked(begin..end)` instead.
1963 - [`std::env::home_dir` is now deprecated for its unintuitive behavior.][51656]
1964 Consider using the `home_dir` function from
1965 https://crates.io/crates/dirs instead.
1966 - [`rustc` will no longer silently ignore invalid data in target spec.][52330]
1967 - [`cfg` attributes and `--cfg` command line flags are now more
1968 strictly validated.][53893]
1969
1970 [53893]: https://github.com/rust-lang/rust/pull/53893/
1971 [52861]: https://github.com/rust-lang/rust/pull/52861/
1972 [52656]: https://github.com/rust-lang/rust/pull/52656/
1973 [52239]: https://github.com/rust-lang/rust/pull/52239/
1974 [52330]: https://github.com/rust-lang/rust/pull/52330/
1975 [52354]: https://github.com/rust-lang/rust/pull/52354/
1976 [52402]: https://github.com/rust-lang/rust/pull/52402/
1977 [52103]: https://github.com/rust-lang/rust/pull/52103/
1978 [52197]: https://github.com/rust-lang/rust/pull/52197/
1979 [51807]: https://github.com/rust-lang/rust/pull/51807/
1980 [51899]: https://github.com/rust-lang/rust/pull/51899/
1981 [51912]: https://github.com/rust-lang/rust/pull/51912/
1982 [51511]: https://github.com/rust-lang/rust/pull/51511/
1983 [51619]: https://github.com/rust-lang/rust/pull/51619/
1984 [51656]: https://github.com/rust-lang/rust/pull/51656/
1985 [51178]: https://github.com/rust-lang/rust/pull/51178/
1986 [51122]: https://github.com/rust-lang/rust/pull/51122
1987 [50494]: https://github.com/rust-lang/rust/pull/50494/
1988 [cargo/5543]: https://github.com/rust-lang/cargo/pull/5543
1989 [cargo/5614]: https://github.com/rust-lang/cargo/pull/5614/
1990 [cargo/5723]: https://github.com/rust-lang/cargo/pull/5723/
1991 [cargo/5831]: https://github.com/rust-lang/cargo/pull/5831/
1992 [`Arc::downcast`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.downcast
1993 [`Iterator::flatten`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.flatten
1994 [`Rc::downcast`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.downcast
1995
1996
1997 Version 1.28.0 (2018-08-02)
1998 ===========================
1999
2000 Language
2001 --------
2002 - [The `#[repr(transparent)]` attribute is now stable.][51562] This attribute
2003 allows a Rust newtype wrapper (`struct NewType<T>(T);`) to be represented as
2004 the inner type across Foreign Function Interface (FFI) boundaries.
2005 - [The keywords `pure`, `sizeof`, `alignof`, and `offsetof` have been unreserved
2006 and can now be used as identifiers.][51196]
2007 - [The `GlobalAlloc` trait and `#[global_allocator]` attribute are now
2008 stable.][51241] This will allow users to specify a global allocator for
2009 their program.
2010 - [Unit test functions marked with the `#[test]` attribute can now return
2011 `Result<(), E: Debug>` in addition to `()`.][51298]
2012 - [The `lifetime` specifier for `macro_rules!` is now stable.][50385] This
2013 allows macros to easily target lifetimes.
2014
2015 Compiler
2016 --------
2017 - [The `s` and `z` optimisation levels are now stable.][50265] These optimisations
2018 prioritise making smaller binary sizes. `z` is the same as `s` with the
2019 exception that it does not vectorise loops, which typically results in an even
2020 smaller binary.
2021 - [The short error format is now stable.][49546] Specified with
2022 `--error-format=short` this option will provide a more compressed output of
2023 rust error messages.
2024 - [Added a lint warning when you have duplicated `macro_export`s.][50143]
2025 - [Reduced the number of allocations in the macro parser.][50855] This can
2026 improve compile times of macro heavy crates on average by 5%.
2027
2028 Libraries
2029 ---------
2030 - [Implemented `Default` for `&mut str`.][51306]
2031 - [Implemented `From<bool>` for all integer and unsigned number types.][50554]
2032 - [Implemented `Extend` for `()`.][50234]
2033 - [The `Debug` implementation of `time::Duration` should now be more easily
2034 human readable.][50364] Previously a `Duration` of one second would printed as
2035 `Duration { secs: 1, nanos: 0 }` and will now be printed as `1s`.
2036 - [Implemented `From<&String>` for `Cow<str>`, `From<&Vec<T>>` for `Cow<[T]>`,
2037 `From<Cow<CStr>>` for `CString`, `From<CString>, From<CStr>, From<&CString>`
2038 for `Cow<CStr>`, `From<OsString>, From<OsStr>, From<&OsString>` for
2039 `Cow<OsStr>`, `From<&PathBuf>` for `Cow<Path>`, and `From<Cow<Path>>`
2040 for `PathBuf`.][50170]
2041 - [Implemented `Shl` and `Shr` for `Wrapping<u128>`
2042 and `Wrapping<i128>`.][50465]
2043 - [`DirEntry::metadata` now uses `fstatat` instead of `lstat` when
2044 possible.][51050] This can provide up to a 40% speed increase.
2045 - [Improved error messages when using `format!`.][50610]
2046
2047 Stabilized APIs
2048 ---------------
2049 - [`Iterator::step_by`]
2050 - [`Path::ancestors`]
2051 - [`SystemTime::UNIX_EPOCH`]
2052 - [`alloc::GlobalAlloc`]
2053 - [`alloc::Layout`]
2054 - [`alloc::LayoutErr`]
2055 - [`alloc::System`]
2056 - [`alloc::alloc`]
2057 - [`alloc::alloc_zeroed`]
2058 - [`alloc::dealloc`]
2059 - [`alloc::realloc`]
2060 - [`alloc::handle_alloc_error`]
2061 - [`btree_map::Entry::or_default`]
2062 - [`fmt::Alignment`]
2063 - [`hash_map::Entry::or_default`]
2064 - [`iter::repeat_with`]
2065 - [`num::NonZeroUsize`]
2066 - [`num::NonZeroU128`]
2067 - [`num::NonZeroU16`]
2068 - [`num::NonZeroU32`]
2069 - [`num::NonZeroU64`]
2070 - [`num::NonZeroU8`]
2071 - [`ops::RangeBounds`]
2072 - [`slice::SliceIndex`]
2073 - [`slice::from_mut`]
2074 - [`slice::from_ref`]
2075 - [`{Any + Send + Sync}::downcast_mut`]
2076 - [`{Any + Send + Sync}::downcast_ref`]
2077 - [`{Any + Send + Sync}::is`]
2078
2079 Cargo
2080 -----
2081 - [Cargo will now no longer allow you to publish crates with build scripts that
2082 modify the `src` directory.][cargo/5584] The `src` directory in a crate should be
2083 considered to be immutable.
2084
2085 Misc
2086 ----
2087 - [The `suggestion_applicability` field in `rustc`'s json output is now
2088 stable.][50486] This will allow dev tools to check whether a code suggestion
2089 would apply to them.
2090
2091 Compatibility Notes
2092 -------------------
2093 - [Rust will consider trait objects with duplicated constraints to be the same
2094 type as without the duplicated constraint.][51276] For example the below code will
2095 now fail to compile.
2096 ```rust
2097 trait Trait {}
2098
2099 impl Trait + Send {
2100 fn test(&self) { println!("one"); } //~ ERROR duplicate definitions with name `test`
2101 }
2102
2103 impl Trait + Send + Send {
2104 fn test(&self) { println!("two"); }
2105 }
2106 ```
2107
2108 [49546]: https://github.com/rust-lang/rust/pull/49546/
2109 [50143]: https://github.com/rust-lang/rust/pull/50143/
2110 [50170]: https://github.com/rust-lang/rust/pull/50170/
2111 [50234]: https://github.com/rust-lang/rust/pull/50234/
2112 [50265]: https://github.com/rust-lang/rust/pull/50265/
2113 [50364]: https://github.com/rust-lang/rust/pull/50364/
2114 [50385]: https://github.com/rust-lang/rust/pull/50385/
2115 [50465]: https://github.com/rust-lang/rust/pull/50465/
2116 [50486]: https://github.com/rust-lang/rust/pull/50486/
2117 [50554]: https://github.com/rust-lang/rust/pull/50554/
2118 [50610]: https://github.com/rust-lang/rust/pull/50610/
2119 [50855]: https://github.com/rust-lang/rust/pull/50855/
2120 [51050]: https://github.com/rust-lang/rust/pull/51050/
2121 [51196]: https://github.com/rust-lang/rust/pull/51196/
2122 [51200]: https://github.com/rust-lang/rust/pull/51200/
2123 [51241]: https://github.com/rust-lang/rust/pull/51241/
2124 [51276]: https://github.com/rust-lang/rust/pull/51276/
2125 [51298]: https://github.com/rust-lang/rust/pull/51298/
2126 [51306]: https://github.com/rust-lang/rust/pull/51306/
2127 [51562]: https://github.com/rust-lang/rust/pull/51562/
2128 [cargo/5584]: https://github.com/rust-lang/cargo/pull/5584/
2129 [`Iterator::step_by`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.step_by
2130 [`Path::ancestors`]: https://doc.rust-lang.org/std/path/struct.Path.html#method.ancestors
2131 [`SystemTime::UNIX_EPOCH`]: https://doc.rust-lang.org/std/time/struct.SystemTime.html#associatedconstant.UNIX_EPOCH
2132 [`alloc::GlobalAlloc`]: https://doc.rust-lang.org/std/alloc/trait.GlobalAlloc.html
2133 [`alloc::Layout`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html
2134 [`alloc::LayoutErr`]: https://doc.rust-lang.org/std/alloc/struct.LayoutErr.html
2135 [`alloc::System`]: https://doc.rust-lang.org/std/alloc/struct.System.html
2136 [`alloc::alloc`]: https://doc.rust-lang.org/std/alloc/fn.alloc.html
2137 [`alloc::alloc_zeroed`]: https://doc.rust-lang.org/std/alloc/fn.alloc_zeroed.html
2138 [`alloc::dealloc`]: https://doc.rust-lang.org/std/alloc/fn.dealloc.html
2139 [`alloc::realloc`]: https://doc.rust-lang.org/std/alloc/fn.realloc.html
2140 [`alloc::handle_alloc_error`]: https://doc.rust-lang.org/std/alloc/fn.handle_alloc_error.html
2141 [`btree_map::Entry::or_default`]: https://doc.rust-lang.org/std/collections/btree_map/enum.Entry.html#method.or_default
2142 [`fmt::Alignment`]: https://doc.rust-lang.org/std/fmt/enum.Alignment.html
2143 [`hash_map::Entry::or_default`]: https://doc.rust-lang.org/std/collections/hash_map/enum.Entry.html#method.or_default
2144 [`iter::repeat_with`]: https://doc.rust-lang.org/std/iter/fn.repeat_with.html
2145 [`num::NonZeroUsize`]: https://doc.rust-lang.org/std/num/struct.NonZeroUsize.html
2146 [`num::NonZeroU128`]: https://doc.rust-lang.org/std/num/struct.NonZeroU128.html
2147 [`num::NonZeroU16`]: https://doc.rust-lang.org/std/num/struct.NonZeroU16.html
2148 [`num::NonZeroU32`]: https://doc.rust-lang.org/std/num/struct.NonZeroU32.html
2149 [`num::NonZeroU64`]: https://doc.rust-lang.org/std/num/struct.NonZeroU64.html
2150 [`num::NonZeroU8`]: https://doc.rust-lang.org/std/num/struct.NonZeroU8.html
2151 [`ops::RangeBounds`]: https://doc.rust-lang.org/std/ops/trait.RangeBounds.html
2152 [`slice::SliceIndex`]: https://doc.rust-lang.org/std/slice/trait.SliceIndex.html
2153 [`slice::from_mut`]: https://doc.rust-lang.org/std/slice/fn.from_mut.html
2154 [`slice::from_ref`]: https://doc.rust-lang.org/std/slice/fn.from_ref.html
2155 [`{Any + Send + Sync}::downcast_mut`]: https://doc.rust-lang.org/std/any/trait.Any.html#method.downcast_mut-2
2156 [`{Any + Send + Sync}::downcast_ref`]: https://doc.rust-lang.org/std/any/trait.Any.html#method.downcast_ref-2
2157 [`{Any + Send + Sync}::is`]: https://doc.rust-lang.org/std/any/trait.Any.html#method.is-2
2158
2159 Version 1.27.2 (2018-07-20)
2160 ===========================
2161
2162 Compatibility Notes
2163 -------------------
2164
2165 - The borrow checker was fixed to avoid potential unsoundness when using
2166 match ergonomics: [#52213][52213].
2167
2168 [52213]: https://github.com/rust-lang/rust/issues/52213
2169
2170 Version 1.27.1 (2018-07-10)
2171 ===========================
2172
2173 Security Notes
2174 --------------
2175
2176 - rustdoc would execute plugins in the /tmp/rustdoc/plugins directory
2177 when running, which enabled executing code as some other user on a
2178 given machine. This release fixes that vulnerability; you can read
2179 more about this on the [blog][rustdoc-sec]. The associated CVE is [CVE-2018-1000622].
2180
2181 Thank you to Red Hat for responsibly disclosing this vulnerability to us.
2182
2183 Compatibility Notes
2184 -------------------
2185
2186 - The borrow checker was fixed to avoid an additional potential unsoundness when using
2187 match ergonomics: [#51415][51415], [#49534][49534].
2188
2189 [51415]: https://github.com/rust-lang/rust/issues/51415
2190 [49534]: https://github.com/rust-lang/rust/issues/49534
2191 [rustdoc-sec]: https://blog.rust-lang.org/2018/07/06/security-advisory-for-rustdoc.html
2192 [CVE-2018-1000622]: https://cve.mitre.org/cgi-bin/cvename.cgi?name=%20CVE-2018-1000622
2193
2194 Version 1.27.0 (2018-06-21)
2195 ==========================
2196
2197 Language
2198 --------
2199 - [Removed 'proc' from the reserved keywords list.][49699] This allows `proc` to
2200 be used as an identifier.
2201 - [The dyn syntax is now available.][49968] This syntax is equivalent to the
2202 bare `Trait` syntax, and should make it clearer when being used in tandem with
2203 `impl Trait` because it is equivalent to the following syntax:
2204 `&Trait == &dyn Trait`, `&mut Trait == &mut dyn Trait`, and
2205 `Box<Trait> == Box<dyn Trait>`.
2206 - [Attributes on generic parameters such as types and lifetimes are
2207 now stable.][48851] e.g.
2208 `fn foo<#[lifetime_attr] 'a, #[type_attr] T: 'a>() {}`
2209 - [The `#[must_use]` attribute can now also be used on functions as well as
2210 types.][48925] It provides a lint that by default warns users when the
2211 value returned by a function has not been used.
2212
2213 Compiler
2214 --------
2215 - [Added the `armv5te-unknown-linux-musleabi` target.][50423]
2216
2217 Libraries
2218 ---------
2219 - [SIMD (Single Instruction Multiple Data) on x86/x86_64 is now stable.][49664]
2220 This includes [`arch::x86`] & [`arch::x86_64`] modules which contain
2221 SIMD intrinsics, a new macro called `is_x86_feature_detected!`, the
2222 `#[target_feature(enable="")]` attribute, and adding `target_feature = ""` to
2223 the `cfg` attribute.
2224 - [A lot of methods for `[u8]`, `f32`, and `f64` previously only available in
2225 std are now available in core.][49896]
2226 - [The generic `Rhs` type parameter on `ops::{Shl, ShlAssign, Shr}` now defaults
2227 to `Self`.][49630]
2228 - [`std::str::replace` now has the `#[must_use]` attribute][50177] to clarify
2229 that the operation isn't done in place.
2230 - [`Clone::clone`, `Iterator::collect`, and `ToOwned::to_owned` now have
2231 the `#[must_use]` attribute][49533] to warn about unused potentially
2232 expensive allocations.
2233
2234 Stabilized APIs
2235 ---------------
2236 - [`DoubleEndedIterator::rfind`]
2237 - [`DoubleEndedIterator::rfold`]
2238 - [`DoubleEndedIterator::try_rfold`]
2239 - [`Duration::from_micros`]
2240 - [`Duration::from_nanos`]
2241 - [`Duration::subsec_micros`]
2242 - [`Duration::subsec_millis`]
2243 - [`HashMap::remove_entry`]
2244 - [`Iterator::try_fold`]
2245 - [`Iterator::try_for_each`]
2246 - [`NonNull::cast`]
2247 - [`Option::filter`]
2248 - [`String::replace_range`]
2249 - [`Take::set_limit`]
2250 - [`hint::unreachable_unchecked`]
2251 - [`os::unix::process::parent_id`]
2252 - [`ptr::swap_nonoverlapping`]
2253 - [`slice::rsplit_mut`]
2254 - [`slice::rsplit`]
2255 - [`slice::swap_with_slice`]
2256
2257 Cargo
2258 -----
2259 - [`cargo-metadata` now includes `authors`, `categories`, `keywords`,
2260 `readme`, and `repository` fields.][cargo/5386]
2261 - [`cargo-metadata` now includes a package's `metadata` table.][cargo/5360]
2262 - [Added the `--target-dir` optional argument.][cargo/5393] This allows you to specify
2263 a different directory than `target` for placing compilation artifacts.
2264 - [Cargo will be adding automatic target inference for binaries, benchmarks,
2265 examples, and tests in the Rust 2018 edition.][cargo/5335] If your project specifies
2266 specific targets, e.g. using `[[bin]]`, and have other binaries in locations
2267 where cargo would infer a binary, Cargo will produce a warning. You can
2268 disable this feature ahead of time by setting any of the following to false:
2269 `autobins`, `autobenches`, `autoexamples`, `autotests`.
2270 - [Cargo will now cache compiler information.][cargo/5359] This can be disabled by
2271 setting `CARGO_CACHE_RUSTC_INFO=0` in your environment.
2272
2273 Misc
2274 ----
2275 - [Added “The Rustc book” into the official documentation.][49707]
2276 [“The Rustc book”] documents and teaches how to use the rustc compiler.
2277 - [All books available on `doc.rust-lang.org` are now searchable.][49623]
2278
2279 Compatibility Notes
2280 -------------------
2281 - [Calling a `CharExt` or `StrExt` method directly on core will no longer
2282 work.][49896] e.g. `::core::prelude::v1::StrExt::is_empty("")` will not
2283 compile, `"".is_empty()` will still compile.
2284 - [`Debug` output on `atomic::{AtomicBool, AtomicIsize, AtomicPtr, AtomicUsize}`
2285 will only print the inner type.][48553] E.g.
2286 `print!("{:?}", AtomicBool::new(true))` will print `true`,
2287 not `AtomicBool(true)`.
2288 - [The maximum number for `repr(align(N))` is now 2²⁹.][50378] Previously you
2289 could enter higher numbers but they were not supported by LLVM. Up to 512MB
2290 alignment should cover all use cases.
2291 - The `.description()` method on the `std::error::Error` trait
2292 [has been soft-deprecated][50163]. It is no longer required to implement it.
2293
2294 [48553]: https://github.com/rust-lang/rust/pull/48553/
2295 [48851]: https://github.com/rust-lang/rust/pull/48851/
2296 [48925]: https://github.com/rust-lang/rust/pull/48925/
2297 [49533]: https://github.com/rust-lang/rust/pull/49533/
2298 [49623]: https://github.com/rust-lang/rust/pull/49623/
2299 [49630]: https://github.com/rust-lang/rust/pull/49630/
2300 [49664]: https://github.com/rust-lang/rust/pull/49664/
2301 [49699]: https://github.com/rust-lang/rust/pull/49699/
2302 [49707]: https://github.com/rust-lang/rust/pull/49707/
2303 [49719]: https://github.com/rust-lang/rust/pull/49719/
2304 [49896]: https://github.com/rust-lang/rust/pull/49896/
2305 [49968]: https://github.com/rust-lang/rust/pull/49968/
2306 [50163]: https://github.com/rust-lang/rust/pull/50163
2307 [50177]: https://github.com/rust-lang/rust/pull/50177/
2308 [50378]: https://github.com/rust-lang/rust/pull/50378/
2309 [50398]: https://github.com/rust-lang/rust/pull/50398/
2310 [50423]: https://github.com/rust-lang/rust/pull/50423/
2311 [cargo/5203]: https://github.com/rust-lang/cargo/pull/5203/
2312 [cargo/5335]: https://github.com/rust-lang/cargo/pull/5335/
2313 [cargo/5359]: https://github.com/rust-lang/cargo/pull/5359/
2314 [cargo/5360]: https://github.com/rust-lang/cargo/pull/5360/
2315 [cargo/5386]: https://github.com/rust-lang/cargo/pull/5386/
2316 [cargo/5393]: https://github.com/rust-lang/cargo/pull/5393/
2317 [`DoubleEndedIterator::rfind`]: https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html#method.rfind
2318 [`DoubleEndedIterator::rfold`]: https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html#method.rfold
2319 [`DoubleEndedIterator::try_rfold`]: https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html#method.try_rfold
2320 [`Duration::from_micros`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.from_micros
2321 [`Duration::from_nanos`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.from_nanos
2322 [`Duration::subsec_micros`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_micros
2323 [`Duration::subsec_millis`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_millis
2324 [`HashMap::remove_entry`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.remove_entry
2325 [`Iterator::try_fold`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.try_fold
2326 [`Iterator::try_for_each`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.try_for_each
2327 [`NonNull::cast`]: https://doc.rust-lang.org/std/ptr/struct.NonNull.html#method.cast
2328 [`Option::filter`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.filter
2329 [`String::replace_range`]: https://doc.rust-lang.org/std/string/struct.String.html#method.replace_range
2330 [`Take::set_limit`]: https://doc.rust-lang.org/std/io/struct.Take.html#method.set_limit
2331 [`hint::unreachable_unchecked`]: https://doc.rust-lang.org/std/hint/fn.unreachable_unchecked.html
2332 [`os::unix::process::parent_id`]: https://doc.rust-lang.org/std/os/unix/process/fn.parent_id.html
2333 [`process::id`]: https://doc.rust-lang.org/std/process/fn.id.html
2334 [`ptr::swap_nonoverlapping`]: https://doc.rust-lang.org/std/ptr/fn.swap_nonoverlapping.html
2335 [`slice::rsplit_mut`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rsplit_mut
2336 [`slice::rsplit`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rsplit
2337 [`slice::swap_with_slice`]: https://doc.rust-lang.org/std/primitive.slice.html#method.swap_with_slice
2338 [`arch::x86_64`]: https://doc.rust-lang.org/std/arch/x86_64/index.html
2339 [`arch::x86`]: https://doc.rust-lang.org/std/arch/x86/index.html
2340 [“The Rustc book”]: https://doc.rust-lang.org/rustc
2341
2342
2343 Version 1.26.2 (2018-06-05)
2344 ==========================
2345
2346 Compatibility Notes
2347 -------------------
2348
2349 - [The borrow checker was fixed to avoid unsoundness when using match ergonomics.][51117]
2350
2351 [51117]: https://github.com/rust-lang/rust/issues/51117
2352
2353
2354 Version 1.26.1 (2018-05-29)
2355 ==========================
2356
2357 Tools
2358 -----
2359
2360 - [RLS now works on Windows.][50646]
2361 - [Rustfmt stopped badly formatting text in some cases.][rustfmt/2695]
2362
2363
2364 Compatibility Notes
2365 --------
2366
2367 - [`fn main() -> impl Trait` no longer works for non-Termination
2368 trait.][50656]
2369 This reverts an accidental stabilization.
2370 - [`NaN > NaN` no longer returns true in const-fn contexts.][50812]
2371 - [Prohibit using turbofish for `impl Trait` in method arguments.][50950]
2372
2373 [50646]: https://github.com/rust-lang/rust/issues/50646
2374 [50656]: https://github.com/rust-lang/rust/pull/50656
2375 [50812]: https://github.com/rust-lang/rust/pull/50812
2376 [50950]: https://github.com/rust-lang/rust/issues/50950
2377 [rustfmt/2695]: https://github.com/rust-lang-nursery/rustfmt/issues/2695
2378
2379 Version 1.26.0 (2018-05-10)
2380 ==========================
2381
2382 Language
2383 --------
2384 - [Closures now implement `Copy` and/or `Clone` if all captured variables
2385 implement either or both traits.][49299]
2386 - [The inclusive range syntax e.g. `for x in 0..=10` is now stable.][47813]
2387 - [The `'_` lifetime is now stable. The underscore lifetime can be used anywhere a
2388 lifetime can be elided.][49458]
2389 - [`impl Trait` is now stable allowing you to have abstract types in returns
2390 or in function parameters.][49255] E.g. `fn foo() -> impl Iterator<Item=u8>` or
2391 `fn open(path: impl AsRef<Path>)`.
2392 - [Pattern matching will now automatically apply dereferences.][49394]
2393 - [128-bit integers in the form of `u128` and `i128` are now stable.][49101]
2394 - [`main` can now return `Result<(), E: Debug>`][49162] in addition to `()`.
2395 - [A lot of operations are now available in a const context.][46882] E.g. You
2396 can now index into constant arrays, reference and dereference into constants,
2397 and use tuple struct constructors.
2398 - [Fixed entry slice patterns are now stable.][48516] E.g.
2399 ```rust
2400 let points = [1, 2, 3, 4];
2401 match points {
2402 [1, 2, 3, 4] => println!("All points were sequential."),
2403 _ => println!("Not all points were sequential."),
2404 }
2405 ```
2406
2407
2408 Compiler
2409 --------
2410 - [LLD is now used as the default linker for `wasm32-unknown-unknown`.][48125]
2411 - [Fixed exponential projection complexity on nested types.][48296]
2412 This can provide up to a ~12% reduction in compile times for certain crates.
2413 - [Added the `--remap-path-prefix` option to rustc.][48359] Allowing you
2414 to remap path prefixes outputted by the compiler.
2415 - [Added `powerpc-unknown-netbsd` target.][48281]
2416
2417 Libraries
2418 ---------
2419 - [Implemented `From<u16> for usize` & `From<{u8, i16}> for isize`.][49305]
2420 - [Added hexadecimal formatting for integers with fmt::Debug][48978]
2421 e.g. `assert!(format!("{:02x?}", b"Foo\0") == "[46, 6f, 6f, 00]")`
2422 - [Implemented `Default, Hash` for `cmp::Reverse`.][48628]
2423 - [Optimized `str::repeat` being 8x faster in large cases.][48657]
2424 - [`ascii::escape_default` is now available in libcore.][48735]
2425 - [Trailing commas are now supported in std and core macros.][48056]
2426 - [Implemented `Copy, Clone` for `cmp::Reverse`][47379]
2427 - [Implemented `Clone` for `char::{ToLowercase, ToUppercase}`.][48629]
2428
2429 Stabilized APIs
2430 ---------------
2431 - [`*const T::add`]
2432 - [`*const T::copy_to_nonoverlapping`]
2433 - [`*const T::copy_to`]
2434 - [`*const T::read_unaligned`]
2435 - [`*const T::read_volatile`]
2436 - [`*const T::read`]
2437 - [`*const T::sub`]
2438 - [`*const T::wrapping_add`]
2439 - [`*const T::wrapping_sub`]
2440 - [`*mut T::add`]
2441 - [`*mut T::copy_to_nonoverlapping`]
2442 - [`*mut T::copy_to`]
2443 - [`*mut T::read_unaligned`]
2444 - [`*mut T::read_volatile`]
2445 - [`*mut T::read`]
2446 - [`*mut T::replace`]
2447 - [`*mut T::sub`]
2448 - [`*mut T::swap`]
2449 - [`*mut T::wrapping_add`]
2450 - [`*mut T::wrapping_sub`]
2451 - [`*mut T::write_bytes`]
2452 - [`*mut T::write_unaligned`]
2453 - [`*mut T::write_volatile`]
2454 - [`*mut T::write`]
2455 - [`Box::leak`]
2456 - [`FromUtf8Error::as_bytes`]
2457 - [`LocalKey::try_with`]
2458 - [`Option::cloned`]
2459 - [`btree_map::Entry::and_modify`]
2460 - [`fs::read_to_string`]
2461 - [`fs::read`]
2462 - [`fs::write`]
2463 - [`hash_map::Entry::and_modify`]
2464 - [`iter::FusedIterator`]
2465 - [`ops::RangeInclusive`]
2466 - [`ops::RangeToInclusive`]
2467 - [`process::id`]
2468 - [`slice::rotate_left`]
2469 - [`slice::rotate_right`]
2470 - [`String::retain`]
2471
2472
2473 Cargo
2474 -----
2475 - [Cargo will now output path to custom commands when `-v` is
2476 passed with `--list`][cargo/5041]
2477 - [The Cargo binary version is now the same as the Rust version][cargo/5083]
2478
2479 Misc
2480 ----
2481 - [The second edition of "The Rust Programming Language" book is now recommended
2482 over the first.][48404]
2483
2484 Compatibility Notes
2485 -------------------
2486
2487 - [aliasing a `Fn` trait as `dyn` no longer works.][48481] E.g. the following
2488 syntax is now invalid.
2489 ```
2490 use std::ops::Fn as dyn;
2491 fn g(_: Box<dyn(std::fmt::Debug)>) {}
2492 ```
2493 - [The result of dereferences are no longer promoted to `'static`.][47408]
2494 e.g.
2495 ```rust
2496 fn main() {
2497 const PAIR: &(i32, i32) = &(0, 1);
2498 let _reversed_pair: &'static _ = &(PAIR.1, PAIR.0); // Doesn't work
2499 }
2500 ```
2501 - [Deprecate `AsciiExt` trait in favor of inherent methods.][49109]
2502 - [`".e0"` will now no longer parse as `0.0` and will instead cause
2503 an error.][48235]
2504 - [Removed hoedown from rustdoc.][48274]
2505 - [Bounds on higher-kinded lifetimes a hard error.][48326]
2506
2507 [46882]: https://github.com/rust-lang/rust/pull/46882
2508 [47379]: https://github.com/rust-lang/rust/pull/47379
2509 [47408]: https://github.com/rust-lang/rust/pull/47408
2510 [47813]: https://github.com/rust-lang/rust/pull/47813
2511 [48056]: https://github.com/rust-lang/rust/pull/48056
2512 [48125]: https://github.com/rust-lang/rust/pull/48125
2513 [48166]: https://github.com/rust-lang/rust/pull/48166
2514 [48235]: https://github.com/rust-lang/rust/pull/48235
2515 [48274]: https://github.com/rust-lang/rust/pull/48274
2516 [48281]: https://github.com/rust-lang/rust/pull/48281
2517 [48296]: https://github.com/rust-lang/rust/pull/48296
2518 [48326]: https://github.com/rust-lang/rust/pull/48326
2519 [48359]: https://github.com/rust-lang/rust/pull/48359
2520 [48404]: https://github.com/rust-lang/rust/pull/48404
2521 [48481]: https://github.com/rust-lang/rust/pull/48481
2522 [48516]: https://github.com/rust-lang/rust/pull/48516
2523 [48628]: https://github.com/rust-lang/rust/pull/48628
2524 [48629]: https://github.com/rust-lang/rust/pull/48629
2525 [48657]: https://github.com/rust-lang/rust/pull/48657
2526 [48735]: https://github.com/rust-lang/rust/pull/48735
2527 [48978]: https://github.com/rust-lang/rust/pull/48978
2528 [49101]: https://github.com/rust-lang/rust/pull/49101
2529 [49109]: https://github.com/rust-lang/rust/pull/49109
2530 [49121]: https://github.com/rust-lang/rust/pull/49121
2531 [49162]: https://github.com/rust-lang/rust/pull/49162
2532 [49184]: https://github.com/rust-lang/rust/pull/49184
2533 [49234]: https://github.com/rust-lang/rust/pull/49234
2534 [49255]: https://github.com/rust-lang/rust/pull/49255
2535 [49299]: https://github.com/rust-lang/rust/pull/49299
2536 [49305]: https://github.com/rust-lang/rust/pull/49305
2537 [49394]: https://github.com/rust-lang/rust/pull/49394
2538 [49458]: https://github.com/rust-lang/rust/pull/49458
2539 [`*const T::add`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.add
2540 [`*const T::copy_to_nonoverlapping`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.copy_to_nonoverlapping
2541 [`*const T::copy_to`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.copy_to
2542 [`*const T::read_unaligned`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read_unaligned
2543 [`*const T::read_volatile`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read_volatile
2544 [`*const T::read`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read
2545 [`*const T::sub`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.sub
2546 [`*const T::wrapping_add`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_add
2547 [`*const T::wrapping_sub`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_sub
2548 [`*mut T::add`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.add-1
2549 [`*mut T::copy_to_nonoverlapping`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.copy_to_nonoverlapping-1
2550 [`*mut T::copy_to`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.copy_to-1
2551 [`*mut T::read_unaligned`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read_unaligned-1
2552 [`*mut T::read_volatile`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read_volatile-1
2553 [`*mut T::read`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.read-1
2554 [`*mut T::replace`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.replace
2555 [`*mut T::sub`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.sub-1
2556 [`*mut T::swap`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.swap
2557 [`*mut T::wrapping_add`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_add-1
2558 [`*mut T::wrapping_sub`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_sub-1
2559 [`*mut T::write_bytes`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write_bytes
2560 [`*mut T::write_unaligned`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write_unaligned
2561 [`*mut T::write_volatile`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write_volatile
2562 [`*mut T::write`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.write
2563 [`Box::leak`]: https://doc.rust-lang.org/std/boxed/struct.Box.html#method.leak
2564 [`FromUtf8Error::as_bytes`]: https://doc.rust-lang.org/std/string/struct.FromUtf8Error.html#method.as_bytes
2565 [`LocalKey::try_with`]: https://doc.rust-lang.org/std/thread/struct.LocalKey.html#method.try_with
2566 [`Option::cloned`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.cloned
2567 [`btree_map::Entry::and_modify`]: https://doc.rust-lang.org/std/collections/btree_map/enum.Entry.html#method.and_modify
2568 [`fs::read_to_string`]: https://doc.rust-lang.org/std/fs/fn.read_to_string.html
2569 [`fs::read`]: https://doc.rust-lang.org/std/fs/fn.read.html
2570 [`fs::write`]: https://doc.rust-lang.org/std/fs/fn.write.html
2571 [`hash_map::Entry::and_modify`]: https://doc.rust-lang.org/std/collections/hash_map/enum.Entry.html#method.and_modify
2572 [`iter::FusedIterator`]: https://doc.rust-lang.org/std/iter/trait.FusedIterator.html
2573 [`ops::RangeInclusive`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html
2574 [`ops::RangeToInclusive`]: https://doc.rust-lang.org/std/ops/struct.RangeToInclusive.html
2575 [`process::id`]: https://doc.rust-lang.org/std/process/fn.id.html
2576 [`slice::rotate_left`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rotate_left
2577 [`slice::rotate_right`]: https://doc.rust-lang.org/std/primitive.slice.html#method.rotate_right
2578 [`String::retain`]: https://doc.rust-lang.org/std/string/struct.String.html#method.retain
2579 [cargo/5041]: https://github.com/rust-lang/cargo/pull/5041
2580 [cargo/5083]: https://github.com/rust-lang/cargo/pull/5083
2581
2582
2583 Version 1.25.0 (2018-03-29)
2584 ==========================
2585
2586 Language
2587 --------
2588 - [The `#[repr(align(x))]` attribute is now stable.][47006] [RFC 1358]
2589 - [You can now use nested groups of imports.][47948]
2590 e.g. `use std::{fs::File, io::Read, path::{Path, PathBuf}};`
2591 - [You can now have `|` at the start of a match arm.][47947] e.g.
2592 ```rust
2593 enum Foo { A, B, C }
2594
2595 fn main() {
2596 let x = Foo::A;
2597 match x {
2598 | Foo::A
2599 | Foo::B => println!("AB"),
2600 | Foo::C => println!("C"),
2601 }
2602 }
2603 ```
2604
2605 Compiler
2606 --------
2607 - [Upgraded to LLVM 6.][47828]
2608 - [Added `-C lto=val` option.][47521]
2609 - [Added `i586-unknown-linux-musl` target][47282]
2610
2611 Libraries
2612 ---------
2613 - [Impl Send for `process::Command` on Unix.][47760]
2614 - [Impl PartialEq and Eq for `ParseCharError`.][47790]
2615 - [`UnsafeCell::into_inner` is now safe.][47204]
2616 - [Implement libstd for CloudABI.][47268]
2617 - [`Float::{from_bits, to_bits}` is now available in libcore.][46931]
2618 - [Implement `AsRef<Path>` for Component][46985]
2619 - [Implemented `Write` for `Cursor<&mut Vec<u8>>`][46830]
2620 - [Moved `Duration` to libcore.][46666]
2621
2622 Stabilized APIs
2623 ---------------
2624 - [`Location::column`]
2625 - [`ptr::NonNull`]
2626
2627 The following functions can now be used in a constant expression.
2628 eg. `static MINUTE: Duration = Duration::from_secs(60);`
2629 - [`Duration::new`][47300]
2630 - [`Duration::from_secs`][47300]
2631 - [`Duration::from_millis`][47300]
2632
2633 Cargo
2634 -----
2635 - [`cargo new` no longer removes `rust` or `rs` prefixs/suffixs.][cargo/5013]
2636 - [`cargo new` now defaults to creating a binary crate, instead of a
2637 library crate.][cargo/5029]
2638
2639 Misc
2640 ----
2641 - [Rust by example is now shipped with new releases][46196]
2642
2643 Compatibility Notes
2644 -------------------
2645 - [Deprecated `net::lookup_host`.][47510]
2646 - [`rustdoc` has switched to pulldown as the default markdown renderer.][47398]
2647 - The borrow checker was sometimes incorrectly permitting overlapping borrows
2648 around indexing operations (see [#47349][47349]). This has been fixed (which also
2649 enabled some correct code that used to cause errors (e.g. [#33903][33903] and [#46095][46095]).
2650 - [Removed deprecated unstable attribute `#[simd]`.][47251]
2651
2652 [33903]: https://github.com/rust-lang/rust/pull/33903
2653 [47947]: https://github.com/rust-lang/rust/pull/47947
2654 [47948]: https://github.com/rust-lang/rust/pull/47948
2655 [47760]: https://github.com/rust-lang/rust/pull/47760
2656 [47790]: https://github.com/rust-lang/rust/pull/47790
2657 [47828]: https://github.com/rust-lang/rust/pull/47828
2658 [47398]: https://github.com/rust-lang/rust/pull/47398
2659 [47510]: https://github.com/rust-lang/rust/pull/47510
2660 [47521]: https://github.com/rust-lang/rust/pull/47521
2661 [47204]: https://github.com/rust-lang/rust/pull/47204
2662 [47251]: https://github.com/rust-lang/rust/pull/47251
2663 [47268]: https://github.com/rust-lang/rust/pull/47268
2664 [47282]: https://github.com/rust-lang/rust/pull/47282
2665 [47300]: https://github.com/rust-lang/rust/pull/47300
2666 [47349]: https://github.com/rust-lang/rust/pull/47349
2667 [46931]: https://github.com/rust-lang/rust/pull/46931
2668 [46985]: https://github.com/rust-lang/rust/pull/46985
2669 [47006]: https://github.com/rust-lang/rust/pull/47006
2670 [46830]: https://github.com/rust-lang/rust/pull/46830
2671 [46095]: https://github.com/rust-lang/rust/pull/46095
2672 [46666]: https://github.com/rust-lang/rust/pull/46666
2673 [46196]: https://github.com/rust-lang/rust/pull/46196
2674 [cargo/5013]: https://github.com/rust-lang/cargo/pull/5013
2675 [cargo/5029]: https://github.com/rust-lang/cargo/pull/5029
2676 [RFC 1358]: https://github.com/rust-lang/rfcs/pull/1358
2677 [`Location::column`]: https://doc.rust-lang.org/std/panic/struct.Location.html#method.column
2678 [`ptr::NonNull`]: https://doc.rust-lang.org/std/ptr/struct.NonNull.html
2679
2680
2681 Version 1.24.1 (2018-03-01)
2682 ==========================
2683
2684 - [Do not abort when unwinding through FFI][48251]
2685 - [Emit UTF-16 files for linker arguments on Windows][48318]
2686 - [Make the error index generator work again][48308]
2687 - [Cargo will warn on Windows 7 if an update is needed][cargo/5069].
2688
2689 [48251]: https://github.com/rust-lang/rust/issues/48251
2690 [48308]: https://github.com/rust-lang/rust/issues/48308
2691 [48318]: https://github.com/rust-lang/rust/issues/48318
2692 [cargo/5069]: https://github.com/rust-lang/cargo/pull/5069
2693
2694
2695 Version 1.24.0 (2018-02-15)
2696 ==========================
2697
2698 Language
2699 --------
2700 - [External `sysv64` ffi is now available.][46528]
2701 eg. `extern "sysv64" fn foo () {}`
2702
2703 Compiler
2704 --------
2705 - [rustc now uses 16 codegen units by default for release builds.][46910]
2706 For the fastest builds, utilize `codegen-units=1`.
2707 - [Added `armv4t-unknown-linux-gnueabi` target.][47018]
2708 - [Add `aarch64-unknown-openbsd` support][46760]
2709
2710 Libraries
2711 ---------
2712 - [`str::find::<char>` now uses memchr.][46735] This should lead to a 10x
2713 improvement in performance in the majority of cases.
2714 - [`OsStr`'s `Debug` implementation is now lossless and consistent
2715 with Windows.][46798]
2716 - [`time::{SystemTime, Instant}` now implement `Hash`.][46828]
2717 - [impl `From<bool>` for `AtomicBool`][46293]
2718 - [impl `From<{CString, &CStr}>` for `{Arc<CStr>, Rc<CStr>}`][45990]
2719 - [impl `From<{OsString, &OsStr}>` for `{Arc<OsStr>, Rc<OsStr>}`][45990]
2720 - [impl `From<{PathBuf, &Path}>` for `{Arc<Path>, Rc<Path>}`][45990]
2721 - [float::from_bits now just uses transmute.][46012] This provides
2722 some optimisations from LLVM.
2723 - [Copied `AsciiExt` methods onto `char`][46077]
2724 - [Remove `T: Sized` requirement on `ptr::is_null()`][46094]
2725 - [impl `From<RecvError>` for `{TryRecvError, RecvTimeoutError}`][45506]
2726 - [Optimised `f32::{min, max}` to generate more efficient x86 assembly][47080]
2727 - [`[u8]::contains` now uses memchr which provides a 3x speed improvement][46713]
2728
2729 Stabilized APIs
2730 ---------------
2731 - [`RefCell::replace`]
2732 - [`RefCell::swap`]
2733 - [`atomic::spin_loop_hint`]
2734
2735 The following functions can now be used in a constant expression.
2736 eg. `let buffer: [u8; size_of::<usize>()];`, `static COUNTER: AtomicUsize = AtomicUsize::new(1);`
2737
2738 - [`AtomicBool::new`][46287]
2739 - [`AtomicUsize::new`][46287]
2740 - [`AtomicIsize::new`][46287]
2741 - [`AtomicPtr::new`][46287]
2742 - [`Cell::new`][46287]
2743 - [`{integer}::min_value`][46287]
2744 - [`{integer}::max_value`][46287]
2745 - [`mem::size_of`][46287]
2746 - [`mem::align_of`][46287]
2747 - [`ptr::null`][46287]
2748 - [`ptr::null_mut`][46287]
2749 - [`RefCell::new`][46287]
2750 - [`UnsafeCell::new`][46287]
2751
2752 Cargo
2753 -----
2754 - [Added a `workspace.default-members` config that
2755 overrides implied `--all` in virtual workspaces.][cargo/4743]
2756 - [Enable incremental by default on development builds.][cargo/4817] Also added
2757 configuration keys to `Cargo.toml` and `.cargo/config` to disable on a
2758 per-project or global basis respectively.
2759
2760 Misc
2761 ----
2762
2763 Compatibility Notes
2764 -------------------
2765 - [Floating point types `Debug` impl now always prints a decimal point.][46831]
2766 - [`Ipv6Addr` now rejects superfluous `::`'s in IPv6 addresses][46671] This is
2767 in accordance with IETF RFC 4291 §2.2.
2768 - [Unwinding will no longer go past FFI boundaries, and will instead abort.][46833]
2769 - [`Formatter::flags` method is now deprecated.][46284] The `sign_plus`,
2770 `sign_minus`, `alternate`, and `sign_aware_zero_pad` should be used instead.
2771 - [Leading zeros in tuple struct members is now an error][47084]
2772 - [`column!()` macro is one-based instead of zero-based][46977]
2773 - [`fmt::Arguments` can no longer be shared across threads][45198]
2774 - [Access to `#[repr(packed)]` struct fields is now unsafe][44884]
2775 - [Cargo sets a different working directory for the compiler][cargo/4788]
2776
2777 [44884]: https://github.com/rust-lang/rust/pull/44884
2778 [45198]: https://github.com/rust-lang/rust/pull/45198
2779 [45506]: https://github.com/rust-lang/rust/pull/45506
2780 [45904]: https://github.com/rust-lang/rust/pull/45904
2781 [45990]: https://github.com/rust-lang/rust/pull/45990
2782 [46012]: https://github.com/rust-lang/rust/pull/46012
2783 [46077]: https://github.com/rust-lang/rust/pull/46077
2784 [46094]: https://github.com/rust-lang/rust/pull/46094
2785 [46284]: https://github.com/rust-lang/rust/pull/46284
2786 [46287]: https://github.com/rust-lang/rust/pull/46287
2787 [46293]: https://github.com/rust-lang/rust/pull/46293
2788 [46528]: https://github.com/rust-lang/rust/pull/46528
2789 [46671]: https://github.com/rust-lang/rust/pull/46671
2790 [46713]: https://github.com/rust-lang/rust/pull/46713
2791 [46735]: https://github.com/rust-lang/rust/pull/46735
2792 [46749]: https://github.com/rust-lang/rust/pull/46749
2793 [46760]: https://github.com/rust-lang/rust/pull/46760
2794 [46798]: https://github.com/rust-lang/rust/pull/46798
2795 [46828]: https://github.com/rust-lang/rust/pull/46828
2796 [46831]: https://github.com/rust-lang/rust/pull/46831
2797 [46833]: https://github.com/rust-lang/rust/pull/46833
2798 [46910]: https://github.com/rust-lang/rust/pull/46910
2799 [46977]: https://github.com/rust-lang/rust/pull/46977
2800 [47018]: https://github.com/rust-lang/rust/pull/47018
2801 [47080]: https://github.com/rust-lang/rust/pull/47080
2802 [47084]: https://github.com/rust-lang/rust/pull/47084
2803 [cargo/4743]: https://github.com/rust-lang/cargo/pull/4743
2804 [cargo/4788]: https://github.com/rust-lang/cargo/pull/4788
2805 [cargo/4817]: https://github.com/rust-lang/cargo/pull/4817
2806 [`RefCell::replace`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.replace
2807 [`RefCell::swap`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.swap
2808 [`atomic::spin_loop_hint`]: https://doc.rust-lang.org/std/sync/atomic/fn.spin_loop_hint.html
2809
2810
2811 Version 1.23.0 (2018-01-04)
2812 ==========================
2813
2814 Language
2815 --------
2816 - [Arbitrary `auto` traits are now permitted in trait objects.][45772]
2817 - [rustc now uses subtyping on the left hand side of binary operations.][45435]
2818 Which should fix some confusing errors in some operations.
2819
2820 Compiler
2821 --------
2822 - [Enabled `TrapUnreachable` in LLVM which should mitigate the impact of
2823 undefined behavior.][45920]
2824 - [rustc now suggests renaming import if names clash.][45660]
2825 - [Display errors/warnings correctly when there are zero-width or
2826 wide characters.][45711]
2827 - [rustc now avoids unnecessary copies of arguments that are
2828 simple bindings][45380] This should improve memory usage on average by 5-10%.
2829 - [Updated musl used to build musl rustc to 1.1.17][45393]
2830
2831 Libraries
2832 ---------
2833 - [Allow a trailing comma in `assert_eq/ne` macro][45887]
2834 - [Implement Hash for raw pointers to unsized types][45483]
2835 - [impl `From<*mut T>` for `AtomicPtr<T>`][45610]
2836 - [impl `From<usize/isize>` for `AtomicUsize/AtomicIsize`.][45610]
2837 - [Removed the `T: Sync` requirement for `RwLock<T>: Send`][45267]
2838 - [Removed `T: Sized` requirement for `{<*const T>, <*mut T>}::as_ref`
2839 and `<*mut T>::as_mut`][44932]
2840 - [Optimized `Thread::{park, unpark}` implementation][45524]
2841 - [Improved `SliceExt::binary_search` performance.][45333]
2842 - [impl `FromIterator<()>` for `()`][45379]
2843 - [Copied `AsciiExt` trait methods to primitive types.][44042] Use of `AsciiExt`
2844 is now deprecated.
2845
2846 Stabilized APIs
2847 ---------------
2848
2849 Cargo
2850 -----
2851 - [Cargo now supports uninstallation of multiple packages][cargo/4561]
2852 eg. `cargo uninstall foo bar` uninstalls `foo` and `bar`.
2853 - [Added unit test checking to `cargo check`][cargo/4592]
2854 - [Cargo now lets you install a specific version
2855 using `cargo install --version`][cargo/4637]
2856
2857 Misc
2858 ----
2859 - [Releases now ship with the Cargo book documentation.][45692]
2860 - [rustdoc now prints rendering warnings on every run.][45324]
2861
2862 Compatibility Notes
2863 -------------------
2864 - [Changes have been made to type equality to make it more correct,
2865 in rare cases this could break some code.][45853] [Tracking issue for
2866 further information][45852]
2867 - [`char::escape_debug` now uses Unicode 10 over 9.][45571]
2868 - [Upgraded Android SDK to 27, and NDK to r15c.][45580] This drops support for
2869 Android 9, the minimum supported version is Android 14.
2870 - [Bumped the minimum LLVM to 3.9][45326]
2871
2872 [44042]: https://github.com/rust-lang/rust/pull/44042
2873 [44932]: https://github.com/rust-lang/rust/pull/44932
2874 [45267]: https://github.com/rust-lang/rust/pull/45267
2875 [45324]: https://github.com/rust-lang/rust/pull/45324
2876 [45326]: https://github.com/rust-lang/rust/pull/45326
2877 [45333]: https://github.com/rust-lang/rust/pull/45333
2878 [45379]: https://github.com/rust-lang/rust/pull/45379
2879 [45380]: https://github.com/rust-lang/rust/pull/45380
2880 [45393]: https://github.com/rust-lang/rust/pull/45393
2881 [45435]: https://github.com/rust-lang/rust/pull/45435
2882 [45483]: https://github.com/rust-lang/rust/pull/45483
2883 [45524]: https://github.com/rust-lang/rust/pull/45524
2884 [45571]: https://github.com/rust-lang/rust/pull/45571
2885 [45580]: https://github.com/rust-lang/rust/pull/45580
2886 [45610]: https://github.com/rust-lang/rust/pull/45610
2887 [45660]: https://github.com/rust-lang/rust/pull/45660
2888 [45692]: https://github.com/rust-lang/rust/pull/45692
2889 [45711]: https://github.com/rust-lang/rust/pull/45711
2890 [45772]: https://github.com/rust-lang/rust/pull/45772
2891 [45852]: https://github.com/rust-lang/rust/issues/45852
2892 [45853]: https://github.com/rust-lang/rust/pull/45853
2893 [45887]: https://github.com/rust-lang/rust/pull/45887
2894 [45920]: https://github.com/rust-lang/rust/pull/45920
2895 [cargo/4561]: https://github.com/rust-lang/cargo/pull/4561
2896 [cargo/4592]: https://github.com/rust-lang/cargo/pull/4592
2897 [cargo/4637]: https://github.com/rust-lang/cargo/pull/4637
2898
2899
2900 Version 1.22.1 (2017-11-22)
2901 ==========================
2902
2903 - [Update Cargo to fix an issue with macOS 10.13 "High Sierra"][46183]
2904
2905 [46183]: https://github.com/rust-lang/rust/pull/46183
2906
2907 Version 1.22.0 (2017-11-22)
2908 ==========================
2909
2910 Language
2911 --------
2912 - [`non_snake_case` lint now allows extern no-mangle functions][44966]
2913 - [Now accepts underscores in unicode escapes][43716]
2914 - [`T op= &T` now works for numeric types.][44287] eg. `let mut x = 2; x += &8;`
2915 - [types that impl `Drop` are now allowed in `const` and `static` types][44456]
2916
2917 Compiler
2918 --------
2919 - [rustc now defaults to having 16 codegen units at debug on supported platforms.][45064]
2920 - [rustc will no longer inline in codegen units when compiling for debug][45075]
2921 This should decrease compile times for debug builds.
2922 - [strict memory alignment now enabled on ARMv6][45094]
2923 - [Remove support for the PNaCl target `le32-unknown-nacl`][45041]
2924
2925 Libraries
2926 ---------
2927 - [Allow atomic operations up to 32 bits
2928 on `armv5te_unknown_linux_gnueabi`][44978]
2929 - [`Box<Error>` now impls `From<Cow<str>>`][44466]
2930 - [`std::mem::Discriminant` is now guaranteed to be `Send + Sync`][45095]
2931 - [`fs::copy` now returns the length of the main stream on NTFS.][44895]
2932 - [Properly detect overflow in `Instant += Duration`.][44220]
2933 - [impl `Hasher` for `{&mut Hasher, Box<Hasher>}`][44015]
2934 - [impl `fmt::Debug` for `SplitWhitespace`.][44303]
2935 - [`Option<T>` now impls `Try`][42526] This allows for using `?` with `Option` types.
2936
2937 Stabilized APIs
2938 ---------------
2939
2940 Cargo
2941 -----
2942 - [Cargo will now build multi file examples in subdirectories of the `examples`
2943 folder that have a `main.rs` file.][cargo/4496]
2944 - [Changed `[root]` to `[package]` in `Cargo.lock`][cargo/4571] Packages with
2945 the old format will continue to work and can be updated with `cargo update`.
2946 - [Now supports vendoring git repositories][cargo/3992]
2947
2948 Misc
2949 ----
2950 - [`libbacktrace` is now available on Apple platforms.][44251]
2951 - [Stabilised the `compile_fail` attribute for code fences in doc-comments.][43949]
2952 This now lets you specify that a given code example will fail to compile.
2953
2954 Compatibility Notes
2955 -------------------
2956 - [The minimum Android version that rustc can build for has been bumped
2957 to `4.0` from `2.3`][45656]
2958 - [Allowing `T op= &T` for numeric types has broken some type
2959 inference cases][45480]
2960
2961
2962 [42526]: https://github.com/rust-lang/rust/pull/42526
2963 [43017]: https://github.com/rust-lang/rust/pull/43017
2964 [43716]: https://github.com/rust-lang/rust/pull/43716
2965 [43949]: https://github.com/rust-lang/rust/pull/43949
2966 [44015]: https://github.com/rust-lang/rust/pull/44015
2967 [44220]: https://github.com/rust-lang/rust/pull/44220
2968 [44251]: https://github.com/rust-lang/rust/pull/44251
2969 [44287]: https://github.com/rust-lang/rust/pull/44287
2970 [44303]: https://github.com/rust-lang/rust/pull/44303
2971 [44456]: https://github.com/rust-lang/rust/pull/44456
2972 [44466]: https://github.com/rust-lang/rust/pull/44466
2973 [44895]: https://github.com/rust-lang/rust/pull/44895
2974 [44966]: https://github.com/rust-lang/rust/pull/44966
2975 [44978]: https://github.com/rust-lang/rust/pull/44978
2976 [45041]: https://github.com/rust-lang/rust/pull/45041
2977 [45064]: https://github.com/rust-lang/rust/pull/45064
2978 [45075]: https://github.com/rust-lang/rust/pull/45075
2979 [45094]: https://github.com/rust-lang/rust/pull/45094
2980 [45095]: https://github.com/rust-lang/rust/pull/45095
2981 [45480]: https://github.com/rust-lang/rust/issues/45480
2982 [45656]: https://github.com/rust-lang/rust/pull/45656
2983 [cargo/3992]: https://github.com/rust-lang/cargo/pull/3992
2984 [cargo/4496]: https://github.com/rust-lang/cargo/pull/4496
2985 [cargo/4571]: https://github.com/rust-lang/cargo/pull/4571
2986
2987
2988
2989
2990
2991
2992 Version 1.21.0 (2017-10-12)
2993 ==========================
2994
2995 Language
2996 --------
2997 - [You can now use static references for literals.][43838]
2998 Example:
2999 ```rust
3000 fn main() {
3001 let x: &'static u32 = &0;
3002 }
3003 ```
3004 - [Relaxed path syntax. Optional `::` before `<` is now allowed in all contexts.][43540]
3005 Example:
3006 ```rust
3007 my_macro!(Vec<i32>::new); // Always worked
3008 my_macro!(Vec::<i32>::new); // Now works
3009 ```
3010
3011 Compiler
3012 --------
3013 - [Upgraded jemalloc to 4.5.0][43911]
3014 - [Enabled unwinding panics on Redox][43917]
3015 - [Now runs LLVM in parallel during translation phase.][43506]
3016 This should reduce peak memory usage.
3017
3018 Libraries
3019 ---------
3020 - [Generate builtin impls for `Clone` for all arrays and tuples that
3021 are `T: Clone`][43690]
3022 - [`Stdin`, `Stdout`, and `Stderr` now implement `AsRawFd`.][43459]
3023 - [`Rc` and `Arc` now implement `From<&[T]> where T: Clone`, `From<str>`,
3024 `From<String>`, `From<Box<T>> where T: ?Sized`, and `From<Vec<T>>`.][42565]
3025
3026 Stabilized APIs
3027 ---------------
3028
3029 [`std::mem::discriminant`]
3030
3031 Cargo
3032 -----
3033 - [You can now call `cargo install` with multiple package names][cargo/4216]
3034 - [Cargo commands inside a virtual workspace will now implicitly
3035 pass `--all`][cargo/4335]
3036 - [Added a `[patch]` section to `Cargo.toml` to handle
3037 prepublication dependencies][cargo/4123] [RFC 1969]
3038 - [`include` & `exclude` fields in `Cargo.toml` now accept gitignore
3039 like patterns][cargo/4270]
3040 - [Added the `--all-targets` option][cargo/4400]
3041 - [Using required dependencies as a feature is now deprecated and emits
3042 a warning][cargo/4364]
3043
3044
3045 Misc
3046 ----
3047 - [Cargo docs are moving][43916]
3048 to [doc.rust-lang.org/cargo](https://doc.rust-lang.org/cargo)
3049 - [The rustdoc book is now available][43863]
3050 at [doc.rust-lang.org/rustdoc](https://doc.rust-lang.org/rustdoc)
3051 - [Added a preview of RLS has been made available through rustup][44204]
3052 Install with `rustup component add rls-preview`
3053 - [`std::os` documentation for Unix, Linux, and Windows now appears on doc.rust-lang.org][43348]
3054 Previously only showed `std::os::unix`.
3055
3056 Compatibility Notes
3057 -------------------
3058 - [Changes in method matching against higher-ranked types][43880] This may cause
3059 breakage in subtyping corner cases. [A more in-depth explanation is available.][info/43880]
3060 - [rustc's JSON error output's byte position start at top of file.][42973]
3061 Was previously relative to the rustc's internal `CodeMap` struct which
3062 required the unstable library `libsyntax` to correctly use.
3063 - [`unused_results` lint no longer ignores booleans][43728]
3064
3065 [42565]: https://github.com/rust-lang/rust/pull/42565
3066 [42973]: https://github.com/rust-lang/rust/pull/42973
3067 [43348]: https://github.com/rust-lang/rust/pull/43348
3068 [43459]: https://github.com/rust-lang/rust/pull/43459
3069 [43506]: https://github.com/rust-lang/rust/pull/43506
3070 [43540]: https://github.com/rust-lang/rust/pull/43540
3071 [43690]: https://github.com/rust-lang/rust/pull/43690
3072 [43728]: https://github.com/rust-lang/rust/pull/43728
3073 [43838]: https://github.com/rust-lang/rust/pull/43838
3074 [43863]: https://github.com/rust-lang/rust/pull/43863
3075 [43880]: https://github.com/rust-lang/rust/pull/43880
3076 [43911]: https://github.com/rust-lang/rust/pull/43911
3077 [43916]: https://github.com/rust-lang/rust/pull/43916
3078 [43917]: https://github.com/rust-lang/rust/pull/43917
3079 [44204]: https://github.com/rust-lang/rust/pull/44204
3080 [cargo/4123]: https://github.com/rust-lang/cargo/pull/4123
3081 [cargo/4216]: https://github.com/rust-lang/cargo/pull/4216
3082 [cargo/4270]: https://github.com/rust-lang/cargo/pull/4270
3083 [cargo/4335]: https://github.com/rust-lang/cargo/pull/4335
3084 [cargo/4364]: https://github.com/rust-lang/cargo/pull/4364
3085 [cargo/4400]: https://github.com/rust-lang/cargo/pull/4400
3086 [RFC 1969]: https://github.com/rust-lang/rfcs/pull/1969
3087 [info/43880]: https://github.com/rust-lang/rust/issues/44224#issuecomment-330058902
3088 [`std::mem::discriminant`]: https://doc.rust-lang.org/std/mem/fn.discriminant.html
3089
3090 Version 1.20.0 (2017-08-31)
3091 ===========================
3092
3093 Language
3094 --------
3095 - [Associated constants are now stabilised.][42809]
3096 - [A lot of macro bugs are now fixed.][42913]
3097
3098 Compiler
3099 --------
3100
3101 - [Struct fields are now properly coerced to the expected field type.][42807]
3102 - [Enabled wasm LLVM backend][42571] WASM can now be built with the
3103 `wasm32-experimental-emscripten` target.
3104 - [Changed some of the error messages to be more helpful.][42033]
3105 - [Add support for RELRO(RELocation Read-Only) for platforms that support
3106 it.][43170]
3107 - [rustc now reports the total number of errors on compilation failure][43015]
3108 previously this was only the number of errors in the pass that failed.
3109 - [Expansion in rustc has been sped up 29x.][42533]
3110 - [added `msp430-none-elf` target.][43099]
3111 - [rustc will now suggest one-argument enum variant to fix type mismatch when
3112 applicable][43178]
3113 - [Fixes backtraces on Redox][43228]
3114 - [rustc now identifies different versions of same crate when absolute paths of
3115 different types match in an error message.][42826]
3116
3117 Libraries
3118 ---------
3119
3120
3121 - [Relaxed Debug constraints on `{HashMap,BTreeMap}::{Keys,Values}`.][42854]
3122 - [Impl `PartialEq`, `Eq`, `PartialOrd`, `Ord`, `Debug`, `Hash` for unsized
3123 tuples.][43011]
3124 - [Impl `fmt::{Display, Debug}` for `Ref`, `RefMut`, `MutexGuard`,
3125 `RwLockReadGuard`, `RwLockWriteGuard`][42822]
3126 - [Impl `Clone` for `DefaultHasher`.][42799]
3127 - [Impl `Sync` for `SyncSender`.][42397]
3128 - [Impl `FromStr` for `char`][42271]
3129 - [Fixed how `{f32, f64}::{is_sign_negative, is_sign_positive}` handles
3130 NaN.][42431]
3131 - [allow messages in the `unimplemented!()` macro.][42155]
3132 ie. `unimplemented!("Waiting for 1.21 to be stable")`
3133 - [`pub(restricted)` is now supported in the `thread_local!` macro.][43185]
3134 - [Upgrade to Unicode 10.0.0][42999]
3135 - [Reimplemented `{f32, f64}::{min, max}` in Rust instead of using CMath.][42430]
3136 - [Skip the main thread's manual stack guard on Linux][43072]
3137 - [Iterator::nth for `ops::{Range, RangeFrom}` is now done in O(1) time][43077]
3138 - [`#[repr(align(N))]` attribute max number is now 2^31 - 1.][43097] This was
3139 previously 2^15.
3140 - [`{OsStr, Path}::Display` now avoids allocations where possible][42613]
3141
3142 Stabilized APIs
3143 ---------------
3144
3145 - [`CStr::into_c_string`]
3146 - [`CString::as_c_str`]
3147 - [`CString::into_boxed_c_str`]
3148 - [`Chain::get_mut`]
3149 - [`Chain::get_ref`]
3150 - [`Chain::into_inner`]
3151 - [`Option::get_or_insert_with`]
3152 - [`Option::get_or_insert`]
3153 - [`OsStr::into_os_string`]
3154 - [`OsString::into_boxed_os_str`]
3155 - [`Take::get_mut`]
3156 - [`Take::get_ref`]
3157 - [`Utf8Error::error_len`]
3158 - [`char::EscapeDebug`]
3159 - [`char::escape_debug`]
3160 - [`compile_error!`]
3161 - [`f32::from_bits`]
3162 - [`f32::to_bits`]
3163 - [`f64::from_bits`]
3164 - [`f64::to_bits`]
3165 - [`mem::ManuallyDrop`]
3166 - [`slice::sort_unstable_by_key`]
3167 - [`slice::sort_unstable_by`]
3168 - [`slice::sort_unstable`]
3169 - [`str::from_boxed_utf8_unchecked`]
3170 - [`str::as_bytes_mut`]
3171 - [`str::as_bytes_mut`]
3172 - [`str::from_utf8_mut`]
3173 - [`str::from_utf8_unchecked_mut`]
3174 - [`str::get_mut`]
3175 - [`str::get_unchecked_mut`]
3176 - [`str::get_unchecked`]
3177 - [`str::get`]
3178 - [`str::into_boxed_bytes`]
3179
3180
3181 Cargo
3182 -----
3183 - [Cargo API token location moved from `~/.cargo/config` to
3184 `~/.cargo/credentials`.][cargo/3978]
3185 - [Cargo will now build `main.rs` binaries that are in sub-directories of
3186 `src/bin`.][cargo/4214] ie. Having `src/bin/server/main.rs` and
3187 `src/bin/client/main.rs` generates `target/debug/server` and `target/debug/client`
3188 - [You can now specify version of a binary when installed through
3189 `cargo install` using `--vers`.][cargo/4229]
3190 - [Added `--no-fail-fast` flag to cargo to run all benchmarks regardless of
3191 failure.][cargo/4248]
3192 - [Changed the convention around which file is the crate root.][cargo/4259]
3193 - [The `include`/`exclude` property in `Cargo.toml` now accepts gitignore paths
3194 instead of glob patterns][cargo/4270]. Glob patterns are now deprecated.
3195
3196 Compatibility Notes
3197 -------------------
3198
3199 - [Functions with `'static` in their return types will now not be as usable as
3200 if they were using lifetime parameters instead.][42417]
3201 - [The reimplementation of `{f32, f64}::is_sign_{negative, positive}` now
3202 takes the sign of NaN into account where previously didn't.][42430]
3203
3204 [42033]: https://github.com/rust-lang/rust/pull/42033
3205 [42155]: https://github.com/rust-lang/rust/pull/42155
3206 [42271]: https://github.com/rust-lang/rust/pull/42271
3207 [42397]: https://github.com/rust-lang/rust/pull/42397
3208 [42417]: https://github.com/rust-lang/rust/pull/42417
3209 [42430]: https://github.com/rust-lang/rust/pull/42430
3210 [42431]: https://github.com/rust-lang/rust/pull/42431
3211 [42533]: https://github.com/rust-lang/rust/pull/42533
3212 [42571]: https://github.com/rust-lang/rust/pull/42571
3213 [42613]: https://github.com/rust-lang/rust/pull/42613
3214 [42799]: https://github.com/rust-lang/rust/pull/42799
3215 [42807]: https://github.com/rust-lang/rust/pull/42807
3216 [42809]: https://github.com/rust-lang/rust/pull/42809
3217 [42822]: https://github.com/rust-lang/rust/pull/42822
3218 [42826]: https://github.com/rust-lang/rust/pull/42826
3219 [42854]: https://github.com/rust-lang/rust/pull/42854
3220 [42913]: https://github.com/rust-lang/rust/pull/42913
3221 [42999]: https://github.com/rust-lang/rust/pull/42999
3222 [43011]: https://github.com/rust-lang/rust/pull/43011
3223 [43015]: https://github.com/rust-lang/rust/pull/43015
3224 [43072]: https://github.com/rust-lang/rust/pull/43072
3225 [43077]: https://github.com/rust-lang/rust/pull/43077
3226 [43097]: https://github.com/rust-lang/rust/pull/43097
3227 [43099]: https://github.com/rust-lang/rust/pull/43099
3228 [43170]: https://github.com/rust-lang/rust/pull/43170
3229 [43178]: https://github.com/rust-lang/rust/pull/43178
3230 [43185]: https://github.com/rust-lang/rust/pull/43185
3231 [43228]: https://github.com/rust-lang/rust/pull/43228
3232 [cargo/3978]: https://github.com/rust-lang/cargo/pull/3978
3233 [cargo/4214]: https://github.com/rust-lang/cargo/pull/4214
3234 [cargo/4229]: https://github.com/rust-lang/cargo/pull/4229
3235 [cargo/4248]: https://github.com/rust-lang/cargo/pull/4248
3236 [cargo/4259]: https://github.com/rust-lang/cargo/pull/4259
3237 [cargo/4270]: https://github.com/rust-lang/cargo/pull/4270
3238 [`CStr::into_c_string`]: https://doc.rust-lang.org/std/ffi/struct.CStr.html#method.into_c_string
3239 [`CString::as_c_str`]: https://doc.rust-lang.org/std/ffi/struct.CString.html#method.as_c_str
3240 [`CString::into_boxed_c_str`]: https://doc.rust-lang.org/std/ffi/struct.CString.html#method.into_boxed_c_str
3241 [`Chain::get_mut`]: https://doc.rust-lang.org/std/io/struct.Chain.html#method.get_mut
3242 [`Chain::get_ref`]: https://doc.rust-lang.org/std/io/struct.Chain.html#method.get_ref
3243 [`Chain::into_inner`]: https://doc.rust-lang.org/std/io/struct.Chain.html#method.into_inner
3244 [`Option::get_or_insert_with`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.get_or_insert_with
3245 [`Option::get_or_insert`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.get_or_insert
3246 [`OsStr::into_os_string`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html#method.into_os_string
3247 [`OsString::into_boxed_os_str`]: https://doc.rust-lang.org/std/ffi/struct.OsString.html#method.into_boxed_os_str
3248 [`Take::get_mut`]: https://doc.rust-lang.org/std/io/struct.Take.html#method.get_mut
3249 [`Take::get_ref`]: https://doc.rust-lang.org/std/io/struct.Take.html#method.get_ref
3250 [`Utf8Error::error_len`]: https://doc.rust-lang.org/std/str/struct.Utf8Error.html#method.error_len
3251 [`char::EscapeDebug`]: https://doc.rust-lang.org/std/char/struct.EscapeDebug.html
3252 [`char::escape_debug`]: https://doc.rust-lang.org/std/primitive.char.html#method.escape_debug
3253 [`compile_error!`]: https://doc.rust-lang.org/std/macro.compile_error.html
3254 [`f32::from_bits`]: https://doc.rust-lang.org/std/primitive.f32.html#method.from_bits
3255 [`f32::to_bits`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_bits
3256 [`f64::from_bits`]: https://doc.rust-lang.org/std/primitive.f64.html#method.from_bits
3257 [`f64::to_bits`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_bits
3258 [`mem::ManuallyDrop`]: https://doc.rust-lang.org/std/mem/union.ManuallyDrop.html
3259 [`slice::sort_unstable_by_key`]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_unstable_by_key
3260 [`slice::sort_unstable_by`]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_unstable_by
3261 [`slice::sort_unstable`]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort_unstable
3262 [`str::from_boxed_utf8_unchecked`]: https://doc.rust-lang.org/std/str/fn.from_boxed_utf8_unchecked.html
3263 [`str::as_bytes_mut`]: https://doc.rust-lang.org/std/primitive.str.html#method.as_bytes_mut
3264 [`str::from_utf8_mut`]: https://doc.rust-lang.org/std/str/fn.from_utf8_mut.html
3265 [`str::from_utf8_unchecked_mut`]: https://doc.rust-lang.org/std/str/fn.from_utf8_unchecked_mut.html
3266 [`str::get_mut`]: https://doc.rust-lang.org/std/primitive.str.html#method.get_mut
3267 [`str::get_unchecked_mut`]: https://doc.rust-lang.org/std/primitive.str.html#method.get_unchecked_mut
3268 [`str::get_unchecked`]: https://doc.rust-lang.org/std/primitive.str.html#method.get_unchecked
3269 [`str::get`]: https://doc.rust-lang.org/std/primitive.str.html#method.get
3270 [`str::into_boxed_bytes`]: https://doc.rust-lang.org/std/primitive.str.html#method.into_boxed_bytes
3271
3272
3273 Version 1.19.0 (2017-07-20)
3274 ===========================
3275
3276 Language
3277 --------
3278
3279 - [Numeric fields can now be used for creating tuple structs.][41145] [RFC 1506]
3280 For example `struct Point(u32, u32); let x = Point { 0: 7, 1: 0 };`.
3281 - [Macro recursion limit increased to 1024 from 64.][41676]
3282 - [Added lint for detecting unused macros.][41907]
3283 - [`loop` can now return a value with `break`.][42016] [RFC 1624]
3284 For example: `let x = loop { break 7; };`
3285 - [C compatible `union`s are now available.][42068] [RFC 1444] They can only
3286 contain `Copy` types and cannot have a `Drop` implementation.
3287 Example: `union Foo { bar: u8, baz: usize }`
3288 - [Non capturing closures can now be coerced into `fn`s,][42162] [RFC 1558]
3289 Example: `let foo: fn(u8) -> u8 = |v: u8| { v };`
3290
3291 Compiler
3292 --------
3293
3294 - [Add support for bootstrapping the Rust compiler toolchain on Android.][41370]
3295 - [Change `arm-linux-androideabi` to correspond to the `armeabi`
3296 official ABI.][41656] If you wish to continue targeting the `armeabi-v7a` ABI
3297 you should use `--target armv7-linux-androideabi`.
3298 - [Fixed ICE when removing a source file between compilation sessions.][41873]
3299 - [Minor optimisation of string operations.][42037]
3300 - [Compiler error message is now `aborting due to previous error(s)` instead of
3301 `aborting due to N previous errors`][42150] This was previously inaccurate and
3302 would only count certain kinds of errors.
3303 - [The compiler now supports Visual Studio 2017][42225]
3304 - [The compiler is now built against LLVM 4.0.1 by default][42948]
3305 - [Added a lot][42264] of [new error codes][42302]
3306 - [Added `target-feature=+crt-static` option][37406] [RFC 1721] Which allows
3307 libraries with C Run-time Libraries(CRT) to be statically linked.
3308 - [Fixed various ARM codegen bugs][42740]
3309
3310 Libraries
3311 ---------
3312
3313 - [`String` now implements `FromIterator<Cow<'a, str>>` and
3314 `Extend<Cow<'a, str>>`][41449]
3315 - [`Vec` now implements `From<&mut [T]>`][41530]
3316 - [`Box<[u8]>` now implements `From<Box<str>>`][41258]
3317 - [`SplitWhitespace` now implements `Clone`][41659]
3318 - [`[u8]::reverse` is now 5x faster and `[u16]::reverse` is now
3319 1.5x faster][41764]
3320 - [`eprint!` and `eprintln!` macros added to prelude.][41192] Same as the `print!`
3321 macros, but for printing to stderr.
3322
3323 Stabilized APIs
3324 ---------------
3325
3326 - [`OsString::shrink_to_fit`]
3327 - [`cmp::Reverse`]
3328 - [`Command::envs`]
3329 - [`thread::ThreadId`]
3330
3331 Cargo
3332 -----
3333
3334 - [Build scripts can now add environment variables to the environment
3335 the crate is being compiled in.
3336 Example: `println!("cargo:rustc-env=FOO=bar");`][cargo/3929]
3337 - [Subcommands now replace the current process rather than spawning a new
3338 child process][cargo/3970]
3339 - [Workspace members can now accept glob file patterns][cargo/3979]
3340 - [Added `--all` flag to the `cargo bench` subcommand to run benchmarks of all
3341 the members in a given workspace.][cargo/3988]
3342 - [Updated `libssh2-sys` to 0.2.6][cargo/4008]
3343 - [Target directory path is now in the cargo metadata][cargo/4022]
3344 - [Cargo no longer checks out a local working directory for the
3345 crates.io index][cargo/4026] This should provide smaller file size for the
3346 registry, and improve cloning times, especially on Windows machines.
3347 - [Added an `--exclude` option for excluding certain packages when using the
3348 `--all` option][cargo/4031]
3349 - [Cargo will now automatically retry when receiving a 5xx error
3350 from crates.io][cargo/4032]
3351 - [The `--features` option now accepts multiple comma or space
3352 delimited values.][cargo/4084]
3353 - [Added support for custom target specific runners][cargo/3954]
3354
3355 Misc
3356 ----
3357
3358 - [Added `rust-windbg.cmd`][39983] for loading rust `.natvis` files in the
3359 Windows Debugger.
3360 - [Rust will now release XZ compressed packages][rust-installer/57]
3361 - [rustup will now prefer to download rust packages with
3362 XZ compression][rustup/1100] over GZip packages.
3363 - [Added the ability to escape `#` in rust documentation][41785] By adding
3364 additional `#`'s ie. `##` is now `#`
3365
3366 Compatibility Notes
3367 -------------------
3368
3369 - [`MutexGuard<T>` may only be `Sync` if `T` is `Sync`.][41624]
3370 - [`-Z` flags are now no longer allowed to be used on the stable
3371 compiler.][41751] This has been a warning for a year previous to this.
3372 - [As a result of the `-Z` flag change, the `cargo-check` plugin no
3373 longer works][42844]. Users should migrate to the built-in `check`
3374 command, which has been available since 1.16.
3375 - [Ending a float literal with `._` is now a hard error.
3376 Example: `42._` .][41946]
3377 - [Any use of a private `extern crate` outside of its module is now a
3378 hard error.][36886] This was previously a warning.
3379 - [`use ::self::foo;` is now a hard error.][36888] `self` paths are always
3380 relative while the `::` prefix makes a path absolute, but was ignored and the
3381 path was relative regardless.
3382 - [Floating point constants in match patterns is now a hard error][36890]
3383 This was previously a warning.
3384 - [Struct or enum constants that don't derive `PartialEq` & `Eq` used
3385 match patterns is now a hard error][36891] This was previously a warning.
3386 - [Lifetimes named `'_` are no longer allowed.][36892] This was previously
3387 a warning.
3388 - [From the pound escape, lines consisting of multiple `#`s are
3389 now visible][41785]
3390 - [It is an error to re-export private enum variants][42460]. This is
3391 known to break a number of crates that depend on an older version of
3392 mustache.
3393 - [On Windows, if `VCINSTALLDIR` is set incorrectly, `rustc` will try
3394 to use it to find the linker, and the build will fail where it did
3395 not previously][42607]
3396
3397 [36886]: https://github.com/rust-lang/rust/issues/36886
3398 [36888]: https://github.com/rust-lang/rust/issues/36888
3399 [36890]: https://github.com/rust-lang/rust/issues/36890
3400 [36891]: https://github.com/rust-lang/rust/issues/36891
3401 [36892]: https://github.com/rust-lang/rust/issues/36892
3402 [37406]: https://github.com/rust-lang/rust/issues/37406
3403 [39983]: https://github.com/rust-lang/rust/pull/39983
3404 [41145]: https://github.com/rust-lang/rust/pull/41145
3405 [41192]: https://github.com/rust-lang/rust/pull/41192
3406 [41258]: https://github.com/rust-lang/rust/pull/41258
3407 [41370]: https://github.com/rust-lang/rust/pull/41370
3408 [41449]: https://github.com/rust-lang/rust/pull/41449
3409 [41530]: https://github.com/rust-lang/rust/pull/41530
3410 [41624]: https://github.com/rust-lang/rust/pull/41624
3411 [41656]: https://github.com/rust-lang/rust/pull/41656
3412 [41659]: https://github.com/rust-lang/rust/pull/41659
3413 [41676]: https://github.com/rust-lang/rust/pull/41676
3414 [41751]: https://github.com/rust-lang/rust/pull/41751
3415 [41764]: https://github.com/rust-lang/rust/pull/41764
3416 [41785]: https://github.com/rust-lang/rust/pull/41785
3417 [41873]: https://github.com/rust-lang/rust/pull/41873
3418 [41907]: https://github.com/rust-lang/rust/pull/41907
3419 [41946]: https://github.com/rust-lang/rust/pull/41946
3420 [42016]: https://github.com/rust-lang/rust/pull/42016
3421 [42037]: https://github.com/rust-lang/rust/pull/42037
3422 [42068]: https://github.com/rust-lang/rust/pull/42068
3423 [42150]: https://github.com/rust-lang/rust/pull/42150
3424 [42162]: https://github.com/rust-lang/rust/pull/42162
3425 [42225]: https://github.com/rust-lang/rust/pull/42225
3426 [42264]: https://github.com/rust-lang/rust/pull/42264
3427 [42302]: https://github.com/rust-lang/rust/pull/42302
3428 [42460]: https://github.com/rust-lang/rust/issues/42460
3429 [42607]: https://github.com/rust-lang/rust/issues/42607
3430 [42740]: https://github.com/rust-lang/rust/pull/42740
3431 [42844]: https://github.com/rust-lang/rust/issues/42844
3432 [42948]: https://github.com/rust-lang/rust/pull/42948
3433 [RFC 1444]: https://github.com/rust-lang/rfcs/pull/1444
3434 [RFC 1506]: https://github.com/rust-lang/rfcs/pull/1506
3435 [RFC 1558]: https://github.com/rust-lang/rfcs/pull/1558
3436 [RFC 1624]: https://github.com/rust-lang/rfcs/pull/1624
3437 [RFC 1721]: https://github.com/rust-lang/rfcs/pull/1721
3438 [`Command::envs`]: https://doc.rust-lang.org/std/process/struct.Command.html#method.envs
3439 [`OsString::shrink_to_fit`]: https://doc.rust-lang.org/std/ffi/struct.OsString.html#method.shrink_to_fit
3440 [`cmp::Reverse`]: https://doc.rust-lang.org/std/cmp/struct.Reverse.html
3441 [`thread::ThreadId`]: https://doc.rust-lang.org/std/thread/struct.ThreadId.html
3442 [cargo/3929]: https://github.com/rust-lang/cargo/pull/3929
3443 [cargo/3954]: https://github.com/rust-lang/cargo/pull/3954
3444 [cargo/3970]: https://github.com/rust-lang/cargo/pull/3970
3445 [cargo/3979]: https://github.com/rust-lang/cargo/pull/3979
3446 [cargo/3988]: https://github.com/rust-lang/cargo/pull/3988
3447 [cargo/4008]: https://github.com/rust-lang/cargo/pull/4008
3448 [cargo/4022]: https://github.com/rust-lang/cargo/pull/4022
3449 [cargo/4026]: https://github.com/rust-lang/cargo/pull/4026
3450 [cargo/4031]: https://github.com/rust-lang/cargo/pull/4031
3451 [cargo/4032]: https://github.com/rust-lang/cargo/pull/4032
3452 [cargo/4084]: https://github.com/rust-lang/cargo/pull/4084
3453 [rust-installer/57]: https://github.com/rust-lang/rust-installer/pull/57
3454 [rustup/1100]: https://github.com/rust-lang-nursery/rustup.rs/pull/1100
3455
3456
3457 Version 1.18.0 (2017-06-08)
3458 ===========================
3459
3460 Language
3461 --------
3462
3463 - [Stabilize pub(restricted)][40556] `pub` can now accept a module path to
3464 make the item visible to just that module tree. Also accepts the keyword
3465 `crate` to make something public to the whole crate but not users of the
3466 library. Example: `pub(crate) mod utils;`. [RFC 1422].
3467 - [Stabilize `#![windows_subsystem]` attribute][40870] conservative exposure of the
3468 `/SUBSYSTEM` linker flag on Windows platforms. [RFC 1665].
3469 - [Refactor of trait object type parsing][40043] Now `ty` in macros can accept
3470 types like `Write + Send`, trailing `+` are now supported in trait objects,
3471 and better error reporting for trait objects starting with `?Sized`.
3472 - [0e+10 is now a valid floating point literal][40589]
3473 - [Now warns if you bind a lifetime parameter to 'static][40734]
3474 - [Tuples, Enum variant fields, and structs with no `repr` attribute or with
3475 `#[repr(Rust)]` are reordered to minimize padding and produce a smaller
3476 representation in some cases.][40377]
3477
3478 Compiler
3479 --------
3480
3481 - [rustc can now emit mir with `--emit mir`][39891]
3482 - [Improved LLVM IR for trivial functions][40367]
3483 - [Added explanation for E0090(Wrong number of lifetimes are supplied)][40723]
3484 - [rustc compilation is now 15%-20% faster][41469] Thanks to optimisation
3485 opportunities found through profiling
3486 - [Improved backtrace formatting when panicking][38165]
3487
3488 Libraries
3489 ---------
3490
3491 - [Specialized `Vec::from_iter` being passed `vec::IntoIter`][40731] if the
3492 iterator hasn't been advanced the original `Vec` is reassembled with no actual
3493 iteration or reallocation.
3494 - [Simplified HashMap Bucket interface][40561] provides performance
3495 improvements for iterating and cloning.
3496 - [Specialize Vec::from_elem to use calloc][40409]
3497 - [Fixed Race condition in fs::create_dir_all][39799]
3498 - [No longer caching stdio on Windows][40516]
3499 - [Optimized insertion sort in slice][40807] insertion sort in some cases
3500 2.50%~ faster and in one case now 12.50% faster.
3501 - [Optimized `AtomicBool::fetch_nand`][41143]
3502
3503 Stabilized APIs
3504 ---------------
3505
3506 - [`Child::try_wait`]
3507 - [`HashMap::retain`]
3508 - [`HashSet::retain`]
3509 - [`PeekMut::pop`]
3510 - [`TcpStream::peek`]
3511 - [`UdpSocket::peek`]
3512 - [`UdpSocket::peek_from`]
3513
3514 Cargo
3515 -----
3516
3517 - [Added partial Pijul support][cargo/3842] Pijul is a version control system in Rust.
3518 You can now create new cargo projects with Pijul using `cargo new --vcs pijul`
3519 - [Now always emits build script warnings for crates that fail to build][cargo/3847]
3520 - [Added Android build support][cargo/3885]
3521 - [Added `--bins` and `--tests` flags][cargo/3901] now you can build all programs
3522 of a certain type, for example `cargo build --bins` will build all
3523 binaries.
3524 - [Added support for haiku][cargo/3952]
3525
3526 Misc
3527 ----
3528
3529 - [rustdoc can now use pulldown-cmark with the `--enable-commonmark` flag][40338]
3530 - [Added rust-windbg script for better debugging on Windows][39983]
3531 - [Rust now uses the official cross compiler for NetBSD][40612]
3532 - [rustdoc now accepts `#` at the start of files][40828]
3533 - [Fixed jemalloc support for musl][41168]
3534
3535 Compatibility Notes
3536 -------------------
3537
3538 - [Changes to how the `0` flag works in format!][40241] Padding zeroes are now
3539 always placed after the sign if it exists and before the digits. With the `#`
3540 flag the zeroes are placed after the prefix and before the digits.
3541 - [Due to the struct field optimisation][40377], using `transmute` on structs
3542 that have no `repr` attribute or `#[repr(Rust)]` will no longer work. This has
3543 always been undefined behavior, but is now more likely to break in practice.
3544 - [The refactor of trait object type parsing][40043] fixed a bug where `+` was
3545 receiving the wrong priority parsing things like `&for<'a> Tr<'a> + Send` as
3546 `&(for<'a> Tr<'a> + Send)` instead of `(&for<'a> Tr<'a>) + Send`
3547 - [Overlapping inherent `impl`s are now a hard error][40728]
3548 - [`PartialOrd` and `Ord` must agree on the ordering.][41270]
3549 - [`rustc main.rs -o out --emit=asm,llvm-ir`][41085] Now will output
3550 `out.asm` and `out.ll` instead of only one of the filetypes.
3551 - [ calling a function that returns `Self` will no longer work][41805] when
3552 the size of `Self` cannot be statically determined.
3553 - [rustc now builds with a "pthreads" flavour of MinGW for Windows GNU][40805]
3554 this has caused a few regressions namely:
3555
3556 - Changed the link order of local static/dynamic libraries (respecting the
3557 order on given rather than having the compiler reorder).
3558 - Changed how MinGW is linked, native code linked to dynamic libraries
3559 may require manually linking to the gcc support library (for the native
3560 code itself)
3561
3562 [38165]: https://github.com/rust-lang/rust/pull/38165
3563 [39799]: https://github.com/rust-lang/rust/pull/39799
3564 [39891]: https://github.com/rust-lang/rust/pull/39891
3565 [39983]: https://github.com/rust-lang/rust/pull/39983
3566 [40043]: https://github.com/rust-lang/rust/pull/40043
3567 [40241]: https://github.com/rust-lang/rust/pull/40241
3568 [40338]: https://github.com/rust-lang/rust/pull/40338
3569 [40367]: https://github.com/rust-lang/rust/pull/40367
3570 [40377]: https://github.com/rust-lang/rust/pull/40377
3571 [40409]: https://github.com/rust-lang/rust/pull/40409
3572 [40516]: https://github.com/rust-lang/rust/pull/40516
3573 [40556]: https://github.com/rust-lang/rust/pull/40556
3574 [40561]: https://github.com/rust-lang/rust/pull/40561
3575 [40589]: https://github.com/rust-lang/rust/pull/40589
3576 [40612]: https://github.com/rust-lang/rust/pull/40612
3577 [40723]: https://github.com/rust-lang/rust/pull/40723
3578 [40728]: https://github.com/rust-lang/rust/pull/40728
3579 [40731]: https://github.com/rust-lang/rust/pull/40731
3580 [40734]: https://github.com/rust-lang/rust/pull/40734
3581 [40805]: https://github.com/rust-lang/rust/pull/40805
3582 [40807]: https://github.com/rust-lang/rust/pull/40807
3583 [40828]: https://github.com/rust-lang/rust/pull/40828
3584 [40870]: https://github.com/rust-lang/rust/pull/40870
3585 [41085]: https://github.com/rust-lang/rust/pull/41085
3586 [41143]: https://github.com/rust-lang/rust/pull/41143
3587 [41168]: https://github.com/rust-lang/rust/pull/41168
3588 [41270]: https://github.com/rust-lang/rust/issues/41270
3589 [41469]: https://github.com/rust-lang/rust/pull/41469
3590 [41805]: https://github.com/rust-lang/rust/issues/41805
3591 [RFC 1422]: https://github.com/rust-lang/rfcs/blob/master/text/1422-pub-restricted.md
3592 [RFC 1665]: https://github.com/rust-lang/rfcs/blob/master/text/1665-windows-subsystem.md
3593 [`Child::try_wait`]: https://doc.rust-lang.org/std/process/struct.Child.html#method.try_wait
3594 [`HashMap::retain`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.retain
3595 [`HashSet::retain`]: https://doc.rust-lang.org/std/collections/struct.HashSet.html#method.retain
3596 [`PeekMut::pop`]: https://doc.rust-lang.org/std/collections/binary_heap/struct.PeekMut.html#method.pop
3597 [`TcpStream::peek`]: https://doc.rust-lang.org/std/net/struct.TcpStream.html#method.peek
3598 [`UdpSocket::peek_from`]: https://doc.rust-lang.org/std/net/struct.UdpSocket.html#method.peek_from
3599 [`UdpSocket::peek`]: https://doc.rust-lang.org/std/net/struct.UdpSocket.html#method.peek
3600 [cargo/3842]: https://github.com/rust-lang/cargo/pull/3842
3601 [cargo/3847]: https://github.com/rust-lang/cargo/pull/3847
3602 [cargo/3885]: https://github.com/rust-lang/cargo/pull/3885
3603 [cargo/3901]: https://github.com/rust-lang/cargo/pull/3901
3604 [cargo/3952]: https://github.com/rust-lang/cargo/pull/3952
3605
3606
3607 Version 1.17.0 (2017-04-27)
3608 ===========================
3609
3610 Language
3611 --------
3612
3613 * [The lifetime of statics and consts defaults to `'static`][39265]. [RFC 1623]
3614 * [Fields of structs may be initialized without duplicating the field/variable
3615 names][39761]. [RFC 1682]
3616 * [`Self` may be included in the `where` clause of `impls`][38864]. [RFC 1647]
3617 * [When coercing to an unsized type lifetimes must be equal][40319]. That is,
3618 there is no subtyping between `T` and `U` when `T: Unsize<U>`. For example,
3619 coercing `&mut [&'a X; N]` to `&mut [&'b X]` requires `'a` be equal to
3620 `'b`. Soundness fix.
3621 * [Values passed to the indexing operator, `[]`, automatically coerce][40166]
3622 * [Static variables may contain references to other statics][40027]
3623
3624 Compiler
3625 --------
3626
3627 * [Exit quickly on only `--emit dep-info`][40336]
3628 * [Make `-C relocation-model` more correctly determine whether the linker
3629 creates a position-independent executable][40245]
3630 * [Add `-C overflow-checks` to directly control whether integer overflow
3631 panics][40037]
3632 * [The rustc type checker now checks items on demand instead of in a single
3633 in-order pass][40008]. This is mostly an internal refactoring in support of
3634 future work, including incremental type checking, but also resolves [RFC
3635 1647], allowing `Self` to appear in `impl` `where` clauses.
3636 * [Optimize vtable loads][39995]
3637 * [Turn off vectorization for Emscripten targets][39990]
3638 * [Provide suggestions for unknown macros imported with `use`][39953]
3639 * [Fix ICEs in path resolution][39939]
3640 * [Strip exception handling code on Emscripten when `panic=abort`][39193]
3641 * [Add clearer error message using `&str + &str`][39116]
3642
3643 Stabilized APIs
3644 ---------------
3645
3646 * [`Arc::into_raw`]
3647 * [`Arc::from_raw`]
3648 * [`Arc::ptr_eq`]
3649 * [`Rc::into_raw`]
3650 * [`Rc::from_raw`]
3651 * [`Rc::ptr_eq`]
3652 * [`Ordering::then`]
3653 * [`Ordering::then_with`]
3654 * [`BTreeMap::range`]
3655 * [`BTreeMap::range_mut`]
3656 * [`collections::Bound`]
3657 * [`process::abort`]
3658 * [`ptr::read_unaligned`]
3659 * [`ptr::write_unaligned`]
3660 * [`Result::expect_err`]
3661 * [`Cell::swap`]
3662 * [`Cell::replace`]
3663 * [`Cell::into_inner`]
3664 * [`Cell::take`]
3665
3666 Libraries
3667 ---------
3668
3669 * [`BTreeMap` and `BTreeSet` can iterate over ranges][27787]
3670 * [`Cell` can store non-`Copy` types][39793]. [RFC 1651]
3671 * [`String` implements `FromIterator<&char>`][40028]
3672 * `Box` [implements][40009] a number of new conversions:
3673 `From<Box<str>> for String`,
3674 `From<Box<[T]>> for Vec<T>`,
3675 `From<Box<CStr>> for CString`,
3676 `From<Box<OsStr>> for OsString`,
3677 `From<Box<Path>> for PathBuf`,
3678 `Into<Box<str>> for String`,
3679 `Into<Box<[T]>> for Vec<T>`,
3680 `Into<Box<CStr>> for CString`,
3681 `Into<Box<OsStr>> for OsString`,
3682 `Into<Box<Path>> for PathBuf`,
3683 `Default for Box<str>`,
3684 `Default for Box<CStr>`,
3685 `Default for Box<OsStr>`,
3686 `From<&CStr> for Box<CStr>`,
3687 `From<&OsStr> for Box<OsStr>`,
3688 `From<&Path> for Box<Path>`
3689 * [`ffi::FromBytesWithNulError` implements `Error` and `Display`][39960]
3690 * [Specialize `PartialOrd<A> for [A] where A: Ord`][39642]
3691 * [Slightly optimize `slice::sort`][39538]
3692 * [Add `ToString` trait specialization for `Cow<'a, str>` and `String`][39440]
3693 * [`Box<[T]>` implements `From<&[T]> where T: Copy`,
3694 `Box<str>` implements `From<&str>`][39438]
3695 * [`IpAddr` implements `From` for various arrays. `SocketAddr` implements
3696 `From<(I, u16)> where I: Into<IpAddr>`][39372]
3697 * [`format!` estimates the needed capacity before writing a string][39356]
3698 * [Support unprivileged symlink creation in Windows][38921]
3699 * [`PathBuf` implements `Default`][38764]
3700 * [Implement `PartialEq<[A]>` for `VecDeque<A>`][38661]
3701 * [`HashMap` resizes adaptively][38368] to guard against DOS attacks
3702 and poor hash functions.
3703
3704 Cargo
3705 -----
3706
3707 * [Add `cargo check --all`][cargo/3731]
3708 * [Add an option to ignore SSL revocation checking][cargo/3699]
3709 * [Add `cargo run --package`][cargo/3691]
3710 * [Add `required_features`][cargo/3667]
3711 * [Assume `build.rs` is a build script][cargo/3664]
3712 * [Find workspace via `workspace_root` link in containing member][cargo/3562]
3713
3714 Misc
3715 ----
3716
3717 * [Documentation is rendered with mdbook instead of the obsolete, in-tree
3718 `rustbook`][39633]
3719 * [The "Unstable Book" documents nightly-only features][ubook]
3720 * [Improve the style of the sidebar in rustdoc output][40265]
3721 * [Configure build correctly on 64-bit CPU's with the armhf ABI][40261]
3722 * [Fix MSP430 breakage due to `i128`][40257]
3723 * [Preliminary Solaris/SPARCv9 support][39903]
3724 * [`rustc` is linked statically on Windows MSVC targets][39837], allowing it to
3725 run without installing the MSVC runtime.
3726 * [`rustdoc --test` includes file names in test names][39788]
3727 * This release includes builds of `std` for `sparc64-unknown-linux-gnu`,
3728 `aarch64-unknown-linux-fuchsia`, and `x86_64-unknown-linux-fuchsia`.
3729 * [Initial support for `aarch64-unknown-freebsd`][39491]
3730 * [Initial support for `i686-unknown-netbsd`][39426]
3731 * [This release no longer includes the old makefile build system][39431]. Rust
3732 is built with a custom build system, written in Rust, and with Cargo.
3733 * [Add Debug implementations for libcollection structs][39002]
3734 * [`TypeId` implements `PartialOrd` and `Ord`][38981]
3735 * [`--test-threads=0` produces an error][38945]
3736 * [`rustup` installs documentation by default][40526]
3737 * [The Rust source includes NatVis visualizations][39843]. These can be used by
3738 WinDbg and Visual Studio to improve the debugging experience.
3739
3740 Compatibility Notes
3741 -------------------
3742
3743 * [Rust 1.17 does not correctly detect the MSVC 2017 linker][38584]. As a
3744 workaround, either use MSVC 2015 or run vcvars.bat.
3745 * [When coercing to an unsized type lifetimes must be equal][40319]. That is,
3746 disallow subtyping between `T` and `U` when `T: Unsize<U>`, e.g. coercing
3747 `&mut [&'a X; N]` to `&mut [&'b X]` requires `'a` be equal to `'b`. Soundness
3748 fix.
3749 * [`format!` and `Display::to_string` panic if an underlying formatting
3750 implementation returns an error][40117]. Previously the error was silently
3751 ignored. It is incorrect for `write_fmt` to return an error when writing
3752 to a string.
3753 * [In-tree crates are verified to be unstable][39851]. Previously, some minor
3754 crates were marked stable and could be accessed from the stable toolchain.
3755 * [Rust git source no longer includes vendored crates][39728]. Those that need
3756 to build with vendored crates should build from release tarballs.
3757 * [Fix inert attributes from `proc_macro_derives`][39572]
3758 * [During crate resolution, rustc prefers a crate in the sysroot if two crates
3759 are otherwise identical][39518]. Unlikely to be encountered outside the Rust
3760 build system.
3761 * [Fixed bugs around how type inference interacts with dead-code][39485]. The
3762 existing code generally ignores the type of dead-code unless a type-hint is
3763 provided; this can cause surprising inference interactions particularly around
3764 defaulting. The new code uniformly ignores the result type of dead-code.
3765 * [Tuple-struct constructors with private fields are no longer visible][38932]
3766 * [Lifetime parameters that do not appear in the arguments are now considered
3767 early-bound][38897], resolving a soundness bug (#[32330]). The
3768 `hr_lifetime_in_assoc_type` future-compatibility lint has been in effect since
3769 April of 2016.
3770 * [rustdoc: fix doctests with non-feature crate attributes][38161]
3771 * [Make transmuting from fn item types to pointer-sized types a hard
3772 error][34198]
3773
3774 [27787]: https://github.com/rust-lang/rust/issues/27787
3775 [32330]: https://github.com/rust-lang/rust/issues/32330
3776 [34198]: https://github.com/rust-lang/rust/pull/34198
3777 [38161]: https://github.com/rust-lang/rust/pull/38161
3778 [38368]: https://github.com/rust-lang/rust/pull/38368
3779 [38584]: https://github.com/rust-lang/rust/issues/38584
3780 [38661]: https://github.com/rust-lang/rust/pull/38661
3781 [38764]: https://github.com/rust-lang/rust/pull/38764
3782 [38864]: https://github.com/rust-lang/rust/issues/38864
3783 [38897]: https://github.com/rust-lang/rust/pull/38897
3784 [38921]: https://github.com/rust-lang/rust/pull/38921
3785 [38932]: https://github.com/rust-lang/rust/pull/38932
3786 [38945]: https://github.com/rust-lang/rust/pull/38945
3787 [38981]: https://github.com/rust-lang/rust/pull/38981
3788 [39002]: https://github.com/rust-lang/rust/pull/39002
3789 [39116]: https://github.com/rust-lang/rust/pull/39116
3790 [39193]: https://github.com/rust-lang/rust/pull/39193
3791 [39265]: https://github.com/rust-lang/rust/pull/39265
3792 [39356]: https://github.com/rust-lang/rust/pull/39356
3793 [39372]: https://github.com/rust-lang/rust/pull/39372
3794 [39426]: https://github.com/rust-lang/rust/pull/39426
3795 [39431]: https://github.com/rust-lang/rust/pull/39431
3796 [39438]: https://github.com/rust-lang/rust/pull/39438
3797 [39440]: https://github.com/rust-lang/rust/pull/39440
3798 [39485]: https://github.com/rust-lang/rust/pull/39485
3799 [39491]: https://github.com/rust-lang/rust/pull/39491
3800 [39518]: https://github.com/rust-lang/rust/pull/39518
3801 [39538]: https://github.com/rust-lang/rust/pull/39538
3802 [39572]: https://github.com/rust-lang/rust/pull/39572
3803 [39633]: https://github.com/rust-lang/rust/pull/39633
3804 [39642]: https://github.com/rust-lang/rust/pull/39642
3805 [39728]: https://github.com/rust-lang/rust/pull/39728
3806 [39761]: https://github.com/rust-lang/rust/pull/39761
3807 [39788]: https://github.com/rust-lang/rust/pull/39788
3808 [39793]: https://github.com/rust-lang/rust/pull/39793
3809 [39837]: https://github.com/rust-lang/rust/pull/39837
3810 [39843]: https://github.com/rust-lang/rust/pull/39843
3811 [39851]: https://github.com/rust-lang/rust/pull/39851
3812 [39903]: https://github.com/rust-lang/rust/pull/39903
3813 [39939]: https://github.com/rust-lang/rust/pull/39939
3814 [39953]: https://github.com/rust-lang/rust/pull/39953
3815 [39960]: https://github.com/rust-lang/rust/pull/39960
3816 [39990]: https://github.com/rust-lang/rust/pull/39990
3817 [39995]: https://github.com/rust-lang/rust/pull/39995
3818 [40008]: https://github.com/rust-lang/rust/pull/40008
3819 [40009]: https://github.com/rust-lang/rust/pull/40009
3820 [40027]: https://github.com/rust-lang/rust/pull/40027
3821 [40028]: https://github.com/rust-lang/rust/pull/40028
3822 [40037]: https://github.com/rust-lang/rust/pull/40037
3823 [40117]: https://github.com/rust-lang/rust/pull/40117
3824 [40166]: https://github.com/rust-lang/rust/pull/40166
3825 [40245]: https://github.com/rust-lang/rust/pull/40245
3826 [40257]: https://github.com/rust-lang/rust/pull/40257
3827 [40261]: https://github.com/rust-lang/rust/pull/40261
3828 [40265]: https://github.com/rust-lang/rust/pull/40265
3829 [40319]: https://github.com/rust-lang/rust/pull/40319
3830 [40336]: https://github.com/rust-lang/rust/pull/40336
3831 [40526]: https://github.com/rust-lang/rust/pull/40526
3832 [RFC 1623]: https://github.com/rust-lang/rfcs/blob/master/text/1623-static.md
3833 [RFC 1647]: https://github.com/rust-lang/rfcs/blob/master/text/1647-allow-self-in-where-clauses.md
3834 [RFC 1651]: https://github.com/rust-lang/rfcs/blob/master/text/1651-movecell.md
3835 [RFC 1682]: https://github.com/rust-lang/rfcs/blob/master/text/1682-field-init-shorthand.md
3836 [`Arc::from_raw`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.from_raw
3837 [`Arc::into_raw`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.into_raw
3838 [`Arc::ptr_eq`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.ptr_eq
3839 [`BTreeMap::range_mut`]: https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.range_mut
3840 [`BTreeMap::range`]: https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.range
3841 [`Cell::into_inner`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.into_inner
3842 [`Cell::replace`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.replace
3843 [`Cell::swap`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.swap
3844 [`Cell::take`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.take
3845 [`Ordering::then_with`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.then_with
3846 [`Ordering::then`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.then
3847 [`Rc::from_raw`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.from_raw
3848 [`Rc::into_raw`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.into_raw
3849 [`Rc::ptr_eq`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.ptr_eq
3850 [`Result::expect_err`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.expect_err
3851 [`collections::Bound`]: https://doc.rust-lang.org/std/collections/enum.Bound.html
3852 [`process::abort`]: https://doc.rust-lang.org/std/process/fn.abort.html
3853 [`ptr::read_unaligned`]: https://doc.rust-lang.org/std/ptr/fn.read_unaligned.html
3854 [`ptr::write_unaligned`]: https://doc.rust-lang.org/std/ptr/fn.write_unaligned.html
3855 [cargo/3562]: https://github.com/rust-lang/cargo/pull/3562
3856 [cargo/3664]: https://github.com/rust-lang/cargo/pull/3664
3857 [cargo/3667]: https://github.com/rust-lang/cargo/pull/3667
3858 [cargo/3691]: https://github.com/rust-lang/cargo/pull/3691
3859 [cargo/3699]: https://github.com/rust-lang/cargo/pull/3699
3860 [cargo/3731]: https://github.com/rust-lang/cargo/pull/3731
3861 [mdbook]: https://crates.io/crates/mdbook
3862 [ubook]: https://doc.rust-lang.org/unstable-book/
3863
3864
3865 Version 1.16.0 (2017-03-16)
3866 ===========================
3867
3868 Language
3869 --------
3870
3871 * [The compiler's `dead_code` lint now accounts for type aliases][38051].
3872 * [Uninhabitable enums (those without any variants) no longer permit wildcard
3873 match patterns][38069]
3874 * [Clean up semantics of `self` in an import list][38313]
3875 * [`Self` may appear in `impl` headers][38920]
3876 * [`Self` may appear in struct expressions][39282]
3877
3878 Compiler
3879 --------
3880
3881 * [`rustc` now supports `--emit=metadata`, which causes rustc to emit
3882 a `.rmeta` file containing only crate metadata][38571]. This can be
3883 used by tools like the Rust Language Service to perform
3884 metadata-only builds.
3885 * [Levenshtein based typo suggestions now work in most places, while
3886 previously they worked only for fields and sometimes for local
3887 variables][38927]. Together with the overhaul of "no
3888 resolution"/"unexpected resolution" errors (#[38154]) they result in
3889 large and systematic improvement in resolution diagnostics.
3890 * [Fix `transmute::<T, U>` where `T` requires a bigger alignment than
3891 `U`][38670]
3892 * [rustc: use -Xlinker when specifying an rpath with ',' in it][38798]
3893 * [`rustc` no longer attempts to provide "consider using an explicit
3894 lifetime" suggestions][37057]. They were inaccurate.
3895
3896 Stabilized APIs
3897 ---------------
3898
3899 * [`VecDeque::truncate`]
3900 * [`VecDeque::resize`]
3901 * [`String::insert_str`]
3902 * [`Duration::checked_add`]
3903 * [`Duration::checked_sub`]
3904 * [`Duration::checked_div`]
3905 * [`Duration::checked_mul`]
3906 * [`str::replacen`]
3907 * [`str::repeat`]
3908 * [`SocketAddr::is_ipv4`]
3909 * [`SocketAddr::is_ipv6`]
3910 * [`IpAddr::is_ipv4`]
3911 * [`IpAddr::is_ipv6`]
3912 * [`Vec::dedup_by`]
3913 * [`Vec::dedup_by_key`]
3914 * [`Result::unwrap_or_default`]
3915 * [`<*const T>::wrapping_offset`]
3916 * [`<*mut T>::wrapping_offset`]
3917 * `CommandExt::creation_flags`
3918 * [`File::set_permissions`]
3919 * [`String::split_off`]
3920
3921 Libraries
3922 ---------
3923
3924 * [`[T]::binary_search` and `[T]::binary_search_by_key` now take
3925 their argument by `Borrow` parameter][37761]
3926 * [All public types in std implement `Debug`][38006]
3927 * [`IpAddr` implements `From<Ipv4Addr>` and `From<Ipv6Addr>`][38327]
3928 * [`Ipv6Addr` implements `From<[u16; 8]>`][38131]
3929 * [Ctrl-Z returns from `Stdin.read()` when reading from the console on
3930 Windows][38274]
3931 * [std: Fix partial writes in `LineWriter`][38062]
3932 * [std: Clamp max read/write sizes on Unix][38062]
3933 * [Use more specific panic message for `&str` slicing errors][38066]
3934 * [`TcpListener::set_only_v6` is deprecated][38304]. This
3935 functionality cannot be achieved in std currently.
3936 * [`writeln!`, like `println!`, now accepts a form with no string
3937 or formatting arguments, to just print a newline][38469]
3938 * [Implement `iter::Sum` and `iter::Product` for `Result`][38580]
3939 * [Reduce the size of static data in `std_unicode::tables`][38781]
3940 * [`char::EscapeDebug`, `EscapeDefault`, `EscapeUnicode`,
3941 `CaseMappingIter`, `ToLowercase`, `ToUppercase`, implement
3942 `Display`][38909]
3943 * [`Duration` implements `Sum`][38712]
3944 * [`String` implements `ToSocketAddrs`][39048]
3945
3946 Cargo
3947 -----
3948
3949 * [The `cargo check` command does a type check of a project without
3950 building it][cargo/3296]
3951 * [crates.io will display CI badges from Travis and AppVeyor, if
3952 specified in Cargo.toml][cargo/3546]
3953 * [crates.io will display categories listed in Cargo.toml][cargo/3301]
3954 * [Compilation profiles accept integer values for `debug`, in addition
3955 to `true` and `false`. These are passed to `rustc` as the value to
3956 `-C debuginfo`][cargo/3534]
3957 * [Implement `cargo --version --verbose`][cargo/3604]
3958 * [All builds now output 'dep-info' build dependencies compatible with
3959 make and ninja][cargo/3557]
3960 * [Build all workspace members with `build --all`][cargo/3511]
3961 * [Document all workspace members with `doc --all`][cargo/3515]
3962 * [Path deps outside workspace are not members][cargo/3443]
3963
3964 Misc
3965 ----
3966
3967 * [`rustdoc` has a `--sysroot` argument that, like `rustc`, specifies
3968 the path to the Rust implementation][38589]
3969 * [The `armv7-linux-androideabi` target no longer enables NEON
3970 extensions, per Google's ABI guide][38413]
3971 * [The stock standard library can be compiled for Redox OS][38401]
3972 * [Rust has initial SPARC support][38726]. Tier 3. No builds
3973 available.
3974 * [Rust has experimental support for Nvidia PTX][38559]. Tier 3. No
3975 builds available.
3976 * [Fix backtraces on i686-pc-windows-gnu by disabling FPO][39379]
3977
3978 Compatibility Notes
3979 -------------------
3980
3981 * [Uninhabitable enums (those without any variants) no longer permit wildcard
3982 match patterns][38069]
3983 * In this release, references to uninhabited types can not be
3984 pattern-matched. This was accidentally allowed in 1.15.
3985 * [The compiler's `dead_code` lint now accounts for type aliases][38051].
3986 * [Ctrl-Z returns from `Stdin.read()` when reading from the console on
3987 Windows][38274]
3988 * [Clean up semantics of `self` in an import list][38313]
3989 * Reimplemented lifetime elision. This change was almost entirely compatible
3990 with existing code, but it did close a number of small bugs and loopholes,
3991 as well as being more accepting in some other [cases][41105].
3992
3993 [37057]: https://github.com/rust-lang/rust/pull/37057
3994 [37761]: https://github.com/rust-lang/rust/pull/37761
3995 [38006]: https://github.com/rust-lang/rust/pull/38006
3996 [38051]: https://github.com/rust-lang/rust/pull/38051
3997 [38062]: https://github.com/rust-lang/rust/pull/38062
3998 [38062]: https://github.com/rust-lang/rust/pull/38622
3999 [38066]: https://github.com/rust-lang/rust/pull/38066
4000 [38069]: https://github.com/rust-lang/rust/pull/38069
4001 [38131]: https://github.com/rust-lang/rust/pull/38131
4002 [38154]: https://github.com/rust-lang/rust/pull/38154
4003 [38274]: https://github.com/rust-lang/rust/pull/38274
4004 [38304]: https://github.com/rust-lang/rust/pull/38304
4005 [38313]: https://github.com/rust-lang/rust/pull/38313
4006 [38314]: https://github.com/rust-lang/rust/pull/38314
4007 [38327]: https://github.com/rust-lang/rust/pull/38327
4008 [38401]: https://github.com/rust-lang/rust/pull/38401
4009 [38413]: https://github.com/rust-lang/rust/pull/38413
4010 [38469]: https://github.com/rust-lang/rust/pull/38469
4011 [38559]: https://github.com/rust-lang/rust/pull/38559
4012 [38571]: https://github.com/rust-lang/rust/pull/38571
4013 [38580]: https://github.com/rust-lang/rust/pull/38580
4014 [38589]: https://github.com/rust-lang/rust/pull/38589
4015 [38670]: https://github.com/rust-lang/rust/pull/38670
4016 [38712]: https://github.com/rust-lang/rust/pull/38712
4017 [38726]: https://github.com/rust-lang/rust/pull/38726
4018 [38781]: https://github.com/rust-lang/rust/pull/38781
4019 [38798]: https://github.com/rust-lang/rust/pull/38798
4020 [38909]: https://github.com/rust-lang/rust/pull/38909
4021 [38920]: https://github.com/rust-lang/rust/pull/38920
4022 [38927]: https://github.com/rust-lang/rust/pull/38927
4023 [39048]: https://github.com/rust-lang/rust/pull/39048
4024 [39282]: https://github.com/rust-lang/rust/pull/39282
4025 [39379]: https://github.com/rust-lang/rust/pull/39379
4026 [41105]: https://github.com/rust-lang/rust/issues/41105
4027 [`<*const T>::wrapping_offset`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_offset
4028 [`<*mut T>::wrapping_offset`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.wrapping_offset
4029 [`Duration::checked_add`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_add
4030 [`Duration::checked_div`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_div
4031 [`Duration::checked_mul`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_mul
4032 [`Duration::checked_sub`]: https://doc.rust-lang.org/std/time/struct.Duration.html#method.checked_sub
4033 [`File::set_permissions`]: https://doc.rust-lang.org/std/fs/struct.File.html#method.set_permissions
4034 [`IpAddr::is_ipv4`]: https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_ipv4
4035 [`IpAddr::is_ipv6`]: https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_ipv6
4036 [`Result::unwrap_or_default`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.unwrap_or_default
4037 [`SocketAddr::is_ipv4`]: https://doc.rust-lang.org/std/net/enum.SocketAddr.html#method.is_ipv4
4038 [`SocketAddr::is_ipv6`]: https://doc.rust-lang.org/std/net/enum.SocketAddr.html#method.is_ipv6
4039 [`String::insert_str`]: https://doc.rust-lang.org/std/string/struct.String.html#method.insert_str
4040 [`String::split_off`]: https://doc.rust-lang.org/std/string/struct.String.html#method.split_off
4041 [`Vec::dedup_by_key`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.dedup_by_key
4042 [`Vec::dedup_by`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.dedup_by
4043 [`VecDeque::resize`]: https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.resize
4044 [`VecDeque::truncate`]: https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.truncate
4045 [`str::repeat`]: https://doc.rust-lang.org/std/primitive.str.html#method.repeat
4046 [`str::replacen`]: https://doc.rust-lang.org/std/primitive.str.html#method.replacen
4047 [cargo/3296]: https://github.com/rust-lang/cargo/pull/3296
4048 [cargo/3301]: https://github.com/rust-lang/cargo/pull/3301
4049 [cargo/3443]: https://github.com/rust-lang/cargo/pull/3443
4050 [cargo/3511]: https://github.com/rust-lang/cargo/pull/3511
4051 [cargo/3515]: https://github.com/rust-lang/cargo/pull/3515
4052 [cargo/3534]: https://github.com/rust-lang/cargo/pull/3534
4053 [cargo/3546]: https://github.com/rust-lang/cargo/pull/3546
4054 [cargo/3557]: https://github.com/rust-lang/cargo/pull/3557
4055 [cargo/3604]: https://github.com/rust-lang/cargo/pull/3604
4056 [RFC 1623]: https://github.com/rust-lang/rfcs/blob/master/text/1623-static.md
4057
4058
4059 Version 1.15.1 (2017-02-09)
4060 ===========================
4061
4062 * [Fix IntoIter::as_mut_slice's signature][39466]
4063 * [Compile compiler builtins with `-fPIC` on 32-bit platforms][39523]
4064
4065 [39466]: https://github.com/rust-lang/rust/pull/39466
4066 [39523]: https://github.com/rust-lang/rust/pull/39523
4067
4068
4069 Version 1.15.0 (2017-02-02)
4070 ===========================
4071
4072 Language
4073 --------
4074
4075 * Basic procedural macros allowing custom `#[derive]`, aka "macros 1.1", are
4076 stable. This allows popular code-generating crates like Serde and Diesel to
4077 work ergonomically. [RFC 1681].
4078 * [Tuple structs may be empty. Unary and empty tuple structs may be instantiated
4079 with curly braces][36868]. Part of [RFC 1506].
4080 * [A number of minor changes to name resolution have been activated][37127].
4081 They add up to more consistent semantics, allowing for future evolution of
4082 Rust macros. Specified in [RFC 1560], see its section on ["changes"] for
4083 details of what is different. The breaking changes here have been transitioned
4084 through the [`legacy_imports`] lint since 1.14, with no known regressions.
4085 * [In `macro_rules`, `path` fragments can now be parsed as type parameter
4086 bounds][38279]
4087 * [`?Sized` can be used in `where` clauses][37791]
4088 * [There is now a limit on the size of monomorphized types and it can be
4089 modified with the `#![type_size_limit]` crate attribute, similarly to
4090 the `#![recursion_limit]` attribute][37789]
4091
4092 Compiler
4093 --------
4094
4095 * [On Windows, the compiler will apply dllimport attributes when linking to
4096 extern functions][37973]. Additional attributes and flags can control which
4097 library kind is linked and its name. [RFC 1717].
4098 * [Rust-ABI symbols are no longer exported from cdylibs][38117]
4099 * [The `--test` flag works with procedural macro crates][38107]
4100 * [Fix `extern "aapcs" fn` ABI][37814]
4101 * [The `-C no-stack-check` flag is deprecated][37636]. It does nothing.
4102 * [The `format!` expander recognizes incorrect `printf` and shell-style
4103 formatting directives and suggests the correct format][37613].
4104 * [Only report one error for all unused imports in an import list][37456]
4105
4106 Compiler Performance
4107 --------------------
4108
4109 * [Avoid unnecessary `mk_ty` calls in `Ty::super_fold_with`][37705]
4110 * [Avoid more unnecessary `mk_ty` calls in `Ty::super_fold_with`][37979]
4111 * [Don't clone in `UnificationTable::probe`][37848]
4112 * [Remove `scope_auxiliary` to cut RSS by 10%][37764]
4113 * [Use small vectors in type walker][37760]
4114 * [Macro expansion performance was improved][37701]
4115 * [Change `HirVec<P<T>>` to `HirVec<T>` in `hir::Expr`][37642]
4116 * [Replace FNV with a faster hash function][37229]
4117
4118 Stabilized APIs
4119 ---------------
4120
4121 * [`std::iter::Iterator::min_by`]
4122 * [`std::iter::Iterator::max_by`]
4123 * [`std::os::*::fs::FileExt`]
4124 * [`std::sync::atomic::Atomic*::get_mut`]
4125 * [`std::sync::atomic::Atomic*::into_inner`]
4126 * [`std::vec::IntoIter::as_slice`]
4127 * [`std::vec::IntoIter::as_mut_slice`]
4128 * [`std::sync::mpsc::Receiver::try_iter`]
4129 * [`std::os::unix::process::CommandExt::before_exec`]
4130 * [`std::rc::Rc::strong_count`]
4131 * [`std::rc::Rc::weak_count`]
4132 * [`std::sync::Arc::strong_count`]
4133 * [`std::sync::Arc::weak_count`]
4134 * [`std::char::encode_utf8`]
4135 * [`std::char::encode_utf16`]
4136 * [`std::cell::Ref::clone`]
4137 * [`std::io::Take::into_inner`]
4138
4139 Libraries
4140 ---------
4141
4142 * [The standard sorting algorithm has been rewritten for dramatic performance
4143 improvements][38192]. It is a hybrid merge sort, drawing influences from
4144 Timsort. Previously it was a naive merge sort.
4145 * [`Iterator::nth` no longer has a `Sized` bound][38134]
4146 * [`Extend<&T>` is specialized for `Vec` where `T: Copy`][38182] to improve
4147 performance.
4148 * [`chars().count()` is much faster][37888] and so are [`chars().last()`
4149 and `char_indices().last()`][37882]
4150 * [Fix ARM Objective-C ABI in `std::env::args`][38146]
4151 * [Chinese characters display correctly in `fmt::Debug`][37855]
4152 * [Derive `Default` for `Duration`][37699]
4153 * [Support creation of anonymous pipes on WinXP/2k][37677]
4154 * [`mpsc::RecvTimeoutError` implements `Error`][37527]
4155 * [Don't pass overlapped handles to processes][38835]
4156
4157 Cargo
4158 -----
4159
4160 * [In this release, Cargo build scripts no longer have access to the `OUT_DIR`
4161 environment variable at build time via `env!("OUT_DIR")`][cargo/3368]. They
4162 should instead check the variable at runtime with `std::env`. That the value
4163 was set at build time was a bug, and incorrect when cross-compiling. This
4164 change is known to cause breakage.
4165 * [Add `--all` flag to `cargo test`][cargo/3221]
4166 * [Compile statically against the MSVC CRT][cargo/3363]
4167 * [Mix feature flags into fingerprint/metadata shorthash][cargo/3102]
4168 * [Link OpenSSL statically on OSX][cargo/3311]
4169 * [Apply new fingerprinting to build dir outputs][cargo/3310]
4170 * [Test for bad path overrides with summaries][cargo/3336]
4171 * [Require `cargo install --vers` to take a semver version][cargo/3338]
4172 * [Fix retrying crate downloads for network errors][cargo/3348]
4173 * [Implement string lookup for `build.rustflags` config key][cargo/3356]
4174 * [Emit more info on --message-format=json][cargo/3319]
4175 * [Assume `build.rs` in the same directory as `Cargo.toml` is a build script][cargo/3361]
4176 * [Don't ignore errors in workspace manifest][cargo/3409]
4177 * [Fix `--message-format JSON` when rustc emits non-JSON warnings][cargo/3410]
4178
4179 Tooling
4180 -------
4181
4182 * [Test runners (binaries built with `--test`) now support a `--list` argument
4183 that lists the tests it contains][38185]
4184 * [Test runners now support a `--exact` argument that makes the test filter
4185 match exactly, instead of matching only a substring of the test name][38181]
4186 * [rustdoc supports a `--playground-url` flag][37763]
4187 * [rustdoc provides more details about `#[should_panic]` errors][37749]
4188
4189 Misc
4190 ----
4191
4192 * [The Rust build system is now written in Rust][37817]. The Makefiles may
4193 continue to be used in this release by passing `--disable-rustbuild` to the
4194 configure script, but they will be deleted soon. Note that the new build
4195 system uses a different on-disk layout that will likely affect any scripts
4196 building Rust.
4197 * [Rust supports i686-unknown-openbsd][38086]. Tier 3 support. No testing or
4198 releases.
4199 * [Rust supports the MSP430][37627]. Tier 3 support. No testing or releases.
4200 * [Rust supports the ARMv5TE architecture][37615]. Tier 3 support. No testing or
4201 releases.
4202
4203 Compatibility Notes
4204 -------------------
4205
4206 * [A number of minor changes to name resolution have been activated][37127].
4207 They add up to more consistent semantics, allowing for future evolution of
4208 Rust macros. Specified in [RFC 1560], see its section on ["changes"] for
4209 details of what is different. The breaking changes here have been transitioned
4210 through the [`legacy_imports`] lint since 1.14, with no known regressions.
4211 * [In this release, Cargo build scripts no longer have access to the `OUT_DIR`
4212 environment variable at build time via `env!("OUT_DIR")`][cargo/3368]. They
4213 should instead check the variable at runtime with `std::env`. That the value
4214 was set at build time was a bug, and incorrect when cross-compiling. This
4215 change is known to cause breakage.
4216 * [Higher-ranked lifetimes are no longer allowed to appear _only_ in associated
4217 types][33685]. The [`hr_lifetime_in_assoc_type` lint] has been a warning since
4218 1.10 and is now an error by default. It will become a hard error in the near
4219 future.
4220 * [The semantics relating modules to file system directories are changing in
4221 minor ways][37602]. This is captured in the new `legacy_directory_ownership`
4222 lint, which is a warning in this release, and will become a hard error in the
4223 future.
4224 * [Rust-ABI symbols are no longer exported from cdylibs][38117]
4225 * [Once `Peekable` peeks a `None` it will return that `None` without re-querying
4226 the underlying iterator][37834]
4227
4228 ["changes"]: https://github.com/rust-lang/rfcs/blob/master/text/1560-name-resolution.md#changes-to-name-resolution-rules
4229 [33685]: https://github.com/rust-lang/rust/issues/33685
4230 [36868]: https://github.com/rust-lang/rust/pull/36868
4231 [37127]: https://github.com/rust-lang/rust/pull/37127
4232 [37229]: https://github.com/rust-lang/rust/pull/37229
4233 [37456]: https://github.com/rust-lang/rust/pull/37456
4234 [37527]: https://github.com/rust-lang/rust/pull/37527
4235 [37602]: https://github.com/rust-lang/rust/pull/37602
4236 [37613]: https://github.com/rust-lang/rust/pull/37613
4237 [37615]: https://github.com/rust-lang/rust/pull/37615
4238 [37636]: https://github.com/rust-lang/rust/pull/37636
4239 [37627]: https://github.com/rust-lang/rust/pull/37627
4240 [37642]: https://github.com/rust-lang/rust/pull/37642
4241 [37677]: https://github.com/rust-lang/rust/pull/37677
4242 [37699]: https://github.com/rust-lang/rust/pull/37699
4243 [37701]: https://github.com/rust-lang/rust/pull/37701
4244 [37705]: https://github.com/rust-lang/rust/pull/37705
4245 [37749]: https://github.com/rust-lang/rust/pull/37749
4246 [37760]: https://github.com/rust-lang/rust/pull/37760
4247 [37763]: https://github.com/rust-lang/rust/pull/37763
4248 [37764]: https://github.com/rust-lang/rust/pull/37764
4249 [37789]: https://github.com/rust-lang/rust/pull/37789
4250 [37791]: https://github.com/rust-lang/rust/pull/37791
4251 [37814]: https://github.com/rust-lang/rust/pull/37814
4252 [37817]: https://github.com/rust-lang/rust/pull/37817
4253 [37834]: https://github.com/rust-lang/rust/pull/37834
4254 [37848]: https://github.com/rust-lang/rust/pull/37848
4255 [37855]: https://github.com/rust-lang/rust/pull/37855
4256 [37882]: https://github.com/rust-lang/rust/pull/37882
4257 [37888]: https://github.com/rust-lang/rust/pull/37888
4258 [37973]: https://github.com/rust-lang/rust/pull/37973
4259 [37979]: https://github.com/rust-lang/rust/pull/37979
4260 [38086]: https://github.com/rust-lang/rust/pull/38086
4261 [38107]: https://github.com/rust-lang/rust/pull/38107
4262 [38117]: https://github.com/rust-lang/rust/pull/38117
4263 [38134]: https://github.com/rust-lang/rust/pull/38134
4264 [38146]: https://github.com/rust-lang/rust/pull/38146
4265 [38181]: https://github.com/rust-lang/rust/pull/38181
4266 [38182]: https://github.com/rust-lang/rust/pull/38182
4267 [38185]: https://github.com/rust-lang/rust/pull/38185
4268 [38192]: https://github.com/rust-lang/rust/pull/38192
4269 [38279]: https://github.com/rust-lang/rust/pull/38279
4270 [38835]: https://github.com/rust-lang/rust/pull/38835
4271 [RFC 1492]: https://github.com/rust-lang/rfcs/blob/master/text/1492-dotdot-in-patterns.md
4272 [RFC 1506]: https://github.com/rust-lang/rfcs/blob/master/text/1506-adt-kinds.md
4273 [RFC 1560]: https://github.com/rust-lang/rfcs/blob/master/text/1560-name-resolution.md
4274 [RFC 1681]: https://github.com/rust-lang/rfcs/blob/master/text/1681-macros-1.1.md
4275 [RFC 1717]: https://github.com/rust-lang/rfcs/blob/master/text/1717-dllimport.md
4276 [`hr_lifetime_in_assoc_type` lint]: https://github.com/rust-lang/rust/issues/33685
4277 [`legacy_imports`]: https://github.com/rust-lang/rust/pull/38271
4278 [cargo/3102]: https://github.com/rust-lang/cargo/pull/3102
4279 [cargo/3221]: https://github.com/rust-lang/cargo/pull/3221
4280 [cargo/3310]: https://github.com/rust-lang/cargo/pull/3310
4281 [cargo/3311]: https://github.com/rust-lang/cargo/pull/3311
4282 [cargo/3319]: https://github.com/rust-lang/cargo/pull/3319
4283 [cargo/3336]: https://github.com/rust-lang/cargo/pull/3336
4284 [cargo/3338]: https://github.com/rust-lang/cargo/pull/3338
4285 [cargo/3348]: https://github.com/rust-lang/cargo/pull/3348
4286 [cargo/3356]: https://github.com/rust-lang/cargo/pull/3356
4287 [cargo/3361]: https://github.com/rust-lang/cargo/pull/3361
4288 [cargo/3363]: https://github.com/rust-lang/cargo/pull/3363
4289 [cargo/3368]: https://github.com/rust-lang/cargo/issues/3368
4290 [cargo/3409]: https://github.com/rust-lang/cargo/pull/3409
4291 [cargo/3410]: https://github.com/rust-lang/cargo/pull/3410
4292 [`std::iter::Iterator::min_by`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.min_by
4293 [`std::iter::Iterator::max_by`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.max_by
4294 [`std::os::*::fs::FileExt`]: https://doc.rust-lang.org/std/os/unix/fs/trait.FileExt.html
4295 [`std::sync::atomic::Atomic*::get_mut`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU8.html#method.get_mut
4296 [`std::sync::atomic::Atomic*::into_inner`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU8.html#method.into_inner
4297 [`std::vec::IntoIter::as_slice`]: https://doc.rust-lang.org/std/vec/struct.IntoIter.html#method.as_slice
4298 [`std::vec::IntoIter::as_mut_slice`]: https://doc.rust-lang.org/std/vec/struct.IntoIter.html#method.as_mut_slice
4299 [`std::sync::mpsc::Receiver::try_iter`]: https://doc.rust-lang.org/std/sync/mpsc/struct.Receiver.html#method.try_iter
4300 [`std::os::unix::process::CommandExt::before_exec`]: https://doc.rust-lang.org/std/os/unix/process/trait.CommandExt.html#tymethod.before_exec
4301 [`std::rc::Rc::strong_count`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.strong_count
4302 [`std::rc::Rc::weak_count`]: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.weak_count
4303 [`std::sync::Arc::strong_count`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.strong_count
4304 [`std::sync::Arc::weak_count`]: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.weak_count
4305 [`std::char::encode_utf8`]: https://doc.rust-lang.org/std/primitive.char.html#method.encode_utf8
4306 [`std::char::encode_utf16`]: https://doc.rust-lang.org/std/primitive.char.html#method.encode_utf16
4307 [`std::cell::Ref::clone`]: https://doc.rust-lang.org/std/cell/struct.Ref.html#method.clone
4308 [`std::io::Take::into_inner`]: https://doc.rust-lang.org/std/io/struct.Take.html#method.into_inner
4309
4310
4311 Version 1.14.0 (2016-12-22)
4312 ===========================
4313
4314 Language
4315 --------
4316
4317 * [`..` matches multiple tuple fields in enum variants, structs
4318 and tuples][36843]. [RFC 1492].
4319 * [Safe `fn` items can be coerced to `unsafe fn` pointers][37389]
4320 * [`use *` and `use ::*` both glob-import from the crate root][37367]
4321 * [It's now possible to call a `Vec<Box<Fn()>>` without explicit
4322 dereferencing][36822]
4323
4324 Compiler
4325 --------
4326
4327 * [Mark enums with non-zero discriminant as non-zero][37224]
4328 * [Lower-case `static mut` names are linted like other
4329 statics and consts][37162]
4330 * [Fix ICE on some macros in const integer positions
4331 (e.g. `[u8; m!()]`)][36819]
4332 * [Improve error message and snippet for "did you mean `x`"][36798]
4333 * [Add a panic-strategy field to the target specification][36794]
4334 * [Include LLVM version in `--version --verbose`][37200]
4335
4336 Compile-time Optimizations
4337 --------------------------
4338
4339 * [Improve macro expansion performance][37569]
4340 * [Shrink `Expr_::ExprInlineAsm`][37445]
4341 * [Replace all uses of SHA-256 with BLAKE2b][37439]
4342 * [Reduce the number of bytes hashed by `IchHasher`][37427]
4343 * [Avoid more allocations when compiling html5ever][37373]
4344 * [Use `SmallVector` in `CombineFields::instantiate`][37322]
4345 * [Avoid some allocations in the macro parser][37318]
4346 * [Use a faster deflate setting][37298]
4347 * [Add `ArrayVec` and `AccumulateVec` to reduce heap allocations
4348 during interning of slices][37270]
4349 * [Optimize `write_metadata`][37267]
4350 * [Don't process obligation forest cycles when stalled][37231]
4351 * [Avoid many `CrateConfig` clones][37161]
4352 * [Optimize `Substs::super_fold_with`][37108]
4353 * [Optimize `ObligationForest`'s `NodeState` handling][36993]
4354 * [Speed up `plug_leaks`][36917]
4355
4356 Libraries
4357 ---------
4358
4359 * [`println!()`, with no arguments, prints newline][36825].
4360 Previously, an empty string was required to achieve the same.
4361 * [`Wrapping` impls standard binary and unary operators, as well as
4362 the `Sum` and `Product` iterators][37356]
4363 * [Implement `From<Cow<str>> for String` and `From<Cow<[T]>> for
4364 Vec<T>`][37326]
4365 * [Improve `fold` performance for `chain`, `cloned`, `map`, and
4366 `VecDeque` iterators][37315]
4367 * [Improve `SipHasher` performance on small values][37312]
4368 * [Add Iterator trait TrustedLen to enable better FromIterator /
4369 Extend][37306]
4370 * [Expand `.zip()` specialization to `.map()` and `.cloned()`][37230]
4371 * [`ReadDir` implements `Debug`][37221]
4372 * [Implement `RefUnwindSafe` for atomic types][37178]
4373 * [Specialize `Vec::extend` to `Vec::extend_from_slice`][37094]
4374 * [Avoid allocations in `Decoder::read_str`][37064]
4375 * [`io::Error` implements `From<io::ErrorKind>`][37037]
4376 * [Impl `Debug` for raw pointers to unsized data][36880]
4377 * [Don't reuse `HashMap` random seeds][37470]
4378 * [The internal memory layout of `HashMap` is more cache-friendly, for
4379 significant improvements in some operations][36692]
4380 * [`HashMap` uses less memory on 32-bit architectures][36595]
4381 * [Impl `Add<{str, Cow<str>}>` for `Cow<str>`][36430]
4382
4383 Cargo
4384 -----
4385
4386 * [Expose rustc cfg values to build scripts][cargo/3243]
4387 * [Allow cargo to work with read-only `CARGO_HOME`][cargo/3259]
4388 * [Fix passing --features when testing multiple packages][cargo/3280]
4389 * [Use a single profile set per workspace][cargo/3249]
4390 * [Load `replace` sections from lock files][cargo/3220]
4391 * [Ignore `panic` configuration for test/bench profiles][cargo/3175]
4392
4393 Tooling
4394 -------
4395
4396 * [rustup is the recommended Rust installation method][1.14rustup]
4397 * This release includes host (rustc) builds for Linux on MIPS, PowerPC, and
4398 S390x. These are [tier 2] platforms and may have major defects. Follow the
4399 instructions on the website to install, or add the targets to an existing
4400 installation with `rustup target add`. The new target triples are:
4401 - `mips-unknown-linux-gnu`
4402 - `mipsel-unknown-linux-gnu`
4403 - `mips64-unknown-linux-gnuabi64`
4404 - `mips64el-unknown-linux-gnuabi64 `
4405 - `powerpc-unknown-linux-gnu`
4406 - `powerpc64-unknown-linux-gnu`
4407 - `powerpc64le-unknown-linux-gnu`
4408 - `s390x-unknown-linux-gnu `
4409 * This release includes target (std) builds for ARM Linux running MUSL
4410 libc. These are [tier 2] platforms and may have major defects. Add the
4411 following triples to an existing rustup installation with `rustup target add`:
4412 - `arm-unknown-linux-musleabi`
4413 - `arm-unknown-linux-musleabihf`
4414 - `armv7-unknown-linux-musleabihf`
4415 * This release includes [experimental support for WebAssembly][1.14wasm], via
4416 the `wasm32-unknown-emscripten` target. This target is known to have major
4417 defects. Please test, report, and fix.
4418 * rustup no longer installs documentation by default. Run `rustup
4419 component add rust-docs` to install.
4420 * [Fix line stepping in debugger][37310]
4421 * [Enable line number debuginfo in releases][37280]
4422
4423 Misc
4424 ----
4425
4426 * [Disable jemalloc on aarch64/powerpc/mips][37392]
4427 * [Add support for Fuchsia OS][37313]
4428 * [Detect local-rebuild by only MAJOR.MINOR version][37273]
4429
4430 Compatibility Notes
4431 -------------------
4432
4433 * [A number of forward-compatibility lints used by the compiler
4434 to gradually introduce language changes have been converted
4435 to deny by default][36894]:
4436 - ["use of inaccessible extern crate erroneously allowed"][36886]
4437 - ["type parameter default erroneously allowed in invalid location"][36887]
4438 - ["detects super or self keywords at the beginning of global path"][36888]
4439 - ["two overlapping inherent impls define an item with the same name
4440 were erroneously allowed"][36889]
4441 - ["floating-point constants cannot be used in patterns"][36890]
4442 - ["constants of struct or enum type can only be used in a pattern if
4443 the struct or enum has `#[derive(PartialEq, Eq)]`"][36891]
4444 - ["lifetimes or labels named `'_` were erroneously allowed"][36892]
4445 * [Prohibit patterns in trait methods without bodies][37378]
4446 * [The atomic `Ordering` enum may not be matched exhaustively][37351]
4447 * [Future-proofing `#[no_link]` breaks some obscure cases][37247]
4448 * [The `$crate` macro variable is accepted in fewer locations][37213]
4449 * [Impls specifying extra region requirements beyond the trait
4450 they implement are rejected][37167]
4451 * [Enums may not be unsized][37111]. Unsized enums are intended to
4452 work but never have. For now they are forbidden.
4453 * [Enforce the shadowing restrictions from RFC 1560 for today's macros][36767]
4454
4455 [tier 2]: https://forge.rust-lang.org/platform-support.html
4456 [1.14rustup]: https://internals.rust-lang.org/t/beta-testing-rustup-rs/3316/204
4457 [1.14wasm]: https://users.rust-lang.org/t/compiling-to-the-web-with-rust-and-emscripten/7627
4458 [36430]: https://github.com/rust-lang/rust/pull/36430
4459 [36595]: https://github.com/rust-lang/rust/pull/36595
4460 [36595]: https://github.com/rust-lang/rust/pull/36595
4461 [36692]: https://github.com/rust-lang/rust/pull/36692
4462 [36767]: https://github.com/rust-lang/rust/pull/36767
4463 [36794]: https://github.com/rust-lang/rust/pull/36794
4464 [36798]: https://github.com/rust-lang/rust/pull/36798
4465 [36819]: https://github.com/rust-lang/rust/pull/36819
4466 [36822]: https://github.com/rust-lang/rust/pull/36822
4467 [36825]: https://github.com/rust-lang/rust/pull/36825
4468 [36843]: https://github.com/rust-lang/rust/pull/36843
4469 [36880]: https://github.com/rust-lang/rust/pull/36880
4470 [36886]: https://github.com/rust-lang/rust/issues/36886
4471 [36887]: https://github.com/rust-lang/rust/issues/36887
4472 [36888]: https://github.com/rust-lang/rust/issues/36888
4473 [36889]: https://github.com/rust-lang/rust/issues/36889
4474 [36890]: https://github.com/rust-lang/rust/issues/36890
4475 [36891]: https://github.com/rust-lang/rust/issues/36891
4476 [36892]: https://github.com/rust-lang/rust/issues/36892
4477 [36894]: https://github.com/rust-lang/rust/pull/36894
4478 [36917]: https://github.com/rust-lang/rust/pull/36917
4479 [36993]: https://github.com/rust-lang/rust/pull/36993
4480 [37037]: https://github.com/rust-lang/rust/pull/37037
4481 [37064]: https://github.com/rust-lang/rust/pull/37064
4482 [37094]: https://github.com/rust-lang/rust/pull/37094
4483 [37108]: https://github.com/rust-lang/rust/pull/37108
4484 [37111]: https://github.com/rust-lang/rust/pull/37111
4485 [37161]: https://github.com/rust-lang/rust/pull/37161
4486 [37162]: https://github.com/rust-lang/rust/pull/37162
4487 [37167]: https://github.com/rust-lang/rust/pull/37167
4488 [37178]: https://github.com/rust-lang/rust/pull/37178
4489 [37200]: https://github.com/rust-lang/rust/pull/37200
4490 [37213]: https://github.com/rust-lang/rust/pull/37213
4491 [37221]: https://github.com/rust-lang/rust/pull/37221
4492 [37224]: https://github.com/rust-lang/rust/pull/37224
4493 [37230]: https://github.com/rust-lang/rust/pull/37230
4494 [37231]: https://github.com/rust-lang/rust/pull/37231
4495 [37247]: https://github.com/rust-lang/rust/pull/37247
4496 [37267]: https://github.com/rust-lang/rust/pull/37267
4497 [37270]: https://github.com/rust-lang/rust/pull/37270
4498 [37273]: https://github.com/rust-lang/rust/pull/37273
4499 [37280]: https://github.com/rust-lang/rust/pull/37280
4500 [37298]: https://github.com/rust-lang/rust/pull/37298
4501 [37306]: https://github.com/rust-lang/rust/pull/37306
4502 [37310]: https://github.com/rust-lang/rust/pull/37310
4503 [37312]: https://github.com/rust-lang/rust/pull/37312
4504 [37313]: https://github.com/rust-lang/rust/pull/37313
4505 [37315]: https://github.com/rust-lang/rust/pull/37315
4506 [37318]: https://github.com/rust-lang/rust/pull/37318
4507 [37322]: https://github.com/rust-lang/rust/pull/37322
4508 [37326]: https://github.com/rust-lang/rust/pull/37326
4509 [37351]: https://github.com/rust-lang/rust/pull/37351
4510 [37356]: https://github.com/rust-lang/rust/pull/37356
4511 [37367]: https://github.com/rust-lang/rust/pull/37367
4512 [37373]: https://github.com/rust-lang/rust/pull/37373
4513 [37378]: https://github.com/rust-lang/rust/pull/37378
4514 [37389]: https://github.com/rust-lang/rust/pull/37389
4515 [37392]: https://github.com/rust-lang/rust/pull/37392
4516 [37427]: https://github.com/rust-lang/rust/pull/37427
4517 [37439]: https://github.com/rust-lang/rust/pull/37439
4518 [37445]: https://github.com/rust-lang/rust/pull/37445
4519 [37470]: https://github.com/rust-lang/rust/pull/37470
4520 [37569]: https://github.com/rust-lang/rust/pull/37569
4521 [RFC 1492]: https://github.com/rust-lang/rfcs/blob/master/text/1492-dotdot-in-patterns.md
4522 [cargo/3175]: https://github.com/rust-lang/cargo/pull/3175
4523 [cargo/3220]: https://github.com/rust-lang/cargo/pull/3220
4524 [cargo/3243]: https://github.com/rust-lang/cargo/pull/3243
4525 [cargo/3249]: https://github.com/rust-lang/cargo/pull/3249
4526 [cargo/3259]: https://github.com/rust-lang/cargo/pull/3259
4527 [cargo/3280]: https://github.com/rust-lang/cargo/pull/3280
4528
4529
4530 Version 1.13.0 (2016-11-10)
4531 ===========================
4532
4533 Language
4534 --------
4535
4536 * [Stabilize the `?` operator][36995]. `?` is a simple way to propagate
4537 errors, like the `try!` macro, described in [RFC 0243].
4538 * [Stabilize macros in type position][36014]. Described in [RFC 873].
4539 * [Stabilize attributes on statements][36995]. Described in [RFC 0016].
4540 * [Fix `#[derive]` for empty tuple structs/variants][35728]
4541 * [Fix lifetime rules for 'if' conditions][36029]
4542 * [Avoid loading and parsing unconfigured non-inline modules][36482]
4543
4544 Compiler
4545 --------
4546
4547 * [Add the `-C link-arg` argument][36574]
4548 * [Remove the old AST-based backend from rustc_trans][35764]
4549 * [Don't enable NEON by default on armv7 Linux][35814]
4550 * [Fix debug line number info for macro expansions][35238]
4551 * [Do not emit "class method" debuginfo for types that are not
4552 DICompositeType][36008]
4553 * [Warn about multiple conflicting #[repr] hints][34623]
4554 * [When sizing DST, don't double-count nested struct prefixes][36351]
4555 * [Default RUST_MIN_STACK to 16MiB for now][36505]
4556 * [Improve rlib metadata format][36551]. Reduces rlib size significantly.
4557 * [Reject macros with empty repetitions to avoid infinite loop][36721]
4558 * [Expand macros without recursing to avoid stack overflows][36214]
4559
4560 Diagnostics
4561 -----------
4562
4563 * [Replace macro backtraces with labeled local uses][35702]
4564 * [Improve error message for misplaced doc comments][33922]
4565 * [Buffer unix and lock windows to prevent message interleaving][35975]
4566 * [Update lifetime errors to specifically note temporaries][36171]
4567 * [Special case a few colors for Windows][36178]
4568 * [Suggest `use self` when such an import resolves][36289]
4569 * [Be more specific when type parameter shadows primitive type][36338]
4570 * Many minor improvements
4571
4572 Compile-time Optimizations
4573 --------------------------
4574
4575 * [Compute and cache HIR hashes at beginning][35854]
4576 * [Don't hash types in loan paths][36004]
4577 * [Cache projections in trans][35761]
4578 * [Optimize the parser's last token handling][36527]
4579 * [Only instantiate #[inline] functions in codegen units referencing
4580 them][36524]. This leads to big improvements in cases where crates export
4581 define many inline functions without using them directly.
4582 * [Lazily allocate TypedArena's first chunk][36592]
4583 * [Don't allocate during default HashSet creation][36734]
4584
4585 Stabilized APIs
4586 ---------------
4587
4588 * [`checked_abs`]
4589 * [`wrapping_abs`]
4590 * [`overflowing_abs`]
4591 * [`RefCell::try_borrow`]
4592 * [`RefCell::try_borrow_mut`]
4593
4594 Libraries
4595 ---------
4596
4597 * [Add `assert_ne!` and `debug_assert_ne!`][35074]
4598 * [Make `vec_deque::Drain`, `hash_map::Drain`, and `hash_set::Drain`
4599 covariant][35354]
4600 * [Implement `AsRef<[T]>` for `std::slice::Iter`][35559]
4601 * [Implement `Debug` for `std::vec::IntoIter`][35707]
4602 * [`CString`: avoid excessive growth just to 0-terminate][35871]
4603 * [Implement `CoerceUnsized` for `{Cell, RefCell, UnsafeCell}`][35627]
4604 * [Use arc4rand on FreeBSD][35884]
4605 * [memrchr: Correct aligned offset computation][35969]
4606 * [Improve Demangling of Rust Symbols][36059]
4607 * [Use monotonic time in condition variables][35048]
4608 * [Implement `Debug` for `std::path::{Components,Iter}`][36101]
4609 * [Implement conversion traits for `char`][35755]
4610 * [Fix illegal instruction caused by overflow in channel cloning][36104]
4611 * [Zero first byte of CString on drop][36264]
4612 * [Inherit overflow checks for sum and product][36372]
4613 * [Add missing Eq implementations][36423]
4614 * [Implement `Debug` for `DirEntry`][36631]
4615 * [When `getaddrinfo` returns `EAI_SYSTEM` retrieve actual error from
4616 `errno`][36754]
4617 * [`SipHasher`] is deprecated. Use [`DefaultHasher`].
4618 * [Implement more traits for `std::io::ErrorKind`][35911]
4619 * [Optimize BinaryHeap bounds checking][36072]
4620 * [Work around pointer aliasing issue in `Vec::extend_from_slice`,
4621 `extend_with_element`][36355]
4622 * [Fix overflow checking in unsigned pow()][34942]
4623
4624 Cargo
4625 -----
4626
4627 * This release includes security fixes to both curl and OpenSSL.
4628 * [Fix transitive doctests when panic=abort][cargo/3021]
4629 * [Add --all-features flag to cargo][cargo/3038]
4630 * [Reject path-based dependencies in `cargo package`][cargo/3060]
4631 * [Don't parse the home directory more than once][cargo/3078]
4632 * [Don't try to generate Cargo.lock on empty workspaces][cargo/3092]
4633 * [Update OpenSSL to 1.0.2j][cargo/3121]
4634 * [Add license and license_file to cargo metadata output][cargo/3110]
4635 * [Make crates-io registry URL optional in config; ignore all changes to
4636 source.crates-io][cargo/3089]
4637 * [Don't download dependencies from other platforms][cargo/3123]
4638 * [Build transitive dev-dependencies when needed][cargo/3125]
4639 * [Add support for per-target rustflags in .cargo/config][cargo/3157]
4640 * [Avoid updating registry when adding existing deps][cargo/3144]
4641 * [Warn about path overrides that won't work][cargo/3136]
4642 * [Use workspaces during `cargo install`][cargo/3146]
4643 * [Leak mspdbsrv.exe processes on Windows][cargo/3162]
4644 * [Add --message-format flag][cargo/3000]
4645 * [Pass target environment for rustdoc][cargo/3205]
4646 * [Use `CommandExt::exec` for `cargo run` on Unix][cargo/2818]
4647 * [Update curl and curl-sys][cargo/3241]
4648 * [Call rustdoc test with the correct cfg flags of a package][cargo/3242]
4649
4650 Tooling
4651 -------
4652
4653 * [rustdoc: Add the `--sysroot` argument][36586]
4654 * [rustdoc: Fix a couple of issues with the search results][35655]
4655 * [rustdoc: remove the `!` from macro URLs and titles][35234]
4656 * [gdb: Fix pretty-printing special-cased Rust types][35585]
4657 * [rustdoc: Filter more incorrect methods inherited through Deref][36266]
4658
4659 Misc
4660 ----
4661
4662 * [Remove unmaintained style guide][35124]
4663 * [Add s390x support][36369]
4664 * [Initial work at Haiku OS support][36727]
4665 * [Add mips-uclibc targets][35734]
4666 * [Crate-ify compiler-rt into compiler-builtins][35021]
4667 * [Add rustc version info (git hash + date) to dist tarball][36213]
4668 * Many documentation improvements
4669
4670 Compatibility Notes
4671 -------------------
4672
4673 * [`SipHasher`] is deprecated. Use [`DefaultHasher`].
4674 * [Deny (by default) transmuting from fn item types to pointer-sized
4675 types][34923]. Continuing the long transition to zero-sized fn items,
4676 per [RFC 401].
4677 * [Fix `#[derive]` for empty tuple structs/variants][35728].
4678 Part of [RFC 1506].
4679 * [Issue deprecation warnings for safe accesses to extern statics][36173]
4680 * [Fix lifetime rules for 'if' conditions][36029].
4681 * [Inherit overflow checks for sum and product][36372].
4682 * [Forbid user-defined macros named "macro_rules"][36730].
4683
4684 [33922]: https://github.com/rust-lang/rust/pull/33922
4685 [34623]: https://github.com/rust-lang/rust/pull/34623
4686 [34923]: https://github.com/rust-lang/rust/pull/34923
4687 [34942]: https://github.com/rust-lang/rust/pull/34942
4688 [34982]: https://github.com/rust-lang/rust/pull/34982
4689 [35021]: https://github.com/rust-lang/rust/pull/35021
4690 [35048]: https://github.com/rust-lang/rust/pull/35048
4691 [35074]: https://github.com/rust-lang/rust/pull/35074
4692 [35124]: https://github.com/rust-lang/rust/pull/35124
4693 [35234]: https://github.com/rust-lang/rust/pull/35234
4694 [35238]: https://github.com/rust-lang/rust/pull/35238
4695 [35354]: https://github.com/rust-lang/rust/pull/35354
4696 [35559]: https://github.com/rust-lang/rust/pull/35559
4697 [35585]: https://github.com/rust-lang/rust/pull/35585
4698 [35627]: https://github.com/rust-lang/rust/pull/35627
4699 [35655]: https://github.com/rust-lang/rust/pull/35655
4700 [35702]: https://github.com/rust-lang/rust/pull/35702
4701 [35707]: https://github.com/rust-lang/rust/pull/35707
4702 [35728]: https://github.com/rust-lang/rust/pull/35728
4703 [35734]: https://github.com/rust-lang/rust/pull/35734
4704 [35755]: https://github.com/rust-lang/rust/pull/35755
4705 [35761]: https://github.com/rust-lang/rust/pull/35761
4706 [35764]: https://github.com/rust-lang/rust/pull/35764
4707 [35814]: https://github.com/rust-lang/rust/pull/35814
4708 [35854]: https://github.com/rust-lang/rust/pull/35854
4709 [35871]: https://github.com/rust-lang/rust/pull/35871
4710 [35884]: https://github.com/rust-lang/rust/pull/35884
4711 [35911]: https://github.com/rust-lang/rust/pull/35911
4712 [35969]: https://github.com/rust-lang/rust/pull/35969
4713 [35975]: https://github.com/rust-lang/rust/pull/35975
4714 [36004]: https://github.com/rust-lang/rust/pull/36004
4715 [36008]: https://github.com/rust-lang/rust/pull/36008
4716 [36014]: https://github.com/rust-lang/rust/pull/36014
4717 [36029]: https://github.com/rust-lang/rust/pull/36029
4718 [36059]: https://github.com/rust-lang/rust/pull/36059
4719 [36072]: https://github.com/rust-lang/rust/pull/36072
4720 [36101]: https://github.com/rust-lang/rust/pull/36101
4721 [36104]: https://github.com/rust-lang/rust/pull/36104
4722 [36171]: https://github.com/rust-lang/rust/pull/36171
4723 [36173]: https://github.com/rust-lang/rust/pull/36173
4724 [36178]: https://github.com/rust-lang/rust/pull/36178
4725 [36213]: https://github.com/rust-lang/rust/pull/36213
4726 [36214]: https://github.com/rust-lang/rust/pull/36214
4727 [36264]: https://github.com/rust-lang/rust/pull/36264
4728 [36266]: https://github.com/rust-lang/rust/pull/36266
4729 [36289]: https://github.com/rust-lang/rust/pull/36289
4730 [36338]: https://github.com/rust-lang/rust/pull/36338
4731 [36351]: https://github.com/rust-lang/rust/pull/36351
4732 [36355]: https://github.com/rust-lang/rust/pull/36355
4733 [36369]: https://github.com/rust-lang/rust/pull/36369
4734 [36372]: https://github.com/rust-lang/rust/pull/36372
4735 [36423]: https://github.com/rust-lang/rust/pull/36423
4736 [36482]: https://github.com/rust-lang/rust/pull/36482
4737 [36505]: https://github.com/rust-lang/rust/pull/36505
4738 [36524]: https://github.com/rust-lang/rust/pull/36524
4739 [36527]: https://github.com/rust-lang/rust/pull/36527
4740 [36551]: https://github.com/rust-lang/rust/pull/36551
4741 [36574]: https://github.com/rust-lang/rust/pull/36574
4742 [36586]: https://github.com/rust-lang/rust/pull/36586
4743 [36592]: https://github.com/rust-lang/rust/pull/36592
4744 [36631]: https://github.com/rust-lang/rust/pull/36631
4745 [36639]: https://github.com/rust-lang/rust/pull/36639
4746 [36721]: https://github.com/rust-lang/rust/pull/36721
4747 [36727]: https://github.com/rust-lang/rust/pull/36727
4748 [36730]: https://github.com/rust-lang/rust/pull/36730
4749 [36734]: https://github.com/rust-lang/rust/pull/36734
4750 [36754]: https://github.com/rust-lang/rust/pull/36754
4751 [36995]: https://github.com/rust-lang/rust/pull/36995
4752 [RFC 0016]: https://github.com/rust-lang/rfcs/blob/master/text/0016-more-attributes.md
4753 [RFC 0243]: https://github.com/rust-lang/rfcs/blob/master/text/0243-trait-based-exception-handling.md
4754 [RFC 1506]: https://github.com/rust-lang/rfcs/blob/master/text/1506-adt-kinds.md
4755 [RFC 401]: https://github.com/rust-lang/rfcs/blob/master/text/0401-coercions.md
4756 [RFC 873]: https://github.com/rust-lang/rfcs/blob/master/text/0873-type-macros.md
4757 [cargo/2818]: https://github.com/rust-lang/cargo/pull/2818
4758 [cargo/3000]: https://github.com/rust-lang/cargo/pull/3000
4759 [cargo/3021]: https://github.com/rust-lang/cargo/pull/3021
4760 [cargo/3038]: https://github.com/rust-lang/cargo/pull/3038
4761 [cargo/3060]: https://github.com/rust-lang/cargo/pull/3060
4762 [cargo/3078]: https://github.com/rust-lang/cargo/pull/3078
4763 [cargo/3089]: https://github.com/rust-lang/cargo/pull/3089
4764 [cargo/3092]: https://github.com/rust-lang/cargo/pull/3092
4765 [cargo/3110]: https://github.com/rust-lang/cargo/pull/3110
4766 [cargo/3121]: https://github.com/rust-lang/cargo/pull/3121
4767 [cargo/3123]: https://github.com/rust-lang/cargo/pull/3123
4768 [cargo/3125]: https://github.com/rust-lang/cargo/pull/3125
4769 [cargo/3136]: https://github.com/rust-lang/cargo/pull/3136
4770 [cargo/3144]: https://github.com/rust-lang/cargo/pull/3144
4771 [cargo/3146]: https://github.com/rust-lang/cargo/pull/3146
4772 [cargo/3157]: https://github.com/rust-lang/cargo/pull/3157
4773 [cargo/3162]: https://github.com/rust-lang/cargo/pull/3162
4774 [cargo/3205]: https://github.com/rust-lang/cargo/pull/3205
4775 [cargo/3241]: https://github.com/rust-lang/cargo/pull/3241
4776 [cargo/3242]: https://github.com/rust-lang/cargo/pull/3242
4777 [rustup]: https://www.rustup.rs
4778 [`checked_abs`]: https://doc.rust-lang.org/std/primitive.i32.html#method.checked_abs
4779 [`wrapping_abs`]: https://doc.rust-lang.org/std/primitive.i32.html#method.wrapping_abs
4780 [`overflowing_abs`]: https://doc.rust-lang.org/std/primitive.i32.html#method.overflowing_abs
4781 [`RefCell::try_borrow`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.try_borrow
4782 [`RefCell::try_borrow_mut`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.try_borrow_mut
4783 [`SipHasher`]: https://doc.rust-lang.org/std/hash/struct.SipHasher.html
4784 [`DefaultHasher`]: https://doc.rust-lang.org/std/collections/hash_map/struct.DefaultHasher.html
4785
4786
4787 Version 1.12.1 (2016-10-20)
4788 ===========================
4789
4790 Regression Fixes
4791 ----------------
4792
4793 * [ICE: 'rustc' panicked at 'assertion failed: concrete_substs.is_normalized_for_trans()' #36381][36381]
4794 * [Confusion with double negation and booleans][36856]
4795 * [rustc 1.12.0 fails with SIGSEGV in release mode (syn crate 0.8.0)][36875]
4796 * [Rustc 1.12.0 Windows build of `ethcore` crate fails with LLVM error][36924]
4797 * [1.12.0: High memory usage when linking in release mode with debug info][36926]
4798 * [Corrupted memory after updated to 1.12][36936]
4799 * ["Let NullaryConstructor = something;" causes internal compiler error: "tried to overwrite interned AdtDef"][37026]
4800 * [Fix ICE: inject bitcast if types mismatch for invokes/calls/stores][37112]
4801 * [debuginfo: Handle spread_arg case in MIR-trans in a more stable way.][37153]
4802
4803 [36381]: https://github.com/rust-lang/rust/issues/36381
4804 [36856]: https://github.com/rust-lang/rust/issues/36856
4805 [36875]: https://github.com/rust-lang/rust/issues/36875
4806 [36924]: https://github.com/rust-lang/rust/issues/36924
4807 [36926]: https://github.com/rust-lang/rust/issues/36926
4808 [36936]: https://github.com/rust-lang/rust/issues/36936
4809 [37026]: https://github.com/rust-lang/rust/issues/37026
4810 [37112]: https://github.com/rust-lang/rust/issues/37112
4811 [37153]: https://github.com/rust-lang/rust/issues/37153
4812
4813
4814 Version 1.12.0 (2016-09-29)
4815 ===========================
4816
4817 Highlights
4818 ----------
4819
4820 * [`rustc` translates code to LLVM IR via its own "middle" IR (MIR)](https://github.com/rust-lang/rust/pull/34096).
4821 This translation pass is far simpler than the previous AST->LLVM pass, and
4822 creates opportunities to perform new optimizations directly on the MIR. It
4823 was previously described [on the Rust blog](https://blog.rust-lang.org/2016/04/19/MIR.html).
4824 * [`rustc` presents a new, more readable error format, along with
4825 machine-readable JSON error output for use by IDEs](https://github.com/rust-lang/rust/pull/35401).
4826 Most common editors supporting Rust have been updated to work with it. It was
4827 previously described [on the Rust blog](https://blog.rust-lang.org/2016/08/10/Shape-of-errors-to-come.html).
4828
4829 Compiler
4830 --------
4831
4832 * [`rustc` translates code to LLVM IR via its own "middle" IR (MIR)](https://github.com/rust-lang/rust/pull/34096).
4833 This translation pass is far simpler than the previous AST->LLVM pass, and
4834 creates opportunities to perform new optimizations directly on the MIR. It
4835 was previously described [on the Rust blog](https://blog.rust-lang.org/2016/04/19/MIR.html).
4836 * [Print the Rust target name, not the LLVM target name, with
4837 `--print target-list`](https://github.com/rust-lang/rust/pull/35489)
4838 * [The computation of `TypeId` is correct in some cases where it was previously
4839 producing inconsistent results](https://github.com/rust-lang/rust/pull/35267)
4840 * [The `mips-unknown-linux-gnu` target uses hardware floating point by default](https://github.com/rust-lang/rust/pull/34910)
4841 * [The `rustc` arguments, `--print target-cpus`, `--print target-features`,
4842 `--print relocation-models`, and `--print code-models` print the available
4843 options to the `-C target-cpu`, `-C target-feature`, `-C relocation-model` and
4844 `-C code-model` code generation arguments](https://github.com/rust-lang/rust/pull/34845)
4845 * [`rustc` supports three new MUSL targets on ARM: `arm-unknown-linux-musleabi`,
4846 `arm-unknown-linux-musleabihf`, and `armv7-unknown-linux-musleabihf`](https://github.com/rust-lang/rust/pull/35060).
4847 These targets produce statically-linked binaries. There are no binary release
4848 builds yet though.
4849
4850 Diagnostics
4851 -----------
4852
4853 * [`rustc` presents a new, more readable error format, along with
4854 machine-readable JSON error output for use by IDEs](https://github.com/rust-lang/rust/pull/35401).
4855 Most common editors supporting Rust have been updated to work with it. It was
4856 previously described [on the Rust blog](https://blog.rust-lang.org/2016/08/10/Shape-of-errors-to-come.html).
4857 * [In error descriptions, references are now described in plain English,
4858 instead of as "&-ptr"](https://github.com/rust-lang/rust/pull/35611)
4859 * [In error type descriptions, unknown numeric types are named `{integer}` or
4860 `{float}` instead of `_`](https://github.com/rust-lang/rust/pull/35080)
4861 * [`rustc` emits a clearer error when inner attributes follow a doc comment](https://github.com/rust-lang/rust/pull/34676)
4862
4863 Language
4864 --------
4865
4866 * [`macro_rules!` invocations can be made within `macro_rules!` invocations](https://github.com/rust-lang/rust/pull/34925)
4867 * [`macro_rules!` meta-variables are hygienic](https://github.com/rust-lang/rust/pull/35453)
4868 * [`macro_rules!` `tt` matchers can be reparsed correctly, making them much more
4869 useful](https://github.com/rust-lang/rust/pull/34908)
4870 * [`macro_rules!` `stmt` matchers correctly consume the entire contents when
4871 inside non-braces invocations](https://github.com/rust-lang/rust/pull/34886)
4872 * [Semicolons are properly required as statement delimiters inside
4873 `macro_rules!` invocations](https://github.com/rust-lang/rust/pull/34660)
4874 * [`cfg_attr` works on `path` attributes](https://github.com/rust-lang/rust/pull/34546)
4875
4876 Stabilized APIs
4877 ---------------
4878
4879 * [`Cell::as_ptr`](https://doc.rust-lang.org/std/cell/struct.Cell.html#method.as_ptr)
4880 * [`RefCell::as_ptr`](https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.as_ptr)
4881 * [`IpAddr::is_unspecified`](https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_unspecified)
4882 * [`IpAddr::is_loopback`](https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_loopback)
4883 * [`IpAddr::is_multicast`](https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_multicast)
4884 * [`Ipv4Addr::is_unspecified`](https://doc.rust-lang.org/std/net/struct.Ipv4Addr.html#method.is_unspecified)
4885 * [`Ipv6Addr::octets`](https://doc.rust-lang.org/std/net/struct.Ipv6Addr.html#method.octets)
4886 * [`LinkedList::contains`](https://doc.rust-lang.org/std/collections/linked_list/struct.LinkedList.html#method.contains)
4887 * [`VecDeque::contains`](https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.contains)
4888 * [`ExitStatusExt::from_raw`](https://doc.rust-lang.org/std/os/unix/process/trait.ExitStatusExt.html#tymethod.from_raw).
4889 Both on Unix and Windows.
4890 * [`Receiver::recv_timeout`](https://doc.rust-lang.org/std/sync/mpsc/struct.Receiver.html#method.recv_timeout)
4891 * [`RecvTimeoutError`](https://doc.rust-lang.org/std/sync/mpsc/enum.RecvTimeoutError.html)
4892 * [`BinaryHeap::peek_mut`](https://doc.rust-lang.org/std/collections/binary_heap/struct.BinaryHeap.html#method.peek_mut)
4893 * [`PeekMut`](https://doc.rust-lang.org/std/collections/binary_heap/struct.PeekMut.html)
4894 * [`iter::Product`](https://doc.rust-lang.org/std/iter/trait.Product.html)
4895 * [`iter::Sum`](https://doc.rust-lang.org/std/iter/trait.Sum.html)
4896 * [`OccupiedEntry::remove_entry`](https://doc.rust-lang.org/std/collections/btree_map/struct.OccupiedEntry.html#method.remove_entry)
4897 * [`VacantEntry::into_key`](https://doc.rust-lang.org/std/collections/btree_map/struct.VacantEntry.html#method.into_key)
4898
4899 Libraries
4900 ---------
4901
4902 * [The `format!` macro and friends now allow a single argument to be formatted
4903 in multiple styles](https://github.com/rust-lang/rust/pull/33642)
4904 * [The lifetime bounds on `[T]::binary_search_by` and
4905 `[T]::binary_search_by_key` have been adjusted to be more flexible](https://github.com/rust-lang/rust/pull/34762)
4906 * [`Option` implements `From` for its contained type](https://github.com/rust-lang/rust/pull/34828)
4907 * [`Cell`, `RefCell` and `UnsafeCell` implement `From` for their contained type](https://github.com/rust-lang/rust/pull/35392)
4908 * [`RwLock` panics if the reader count overflows](https://github.com/rust-lang/rust/pull/35378)
4909 * [`vec_deque::Drain`, `hash_map::Drain` and `hash_set::Drain` are covariant](https://github.com/rust-lang/rust/pull/35354)
4910 * [`vec::Drain` and `binary_heap::Drain` are covariant](https://github.com/rust-lang/rust/pull/34951)
4911 * [`Cow<str>` implements `FromIterator` for `char`, `&str` and `String`](https://github.com/rust-lang/rust/pull/35064)
4912 * [Sockets on Linux are correctly closed in subprocesses via `SOCK_CLOEXEC`](https://github.com/rust-lang/rust/pull/34946)
4913 * [`hash_map::Entry`, `hash_map::VacantEntry` and `hash_map::OccupiedEntry`
4914 implement `Debug`](https://github.com/rust-lang/rust/pull/34937)
4915 * [`btree_map::Entry`, `btree_map::VacantEntry` and `btree_map::OccupiedEntry`
4916 implement `Debug`](https://github.com/rust-lang/rust/pull/34885)
4917 * [`String` implements `AddAssign`](https://github.com/rust-lang/rust/pull/34890)
4918 * [Variadic `extern fn` pointers implement the `Clone`, `PartialEq`, `Eq`,
4919 `PartialOrd`, `Ord`, `Hash`, `fmt::Pointer`, and `fmt::Debug` traits](https://github.com/rust-lang/rust/pull/34879)
4920 * [`FileType` implements `Debug`](https://github.com/rust-lang/rust/pull/34757)
4921 * [References to `Mutex` and `RwLock` are unwind-safe](https://github.com/rust-lang/rust/pull/34756)
4922 * [`mpsc::sync_channel` `Receiver`s return any available message before
4923 reporting a disconnect](https://github.com/rust-lang/rust/pull/34731)
4924 * [Unicode definitions have been updated to 9.0](https://github.com/rust-lang/rust/pull/34599)
4925 * [`env` iterators implement `DoubleEndedIterator`](https://github.com/rust-lang/rust/pull/33312)
4926
4927 Cargo
4928 -----
4929
4930 * [Support local mirrors of registries](https://github.com/rust-lang/cargo/pull/2857)
4931 * [Add support for command aliases](https://github.com/rust-lang/cargo/pull/2679)
4932 * [Allow `opt-level="s"` / `opt-level="z"` in profile overrides](https://github.com/rust-lang/cargo/pull/3007)
4933 * [Make `cargo doc --open --target` work as expected](https://github.com/rust-lang/cargo/pull/2988)
4934 * [Speed up noop registry updates](https://github.com/rust-lang/cargo/pull/2974)
4935 * [Update OpenSSL](https://github.com/rust-lang/cargo/pull/2971)
4936 * [Fix `--panic=abort` with plugins](https://github.com/rust-lang/cargo/pull/2954)
4937 * [Always pass `-C metadata` to the compiler](https://github.com/rust-lang/cargo/pull/2946)
4938 * [Fix depending on git repos with workspaces](https://github.com/rust-lang/cargo/pull/2938)
4939 * [Add a `--lib` flag to `cargo new`](https://github.com/rust-lang/cargo/pull/2921)
4940 * [Add `http.cainfo` for custom certs](https://github.com/rust-lang/cargo/pull/2917)
4941 * [Indicate the compilation profile after compiling](https://github.com/rust-lang/cargo/pull/2909)
4942 * [Allow enabling features for dependencies with `--features`](https://github.com/rust-lang/cargo/pull/2876)
4943 * [Add `--jobs` flag to `cargo package`](https://github.com/rust-lang/cargo/pull/2867)
4944 * [Add `--dry-run` to `cargo publish`](https://github.com/rust-lang/cargo/pull/2849)
4945 * [Add support for `RUSTDOCFLAGS`](https://github.com/rust-lang/cargo/pull/2794)
4946
4947 Performance
4948 -----------
4949
4950 * [`panic::catch_unwind` is more optimized](https://github.com/rust-lang/rust/pull/35444)
4951 * [`panic::catch_unwind` no longer accesses thread-local storage on entry](https://github.com/rust-lang/rust/pull/34866)
4952
4953 Tooling
4954 -------
4955
4956 * [Test binaries now support a `--test-threads` argument to specify the number
4957 of threads used to run tests, and which acts the same as the
4958 `RUST_TEST_THREADS` environment variable](https://github.com/rust-lang/rust/pull/35414)
4959 * [The test runner now emits a warning when tests run over 60 seconds](https://github.com/rust-lang/rust/pull/35405)
4960 * [rustdoc: Fix methods in search results](https://github.com/rust-lang/rust/pull/34752)
4961 * [`rust-lldb` warns about unsupported versions of LLDB](https://github.com/rust-lang/rust/pull/34646)
4962 * [Rust releases now come with source packages that can be installed by rustup
4963 via `rustup component add rust-src`](https://github.com/rust-lang/rust/pull/34366).
4964 The resulting source code can be used by tools and IDES, located in the
4965 sysroot under `lib/rustlib/src`.
4966
4967 Misc
4968 ----
4969
4970 * [The compiler can now be built against LLVM 3.9](https://github.com/rust-lang/rust/pull/35594)
4971 * Many minor improvements to the documentation.
4972 * [The Rust exception handling "personality" routine is now written in Rust](https://github.com/rust-lang/rust/pull/34832)
4973
4974 Compatibility Notes
4975 -------------------
4976
4977 * [When printing Windows `OsStr`s, unpaired surrogate codepoints are escaped
4978 with the lowercase format instead of the uppercase](https://github.com/rust-lang/rust/pull/35084)
4979 * [When formatting strings, if "precision" is specified, the "fill",
4980 "align" and "width" specifiers are no longer ignored](https://github.com/rust-lang/rust/pull/34544)
4981 * [The `Debug` impl for strings no longer escapes all non-ASCII characters](https://github.com/rust-lang/rust/pull/34485)
4982
4983
4984 Version 1.11.0 (2016-08-18)
4985 ===========================
4986
4987 Language
4988 --------
4989
4990 * [Support nested `cfg_attr` attributes](https://github.com/rust-lang/rust/pull/34216)
4991 * [Allow statement-generating braced macro invocations at the end of blocks](https://github.com/rust-lang/rust/pull/34436)
4992 * [Macros can be expanded inside of trait definitions](https://github.com/rust-lang/rust/pull/34213)
4993 * [`#[macro_use]` works properly when it is itself expanded from a macro](https://github.com/rust-lang/rust/pull/34032)
4994
4995 Stabilized APIs
4996 ---------------
4997
4998 * [`BinaryHeap::append`](https://doc.rust-lang.org/std/collections/binary_heap/struct.BinaryHeap.html#method.append)
4999 * [`BTreeMap::append`](https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.append)
5000 * [`BTreeMap::split_off`](https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.split_off)
5001 * [`BTreeSet::append`](https://doc.rust-lang.org/std/collections/btree_set/struct.BTreeSet.html#method.append)
5002 * [`BTreeSet::split_off`](https://doc.rust-lang.org/std/collections/btree_set/struct.BTreeSet.html#method.split_off)
5003 * [`f32::to_degrees`](https://doc.rust-lang.org/std/primitive.f32.html#method.to_degrees)
5004 (in libcore - previously stabilized in libstd)
5005 * [`f32::to_radians`](https://doc.rust-lang.org/std/primitive.f32.html#method.to_radians)
5006 (in libcore - previously stabilized in libstd)
5007 * [`f64::to_degrees`](https://doc.rust-lang.org/std/primitive.f64.html#method.to_degrees)
5008 (in libcore - previously stabilized in libstd)
5009 * [`f64::to_radians`](https://doc.rust-lang.org/std/primitive.f64.html#method.to_radians)
5010 (in libcore - previously stabilized in libstd)
5011 * [`Iterator::sum`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.sum)
5012 * [`Iterator::product`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.sum)
5013 * [`Cell::get_mut`](https://doc.rust-lang.org/std/cell/struct.Cell.html#method.get_mut)
5014 * [`RefCell::get_mut`](https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.get_mut)
5015
5016 Libraries
5017 ---------
5018
5019 * [The `thread_local!` macro supports multiple definitions in a single
5020 invocation, and can apply attributes](https://github.com/rust-lang/rust/pull/34077)
5021 * [`Cow` implements `Default`](https://github.com/rust-lang/rust/pull/34305)
5022 * [`Wrapping` implements binary, octal, lower-hex and upper-hex
5023 `Display` formatting](https://github.com/rust-lang/rust/pull/34190)
5024 * [The range types implement `Hash`](https://github.com/rust-lang/rust/pull/34180)
5025 * [`lookup_host` ignores unknown address types](https://github.com/rust-lang/rust/pull/34067)
5026 * [`assert_eq!` accepts a custom error message, like `assert!` does](https://github.com/rust-lang/rust/pull/33976)
5027 * [The main thread is now called "main" instead of "&lt;main&gt;"](https://github.com/rust-lang/rust/pull/33803)
5028
5029 Cargo
5030 -----
5031
5032 * [Disallow specifying features of transitive deps](https://github.com/rust-lang/cargo/pull/2821)
5033 * [Add color support for Windows consoles](https://github.com/rust-lang/cargo/pull/2804)
5034 * [Fix `harness = false` on `[lib]` sections](https://github.com/rust-lang/cargo/pull/2795)
5035 * [Don't panic when `links` contains a '.'](https://github.com/rust-lang/cargo/pull/2787)
5036 * [Build scripts can emit warnings](https://github.com/rust-lang/cargo/pull/2630),
5037 and `-vv` prints warnings for all crates.
5038 * [Ignore file locks on OS X NFS mounts](https://github.com/rust-lang/cargo/pull/2720)
5039 * [Don't warn about `package.metadata` keys](https://github.com/rust-lang/cargo/pull/2668).
5040 This provides room for expansion by arbitrary tools.
5041 * [Add support for cdylib crate types](https://github.com/rust-lang/cargo/pull/2741)
5042 * [Prevent publishing crates when files are dirty](https://github.com/rust-lang/cargo/pull/2781)
5043 * [Don't fetch all crates on clean](https://github.com/rust-lang/cargo/pull/2704)
5044 * [Propagate --color option to rustc](https://github.com/rust-lang/cargo/pull/2779)
5045 * [Fix `cargo doc --open` on Windows](https://github.com/rust-lang/cargo/pull/2780)
5046 * [Improve autocompletion](https://github.com/rust-lang/cargo/pull/2772)
5047 * [Configure colors of stderr as well as stdout](https://github.com/rust-lang/cargo/pull/2739)
5048
5049 Performance
5050 -----------
5051
5052 * [Caching projections speeds up type check dramatically for some
5053 workloads](https://github.com/rust-lang/rust/pull/33816)
5054 * [The default `HashMap` hasher is SipHash 1-3 instead of SipHash 2-4](https://github.com/rust-lang/rust/pull/33940)
5055 This hasher is faster, but is believed to provide sufficient
5056 protection from collision attacks.
5057 * [Comparison of `Ipv4Addr` is 10x faster](https://github.com/rust-lang/rust/pull/33891)
5058
5059 Rustdoc
5060 -------
5061
5062 * [Fix empty implementation section on some module pages](https://github.com/rust-lang/rust/pull/34536)
5063 * [Fix inlined renamed re-exports in import lists](https://github.com/rust-lang/rust/pull/34479)
5064 * [Fix search result layout for enum variants and struct fields](https://github.com/rust-lang/rust/pull/34477)
5065 * [Fix issues with source links to external crates](https://github.com/rust-lang/rust/pull/34387)
5066 * [Fix redirect pages for renamed re-exports](https://github.com/rust-lang/rust/pull/34245)
5067
5068 Tooling
5069 -------
5070
5071 * [rustc is better at finding the MSVC toolchain](https://github.com/rust-lang/rust/pull/34492)
5072 * [When emitting debug info, rustc emits frame pointers for closures,
5073 shims and glue, as it does for all other functions](https://github.com/rust-lang/rust/pull/33909)
5074 * [rust-lldb warns about unsupported versions of LLDB](https://github.com/rust-lang/rust/pull/34646)
5075 * Many more errors have been given error codes and extended
5076 explanations
5077 * API documentation continues to be improved, with many new examples
5078
5079 Misc
5080 ----
5081
5082 * [rustc no longer hangs when dependencies recursively re-export
5083 submodules](https://github.com/rust-lang/rust/pull/34542)
5084 * [rustc requires LLVM 3.7+](https://github.com/rust-lang/rust/pull/34104)
5085 * [The 'How Safe and Unsafe Interact' chapter of The Rustonomicon was
5086 rewritten](https://github.com/rust-lang/rust/pull/33895)
5087 * [rustc support 16-bit pointer sizes](https://github.com/rust-lang/rust/pull/33460).
5088 No targets use this yet, but it works toward AVR support.
5089
5090 Compatibility Notes
5091 -------------------
5092
5093 * [`const`s and `static`s may not have unsized types](https://github.com/rust-lang/rust/pull/34443)
5094 * [The new follow-set rules that place restrictions on `macro_rules!`
5095 in order to ensure syntax forward-compatibility have been enabled](https://github.com/rust-lang/rust/pull/33982)
5096 This was an [amendment to RFC 550](https://github.com/rust-lang/rfcs/pull/1384),
5097 and has been a warning since 1.10.
5098 * [`cfg` attribute process has been refactored to fix various bugs](https://github.com/rust-lang/rust/pull/33706).
5099 This causes breakage in some corner cases.
5100
5101
5102 Version 1.10.0 (2016-07-07)
5103 ===========================
5104
5105 Language
5106 --------
5107
5108 * [`Copy` types are required to have a trivial implementation of `Clone`](https://github.com/rust-lang/rust/pull/33420).
5109 [RFC 1521](https://github.com/rust-lang/rfcs/blob/master/text/1521-copy-clone-semantics.md).
5110 * [Single-variant enums support the `#[repr(..)]` attribute](https://github.com/rust-lang/rust/pull/33355).
5111 * [Fix `#[derive(RustcEncodable)]` in the presence of other `encode` methods](https://github.com/rust-lang/rust/pull/32908).
5112 * [`panic!` can be converted to a runtime abort with the
5113 `-C panic=abort` flag](https://github.com/rust-lang/rust/pull/32900).
5114 [RFC 1513](https://github.com/rust-lang/rfcs/blob/master/text/1513-less-unwinding.md).
5115 * [Add a new crate type, 'cdylib'](https://github.com/rust-lang/rust/pull/33553).
5116 cdylibs are dynamic libraries suitable for loading by non-Rust hosts.
5117 [RFC 1510](https://github.com/rust-lang/rfcs/blob/master/text/1510-cdylib.md).
5118 Note that Cargo does not yet directly support cdylibs.
5119
5120 Stabilized APIs
5121 ---------------
5122
5123 * `os::windows::fs::OpenOptionsExt::access_mode`
5124 * `os::windows::fs::OpenOptionsExt::share_mode`
5125 * `os::windows::fs::OpenOptionsExt::custom_flags`
5126 * `os::windows::fs::OpenOptionsExt::attributes`
5127 * `os::windows::fs::OpenOptionsExt::security_qos_flags`
5128 * `os::unix::fs::OpenOptionsExt::custom_flags`
5129 * [`sync::Weak::new`](http://doc.rust-lang.org/alloc/arc/struct.Weak.html#method.new)
5130 * `Default for sync::Weak`
5131 * [`panic::set_hook`](http://doc.rust-lang.org/std/panic/fn.set_hook.html)
5132 * [`panic::take_hook`](http://doc.rust-lang.org/std/panic/fn.take_hook.html)
5133 * [`panic::PanicInfo`](http://doc.rust-lang.org/std/panic/struct.PanicInfo.html)
5134 * [`panic::PanicInfo::payload`](http://doc.rust-lang.org/std/panic/struct.PanicInfo.html#method.payload)
5135 * [`panic::PanicInfo::location`](http://doc.rust-lang.org/std/panic/struct.PanicInfo.html#method.location)
5136 * [`panic::Location`](http://doc.rust-lang.org/std/panic/struct.Location.html)
5137 * [`panic::Location::file`](http://doc.rust-lang.org/std/panic/struct.Location.html#method.file)
5138 * [`panic::Location::line`](http://doc.rust-lang.org/std/panic/struct.Location.html#method.line)
5139 * [`ffi::CStr::from_bytes_with_nul`](http://doc.rust-lang.org/std/ffi/struct.CStr.html#method.from_bytes_with_nul)
5140 * [`ffi::CStr::from_bytes_with_nul_unchecked`](http://doc.rust-lang.org/std/ffi/struct.CStr.html#method.from_bytes_with_nul_unchecked)
5141 * [`ffi::FromBytesWithNulError`](http://doc.rust-lang.org/std/ffi/struct.FromBytesWithNulError.html)
5142 * [`fs::Metadata::modified`](http://doc.rust-lang.org/std/fs/struct.Metadata.html#method.modified)
5143 * [`fs::Metadata::accessed`](http://doc.rust-lang.org/std/fs/struct.Metadata.html#method.accessed)
5144 * [`fs::Metadata::created`](http://doc.rust-lang.org/std/fs/struct.Metadata.html#method.created)
5145 * `sync::atomic::Atomic{Usize,Isize,Bool,Ptr}::compare_exchange`
5146 * `sync::atomic::Atomic{Usize,Isize,Bool,Ptr}::compare_exchange_weak`
5147 * `collections::{btree,hash}_map::{Occupied,Vacant,}Entry::key`
5148 * `os::unix::net::{UnixStream, UnixListener, UnixDatagram, SocketAddr}`
5149 * [`SocketAddr::is_unnamed`](http://doc.rust-lang.org/std/os/unix/net/struct.SocketAddr.html#method.is_unnamed)
5150 * [`SocketAddr::as_pathname`](http://doc.rust-lang.org/std/os/unix/net/struct.SocketAddr.html#method.as_pathname)
5151 * [`UnixStream::connect`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.connect)
5152 * [`UnixStream::pair`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.pair)
5153 * [`UnixStream::try_clone`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.try_clone)
5154 * [`UnixStream::local_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.local_addr)
5155 * [`UnixStream::peer_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.peer_addr)
5156 * [`UnixStream::set_read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.read_timeout)
5157 * [`UnixStream::set_write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.write_timeout)
5158 * [`UnixStream::read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.read_timeout)
5159 * [`UnixStream::write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.write_timeout)
5160 * [`UnixStream::set_nonblocking`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.set_nonblocking)
5161 * [`UnixStream::take_error`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.take_error)
5162 * [`UnixStream::shutdown`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.shutdown)
5163 * Read/Write/RawFd impls for `UnixStream`
5164 * [`UnixListener::bind`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.bind)
5165 * [`UnixListener::accept`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.accept)
5166 * [`UnixListener::try_clone`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.try_clone)
5167 * [`UnixListener::local_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.local_addr)
5168 * [`UnixListener::set_nonblocking`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.set_nonblocking)
5169 * [`UnixListener::take_error`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.take_error)
5170 * [`UnixListener::incoming`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.incoming)
5171 * RawFd impls for `UnixListener`
5172 * [`UnixDatagram::bind`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.bind)
5173 * [`UnixDatagram::unbound`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.unbound)
5174 * [`UnixDatagram::pair`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.pair)
5175 * [`UnixDatagram::connect`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.connect)
5176 * [`UnixDatagram::try_clone`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.try_clone)
5177 * [`UnixDatagram::local_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.local_addr)
5178 * [`UnixDatagram::peer_addr`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.peer_addr)
5179 * [`UnixDatagram::recv_from`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.recv_from)
5180 * [`UnixDatagram::recv`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.recv)
5181 * [`UnixDatagram::send_to`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.send_to)
5182 * [`UnixDatagram::send`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.send)
5183 * [`UnixDatagram::set_read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.set_read_timeout)
5184 * [`UnixDatagram::set_write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.set_write_timeout)
5185 * [`UnixDatagram::read_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.read_timeout)
5186 * [`UnixDatagram::write_timeout`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.write_timeout)
5187 * [`UnixDatagram::set_nonblocking`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.set_nonblocking)
5188 * [`UnixDatagram::take_error`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.take_error)
5189 * [`UnixDatagram::shutdown`](http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.shutdown)
5190 * RawFd impls for `UnixDatagram`
5191 * `{BTree,Hash}Map::values_mut`
5192 * [`<[_]>::binary_search_by_key`](http://doc.rust-lang.org/std/primitive.slice.html#method.binary_search_by_key)
5193
5194 Libraries
5195 ---------
5196
5197 * [The `abs_sub` method of floats is deprecated](https://github.com/rust-lang/rust/pull/33664).
5198 The semantics of this minor method are subtle and probably not what
5199 most people want.
5200 * [Add implementation of Ord for Cell<T> and RefCell<T> where T: Ord](https://github.com/rust-lang/rust/pull/33306).
5201 * [On Linux, if `HashMap`s can't be initialized with `getrandom` they
5202 will fall back to `/dev/urandom` temporarily to avoid blocking
5203 during early boot](https://github.com/rust-lang/rust/pull/33086).
5204 * [Implemented negation for wrapping numerals](https://github.com/rust-lang/rust/pull/33067).
5205 * [Implement `Clone` for `binary_heap::IntoIter`](https://github.com/rust-lang/rust/pull/33050).
5206 * [Implement `Display` and `Hash` for `std::num::Wrapping`](https://github.com/rust-lang/rust/pull/33023).
5207 * [Add `Default` implementation for `&CStr`, `CString`](https://github.com/rust-lang/rust/pull/32990).
5208 * [Implement `From<Vec<T>>` and `Into<Vec<T>>` for `VecDeque<T>`](https://github.com/rust-lang/rust/pull/32866).
5209 * [Implement `Default` for `UnsafeCell`, `fmt::Error`, `Condvar`,
5210 `Mutex`, `RwLock`](https://github.com/rust-lang/rust/pull/32785).
5211
5212 Cargo
5213 -----
5214 * [Cargo.toml supports the `profile.*.panic` option](https://github.com/rust-lang/cargo/pull/2687).
5215 This controls the runtime behavior of the `panic!` macro
5216 and can be either "unwind" (the default), or "abort".
5217 [RFC 1513](https://github.com/rust-lang/rfcs/blob/master/text/1513-less-unwinding.md).
5218 * [Don't throw away errors with `-p` arguments](https://github.com/rust-lang/cargo/pull/2723).
5219 * [Report status to stderr instead of stdout](https://github.com/rust-lang/cargo/pull/2693).
5220 * [Build scripts are passed a `CARGO_MANIFEST_LINKS` environment
5221 variable that corresponds to the `links` field of the manifest](https://github.com/rust-lang/cargo/pull/2710).
5222 * [Ban keywords from crate names](https://github.com/rust-lang/cargo/pull/2707).
5223 * [Canonicalize `CARGO_HOME` on Windows](https://github.com/rust-lang/cargo/pull/2604).
5224 * [Retry network requests](https://github.com/rust-lang/cargo/pull/2396).
5225 By default they are retried twice, which can be customized with the
5226 `net.retry` value in `.cargo/config`.
5227 * [Don't print extra error info for failing subcommands](https://github.com/rust-lang/cargo/pull/2674).
5228 * [Add `--force` flag to `cargo install`](https://github.com/rust-lang/cargo/pull/2405).
5229 * [Don't use `flock` on NFS mounts](https://github.com/rust-lang/cargo/pull/2623).
5230 * [Prefer building `cargo install` artifacts in temporary directories](https://github.com/rust-lang/cargo/pull/2610).
5231 Makes it possible to install multiple crates in parallel.
5232 * [Add `cargo test --doc`](https://github.com/rust-lang/cargo/pull/2578).
5233 * [Add `cargo --explain`](https://github.com/rust-lang/cargo/pull/2551).
5234 * [Don't print warnings when `-q` is passed](https://github.com/rust-lang/cargo/pull/2576).
5235 * [Add `cargo doc --lib` and `--bin`](https://github.com/rust-lang/cargo/pull/2577).
5236 * [Don't require build script output to be UTF-8](https://github.com/rust-lang/cargo/pull/2560).
5237 * [Correctly attempt multiple git usernames](https://github.com/rust-lang/cargo/pull/2584).
5238
5239 Performance
5240 -----------
5241
5242 * [rustc memory usage was reduced by refactoring the context used for
5243 type checking](https://github.com/rust-lang/rust/pull/33425).
5244 * [Speed up creation of `HashMap`s by caching the random keys used
5245 to initialize the hash state](https://github.com/rust-lang/rust/pull/33318).
5246 * [The `find` implementation for `Chain` iterators is 2x faster](https://github.com/rust-lang/rust/pull/33289).
5247 * [Trait selection optimizations speed up type checking by 15%](https://github.com/rust-lang/rust/pull/33138).
5248 * [Efficient trie lookup for boolean Unicode properties](https://github.com/rust-lang/rust/pull/33098).
5249 10x faster than the previous lookup tables.
5250 * [Special case `#[derive(Copy, Clone)]` to avoid bloat](https://github.com/rust-lang/rust/pull/31414).
5251
5252 Usability
5253 ---------
5254
5255 * Many incremental improvements to documentation and rustdoc.
5256 * [rustdoc: List blanket trait impls](https://github.com/rust-lang/rust/pull/33514).
5257 * [rustdoc: Clean up ABI rendering](https://github.com/rust-lang/rust/pull/33151).
5258 * [Indexing with the wrong type produces a more informative error](https://github.com/rust-lang/rust/pull/33401).
5259 * [Improve diagnostics for constants being used in irrefutable patterns](https://github.com/rust-lang/rust/pull/33406).
5260 * [When many method candidates are in scope limit the suggestions to 10](https://github.com/rust-lang/rust/pull/33338).
5261 * [Remove confusing suggestion when calling a `fn` type](https://github.com/rust-lang/rust/pull/33325).
5262 * [Do not suggest changing `&mut self` to `&mut mut self`](https://github.com/rust-lang/rust/pull/33319).
5263
5264 Misc
5265 ----
5266
5267 * [Update i686-linux-android features to match Android ABI](https://github.com/rust-lang/rust/pull/33651).
5268 * [Update aarch64-linux-android features to match Android ABI](https://github.com/rust-lang/rust/pull/33500).
5269 * [`std` no longer prints backtraces on platforms where the running
5270 module must be loaded with `env::current_exe`, which can't be relied
5271 on](https://github.com/rust-lang/rust/pull/33554).
5272 * This release includes std binaries for the i586-unknown-linux-gnu,
5273 i686-unknown-linux-musl, and armv7-linux-androideabi targets. The
5274 i586 target is for old x86 hardware without SSE2, and the armv7
5275 target is for Android running on modern ARM architectures.
5276 * [The `rust-gdb` and `rust-lldb` scripts are distributed on all
5277 Unix platforms](https://github.com/rust-lang/rust/pull/32835).
5278 * [On Unix the runtime aborts by calling `libc::abort` instead of
5279 generating an illegal instruction](https://github.com/rust-lang/rust/pull/31457).
5280 * [Rust is now bootstrapped from the previous release of Rust,
5281 instead of a snapshot from an arbitrary commit](https://github.com/rust-lang/rust/pull/32942).
5282
5283 Compatibility Notes
5284 -------------------
5285
5286 * [`AtomicBool` is now bool-sized, not word-sized](https://github.com/rust-lang/rust/pull/33579).
5287 * [`target_env` for Linux ARM targets is just `gnu`, not
5288 `gnueabihf`, `gnueabi`, etc](https://github.com/rust-lang/rust/pull/33403).
5289 * [Consistently panic on overflow in `Duration::new`](https://github.com/rust-lang/rust/pull/33072).
5290 * [Change `String::truncate` to panic less](https://github.com/rust-lang/rust/pull/32977).
5291 * [Add `:block` to the follow set for `:ty` and `:path`](https://github.com/rust-lang/rust/pull/32945).
5292 Affects how macros are parsed.
5293 * [Fix macro hygiene bug](https://github.com/rust-lang/rust/pull/32923).
5294 * [Feature-gated attributes on macro-generated macro invocations are
5295 now rejected](https://github.com/rust-lang/rust/pull/32791).
5296 * [Suppress fallback and ambiguity errors during type inference](https://github.com/rust-lang/rust/pull/32258).
5297 This caused some minor changes to type inference.
5298
5299
5300 Version 1.9.0 (2016-05-26)
5301 ==========================
5302
5303 Language
5304 --------
5305
5306 * The `#[deprecated]` attribute when applied to an API will generate
5307 warnings when used. The warnings may be suppressed with
5308 `#[allow(deprecated)]`. [RFC 1270].
5309 * [`fn` item types are zero sized, and each `fn` names a unique
5310 type][1.9fn]. This will break code that transmutes `fn`s, so calling
5311 `transmute` on a `fn` type will generate a warning for a few cycles,
5312 then will be converted to an error.
5313 * [Field and method resolution understand visibility, so private
5314 fields and methods cannot prevent the proper use of public fields
5315 and methods][1.9fv].
5316 * [The parser considers unicode codepoints in the
5317 `PATTERN_WHITE_SPACE` category to be whitespace][1.9ws].
5318
5319 Stabilized APIs
5320 ---------------
5321
5322 * [`std::panic`]
5323 * [`std::panic::catch_unwind`] (renamed from `recover`)
5324 * [`std::panic::resume_unwind`] (renamed from `propagate`)
5325 * [`std::panic::AssertUnwindSafe`] (renamed from `AssertRecoverSafe`)
5326 * [`std::panic::UnwindSafe`] (renamed from `RecoverSafe`)
5327 * [`str::is_char_boundary`]
5328 * [`<*const T>::as_ref`]
5329 * [`<*mut T>::as_ref`]
5330 * [`<*mut T>::as_mut`]
5331 * [`AsciiExt::make_ascii_uppercase`]
5332 * [`AsciiExt::make_ascii_lowercase`]
5333 * [`char::decode_utf16`]
5334 * [`char::DecodeUtf16`]
5335 * [`char::DecodeUtf16Error`]
5336 * [`char::DecodeUtf16Error::unpaired_surrogate`]
5337 * [`BTreeSet::take`]
5338 * [`BTreeSet::replace`]
5339 * [`BTreeSet::get`]
5340 * [`HashSet::take`]
5341 * [`HashSet::replace`]
5342 * [`HashSet::get`]
5343 * [`OsString::with_capacity`]
5344 * [`OsString::clear`]
5345 * [`OsString::capacity`]
5346 * [`OsString::reserve`]
5347 * [`OsString::reserve_exact`]
5348 * [`OsStr::is_empty`]
5349 * [`OsStr::len`]
5350 * [`std::os::unix::thread`]
5351 * [`RawPthread`]
5352 * [`JoinHandleExt`]
5353 * [`JoinHandleExt::as_pthread_t`]
5354 * [`JoinHandleExt::into_pthread_t`]
5355 * [`HashSet::hasher`]
5356 * [`HashMap::hasher`]
5357 * [`CommandExt::exec`]
5358 * [`File::try_clone`]
5359 * [`SocketAddr::set_ip`]
5360 * [`SocketAddr::set_port`]
5361 * [`SocketAddrV4::set_ip`]
5362 * [`SocketAddrV4::set_port`]
5363 * [`SocketAddrV6::set_ip`]
5364 * [`SocketAddrV6::set_port`]
5365 * [`SocketAddrV6::set_flowinfo`]
5366 * [`SocketAddrV6::set_scope_id`]
5367 * [`slice::copy_from_slice`]
5368 * [`ptr::read_volatile`]
5369 * [`ptr::write_volatile`]
5370 * [`OpenOptions::create_new`]
5371 * [`TcpStream::set_nodelay`]
5372 * [`TcpStream::nodelay`]
5373 * [`TcpStream::set_ttl`]
5374 * [`TcpStream::ttl`]
5375 * [`TcpStream::set_only_v6`]
5376 * [`TcpStream::only_v6`]
5377 * [`TcpStream::take_error`]
5378 * [`TcpStream::set_nonblocking`]
5379 * [`TcpListener::set_ttl`]
5380 * [`TcpListener::ttl`]
5381 * [`TcpListener::set_only_v6`]
5382 * [`TcpListener::only_v6`]
5383 * [`TcpListener::take_error`]
5384 * [`TcpListener::set_nonblocking`]
5385 * [`UdpSocket::set_broadcast`]
5386 * [`UdpSocket::broadcast`]
5387 * [`UdpSocket::set_multicast_loop_v4`]
5388 * [`UdpSocket::multicast_loop_v4`]
5389 * [`UdpSocket::set_multicast_ttl_v4`]
5390 * [`UdpSocket::multicast_ttl_v4`]
5391 * [`UdpSocket::set_multicast_loop_v6`]
5392 * [`UdpSocket::multicast_loop_v6`]
5393 * [`UdpSocket::set_multicast_ttl_v6`]
5394 * [`UdpSocket::multicast_ttl_v6`]
5395 * [`UdpSocket::set_ttl`]
5396 * [`UdpSocket::ttl`]
5397 * [`UdpSocket::set_only_v6`]
5398 * [`UdpSocket::only_v6`]
5399 * [`UdpSocket::join_multicast_v4`]
5400 * [`UdpSocket::join_multicast_v6`]
5401 * [`UdpSocket::leave_multicast_v4`]
5402 * [`UdpSocket::leave_multicast_v6`]
5403 * [`UdpSocket::take_error`]
5404 * [`UdpSocket::connect`]
5405 * [`UdpSocket::send`]
5406 * [`UdpSocket::recv`]
5407 * [`UdpSocket::set_nonblocking`]
5408
5409 Libraries
5410 ---------
5411
5412 * [`std::sync::Once` is poisoned if its initialization function
5413 fails][1.9o].
5414 * [`cell::Ref` and `cell::RefMut` can contain unsized types][1.9cu].
5415 * [Most types implement `fmt::Debug`][1.9db].
5416 * [The default buffer size used by `BufReader` and `BufWriter` was
5417 reduced to 8K, from 64K][1.9bf]. This is in line with the buffer size
5418 used by other languages.
5419 * [`Instant`, `SystemTime` and `Duration` implement `+=` and `-=`.
5420 `Duration` additionally implements `*=` and `/=`][1.9ta].
5421 * [`Skip` is a `DoubleEndedIterator`][1.9sk].
5422 * [`From<[u8; 4]>` is implemented for `Ipv4Addr`][1.9fi].
5423 * [`Chain` implements `BufRead`][1.9ch].
5424 * [`HashMap`, `HashSet` and iterators are covariant][1.9hc].
5425
5426 Cargo
5427 -----
5428
5429 * [Cargo can now run concurrently][1.9cc].
5430 * [Top-level overrides allow specific revisions of crates to be
5431 overridden through the entire crate graph][1.9ct]. This is intended
5432 to make upgrades easier for large projects, by allowing crates to be
5433 forked temporarily until they've been upgraded and republished.
5434 * [Cargo exports a `CARGO_PKG_AUTHORS` environment variable][1.9cp].
5435 * [Cargo will pass the contents of the `RUSTFLAGS` variable to `rustc`
5436 on the commandline][1.9cf]. `rustc` arguments can also be specified
5437 in the `build.rustflags` configuration key.
5438
5439 Performance
5440 -----------
5441
5442 * [The time complexity of comparing variables for equivalence during type
5443 unification is reduced from _O_(_n_!) to _O_(_n_)][1.9tu]. This leads
5444 to major compilation time improvement in some scenarios.
5445 * [`ToString` is specialized for `str`, giving it the same performance
5446 as `to_owned`][1.9ts].
5447 * [Spawning processes with `Command::output` no longer creates extra
5448 threads][1.9sp].
5449 * [`#[derive(PartialEq)]` and `#[derive(PartialOrd)]` emit less code
5450 for C-like enums][1.9cl].
5451
5452 Misc
5453 ----
5454
5455 * [Passing the `--quiet` flag to a test runner will produce
5456 much-abbreviated output][1.9q].
5457 * The Rust Project now publishes std binaries for the
5458 `mips-unknown-linux-musl`, `mipsel-unknown-linux-musl`, and
5459 `i586-pc-windows-msvc` targets.
5460
5461 Compatibility Notes
5462 -------------------
5463
5464 * [`std::sync::Once` is poisoned if its initialization function
5465 fails][1.9o].
5466 * [It is illegal to define methods with the same name in overlapping
5467 inherent `impl` blocks][1.9sn].
5468 * [`fn` item types are zero sized, and each `fn` names a unique
5469 type][1.9fn]. This will break code that transmutes `fn`s, so calling
5470 `transmute` on a `fn` type will generate a warning for a few cycles,
5471 then will be converted to an error.
5472 * [Improvements to const evaluation may trigger new errors when integer
5473 literals are out of range][1.9ce].
5474
5475
5476 [1.9bf]: https://github.com/rust-lang/rust/pull/32695
5477 [1.9cc]: https://github.com/rust-lang/cargo/pull/2486
5478 [1.9ce]: https://github.com/rust-lang/rust/pull/30587
5479 [1.9cf]: https://github.com/rust-lang/cargo/pull/2241
5480 [1.9ch]: https://github.com/rust-lang/rust/pull/32541
5481 [1.9cl]: https://github.com/rust-lang/rust/pull/31977
5482 [1.9cp]: https://github.com/rust-lang/cargo/pull/2465
5483 [1.9ct]: https://github.com/rust-lang/cargo/pull/2385
5484 [1.9cu]: https://github.com/rust-lang/rust/pull/32652
5485 [1.9db]: https://github.com/rust-lang/rust/pull/32054
5486 [1.9fi]: https://github.com/rust-lang/rust/pull/32050
5487 [1.9fn]: https://github.com/rust-lang/rust/pull/31710
5488 [1.9fv]: https://github.com/rust-lang/rust/pull/31938
5489 [1.9hc]: https://github.com/rust-lang/rust/pull/32635
5490 [1.9o]: https://github.com/rust-lang/rust/pull/32325
5491 [1.9q]: https://github.com/rust-lang/rust/pull/31887
5492 [1.9sk]: https://github.com/rust-lang/rust/pull/31700
5493 [1.9sn]: https://github.com/rust-lang/rust/pull/31925
5494 [1.9sp]: https://github.com/rust-lang/rust/pull/31618
5495 [1.9ta]: https://github.com/rust-lang/rust/pull/32448
5496 [1.9ts]: https://github.com/rust-lang/rust/pull/32586
5497 [1.9tu]: https://github.com/rust-lang/rust/pull/32062
5498 [1.9ws]: https://github.com/rust-lang/rust/pull/29734
5499 [RFC 1270]: https://github.com/rust-lang/rfcs/blob/master/text/1270-deprecation.md
5500 [`<*const T>::as_ref`]: http://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.as_ref
5501 [`<*mut T>::as_mut`]: http://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.as_mut
5502 [`<*mut T>::as_ref`]: http://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.as_ref
5503 [`slice::copy_from_slice`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.copy_from_slice
5504 [`AsciiExt::make_ascii_lowercase`]: http://doc.rust-lang.org/nightly/std/ascii/trait.AsciiExt.html#tymethod.make_ascii_lowercase
5505 [`AsciiExt::make_ascii_uppercase`]: http://doc.rust-lang.org/nightly/std/ascii/trait.AsciiExt.html#tymethod.make_ascii_uppercase
5506 [`BTreeSet::get`]: http://doc.rust-lang.org/nightly/collections/btree/set/struct.BTreeSet.html#method.get
5507 [`BTreeSet::replace`]: http://doc.rust-lang.org/nightly/collections/btree/set/struct.BTreeSet.html#method.replace
5508 [`BTreeSet::take`]: http://doc.rust-lang.org/nightly/collections/btree/set/struct.BTreeSet.html#method.take
5509 [`CommandExt::exec`]: http://doc.rust-lang.org/nightly/std/os/unix/process/trait.CommandExt.html#tymethod.exec
5510 [`File::try_clone`]: http://doc.rust-lang.org/nightly/std/fs/struct.File.html#method.try_clone
5511 [`HashMap::hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashMap.html#method.hasher
5512 [`HashSet::get`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.get
5513 [`HashSet::hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.hasher
5514 [`HashSet::replace`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.replace
5515 [`HashSet::take`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.take
5516 [`JoinHandleExt::as_pthread_t`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/trait.JoinHandleExt.html#tymethod.as_pthread_t
5517 [`JoinHandleExt::into_pthread_t`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/trait.JoinHandleExt.html#tymethod.into_pthread_t
5518 [`JoinHandleExt`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/trait.JoinHandleExt.html
5519 [`OpenOptions::create_new`]: http://doc.rust-lang.org/nightly/std/fs/struct.OpenOptions.html#method.create_new
5520 [`OsStr::is_empty`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsStr.html#method.is_empty
5521 [`OsStr::len`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsStr.html#method.len
5522 [`OsString::capacity`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.capacity
5523 [`OsString::clear`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.clear
5524 [`OsString::reserve_exact`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.reserve_exact
5525 [`OsString::reserve`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.reserve
5526 [`OsString::with_capacity`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.with_capacity
5527 [`RawPthread`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/type.RawPthread.html
5528 [`SocketAddr::set_ip`]: http://doc.rust-lang.org/nightly/std/net/enum.SocketAddr.html#method.set_ip
5529 [`SocketAddr::set_port`]: http://doc.rust-lang.org/nightly/std/net/enum.SocketAddr.html#method.set_port
5530 [`SocketAddrV4::set_ip`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV4.html#method.set_ip
5531 [`SocketAddrV4::set_port`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV4.html#method.set_port
5532 [`SocketAddrV6::set_flowinfo`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_flowinfo
5533 [`SocketAddrV6::set_ip`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_ip
5534 [`SocketAddrV6::set_port`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_port
5535 [`SocketAddrV6::set_scope_id`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_scope_id
5536 [`TcpListener::only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.only_v6
5537 [`TcpListener::set_nonblocking`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_nonblocking
5538 [`TcpListener::set_only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_only_v6
5539 [`TcpListener::set_ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_ttl
5540 [`TcpListener::take_error`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.take_error
5541 [`TcpListener::ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.ttl
5542 [`TcpStream::nodelay`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.nodelay
5543 [`TcpStream::only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.only_v6
5544 [`TcpStream::set_nodelay`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_nodelay
5545 [`TcpStream::set_nonblocking`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_nonblocking
5546 [`TcpStream::set_only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_only_v6
5547 [`TcpStream::set_ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_ttl
5548 [`TcpStream::take_error`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.take_error
5549 [`TcpStream::ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.ttl
5550 [`UdpSocket::broadcast`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.broadcast
5551 [`UdpSocket::connect`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.connect
5552 [`UdpSocket::join_multicast_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.join_multicast_v4
5553 [`UdpSocket::join_multicast_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.join_multicast_v6
5554 [`UdpSocket::leave_multicast_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.leave_multicast_v4
5555 [`UdpSocket::leave_multicast_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.leave_multicast_v6
5556 [`UdpSocket::multicast_loop_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_loop_v4
5557 [`UdpSocket::multicast_loop_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_loop_v6
5558 [`UdpSocket::multicast_ttl_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_ttl_v4
5559 [`UdpSocket::multicast_ttl_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_ttl_v6
5560 [`UdpSocket::only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.only_v6
5561 [`UdpSocket::recv`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.recv
5562 [`UdpSocket::send`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.send
5563 [`UdpSocket::set_broadcast`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_broadcast
5564 [`UdpSocket::set_multicast_loop_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_loop_v4
5565 [`UdpSocket::set_multicast_loop_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_loop_v6
5566 [`UdpSocket::set_multicast_ttl_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_ttl_v4
5567 [`UdpSocket::set_multicast_ttl_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_ttl_v6
5568 [`UdpSocket::set_nonblocking`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_nonblocking
5569 [`UdpSocket::set_only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_only_v6
5570 [`UdpSocket::set_ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_ttl
5571 [`UdpSocket::take_error`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.take_error
5572 [`UdpSocket::ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.ttl
5573 [`char::DecodeUtf16Error::unpaired_surrogate`]: http://doc.rust-lang.org/nightly/std/char/struct.DecodeUtf16Error.html#method.unpaired_surrogate
5574 [`char::DecodeUtf16Error`]: http://doc.rust-lang.org/nightly/std/char/struct.DecodeUtf16Error.html
5575 [`char::DecodeUtf16`]: http://doc.rust-lang.org/nightly/std/char/struct.DecodeUtf16.html
5576 [`char::decode_utf16`]: http://doc.rust-lang.org/nightly/std/char/fn.decode_utf16.html
5577 [`ptr::read_volatile`]: http://doc.rust-lang.org/nightly/std/ptr/fn.read_volatile.html
5578 [`ptr::write_volatile`]: http://doc.rust-lang.org/nightly/std/ptr/fn.write_volatile.html
5579 [`std::os::unix::thread`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/index.html
5580 [`std::panic::AssertUnwindSafe`]: http://doc.rust-lang.org/nightly/std/panic/struct.AssertUnwindSafe.html
5581 [`std::panic::UnwindSafe`]: http://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html
5582 [`std::panic::catch_unwind`]: http://doc.rust-lang.org/nightly/std/panic/fn.catch_unwind.html
5583 [`std::panic::resume_unwind`]: http://doc.rust-lang.org/nightly/std/panic/fn.resume_unwind.html
5584 [`std::panic`]: http://doc.rust-lang.org/nightly/std/panic/index.html
5585 [`str::is_char_boundary`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.is_char_boundary
5586
5587
5588 Version 1.8.0 (2016-04-14)
5589 ==========================
5590
5591 Language
5592 --------
5593
5594 * Rust supports overloading of compound assignment statements like
5595 `+=` by implementing the [`AddAssign`], [`SubAssign`],
5596 [`MulAssign`], [`DivAssign`], [`RemAssign`], [`BitAndAssign`],
5597 [`BitOrAssign`], [`BitXorAssign`], [`ShlAssign`], or [`ShrAssign`]
5598 traits. [RFC 953].
5599 * Empty structs can be defined with braces, as in `struct Foo { }`, in
5600 addition to the non-braced form, `struct Foo;`. [RFC 218].
5601
5602 Libraries
5603 ---------
5604
5605 * Stabilized APIs:
5606 * [`str::encode_utf16`] (renamed from `utf16_units`)
5607 * [`str::EncodeUtf16`] (renamed from `Utf16Units`)
5608 * [`Ref::map`]
5609 * [`RefMut::map`]
5610 * [`ptr::drop_in_place`]
5611 * [`time::Instant`]
5612 * [`time::SystemTime`]
5613 * [`Instant::now`]
5614 * [`Instant::duration_since`] (renamed from `duration_from_earlier`)
5615 * [`Instant::elapsed`]
5616 * [`SystemTime::now`]
5617 * [`SystemTime::duration_since`] (renamed from `duration_from_earlier`)
5618 * [`SystemTime::elapsed`]
5619 * Various `Add`/`Sub` impls for `Time` and `SystemTime`
5620 * [`SystemTimeError`]
5621 * [`SystemTimeError::duration`]
5622 * Various impls for `SystemTimeError`
5623 * [`UNIX_EPOCH`]
5624 * [`AddAssign`], [`SubAssign`], [`MulAssign`], [`DivAssign`],
5625 [`RemAssign`], [`BitAndAssign`], [`BitOrAssign`],
5626 [`BitXorAssign`], [`ShlAssign`], [`ShrAssign`].
5627 * [The `write!` and `writeln!` macros correctly emit errors if any of
5628 their arguments can't be formatted][1.8w].
5629 * [Various I/O functions support large files on 32-bit Linux][1.8l].
5630 * [The Unix-specific `raw` modules, which contain a number of
5631 redefined C types are deprecated][1.8r], including `os::raw::unix`,
5632 `os::raw::macos`, and `os::raw::linux`. These modules defined types
5633 such as `ino_t` and `dev_t`. The inconsistency of these definitions
5634 across platforms was making it difficult to implement `std`
5635 correctly. Those that need these definitions should use the `libc`
5636 crate. [RFC 1415].
5637 * The Unix-specific `MetadataExt` traits, including
5638 `os::unix::fs::MetadataExt`, which expose values such as inode
5639 numbers [no longer return platform-specific types][1.8r], but
5640 instead return widened integers. [RFC 1415].
5641 * [`btree_set::{IntoIter, Iter, Range}` are covariant][1.8cv].
5642 * [Atomic loads and stores are not volatile][1.8a].
5643 * [All types in `sync::mpsc` implement `fmt::Debug`][1.8mp].
5644
5645 Performance
5646 -----------
5647
5648 * [Inlining hash functions lead to a 3% compile-time improvement in
5649 some workloads][1.8h].
5650 * When using jemalloc, its symbols are [unprefixed so that it
5651 overrides the libc malloc implementation][1.8h]. This means that for
5652 rustc, LLVM is now using jemalloc, which results in a 6%
5653 compile-time improvement on a specific workload.
5654 * [Avoid quadratic growth in function size due to cleanups][1.8cu].
5655
5656 Misc
5657 ----
5658
5659 * [32-bit MSVC builds finally implement unwinding][1.8ms].
5660 i686-pc-windows-msvc is now considered a tier-1 platform.
5661 * [The `--print targets` flag prints a list of supported targets][1.8t].
5662 * [The `--print cfg` flag prints the `cfg`s defined for the current
5663 target][1.8cf].
5664 * [`rustc` can be built with an new Cargo-based build system, written
5665 in Rust][1.8b]. It will eventually replace Rust's Makefile-based
5666 build system. To enable it configure with `configure --rustbuild`.
5667 * [Errors for non-exhaustive `match` patterns now list up to 3 missing
5668 variants while also indicating the total number of missing variants
5669 if more than 3][1.8m].
5670 * [Executable stacks are disabled on Linux and BSD][1.8nx].
5671 * The Rust Project now publishes binary releases of the standard
5672 library for a number of tier-2 targets:
5673 `armv7-unknown-linux-gnueabihf`, `powerpc-unknown-linux-gnu`,
5674 `powerpc64-unknown-linux-gnu`, `powerpc64le-unknown-linux-gnu`
5675 `x86_64-rumprun-netbsd`. These can be installed with
5676 tools such as [multirust][1.8mr].
5677
5678 Cargo
5679 -----
5680
5681 * [`cargo init` creates a new Cargo project in the current
5682 directory][1.8ci]. It is otherwise like `cargo new`.
5683 * [Cargo has configuration keys for `-v` and
5684 `--color`][1.8cc]. `verbose` and `color`, respectively, go in the
5685 `[term]` section of `.cargo/config`.
5686 * [Configuration keys that evaluate to strings or integers can be set
5687 via environment variables][1.8ce]. For example the `build.jobs` key
5688 can be set via `CARGO_BUILD_JOBS`. Environment variables take
5689 precedence over config files.
5690 * [Target-specific dependencies support Rust `cfg` syntax for
5691 describing targets][1.8cfg] so that dependencies for multiple
5692 targets can be specified together. [RFC 1361].
5693 * [The environment variables `CARGO_TARGET_ROOT`, `RUSTC`, and
5694 `RUSTDOC` take precedence over the `build.target-dir`,
5695 `build.rustc`, and `build.rustdoc` configuration values][1.8cv].
5696 * [The child process tree is killed on Windows when Cargo is
5697 killed][1.8ck].
5698 * [The `build.target` configuration value sets the target platform,
5699 like `--target`][1.8ct].
5700
5701 Compatibility Notes
5702 -------------------
5703
5704 * [Unstable compiler flags have been further restricted][1.8u]. Since
5705 1.0 `-Z` flags have been considered unstable, and other flags that
5706 were considered unstable additionally required passing `-Z
5707 unstable-options` to access. Unlike unstable language and library
5708 features though, these options have been accessible on the stable
5709 release channel. Going forward, *new unstable flags will not be
5710 available on the stable release channel*, and old unstable flags
5711 will warn about their usage. In the future, all unstable flags will
5712 be unavailable on the stable release channel.
5713 * [It is no longer possible to `match` on empty enum variants using
5714 the `Variant(..)` syntax][1.8v]. This has been a warning since 1.6.
5715 * The Unix-specific `MetadataExt` traits, including
5716 `os::unix::fs::MetadataExt`, which expose values such as inode
5717 numbers [no longer return platform-specific types][1.8r], but
5718 instead return widened integers. [RFC 1415].
5719 * [Modules sourced from the filesystem cannot appear within arbitrary
5720 blocks, but only within other modules][1.8mf].
5721 * [`--cfg` compiler flags are parsed strictly as identifiers][1.8c].
5722 * On Unix, [stack overflow triggers a runtime abort instead of a
5723 SIGSEGV][1.8so].
5724 * [`Command::spawn` and its equivalents return an error if any of
5725 its command-line arguments contain interior `NUL`s][1.8n].
5726 * [Tuple and unit enum variants from other crates are in the type
5727 namespace][1.8tn].
5728 * [On Windows `rustc` emits `.lib` files for the `staticlib` library
5729 type instead of `.a` files][1.8st]. Additionally, for the MSVC
5730 toolchain, `rustc` emits import libraries named `foo.dll.lib`
5731 instead of `foo.lib`.
5732
5733
5734 [1.8a]: https://github.com/rust-lang/rust/pull/30962
5735 [1.8b]: https://github.com/rust-lang/rust/pull/31123
5736 [1.8c]: https://github.com/rust-lang/rust/pull/31530
5737 [1.8cc]: https://github.com/rust-lang/cargo/pull/2397
5738 [1.8ce]: https://github.com/rust-lang/cargo/pull/2398
5739 [1.8cf]: https://github.com/rust-lang/rust/pull/31278
5740 [1.8cfg]: https://github.com/rust-lang/cargo/pull/2328
5741 [1.8ci]: https://github.com/rust-lang/cargo/pull/2081
5742 [1.8ck]: https://github.com/rust-lang/cargo/pull/2370
5743 [1.8ct]: https://github.com/rust-lang/cargo/pull/2335
5744 [1.8cu]: https://github.com/rust-lang/rust/pull/31390
5745 [1.8cv]: https://github.com/rust-lang/cargo/issues/2365
5746 [1.8cv]: https://github.com/rust-lang/rust/pull/30998
5747 [1.8h]: https://github.com/rust-lang/rust/pull/31460
5748 [1.8l]: https://github.com/rust-lang/rust/pull/31668
5749 [1.8m]: https://github.com/rust-lang/rust/pull/31020
5750 [1.8mf]: https://github.com/rust-lang/rust/pull/31534
5751 [1.8mp]: https://github.com/rust-lang/rust/pull/30894
5752 [1.8mr]: https://users.rust-lang.org/t/multirust-0-8-with-cross-std-installation/4901
5753 [1.8ms]: https://github.com/rust-lang/rust/pull/30448
5754 [1.8n]: https://github.com/rust-lang/rust/pull/31056
5755 [1.8nx]: https://github.com/rust-lang/rust/pull/30859
5756 [1.8r]: https://github.com/rust-lang/rust/pull/31551
5757 [1.8so]: https://github.com/rust-lang/rust/pull/31333
5758 [1.8st]: https://github.com/rust-lang/rust/pull/29520
5759 [1.8t]: https://github.com/rust-lang/rust/pull/31358
5760 [1.8tn]: https://github.com/rust-lang/rust/pull/30882
5761 [1.8u]: https://github.com/rust-lang/rust/pull/31793
5762 [1.8v]: https://github.com/rust-lang/rust/pull/31757
5763 [1.8w]: https://github.com/rust-lang/rust/pull/31904
5764 [RFC 1361]: https://github.com/rust-lang/rfcs/blob/master/text/1361-cargo-cfg-dependencies.md
5765 [RFC 1415]: https://github.com/rust-lang/rfcs/blob/master/text/1415-trim-std-os.md
5766 [RFC 218]: https://github.com/rust-lang/rfcs/blob/master/text/0218-empty-struct-with-braces.md
5767 [RFC 953]: https://github.com/rust-lang/rfcs/blob/master/text/0953-op-assign.md
5768 [`AddAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.AddAssign.html
5769 [`BitAndAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.BitAndAssign.html
5770 [`BitOrAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.BitOrAssign.html
5771 [`BitXorAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.BitXorAssign.html
5772 [`DivAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.DivAssign.html
5773 [`Instant::duration_since`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html#method.duration_since
5774 [`Instant::elapsed`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html#method.elapsed
5775 [`Instant::now`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html#method.now
5776 [`MulAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.MulAssign.html
5777 [`Ref::map`]: http://doc.rust-lang.org/nightly/std/cell/struct.Ref.html#method.map
5778 [`RefMut::map`]: http://doc.rust-lang.org/nightly/std/cell/struct.RefMut.html#method.map
5779 [`RemAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.RemAssign.html
5780 [`ShlAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.ShlAssign.html
5781 [`ShrAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.ShrAssign.html
5782 [`SubAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.SubAssign.html
5783 [`SystemTime::duration_since`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html#method.duration_since
5784 [`SystemTime::elapsed`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html#method.elapsed
5785 [`SystemTime::now`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html#method.now
5786 [`SystemTimeError::duration`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTimeError.html#method.duration
5787 [`SystemTimeError`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTimeError.html
5788 [`UNIX_EPOCH`]: http://doc.rust-lang.org/nightly/std/time/constant.UNIX_EPOCH.html
5789 [`ptr::drop_in_place`]: http://doc.rust-lang.org/nightly/std/ptr/fn.drop_in_place.html
5790 [`str::EncodeUtf16`]: http://doc.rust-lang.org/nightly/std/str/struct.EncodeUtf16.html
5791 [`str::encode_utf16`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.encode_utf16
5792 [`time::Instant`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html
5793 [`time::SystemTime`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html
5794
5795
5796 Version 1.7.0 (2016-03-03)
5797 ==========================
5798
5799 Libraries
5800 ---------
5801
5802 * Stabilized APIs
5803 * `Path`
5804 * [`Path::strip_prefix`] (renamed from relative_from)
5805 * [`path::StripPrefixError`] (new error type returned from strip_prefix)
5806 * `Ipv4Addr`
5807 * [`Ipv4Addr::is_loopback`]
5808 * [`Ipv4Addr::is_private`]
5809 * [`Ipv4Addr::is_link_local`]
5810 * [`Ipv4Addr::is_multicast`]
5811 * [`Ipv4Addr::is_broadcast`]
5812 * [`Ipv4Addr::is_documentation`]
5813 * `Ipv6Addr`
5814 * [`Ipv6Addr::is_unspecified`]
5815 * [`Ipv6Addr::is_loopback`]
5816 * [`Ipv6Addr::is_multicast`]
5817 * `Vec`
5818 * [`Vec::as_slice`]
5819 * [`Vec::as_mut_slice`]
5820 * `String`
5821 * [`String::as_str`]
5822 * [`String::as_mut_str`]
5823 * Slices
5824 * `<[T]>::`[`clone_from_slice`], which now requires the two slices to
5825 be the same length
5826 * `<[T]>::`[`sort_by_key`]
5827 * checked, saturated, and overflowing operations
5828 * [`i32::checked_rem`], [`i32::checked_neg`], [`i32::checked_shl`], [`i32::checked_shr`]
5829 * [`i32::saturating_mul`]
5830 * [`i32::overflowing_add`], [`i32::overflowing_sub`], [`i32::overflowing_mul`], [`i32::overflowing_div`]
5831 * [`i32::overflowing_rem`], [`i32::overflowing_neg`], [`i32::overflowing_shl`], [`i32::overflowing_shr`]
5832 * [`u32::checked_rem`], [`u32::checked_neg`], [`u32::checked_shl`], [`u32::checked_shl`]
5833 * [`u32::saturating_mul`]
5834 * [`u32::overflowing_add`], [`u32::overflowing_sub`], [`u32::overflowing_mul`], [`u32::overflowing_div`]
5835 * [`u32::overflowing_rem`], [`u32::overflowing_neg`], [`u32::overflowing_shl`], [`u32::overflowing_shr`]
5836 * and checked, saturated, and overflowing operations for other primitive types
5837 * FFI
5838 * [`ffi::IntoStringError`]
5839 * [`CString::into_string`]
5840 * [`CString::into_bytes`]
5841 * [`CString::into_bytes_with_nul`]
5842 * `From<CString> for Vec<u8>`
5843 * `IntoStringError`
5844 * [`IntoStringError::into_cstring`]
5845 * [`IntoStringError::utf8_error`]
5846 * `Error for IntoStringError`
5847 * Hashing
5848 * [`std::hash::BuildHasher`]
5849 * [`BuildHasher::Hasher`]
5850 * [`BuildHasher::build_hasher`]
5851 * [`std::hash::BuildHasherDefault`]
5852 * [`HashMap::with_hasher`]
5853 * [`HashMap::with_capacity_and_hasher`]
5854 * [`HashSet::with_hasher`]
5855 * [`HashSet::with_capacity_and_hasher`]
5856 * [`std::collections::hash_map::RandomState`]
5857 * [`RandomState::new`]
5858 * [Validating UTF-8 is faster by a factor of between 7 and 14x for
5859 ASCII input][1.7utf8]. This means that creating `String`s and `str`s
5860 from bytes is faster.
5861 * [The performance of `LineWriter` (and thus `io::stdout`) was
5862 improved by using `memchr` to search for newlines][1.7m].
5863 * [`f32::to_degrees` and `f32::to_radians` are stable][1.7f]. The
5864 `f64` variants were stabilized previously.
5865 * [`BTreeMap` was rewritten to use less memory and improve the performance
5866 of insertion and iteration, the latter by as much as 5x][1.7bm].
5867 * [`BTreeSet` and its iterators, `Iter`, `IntoIter`, and `Range` are
5868 covariant over their contained type][1.7bt].
5869 * [`LinkedList` and its iterators, `Iter` and `IntoIter` are covariant
5870 over their contained type][1.7ll].
5871 * [`str::replace` now accepts a `Pattern`][1.7rp], like other string
5872 searching methods.
5873 * [`Any` is implemented for unsized types][1.7a].
5874 * [`Hash` is implemented for `Duration`][1.7h].
5875
5876 Misc
5877 ----
5878
5879 * [When running tests with `--test`, rustdoc will pass `--cfg`
5880 arguments to the compiler][1.7dt].
5881 * [The compiler is built with RPATH information by default][1.7rpa].
5882 This means that it will be possible to run `rustc` when installed in
5883 unusual configurations without configuring the dynamic linker search
5884 path explicitly.
5885 * [`rustc` passes `--enable-new-dtags` to GNU ld][1.7dta]. This makes
5886 any RPATH entries (emitted with `-C rpath`) *not* take precedence
5887 over `LD_LIBRARY_PATH`.
5888
5889 Cargo
5890 -----
5891
5892 * [`cargo rustc` accepts a `--profile` flag that runs `rustc` under
5893 any of the compilation profiles, 'dev', 'bench', or 'test'][1.7cp].
5894 * [The `rerun-if-changed` build script directive no longer causes the
5895 build script to incorrectly run twice in certain scenarios][1.7rr].
5896
5897 Compatibility Notes
5898 -------------------
5899
5900 * Soundness fixes to the interactions between associated types and
5901 lifetimes, specified in [RFC 1214], [now generate errors][1.7sf] for
5902 code that violates the new rules. This is a significant change that
5903 is known to break existing code, so it has emitted warnings for the
5904 new error cases since 1.4 to give crate authors time to adapt. The
5905 details of what is changing are subtle; read the RFC for more.
5906 * [Several bugs in the compiler's visibility calculations were
5907 fixed][1.7v]. Since this was found to break significant amounts of
5908 code, the new errors will be emitted as warnings for several release
5909 cycles, under the `private_in_public` lint.
5910 * Defaulted type parameters were accidentally accepted in positions
5911 that were not intended. In this release, [defaulted type parameters
5912 appearing outside of type definitions will generate a
5913 warning][1.7d], which will become an error in future releases.
5914 * [Parsing "." as a float results in an error instead of 0][1.7p].
5915 That is, `".".parse::<f32>()` returns `Err`, not `Ok(0.0)`.
5916 * [Borrows of closure parameters may not outlive the closure][1.7bc].
5917
5918 [1.7a]: https://github.com/rust-lang/rust/pull/30928
5919 [1.7bc]: https://github.com/rust-lang/rust/pull/30341
5920 [1.7bm]: https://github.com/rust-lang/rust/pull/30426
5921 [1.7bt]: https://github.com/rust-lang/rust/pull/30998
5922 [1.7cp]: https://github.com/rust-lang/cargo/pull/2224
5923 [1.7d]: https://github.com/rust-lang/rust/pull/30724
5924 [1.7dt]: https://github.com/rust-lang/rust/pull/30372
5925 [1.7dta]: https://github.com/rust-lang/rust/pull/30394
5926 [1.7f]: https://github.com/rust-lang/rust/pull/30672
5927 [1.7h]: https://github.com/rust-lang/rust/pull/30818
5928 [1.7ll]: https://github.com/rust-lang/rust/pull/30663
5929 [1.7m]: https://github.com/rust-lang/rust/pull/30381
5930 [1.7p]: https://github.com/rust-lang/rust/pull/30681
5931 [1.7rp]: https://github.com/rust-lang/rust/pull/29498
5932 [1.7rpa]: https://github.com/rust-lang/rust/pull/30353
5933 [1.7rr]: https://github.com/rust-lang/cargo/pull/2279
5934 [1.7sf]: https://github.com/rust-lang/rust/pull/30389
5935 [1.7utf8]: https://github.com/rust-lang/rust/pull/30740
5936 [1.7v]: https://github.com/rust-lang/rust/pull/29973
5937 [RFC 1214]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
5938 [`BuildHasher::Hasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hasher.html
5939 [`BuildHasher::build_hasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.BuildHasher.html#tymethod.build_hasher
5940 [`CString::into_bytes_with_nul`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_bytes_with_nul
5941 [`CString::into_bytes`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_bytes
5942 [`CString::into_string`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_string
5943 [`HashMap::with_capacity_and_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashMap.html#method.with_capacity_and_hasher
5944 [`HashMap::with_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashMap.html#method.with_hasher
5945 [`HashSet::with_capacity_and_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.with_capacity_and_hasher
5946 [`HashSet::with_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.with_hasher
5947 [`IntoStringError::into_cstring`]: http://doc.rust-lang.org/nightly/std/ffi/struct.IntoStringError.html#method.into_cstring
5948 [`IntoStringError::utf8_error`]: http://doc.rust-lang.org/nightly/std/ffi/struct.IntoStringError.html#method.utf8_error
5949 [`Ipv4Addr::is_broadcast`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_broadcast
5950 [`Ipv4Addr::is_documentation`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_documentation
5951 [`Ipv4Addr::is_link_local`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_link_local
5952 [`Ipv4Addr::is_loopback`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_loopback
5953 [`Ipv4Addr::is_multicast`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_multicast
5954 [`Ipv4Addr::is_private`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_private
5955 [`Ipv6Addr::is_loopback`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_loopback
5956 [`Ipv6Addr::is_multicast`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_multicast
5957 [`Ipv6Addr::is_unspecified`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_unspecified
5958 [`Path::strip_prefix`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.strip_prefix
5959 [`RandomState::new`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.RandomState.html#method.new
5960 [`String::as_mut_str`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.as_mut_str
5961 [`String::as_str`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.as_str
5962 [`Vec::as_mut_slice`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.as_mut_slice
5963 [`Vec::as_slice`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.as_slice
5964 [`clone_from_slice`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.clone_from_slice
5965 [`ffi::IntoStringError`]: http://doc.rust-lang.org/nightly/std/ffi/struct.IntoStringError.html
5966 [`i32::checked_neg`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_neg
5967 [`i32::checked_rem`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_rem
5968 [`i32::checked_shl`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_shl
5969 [`i32::checked_shr`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_shr
5970 [`i32::overflowing_add`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_add
5971 [`i32::overflowing_div`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_div
5972 [`i32::overflowing_mul`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_mul
5973 [`i32::overflowing_neg`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_neg
5974 [`i32::overflowing_rem`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_rem
5975 [`i32::overflowing_shl`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_shl
5976 [`i32::overflowing_shr`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_shr
5977 [`i32::overflowing_sub`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_sub
5978 [`i32::saturating_mul`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.saturating_mul
5979 [`path::StripPrefixError`]: http://doc.rust-lang.org/nightly/std/path/struct.StripPrefixError.html
5980 [`sort_by_key`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.sort_by_key
5981 [`std::collections::hash_map::RandomState`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.RandomState.html
5982 [`std::hash::BuildHasherDefault`]: http://doc.rust-lang.org/nightly/std/hash/struct.BuildHasherDefault.html
5983 [`std::hash::BuildHasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.BuildHasher.html
5984 [`u32::checked_neg`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_neg
5985 [`u32::checked_rem`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_rem
5986 [`u32::checked_neg`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_neg
5987 [`u32::checked_shl`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_shl
5988 [`u32::overflowing_add`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_add
5989 [`u32::overflowing_div`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_div
5990 [`u32::overflowing_mul`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_mul
5991 [`u32::overflowing_neg`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_neg
5992 [`u32::overflowing_rem`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_rem
5993 [`u32::overflowing_shl`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_shl
5994 [`u32::overflowing_shr`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_shr
5995 [`u32::overflowing_sub`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_sub
5996 [`u32::saturating_mul`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.saturating_mul
5997
5998
5999 Version 1.6.0 (2016-01-21)
6000 ==========================
6001
6002 Language
6003 --------
6004
6005 * The `#![no_std]` attribute causes a crate to not be linked to the
6006 standard library, but only the [core library][1.6co], as described
6007 in [RFC 1184]. The core library defines common types and traits but
6008 has no platform dependencies whatsoever, and is the basis for Rust
6009 software in environments that cannot support a full port of the
6010 standard library, such as operating systems. Most of the core
6011 library is now stable.
6012
6013 Libraries
6014 ---------
6015
6016 * Stabilized APIs:
6017 [`Read::read_exact`],
6018 [`ErrorKind::UnexpectedEof`] (renamed from `UnexpectedEOF`),
6019 [`fs::DirBuilder`], [`fs::DirBuilder::new`],
6020 [`fs::DirBuilder::recursive`], [`fs::DirBuilder::create`],
6021 [`os::unix::fs::DirBuilderExt`],
6022 [`os::unix::fs::DirBuilderExt::mode`], [`vec::Drain`],
6023 [`vec::Vec::drain`], [`string::Drain`], [`string::String::drain`],
6024 [`vec_deque::Drain`], [`vec_deque::VecDeque::drain`],
6025 [`collections::hash_map::Drain`],
6026 [`collections::hash_map::HashMap::drain`],
6027 [`collections::hash_set::Drain`],
6028 [`collections::hash_set::HashSet::drain`],
6029 [`collections::binary_heap::Drain`],
6030 [`collections::binary_heap::BinaryHeap::drain`],
6031 [`Vec::extend_from_slice`] (renamed from `push_all`),
6032 [`Mutex::get_mut`], [`Mutex::into_inner`], [`RwLock::get_mut`],
6033 [`RwLock::into_inner`],
6034 [`Iterator::min_by_key`] (renamed from `min_by`),
6035 [`Iterator::max_by_key`] (renamed from `max_by`).
6036 * The [core library][1.6co] is stable, as are most of its APIs.
6037 * [The `assert_eq!` macro supports arguments that don't implement
6038 `Sized`][1.6ae], such as arrays. In this way it behaves more like
6039 `assert!`.
6040 * Several timer functions that take duration in milliseconds [are
6041 deprecated in favor of those that take `Duration`][1.6ms]. These
6042 include `Condvar::wait_timeout_ms`, `thread::sleep_ms`, and
6043 `thread::park_timeout_ms`.
6044 * The algorithm by which `Vec` reserves additional elements was
6045 [tweaked to not allocate excessive space][1.6a] while still growing
6046 exponentially.
6047 * `From` conversions are [implemented from integers to floats][1.6f]
6048 in cases where the conversion is lossless. Thus they are not
6049 implemented for 32-bit ints to `f32`, nor for 64-bit ints to `f32`
6050 or `f64`. They are also not implemented for `isize` and `usize`
6051 because the implementations would be platform-specific. `From` is
6052 also implemented from `f32` to `f64`.
6053 * `From<&Path>` and `From<PathBuf>` are implemented for `Cow<Path>`.
6054 * `From<T>` is implemented for `Box<T>`, `Rc<T>` and `Arc<T>`.
6055 * `IntoIterator` is implemented for `&PathBuf` and `&Path`.
6056 * [`BinaryHeap` was refactored][1.6bh] for modest performance
6057 improvements.
6058 * Sorting slices that are already sorted [is 50% faster in some
6059 cases][1.6s].
6060
6061 Cargo
6062 -----
6063
6064 * Cargo will look in `$CARGO_HOME/bin` for subcommands [by default][1.6c].
6065 * Cargo build scripts can specify their dependencies by emitting the
6066 [`rerun-if-changed`][1.6rr] key.
6067 * crates.io will reject publication of crates with dependencies that
6068 have a wildcard version constraint. Crates with wildcard
6069 dependencies were seen to cause a variety of problems, as described
6070 in [RFC 1241]. Since 1.5 publication of such crates has emitted a
6071 warning.
6072 * `cargo clean` [accepts a `--release` flag][1.6cc] to clean the
6073 release folder. A variety of artifacts that Cargo failed to clean
6074 are now correctly deleted.
6075
6076 Misc
6077 ----
6078
6079 * The `unreachable_code` lint [warns when a function call's argument
6080 diverges][1.6dv].
6081 * The parser indicates [failures that may be caused by
6082 confusingly-similar Unicode characters][1.6uc]
6083 * Certain macro errors [are reported at definition time][1.6m], not
6084 expansion.
6085
6086 Compatibility Notes
6087 -------------------
6088
6089 * The compiler no longer makes use of the [`RUST_PATH`][1.6rp]
6090 environment variable when locating crates. This was a pre-cargo
6091 feature for integrating with the package manager that was
6092 accidentally never removed.
6093 * [A number of bugs were fixed in the privacy checker][1.6p] that
6094 could cause previously-accepted code to break.
6095 * [Modules and unit/tuple structs may not share the same name][1.6ts].
6096 * [Bugs in pattern matching unit structs were fixed][1.6us]. The tuple
6097 struct pattern syntax (`Foo(..)`) can no longer be used to match
6098 unit structs. This is a warning now, but will become an error in
6099 future releases. Patterns that share the same name as a const are
6100 now an error.
6101 * A bug was fixed that causes [rustc not to apply default type
6102 parameters][1.6xc] when resolving certain method implementations of
6103 traits defined in other crates.
6104
6105 [1.6a]: https://github.com/rust-lang/rust/pull/29454
6106 [1.6ae]: https://github.com/rust-lang/rust/pull/29770
6107 [1.6bh]: https://github.com/rust-lang/rust/pull/29811
6108 [1.6c]: https://github.com/rust-lang/cargo/pull/2192
6109 [1.6cc]: https://github.com/rust-lang/cargo/pull/2131
6110 [1.6co]: http://doc.rust-lang.org/core/index.html
6111 [1.6dv]: https://github.com/rust-lang/rust/pull/30000
6112 [1.6f]: https://github.com/rust-lang/rust/pull/29129
6113 [1.6m]: https://github.com/rust-lang/rust/pull/29828
6114 [1.6ms]: https://github.com/rust-lang/rust/pull/29604
6115 [1.6p]: https://github.com/rust-lang/rust/pull/29726
6116 [1.6rp]: https://github.com/rust-lang/rust/pull/30034
6117 [1.6rr]: https://github.com/rust-lang/cargo/pull/2134
6118 [1.6s]: https://github.com/rust-lang/rust/pull/29675
6119 [1.6ts]: https://github.com/rust-lang/rust/issues/21546
6120 [1.6uc]: https://github.com/rust-lang/rust/pull/29837
6121 [1.6us]: https://github.com/rust-lang/rust/pull/29383
6122 [1.6xc]: https://github.com/rust-lang/rust/issues/30123
6123 [RFC 1184]: https://github.com/rust-lang/rfcs/blob/master/text/1184-stabilize-no_std.md
6124 [RFC 1241]: https://github.com/rust-lang/rfcs/blob/master/text/1241-no-wildcard-deps.md
6125 [`ErrorKind::UnexpectedEof`]: http://doc.rust-lang.org/nightly/std/io/enum.ErrorKind.html#variant.UnexpectedEof
6126 [`Iterator::max_by_key`]: http://doc.rust-lang.org/nightly/std/iter/trait.Iterator.html#method.max_by_key
6127 [`Iterator::min_by_key`]: http://doc.rust-lang.org/nightly/std/iter/trait.Iterator.html#method.min_by_key
6128 [`Mutex::get_mut`]: http://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html#method.get_mut
6129 [`Mutex::into_inner`]: http://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html#method.into_inner
6130 [`Read::read_exact`]: http://doc.rust-lang.org/nightly/std/io/trait.Read.html#method.read_exact
6131 [`RwLock::get_mut`]: http://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html#method.get_mut
6132 [`RwLock::into_inner`]: http://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html#method.into_inner
6133 [`Vec::extend_from_slice`]: http://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html#method.extend_from_slice
6134 [`collections::binary_heap::BinaryHeap::drain`]: http://doc.rust-lang.org/nightly/std/collections/binary_heap/struct.BinaryHeap.html#method.drain
6135 [`collections::binary_heap::Drain`]: http://doc.rust-lang.org/nightly/std/collections/binary_heap/struct.Drain.html
6136 [`collections::hash_map::Drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.Drain.html
6137 [`collections::hash_map::HashMap::drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.HashMap.html#method.drain
6138 [`collections::hash_set::Drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_set/struct.Drain.html
6139 [`collections::hash_set::HashSet::drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_set/struct.HashSet.html#method.drain
6140 [`fs::DirBuilder::create`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html#method.create
6141 [`fs::DirBuilder::new`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html#method.new
6142 [`fs::DirBuilder::recursive`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html#method.recursive
6143 [`fs::DirBuilder`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html
6144 [`os::unix::fs::DirBuilderExt::mode`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.DirBuilderExt.html#tymethod.mode
6145 [`os::unix::fs::DirBuilderExt`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.DirBuilderExt.html
6146 [`string::Drain`]: http://doc.rust-lang.org/nightly/std/string/struct.Drain.html
6147 [`string::String::drain`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.drain
6148 [`vec::Drain`]: http://doc.rust-lang.org/nightly/std/vec/struct.Drain.html
6149 [`vec::Vec::drain`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.drain
6150 [`vec_deque::Drain`]: http://doc.rust-lang.org/nightly/std/collections/vec_deque/struct.Drain.html
6151 [`vec_deque::VecDeque::drain`]: http://doc.rust-lang.org/nightly/std/collections/vec_deque/struct.VecDeque.html#method.drain
6152
6153
6154 Version 1.5.0 (2015-12-10)
6155 ==========================
6156
6157 * ~700 changes, numerous bugfixes
6158
6159 Highlights
6160 ----------
6161
6162 * Stabilized APIs:
6163 [`BinaryHeap::from`], [`BinaryHeap::into_sorted_vec`],
6164 [`BinaryHeap::into_vec`], [`Condvar::wait_timeout`],
6165 [`FileTypeExt::is_block_device`], [`FileTypeExt::is_char_device`],
6166 [`FileTypeExt::is_fifo`], [`FileTypeExt::is_socket`],
6167 [`FileTypeExt`], [`Formatter::alternate`], [`Formatter::fill`],
6168 [`Formatter::precision`], [`Formatter::sign_aware_zero_pad`],
6169 [`Formatter::sign_minus`], [`Formatter::sign_plus`],
6170 [`Formatter::width`], [`Iterator::cmp`], [`Iterator::eq`],
6171 [`Iterator::ge`], [`Iterator::gt`], [`Iterator::le`],
6172 [`Iterator::lt`], [`Iterator::ne`], [`Iterator::partial_cmp`],
6173 [`Path::canonicalize`], [`Path::exists`], [`Path::is_dir`],
6174 [`Path::is_file`], [`Path::metadata`], [`Path::read_dir`],
6175 [`Path::read_link`], [`Path::symlink_metadata`],
6176 [`Utf8Error::valid_up_to`], [`Vec::resize`],
6177 [`VecDeque::as_mut_slices`], [`VecDeque::as_slices`],
6178 [`VecDeque::insert`], [`VecDeque::shrink_to_fit`],
6179 [`VecDeque::swap_remove_back`], [`VecDeque::swap_remove_front`],
6180 [`slice::split_first_mut`], [`slice::split_first`],
6181 [`slice::split_last_mut`], [`slice::split_last`],
6182 [`char::from_u32_unchecked`], [`fs::canonicalize`],
6183 [`str::MatchIndices`], [`str::RMatchIndices`],
6184 [`str::match_indices`], [`str::rmatch_indices`],
6185 [`str::slice_mut_unchecked`], [`string::ParseError`].
6186 * Rust applications hosted on crates.io can be installed locally to
6187 `~/.cargo/bin` with the [`cargo install`] command. Among other
6188 things this makes it easier to augment Cargo with new subcommands:
6189 when a binary named e.g. `cargo-foo` is found in `$PATH` it can be
6190 invoked as `cargo foo`.
6191 * Crates with wildcard (`*`) dependencies will [emit warnings when
6192 published][1.5w]. In 1.6 it will no longer be possible to publish
6193 crates with wildcard dependencies.
6194
6195 Breaking Changes
6196 ----------------
6197
6198 * The rules determining when a particular lifetime must outlive
6199 a particular value (known as '[dropck]') have been [modified
6200 to not rely on parametricity][1.5p].
6201 * [Implementations of `AsRef` and `AsMut` were added to `Box`, `Rc`,
6202 and `Arc`][1.5a]. Because these smart pointer types implement
6203 `Deref`, this causes breakage in cases where the interior type
6204 contains methods of the same name.
6205 * [Correct a bug in Rc/Arc][1.5c] that caused [dropck] to be unaware
6206 that they could drop their content. Soundness fix.
6207 * All method invocations are [properly checked][1.5wf1] for
6208 [well-formedness][1.5wf2]. Soundness fix.
6209 * Traits whose supertraits contain `Self` are [not object
6210 safe][1.5o]. Soundness fix.
6211 * Target specifications support a [`no_default_libraries`][1.5nd]
6212 setting that controls whether `-nodefaultlibs` is passed to the
6213 linker, and in turn the `is_like_windows` setting no longer affects
6214 the `-nodefaultlibs` flag.
6215 * `#[derive(Show)]`, long-deprecated, [has been removed][1.5ds].
6216 * The `#[inline]` and `#[repr]` attributes [can only appear
6217 in valid locations][1.5at].
6218 * Native libraries linked from the local crate are [passed to
6219 the linker before native libraries from upstream crates][1.5nl].
6220 * Two rarely-used attributes, `#[no_debug]` and
6221 `#[omit_gdb_pretty_printer_section]` [are feature gated][1.5fg].
6222 * Negation of unsigned integers, which has been a warning for
6223 several releases, [is now behind a feature gate and will
6224 generate errors][1.5nu].
6225 * The parser accidentally accepted visibility modifiers on
6226 enum variants, a bug [which has been fixed][1.5ev].
6227 * [A bug was fixed that allowed `use` statements to import unstable
6228 features][1.5use].
6229
6230 Language
6231 --------
6232
6233 * When evaluating expressions at compile-time that are not
6234 compile-time constants (const-evaluating expressions in non-const
6235 contexts), incorrect code such as overlong bitshifts and arithmetic
6236 overflow will [generate a warning instead of an error][1.5ce],
6237 delaying the error until runtime. This will allow the
6238 const-evaluator to be expanded in the future backwards-compatibly.
6239 * The `improper_ctypes` lint [no longer warns about using `isize` and
6240 `usize` in FFI][1.5ict].
6241
6242 Libraries
6243 ---------
6244
6245 * `Arc<T>` and `Rc<T>` are [covariant with respect to `T` instead of
6246 invariant][1.5c].
6247 * `Default` is [implemented for mutable slices][1.5d].
6248 * `FromStr` is [implemented for `SockAddrV4` and `SockAddrV6`][1.5s].
6249 * There are now `From` conversions [between floating point
6250 types][1.5f] where the conversions are lossless.
6251 * There are now `From` conversions [between integer types][1.5i] where
6252 the conversions are lossless.
6253 * [`fs::Metadata` implements `Clone`][1.5fs].
6254 * The `parse` method [accepts a leading "+" when parsing
6255 integers][1.5pi].
6256 * [`AsMut` is implemented for `Vec`][1.5am].
6257 * The `clone_from` implementations for `String` and `BinaryHeap` [have
6258 been optimized][1.5cf] and no longer rely on the default impl.
6259 * The `extern "Rust"`, `extern "C"`, `unsafe extern "Rust"` and
6260 `unsafe extern "C"` function types now [implement `Clone`,
6261 `PartialEq`, `Eq`, `PartialOrd`, `Ord`, `Hash`, `fmt::Pointer`, and
6262 `fmt::Debug` for up to 12 arguments][1.5fp].
6263 * [Dropping `Vec`s is much faster in unoptimized builds when the
6264 element types don't implement `Drop`][1.5dv].
6265 * A bug that caused in incorrect behavior when [combining `VecDeque`
6266 with zero-sized types][1.5vdz] was resolved.
6267 * [`PartialOrd` for slices is faster][1.5po].
6268
6269 Miscellaneous
6270 -------------
6271
6272 * [Crate metadata size was reduced by 20%][1.5md].
6273 * [Improvements to code generation reduced the size of libcore by 3.3
6274 MB and rustc's memory usage by 18MB][1.5m].
6275 * [Improvements to deref translation increased performance in
6276 unoptimized builds][1.5dr].
6277 * Various errors in trait resolution [are deduplicated to only be
6278 reported once][1.5te].
6279 * Rust has preliminary [support for rumprun kernels][1.5rr].
6280 * Rust has preliminary [support for NetBSD on amd64][1.5na].
6281
6282 [1.5use]: https://github.com/rust-lang/rust/pull/28364
6283 [1.5po]: https://github.com/rust-lang/rust/pull/28436
6284 [1.5ev]: https://github.com/rust-lang/rust/pull/28442
6285 [1.5nu]: https://github.com/rust-lang/rust/pull/28468
6286 [1.5dr]: https://github.com/rust-lang/rust/pull/28491
6287 [1.5vdz]: https://github.com/rust-lang/rust/pull/28494
6288 [1.5md]: https://github.com/rust-lang/rust/pull/28521
6289 [1.5fg]: https://github.com/rust-lang/rust/pull/28522
6290 [1.5dv]: https://github.com/rust-lang/rust/pull/28531
6291 [1.5na]: https://github.com/rust-lang/rust/pull/28543
6292 [1.5fp]: https://github.com/rust-lang/rust/pull/28560
6293 [1.5rr]: https://github.com/rust-lang/rust/pull/28593
6294 [1.5cf]: https://github.com/rust-lang/rust/pull/28602
6295 [1.5nl]: https://github.com/rust-lang/rust/pull/28605
6296 [1.5te]: https://github.com/rust-lang/rust/pull/28645
6297 [1.5at]: https://github.com/rust-lang/rust/pull/28650
6298 [1.5am]: https://github.com/rust-lang/rust/pull/28663
6299 [1.5m]: https://github.com/rust-lang/rust/pull/28778
6300 [1.5ict]: https://github.com/rust-lang/rust/pull/28779
6301 [1.5a]: https://github.com/rust-lang/rust/pull/28811
6302 [1.5pi]: https://github.com/rust-lang/rust/pull/28826
6303 [1.5ce]: https://github.com/rust-lang/rfcs/blob/master/text/1229-compile-time-asserts.md
6304 [1.5p]: https://github.com/rust-lang/rfcs/blob/master/text/1238-nonparametric-dropck.md
6305 [1.5i]: https://github.com/rust-lang/rust/pull/28921
6306 [1.5fs]: https://github.com/rust-lang/rust/pull/29021
6307 [1.5f]: https://github.com/rust-lang/rust/pull/29129
6308 [1.5ds]: https://github.com/rust-lang/rust/pull/29148
6309 [1.5s]: https://github.com/rust-lang/rust/pull/29190
6310 [1.5d]: https://github.com/rust-lang/rust/pull/29245
6311 [1.5o]: https://github.com/rust-lang/rust/pull/29259
6312 [1.5nd]: https://github.com/rust-lang/rust/pull/28578
6313 [1.5wf2]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
6314 [1.5wf1]: https://github.com/rust-lang/rust/pull/28669
6315 [dropck]: https://doc.rust-lang.org/nightly/nomicon/dropck.html
6316 [1.5c]: https://github.com/rust-lang/rust/pull/29110
6317 [1.5w]: https://github.com/rust-lang/rfcs/blob/master/text/1241-no-wildcard-deps.md
6318 [`cargo install`]: https://github.com/rust-lang/rfcs/blob/master/text/1200-cargo-install.md
6319 [`BinaryHeap::from`]: http://doc.rust-lang.org/nightly/std/convert/trait.From.html#method.from
6320 [`BinaryHeap::into_sorted_vec`]: http://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html#method.into_sorted_vec
6321 [`BinaryHeap::into_vec`]: http://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html#method.into_vec
6322 [`Condvar::wait_timeout`]: http://doc.rust-lang.org/nightly/std/sync/struct.Condvar.html#method.wait_timeout
6323 [`FileTypeExt::is_block_device`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_block_device
6324 [`FileTypeExt::is_char_device`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_char_device
6325 [`FileTypeExt::is_fifo`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_fifo
6326 [`FileTypeExt::is_socket`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_socket
6327 [`FileTypeExt`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html
6328 [`Formatter::alternate`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.alternate
6329 [`Formatter::fill`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.fill
6330 [`Formatter::precision`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.precision
6331 [`Formatter::sign_aware_zero_pad`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.sign_aware_zero_pad
6332 [`Formatter::sign_minus`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.sign_minus
6333 [`Formatter::sign_plus`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.sign_plus
6334 [`Formatter::width`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.width
6335 [`Iterator::cmp`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.cmp
6336 [`Iterator::eq`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.eq
6337 [`Iterator::ge`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.ge
6338 [`Iterator::gt`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.gt
6339 [`Iterator::le`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.le
6340 [`Iterator::lt`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.lt
6341 [`Iterator::ne`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.ne
6342 [`Iterator::partial_cmp`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.partial_cmp
6343 [`Path::canonicalize`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.canonicalize
6344 [`Path::exists`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.exists
6345 [`Path::is_dir`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.is_dir
6346 [`Path::is_file`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.is_file
6347 [`Path::metadata`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.metadata
6348 [`Path::read_dir`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.read_dir
6349 [`Path::read_link`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.read_link
6350 [`Path::symlink_metadata`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.symlink_metadata
6351 [`Utf8Error::valid_up_to`]: http://doc.rust-lang.org/nightly/core/str/struct.Utf8Error.html#method.valid_up_to
6352 [`Vec::resize`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.resize
6353 [`VecDeque::as_mut_slices`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.as_mut_slices
6354 [`VecDeque::as_slices`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.as_slices
6355 [`VecDeque::insert`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.insert
6356 [`VecDeque::shrink_to_fit`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.shrink_to_fit
6357 [`VecDeque::swap_remove_back`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.swap_remove_back
6358 [`VecDeque::swap_remove_front`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.swap_remove_front
6359 [`slice::split_first_mut`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_first_mut
6360 [`slice::split_first`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_first
6361 [`slice::split_last_mut`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_last_mut
6362 [`slice::split_last`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_last
6363 [`char::from_u32_unchecked`]: http://doc.rust-lang.org/nightly/std/char/fn.from_u32_unchecked.html
6364 [`fs::canonicalize`]: http://doc.rust-lang.org/nightly/std/fs/fn.canonicalize.html
6365 [`str::MatchIndices`]: http://doc.rust-lang.org/nightly/std/str/struct.MatchIndices.html
6366 [`str::RMatchIndices`]: http://doc.rust-lang.org/nightly/std/str/struct.RMatchIndices.html
6367 [`str::match_indices`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.match_indices
6368 [`str::rmatch_indices`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.rmatch_indices
6369 [`str::slice_mut_unchecked`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.slice_mut_unchecked
6370 [`string::ParseError`]: http://doc.rust-lang.org/nightly/std/string/enum.ParseError.html
6371
6372 Version 1.4.0 (2015-10-29)
6373 ==========================
6374
6375 * ~1200 changes, numerous bugfixes
6376
6377 Highlights
6378 ----------
6379
6380 * Windows builds targeting the 64-bit MSVC ABI and linker (instead of
6381 GNU) are now supported and recommended for use.
6382
6383 Breaking Changes
6384 ----------------
6385
6386 * [Several changes have been made to fix type soundness and improve
6387 the behavior of associated types][sound]. See [RFC 1214]. Although
6388 we have mostly introduced these changes as warnings this release, to
6389 become errors next release, there are still some scenarios that will
6390 see immediate breakage.
6391 * [The `str::lines` and `BufRead::lines` iterators treat `\r\n` as
6392 line breaks in addition to `\n`][crlf].
6393 * [Loans of `'static` lifetime extend to the end of a function][stat].
6394 * [`str::parse` no longer introduces avoidable rounding error when
6395 parsing floating point numbers. Together with earlier changes to
6396 float formatting/output, "round trips" like f.to_string().parse()
6397 now preserve the value of f exactly. Additionally, leading plus
6398 signs are now accepted][fp3].
6399
6400
6401 Language
6402 --------
6403
6404 * `use` statements that import multiple items [can now rename
6405 them][i], as in `use foo::{bar as kitten, baz as puppy}`.
6406 * [Binops work correctly on fat pointers][binfat].
6407 * `pub extern crate`, which does not behave as expected, [issues a
6408 warning][pec] until a better solution is found.
6409
6410 Libraries
6411 ---------
6412
6413 * [Many APIs were stabilized][stab]: `<Box<str>>::into_string`,
6414 [`Arc::downgrade`], [`Arc::get_mut`], [`Arc::make_mut`],
6415 [`Arc::try_unwrap`], [`Box::from_raw`], [`Box::into_raw`], [`CStr::to_str`],
6416 [`CStr::to_string_lossy`], [`CString::from_raw`], [`CString::into_raw`],
6417 [`IntoRawFd::into_raw_fd`], [`IntoRawFd`],
6418 `IntoRawHandle::into_raw_handle`, `IntoRawHandle`,
6419 `IntoRawSocket::into_raw_socket`, `IntoRawSocket`, [`Rc::downgrade`],
6420 [`Rc::get_mut`], [`Rc::make_mut`], [`Rc::try_unwrap`], [`Result::expect`],
6421 [`String::into_boxed_str`], [`TcpStream::read_timeout`],
6422 [`TcpStream::set_read_timeout`], [`TcpStream::set_write_timeout`],
6423 [`TcpStream::write_timeout`], [`UdpSocket::read_timeout`],
6424 [`UdpSocket::set_read_timeout`], [`UdpSocket::set_write_timeout`],
6425 [`UdpSocket::write_timeout`], `Vec::append`, `Vec::split_off`,
6426 [`VecDeque::append`], [`VecDeque::retain`], [`VecDeque::split_off`],
6427 [`rc::Weak::upgrade`], [`rc::Weak`], [`slice::Iter::as_slice`],
6428 [`slice::IterMut::into_slice`], [`str::CharIndices::as_str`],
6429 [`str::Chars::as_str`], [`str::split_at_mut`], [`str::split_at`],
6430 [`sync::Weak::upgrade`], [`sync::Weak`], [`thread::park_timeout`],
6431 [`thread::sleep`].
6432 * [Some APIs were deprecated][dep]: `BTreeMap::with_b`,
6433 `BTreeSet::with_b`, `Option::as_mut_slice`, `Option::as_slice`,
6434 `Result::as_mut_slice`, `Result::as_slice`, `f32::from_str_radix`,
6435 `f64::from_str_radix`.
6436 * [Reverse-searching strings is faster with the 'two-way'
6437 algorithm][s].
6438 * [`std::io::copy` allows `?Sized` arguments][cc].
6439 * The `Windows`, `Chunks`, and `ChunksMut` iterators over slices all
6440 [override `count`, `nth` and `last` with an O(1)
6441 implementation][it].
6442 * [`Default` is implemented for arrays up to `[T; 32]`][d].
6443 * [`IntoRawFd` has been added to the Unix-specific prelude,
6444 `IntoRawSocket` and `IntoRawHandle` to the Windows-specific
6445 prelude][pr].
6446 * [`Extend<String>` and `FromIterator<String` are both implemented for
6447 `String`][es].
6448 * [`IntoIterator` is implemented for references to `Option` and
6449 `Result`][into2].
6450 * [`HashMap` and `HashSet` implement `Extend<&T>` where `T:
6451 Copy`][ext] as part of [RFC 839]. This will cause type inference
6452 breakage in rare situations.
6453 * [`BinaryHeap` implements `Debug`][bh2].
6454 * [`Borrow` and `BorrowMut` are implemented for fixed-size
6455 arrays][bm].
6456 * [`extern fn`s with the "Rust" and "C" ABIs implement common
6457 traits including `Eq`, `Ord`, `Debug`, `Hash`][fp].
6458 * [String comparison is faster][faststr].
6459 * `&mut T` where `T: std::fmt::Write` [also implements
6460 `std::fmt::Write`][mutw].
6461 * [A stable regression in `VecDeque::push_back` and other
6462 capacity-altering methods that caused panics for zero-sized types
6463 was fixed][vd].
6464 * [Function pointers implement traits for up to 12 parameters][fp2].
6465
6466 Miscellaneous
6467 -------------
6468
6469 * The compiler [no longer uses the 'morestack' feature to prevent
6470 stack overflow][mm]. Instead it uses guard pages and stack
6471 probes (though stack probes are not yet implemented on any platform
6472 but Windows).
6473 * [The compiler matches traits faster when projections are involved][p].
6474 * The 'improper_ctypes' lint [no longer warns about use of `isize` and
6475 `usize`][ffi].
6476 * [Cargo now displays useful information about what its doing during
6477 `cargo update`][cu].
6478
6479 [`Arc::downgrade`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.downgrade
6480 [`Arc::make_mut`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.make_mut
6481 [`Arc::get_mut`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.get_mut
6482 [`Arc::try_unwrap`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.try_unwrap
6483 [`Box::from_raw`]: http://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html#method.from_raw
6484 [`Box::into_raw`]: http://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html#method.into_raw
6485 [`CStr::to_str`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html#method.to_str
6486 [`CStr::to_string_lossy`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html#method.to_string_lossy
6487 [`CString::from_raw`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.from_raw
6488 [`CString::into_raw`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_raw
6489 [`IntoRawFd::into_raw_fd`]: http://doc.rust-lang.org/nightly/std/os/unix/io/trait.IntoRawFd.html#tymethod.into_raw_fd
6490 [`IntoRawFd`]: http://doc.rust-lang.org/nightly/std/os/unix/io/trait.IntoRawFd.html
6491 [`Rc::downgrade`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.downgrade
6492 [`Rc::get_mut`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.get_mut
6493 [`Rc::make_mut`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.make_mut
6494 [`Rc::try_unwrap`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.try_unwrap
6495 [`Result::expect`]: http://doc.rust-lang.org/nightly/core/result/enum.Result.html#method.expect
6496 [`String::into_boxed_str`]: http://doc.rust-lang.org/nightly/collections/string/struct.String.html#method.into_boxed_str
6497 [`TcpStream::read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.read_timeout
6498 [`TcpStream::set_read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_read_timeout
6499 [`TcpStream::write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.write_timeout
6500 [`TcpStream::set_write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_write_timeout
6501 [`UdpSocket::read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.read_timeout
6502 [`UdpSocket::set_read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_read_timeout
6503 [`UdpSocket::write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.write_timeout
6504 [`UdpSocket::set_write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_write_timeout
6505 [`VecDeque::append`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.append
6506 [`VecDeque::retain`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.retain
6507 [`VecDeque::split_off`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.split_off
6508 [`rc::Weak::upgrade`]: http://doc.rust-lang.org/nightly/std/rc/struct.Weak.html#method.upgrade
6509 [`rc::Weak`]: http://doc.rust-lang.org/nightly/std/rc/struct.Weak.html
6510 [`slice::Iter::as_slice`]: http://doc.rust-lang.org/nightly/std/slice/struct.Iter.html#method.as_slice
6511 [`slice::IterMut::into_slice`]: http://doc.rust-lang.org/nightly/std/slice/struct.IterMut.html#method.into_slice
6512 [`str::CharIndices::as_str`]: http://doc.rust-lang.org/nightly/std/str/struct.CharIndices.html#method.as_str
6513 [`str::Chars::as_str`]: http://doc.rust-lang.org/nightly/std/str/struct.Chars.html#method.as_str
6514 [`str::split_at_mut`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_at_mut
6515 [`str::split_at`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_at
6516 [`sync::Weak::upgrade`]: http://doc.rust-lang.org/nightly/std/sync/struct.Weak.html#method.upgrade
6517 [`sync::Weak`]: http://doc.rust-lang.org/nightly/std/sync/struct.Weak.html
6518 [`thread::park_timeout`]: http://doc.rust-lang.org/nightly/std/thread/fn.park_timeout.html
6519 [`thread::sleep`]: http://doc.rust-lang.org/nightly/std/thread/fn.sleep.html
6520 [bh2]: https://github.com/rust-lang/rust/pull/28156
6521 [binfat]: https://github.com/rust-lang/rust/pull/28270
6522 [bm]: https://github.com/rust-lang/rust/pull/28197
6523 [cc]: https://github.com/rust-lang/rust/pull/27531
6524 [crlf]: https://github.com/rust-lang/rust/pull/28034
6525 [cu]: https://github.com/rust-lang/cargo/pull/1931
6526 [d]: https://github.com/rust-lang/rust/pull/27825
6527 [dep]: https://github.com/rust-lang/rust/pull/28339
6528 [es]: https://github.com/rust-lang/rust/pull/27956
6529 [ext]: https://github.com/rust-lang/rust/pull/28094
6530 [faststr]: https://github.com/rust-lang/rust/pull/28338
6531 [ffi]: https://github.com/rust-lang/rust/pull/28779
6532 [fp]: https://github.com/rust-lang/rust/pull/28268
6533 [fp2]: https://github.com/rust-lang/rust/pull/28560
6534 [fp3]: https://github.com/rust-lang/rust/pull/27307
6535 [i]: https://github.com/rust-lang/rust/pull/27451
6536 [into2]: https://github.com/rust-lang/rust/pull/28039
6537 [it]: https://github.com/rust-lang/rust/pull/27652
6538 [mm]: https://github.com/rust-lang/rust/pull/27338
6539 [mutw]: https://github.com/rust-lang/rust/pull/28368
6540 [sound]: https://github.com/rust-lang/rust/pull/27641
6541 [p]: https://github.com/rust-lang/rust/pull/27866
6542 [pec]: https://github.com/rust-lang/rust/pull/28486
6543 [pr]: https://github.com/rust-lang/rust/pull/27896
6544 [RFC 839]: https://github.com/rust-lang/rfcs/blob/master/text/0839-embrace-extend-extinguish.md
6545 [RFC 1214]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
6546 [s]: https://github.com/rust-lang/rust/pull/27474
6547 [stab]: https://github.com/rust-lang/rust/pull/28339
6548 [stat]: https://github.com/rust-lang/rust/pull/28321
6549 [vd]: https://github.com/rust-lang/rust/pull/28494
6550
6551 Version 1.3.0 (2015-09-17)
6552 ==============================
6553
6554 * ~900 changes, numerous bugfixes
6555
6556 Highlights
6557 ----------
6558
6559 * The [new object lifetime defaults][nold] have been [turned
6560 on][nold2] after a cycle of warnings about the change. Now types
6561 like `&'a Box<Trait>` (or `&'a Rc<Trait>`, etc) will change from
6562 being interpreted as `&'a Box<Trait+'a>` to `&'a
6563 Box<Trait+'static>`.
6564 * [The Rustonomicon][nom] is a new book in the official documentation
6565 that dives into writing unsafe Rust.
6566 * The [`Duration`] API, [has been stabilized][ds]. This basic unit of
6567 timekeeping is employed by other std APIs, as well as out-of-tree
6568 time crates.
6569
6570 Breaking Changes
6571 ----------------
6572
6573 * The [new object lifetime defaults][nold] have been [turned
6574 on][nold2] after a cycle of warnings about the change.
6575 * There is a known [regression][lr] in how object lifetime elision is
6576 interpreted, the proper solution for which is undetermined.
6577 * The `#[prelude_import]` attribute, an internal implementation
6578 detail, was accidentally stabilized previously. [It has been put
6579 behind the `prelude_import` feature gate][pi]. This change is
6580 believed to break no existing code.
6581 * The behavior of [`size_of_val`][dst1] and [`align_of_val`][dst2] is
6582 [more sane for dynamically sized types][dst3]. Code that relied on
6583 the previous behavior is thought to be broken.
6584 * The `dropck` rules, which checks that destructors can't access
6585 destroyed values, [have been updated][dropck] to match the
6586 [RFC][dropckrfc]. This fixes some soundness holes, and as such will
6587 cause some previously-compiling code to no longer build.
6588
6589 Language
6590 --------
6591
6592 * The [new object lifetime defaults][nold] have been [turned
6593 on][nold2] after a cycle of warnings about the change.
6594 * Semicolons may [now follow types and paths in
6595 macros](https://github.com/rust-lang/rust/pull/27000).
6596 * The behavior of [`size_of_val`][dst1] and [`align_of_val`][dst2] is
6597 [more sane for dynamically sized types][dst3]. Code that relied on
6598 the previous behavior is not known to exist, and suspected to be
6599 broken.
6600 * `'static` variables [may now be recursive][st].
6601 * `ref` bindings choose between [`Deref`] and [`DerefMut`]
6602 implementations correctly.
6603 * The `dropck` rules, which checks that destructors can't access
6604 destroyed values, [have been updated][dropck] to match the
6605 [RFC][dropckrfc].
6606
6607 Libraries
6608 ---------
6609
6610 * The [`Duration`] API, [has been stabilized][ds], as well as the
6611 `std::time` module, which presently contains only `Duration`.
6612 * `Box<str>` and `Box<[T]>` both implement `Clone`.
6613 * The owned C string, [`CString`], implements [`Borrow`] and the
6614 borrowed C string, [`CStr`], implements [`ToOwned`]. The two of
6615 these allow C strings to be borrowed and cloned in generic code.
6616 * [`CStr`] implements [`Debug`].
6617 * [`AtomicPtr`] implements [`Debug`].
6618 * [`Error`] trait objects [can be downcast to their concrete types][e]
6619 in many common configurations, using the [`is`], [`downcast`],
6620 [`downcast_ref`] and [`downcast_mut`] methods, similarly to the
6621 [`Any`] trait.
6622 * Searching for substrings now [employs the two-way algorithm][search]
6623 instead of doing a naive search. This gives major speedups to a
6624 number of methods, including [`contains`][sc], [`find`][sf],
6625 [`rfind`][srf], [`split`][ss]. [`starts_with`][ssw] and
6626 [`ends_with`][sew] are also faster.
6627 * The performance of `PartialEq` for slices is [much faster][ps].
6628 * The [`Hash`] trait offers the default method, [`hash_slice`], which
6629 is overridden and optimized by the implementations for scalars.
6630 * The [`Hasher`] trait now has a number of specialized `write_*`
6631 methods for primitive types, for efficiency.
6632 * The I/O-specific error type, [`std::io::Error`][ie], gained a set of
6633 methods for accessing the 'inner error', if any: [`get_ref`][iegr],
6634 [`get_mut`][iegm], [`into_inner`][ieii]. As well, the implementation
6635 of [`std::error::Error::cause`][iec] also delegates to the inner
6636 error.
6637 * [`process::Child`][pc] gained the [`id`] method, which returns a
6638 `u32` representing the platform-specific process identifier.
6639 * The [`connect`] method on slices is deprecated, replaced by the new
6640 [`join`] method (note that both of these are on the *unstable*
6641 [`SliceConcatExt`] trait, but through the magic of the prelude are
6642 available to stable code anyway).
6643 * The [`Div`] operator is implemented for [`Wrapping`] types.
6644 * [`DerefMut` is implemented for `String`][dms].
6645 * Performance of SipHash (the default hasher for `HashMap`) is
6646 [better for long data][sh].
6647 * [`AtomicPtr`] implements [`Send`].
6648 * The [`read_to_end`] implementations for [`Stdin`] and [`File`]
6649 are now [specialized to use uninitialized buffers for increased
6650 performance][rte].
6651 * Lifetime parameters of foreign functions [are now resolved
6652 properly][f].
6653
6654 Misc
6655 ----
6656
6657 * Rust can now, with some coercion, [produce programs that run on
6658 Windows XP][xp], though XP is not considered a supported platform.
6659 * Porting Rust on Windows from the GNU toolchain to MSVC continues
6660 ([1][win1], [2][win2], [3][win3], [4][win4]). It is still not
6661 recommended for use in 1.3, though should be fully-functional
6662 in the [64-bit 1.4 beta][b14].
6663 * On Fedora-based systems installation will [properly configure the
6664 dynamic linker][fl].
6665 * The compiler gained many new extended error descriptions, which can
6666 be accessed with the `--explain` flag.
6667 * The `dropck` pass, which checks that destructors can't access
6668 destroyed values, [has been rewritten][dropck]. This fixes some
6669 soundness holes, and as such will cause some previously-compiling
6670 code to no longer build.
6671 * `rustc` now uses [LLVM to write archive files where possible][ar].
6672 Eventually this will eliminate the compiler's dependency on the ar
6673 utility.
6674 * Rust has [preliminary support for i686 FreeBSD][fb] (it has long
6675 supported FreeBSD on x86_64).
6676 * The [`unused_mut`][lum], [`unconditional_recursion`][lur],
6677 [`improper_ctypes`][lic], and [`negate_unsigned`][lnu] lints are
6678 more strict.
6679 * If landing pads are disabled (with `-Z no-landing-pads`), [`panic!`
6680 will kill the process instead of leaking][nlp].
6681
6682 [`Any`]: http://doc.rust-lang.org/nightly/std/any/trait.Any.html
6683 [`AtomicPtr`]: http://doc.rust-lang.org/nightly/std/sync/atomic/struct.AtomicPtr.html
6684 [`Borrow`]: http://doc.rust-lang.org/nightly/std/borrow/trait.Borrow.html
6685 [`CStr`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html
6686 [`CString`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html
6687 [`Debug`]: http://doc.rust-lang.org/nightly/std/fmt/trait.Debug.html
6688 [`DerefMut`]: http://doc.rust-lang.org/nightly/std/ops/trait.DerefMut.html
6689 [`Deref`]: http://doc.rust-lang.org/nightly/std/ops/trait.Deref.html
6690 [`Div`]: http://doc.rust-lang.org/nightly/std/ops/trait.Div.html
6691 [`Duration`]: http://doc.rust-lang.org/nightly/std/time/struct.Duration.html
6692 [`Error`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html
6693 [`File`]: http://doc.rust-lang.org/nightly/std/fs/struct.File.html
6694 [`Hash`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html
6695 [`Hasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hasher.html
6696 [`Send`]: http://doc.rust-lang.org/nightly/std/marker/trait.Send.html
6697 [`SliceConcatExt`]: http://doc.rust-lang.org/nightly/std/slice/trait.SliceConcatExt.html
6698 [`Stdin`]: http://doc.rust-lang.org/nightly/std/io/struct.Stdin.html
6699 [`ToOwned`]: http://doc.rust-lang.org/nightly/std/borrow/trait.ToOwned.html
6700 [`Wrapping`]: http://doc.rust-lang.org/nightly/std/num/struct.Wrapping.html
6701 [`connect`]: http://doc.rust-lang.org/nightly/std/slice/trait.SliceConcatExt.html#method.connect
6702 [`downcast_mut`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.downcast_mut
6703 [`downcast_ref`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.downcast_ref
6704 [`downcast`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.downcast
6705 [`hash_slice`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html#method.hash_slice
6706 [`id`]: http://doc.rust-lang.org/nightly/std/process/struct.Child.html#method.id
6707 [`is`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.is
6708 [`join`]: http://doc.rust-lang.org/nightly/std/slice/trait.SliceConcatExt.html#method.join
6709 [`read_to_end`]: http://doc.rust-lang.org/nightly/std/io/trait.Read.html#method.read_to_end
6710 [ar]: https://github.com/rust-lang/rust/pull/26926
6711 [b14]: https://static.rust-lang.org/dist/rust-beta-x86_64-pc-windows-msvc.msi
6712 [dms]: https://github.com/rust-lang/rust/pull/26241
6713 [dropck]: https://github.com/rust-lang/rust/pull/27261
6714 [dropckrfc]: https://github.com/rust-lang/rfcs/blob/master/text/0769-sound-generic-drop.md
6715 [ds]: https://github.com/rust-lang/rust/pull/26818
6716 [dst1]: http://doc.rust-lang.org/nightly/std/mem/fn.size_of_val.html
6717 [dst2]: http://doc.rust-lang.org/nightly/std/mem/fn.align_of_val.html
6718 [dst3]: https://github.com/rust-lang/rust/pull/27351
6719 [e]: https://github.com/rust-lang/rust/pull/24793
6720 [f]: https://github.com/rust-lang/rust/pull/26588
6721 [fb]: https://github.com/rust-lang/rust/pull/26959
6722 [fl]: https://github.com/rust-lang/rust-installer/pull/41
6723 [hs]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html#method.hash_slice
6724 [ie]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html
6725 [iec]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.cause
6726 [iegm]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.get_mut
6727 [iegr]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.get_ref
6728 [ieii]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.into_inner
6729 [lic]: https://github.com/rust-lang/rust/pull/26583
6730 [lnu]: https://github.com/rust-lang/rust/pull/27026
6731 [lr]: https://github.com/rust-lang/rust/issues/27248
6732 [lum]: https://github.com/rust-lang/rust/pull/26378
6733 [lur]: https://github.com/rust-lang/rust/pull/26783
6734 [nlp]: https://github.com/rust-lang/rust/pull/27176
6735 [nold2]: https://github.com/rust-lang/rust/pull/27045
6736 [nold]: https://github.com/rust-lang/rfcs/blob/master/text/1156-adjust-default-object-bounds.md
6737 [nom]: http://doc.rust-lang.org/nightly/nomicon/
6738 [pc]: http://doc.rust-lang.org/nightly/std/process/struct.Child.html
6739 [pi]: https://github.com/rust-lang/rust/pull/26699
6740 [ps]: https://github.com/rust-lang/rust/pull/26884
6741 [rte]: https://github.com/rust-lang/rust/pull/26950
6742 [sc]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.contains
6743 [search]: https://github.com/rust-lang/rust/pull/26327
6744 [sew]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.ends_with
6745 [sf]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.find
6746 [sh]: https://github.com/rust-lang/rust/pull/27280
6747 [srf]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.rfind
6748 [ss]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split
6749 [ssw]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.starts_with
6750 [st]: https://github.com/rust-lang/rust/pull/26630
6751 [win1]: https://github.com/rust-lang/rust/pull/26569
6752 [win2]: https://github.com/rust-lang/rust/pull/26741
6753 [win3]: https://github.com/rust-lang/rust/pull/26741
6754 [win4]: https://github.com/rust-lang/rust/pull/27210
6755 [xp]: https://github.com/rust-lang/rust/pull/26569
6756
6757 Version 1.2.0 (2015-08-07)
6758 ==========================
6759
6760 * ~1200 changes, numerous bugfixes
6761
6762 Highlights
6763 ----------
6764
6765 * [Dynamically-sized-type coercions][dst] allow smart pointer types
6766 like `Rc` to contain types without a fixed size, arrays and trait
6767 objects, finally enabling use of `Rc<[T]>` and completing the
6768 implementation of DST.
6769 * [Parallel codegen][parcodegen] is now working again, which can
6770 substantially speed up large builds in debug mode; It also gets
6771 another ~33% speedup when bootstrapping on a 4 core machine (using 8
6772 jobs). It's not enabled by default, but will be "in the near
6773 future". It can be activated with the `-C codegen-units=N` flag to
6774 `rustc`.
6775 * This is the first release with [experimental support for linking
6776 with the MSVC linker and lib C on Windows (instead of using the GNU
6777 variants via MinGW)][win]. It is yet recommended only for the most
6778 intrepid Rustaceans.
6779 * Benchmark compilations are showing a 30% improvement in
6780 bootstrapping over 1.1.
6781
6782 Breaking Changes
6783 ----------------
6784
6785 * The [`to_uppercase`] and [`to_lowercase`] methods on `char` now do
6786 unicode case mapping, which is a previously-planned change in
6787 behavior and considered a bugfix.
6788 * [`mem::align_of`] now specifies [the *minimum alignment* for
6789 T][align], which is usually the alignment programs are interested
6790 in, and the same value reported by clang's
6791 `alignof`. [`mem::min_align_of`] is deprecated. This is not known to
6792 break real code.
6793 * [The `#[packed]` attribute is no longer silently accepted by the
6794 compiler][packed]. This attribute did nothing and code that
6795 mentioned it likely did not work as intended.
6796 * Associated type defaults are [now behind the
6797 `associated_type_defaults` feature gate][ad]. In 1.1 associated type
6798 defaults *did not work*, but could be mentioned syntactically. As
6799 such this breakage has minimal impact.
6800
6801 Language
6802 --------
6803
6804 * Patterns with `ref mut` now correctly invoke [`DerefMut`] when
6805 matching against dereferenceable values.
6806
6807 Libraries
6808 ---------
6809
6810 * The [`Extend`] trait, which grows a collection from an iterator, is
6811 implemented over iterators of references, for `String`, `Vec`,
6812 `LinkedList`, `VecDeque`, `EnumSet`, `BinaryHeap`, `VecMap`,
6813 `BTreeSet` and `BTreeMap`. [RFC][extend-rfc].
6814 * The [`iter::once`] function returns an iterator that yields a single
6815 element, and [`iter::empty`] returns an iterator that yields no
6816 elements.
6817 * The [`matches`] and [`rmatches`] methods on `str` return iterators
6818 over substring matches.
6819 * [`Cell`] and [`RefCell`] both implement `Eq`.
6820 * A number of methods for wrapping arithmetic are added to the
6821 integral types, [`wrapping_div`], [`wrapping_rem`],
6822 [`wrapping_neg`], [`wrapping_shl`], [`wrapping_shr`]. These are in
6823 addition to the existing [`wrapping_add`], [`wrapping_sub`], and
6824 [`wrapping_mul`] methods, and alternatives to the [`Wrapping`]
6825 type.. It is illegal for the default arithmetic operations in Rust
6826 to overflow; the desire to wrap must be explicit.
6827 * The `{:#?}` formatting specifier [displays the alternate,
6828 pretty-printed][debugfmt] form of the `Debug` formatter. This
6829 feature was actually introduced prior to 1.0 with little
6830 fanfare.
6831 * [`fmt::Formatter`] implements [`fmt::Write`], a `fmt`-specific trait
6832 for writing data to formatted strings, similar to [`io::Write`].
6833 * [`fmt::Formatter`] adds 'debug builder' methods, [`debug_struct`],
6834 [`debug_tuple`], [`debug_list`], [`debug_set`], [`debug_map`]. These
6835 are used by code generators to emit implementations of [`Debug`].
6836 * `str` has new [`to_uppercase`][strup] and [`to_lowercase`][strlow]
6837 methods that convert case, following Unicode case mapping.
6838 * It is now easier to handle poisoned locks. The [`PoisonError`]
6839 type, returned by failing lock operations, exposes `into_inner`,
6840 `get_ref`, and `get_mut`, which all give access to the inner lock
6841 guard, and allow the poisoned lock to continue to operate. The
6842 `is_poisoned` method of [`RwLock`] and [`Mutex`] can poll for a
6843 poisoned lock without attempting to take the lock.
6844 * On Unix the [`FromRawFd`] trait is implemented for [`Stdio`], and
6845 [`AsRawFd`] for [`ChildStdin`], [`ChildStdout`], [`ChildStderr`].
6846 On Windows the `FromRawHandle` trait is implemented for `Stdio`,
6847 and `AsRawHandle` for `ChildStdin`, `ChildStdout`,
6848 `ChildStderr`.
6849 * [`io::ErrorKind`] has a new variant, `InvalidData`, which indicates
6850 malformed input.
6851
6852 Misc
6853 ----
6854
6855 * `rustc` employs smarter heuristics for guessing at [typos].
6856 * `rustc` emits more efficient code for [no-op conversions between
6857 unsafe pointers][nop].
6858 * Fat pointers are now [passed in pairs of immediate arguments][fat],
6859 resulting in faster compile times and smaller code.
6860
6861 [`Extend`]: https://doc.rust-lang.org/nightly/std/iter/trait.Extend.html
6862 [extend-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0839-embrace-extend-extinguish.md
6863 [`iter::once`]: https://doc.rust-lang.org/nightly/std/iter/fn.once.html
6864 [`iter::empty`]: https://doc.rust-lang.org/nightly/std/iter/fn.empty.html
6865 [`matches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.matches
6866 [`rmatches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.rmatches
6867 [`Cell`]: https://doc.rust-lang.org/nightly/std/cell/struct.Cell.html
6868 [`RefCell`]: https://doc.rust-lang.org/nightly/std/cell/struct.RefCell.html
6869 [`wrapping_add`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_add
6870 [`wrapping_sub`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_sub
6871 [`wrapping_mul`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_mul
6872 [`wrapping_div`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_div
6873 [`wrapping_rem`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_rem
6874 [`wrapping_neg`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_neg
6875 [`wrapping_shl`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_shl
6876 [`wrapping_shr`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_shr
6877 [`Wrapping`]: https://doc.rust-lang.org/nightly/std/num/struct.Wrapping.html
6878 [`fmt::Formatter`]: https://doc.rust-lang.org/nightly/std/fmt/struct.Formatter.html
6879 [`fmt::Write`]: https://doc.rust-lang.org/nightly/std/fmt/trait.Write.html
6880 [`io::Write`]: https://doc.rust-lang.org/nightly/std/io/trait.Write.html
6881 [`debug_struct`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_struct
6882 [`debug_tuple`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_tuple
6883 [`debug_list`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_list
6884 [`debug_set`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_set
6885 [`debug_map`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_map
6886 [`Debug`]: https://doc.rust-lang.org/nightly/std/fmt/trait.Debug.html
6887 [strup]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.to_uppercase
6888 [strlow]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.to_lowercase
6889 [`to_uppercase`]: https://doc.rust-lang.org/nightly/std/primitive.char.html#method.to_uppercase
6890 [`to_lowercase`]: https://doc.rust-lang.org/nightly/std/primitive.char.html#method.to_lowercase
6891 [`PoisonError`]: https://doc.rust-lang.org/nightly/std/sync/struct.PoisonError.html
6892 [`RwLock`]: https://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html
6893 [`Mutex`]: https://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html
6894 [`FromRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.FromRawFd.html
6895 [`AsRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.AsRawFd.html
6896 [`Stdio`]: https://doc.rust-lang.org/nightly/std/process/struct.Stdio.html
6897 [`ChildStdin`]: https://doc.rust-lang.org/nightly/std/process/struct.ChildStdin.html
6898 [`ChildStdout`]: https://doc.rust-lang.org/nightly/std/process/struct.ChildStdout.html
6899 [`ChildStderr`]: https://doc.rust-lang.org/nightly/std/process/struct.ChildStderr.html
6900 [`io::ErrorKind`]: https://doc.rust-lang.org/nightly/std/io/enum.ErrorKind.html
6901 [debugfmt]: https://www.reddit.com/r/rust/comments/3ceaui/psa_produces_prettyprinted_debug_output/
6902 [`DerefMut`]: https://doc.rust-lang.org/nightly/std/ops/trait.DerefMut.html
6903 [`mem::align_of`]: https://doc.rust-lang.org/nightly/std/mem/fn.align_of.html
6904 [align]: https://github.com/rust-lang/rust/pull/25646
6905 [`mem::min_align_of`]: https://doc.rust-lang.org/nightly/std/mem/fn.min_align_of.html
6906 [typos]: https://github.com/rust-lang/rust/pull/26087
6907 [nop]: https://github.com/rust-lang/rust/pull/26336
6908 [fat]: https://github.com/rust-lang/rust/pull/26411
6909 [dst]: https://github.com/rust-lang/rfcs/blob/master/text/0982-dst-coercion.md
6910 [parcodegen]: https://github.com/rust-lang/rust/pull/26018
6911 [packed]: https://github.com/rust-lang/rust/pull/25541
6912 [ad]: https://github.com/rust-lang/rust/pull/27382
6913 [win]: https://github.com/rust-lang/rust/pull/25350
6914
6915 Version 1.1.0 (2015-06-25)
6916 =========================
6917
6918 * ~850 changes, numerous bugfixes
6919
6920 Highlights
6921 ----------
6922
6923 * The [`std::fs` module has been expanded][fs] to expand the set of
6924 functionality exposed:
6925 * `DirEntry` now supports optimizations like `file_type` and `metadata` which
6926 don't incur a syscall on some platforms.
6927 * A `symlink_metadata` function has been added.
6928 * The `fs::Metadata` structure now lowers to its OS counterpart, providing
6929 access to all underlying information.
6930 * The compiler now contains extended explanations of many errors. When an error
6931 with an explanation occurs the compiler suggests using the `--explain` flag
6932 to read the explanation. Error explanations are also [available online][err-index].
6933 * Thanks to multiple [improvements][sk] to [type checking][pre], as
6934 well as other work, the time to bootstrap the compiler decreased by
6935 32%.
6936
6937 Libraries
6938 ---------
6939
6940 * The [`str::split_whitespace`] method splits a string on unicode
6941 whitespace boundaries.
6942 * On both Windows and Unix, new extension traits provide conversion of
6943 I/O types to and from the underlying system handles. On Unix, these
6944 traits are [`FromRawFd`] and [`AsRawFd`], on Windows `FromRawHandle`
6945 and `AsRawHandle`. These are implemented for `File`, `TcpStream`,
6946 `TcpListener`, and `UpdSocket`. Further implementations for
6947 `std::process` will be stabilized later.
6948 * On Unix, [`std::os::unix::symlink`] creates symlinks. On
6949 Windows, symlinks can be created with
6950 `std::os::windows::symlink_dir` and
6951 `std::os::windows::symlink_file`.
6952 * The `mpsc::Receiver` type can now be converted into an iterator with
6953 `into_iter` on the [`IntoIterator`] trait.
6954 * `Ipv4Addr` can be created from `u32` with the `From<u32>`
6955 implementation of the [`From`] trait.
6956 * The `Debug` implementation for `RangeFull` [creates output that is
6957 more consistent with other implementations][rf].
6958 * [`Debug` is implemented for `File`][file].
6959 * The `Default` implementation for `Arc` [no longer requires `Sync +
6960 Send`][arc].
6961 * [The `Iterator` methods `count`, `nth`, and `last` have been
6962 overridden for slices to have O(1) performance instead of O(n)][si].
6963 * Incorrect handling of paths on Windows has been improved in both the
6964 compiler and the standard library.
6965 * [`AtomicPtr` gained a `Default` implementation][ap].
6966 * In accordance with Rust's policy on arithmetic overflow `abs` now
6967 [panics on overflow when debug assertions are enabled][abs].
6968 * The [`Cloned`] iterator, which was accidentally left unstable for
6969 1.0 [has been stabilized][c].
6970 * The [`Incoming`] iterator, which iterates over incoming TCP
6971 connections, and which was accidentally unnamable in 1.0, [is now
6972 properly exported][inc].
6973 * [`BinaryHeap`] no longer corrupts itself [when functions called by
6974 `sift_up` or `sift_down` panic][bh].
6975 * The [`split_off`] method of `LinkedList` [no longer corrupts
6976 the list in certain scenarios][ll].
6977
6978 Misc
6979 ----
6980
6981 * Type checking performance [has improved notably][sk] with
6982 [multiple improvements][pre].
6983 * The compiler [suggests code changes][ch] for more errors.
6984 * rustc and it's build system have experimental support for [building
6985 toolchains against MUSL][m] instead of glibc on Linux.
6986 * The compiler defines the `target_env` cfg value, which is used for
6987 distinguishing toolchains that are otherwise for the same
6988 platform. Presently this is set to `gnu` for common GNU Linux
6989 targets and for MinGW targets, and `musl` for MUSL Linux targets.
6990 * The [`cargo rustc`][crc] command invokes a build with custom flags
6991 to rustc.
6992 * [Android executables are always position independent][pie].
6993 * [The `drop_with_repr_extern` lint warns about mixing `repr(C)`
6994 with `Drop`][drop].
6995
6996 [`str::split_whitespace`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_whitespace
6997 [`FromRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.FromRawFd.html
6998 [`AsRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.AsRawFd.html
6999 [`std::os::unix::symlink`]: https://doc.rust-lang.org/nightly/std/os/unix/fs/fn.symlink.html
7000 [`IntoIterator`]: https://doc.rust-lang.org/nightly/std/iter/trait.IntoIterator.html
7001 [`From`]: https://doc.rust-lang.org/nightly/std/convert/trait.From.html
7002 [rf]: https://github.com/rust-lang/rust/pull/24491
7003 [err-index]: https://doc.rust-lang.org/error-index.html
7004 [sk]: https://github.com/rust-lang/rust/pull/24615
7005 [pre]: https://github.com/rust-lang/rust/pull/25323
7006 [file]: https://github.com/rust-lang/rust/pull/24598
7007 [ch]: https://github.com/rust-lang/rust/pull/24683
7008 [arc]: https://github.com/rust-lang/rust/pull/24695
7009 [si]: https://github.com/rust-lang/rust/pull/24701
7010 [ap]: https://github.com/rust-lang/rust/pull/24834
7011 [m]: https://github.com/rust-lang/rust/pull/24777
7012 [fs]: https://github.com/rust-lang/rfcs/blob/master/text/1044-io-fs-2.1.md
7013 [crc]: https://github.com/rust-lang/cargo/pull/1568
7014 [pie]: https://github.com/rust-lang/rust/pull/24953
7015 [abs]: https://github.com/rust-lang/rust/pull/25441
7016 [c]: https://github.com/rust-lang/rust/pull/25496
7017 [`Cloned`]: https://doc.rust-lang.org/nightly/std/iter/struct.Cloned.html
7018 [`Incoming`]: https://doc.rust-lang.org/nightly/std/net/struct.Incoming.html
7019 [inc]: https://github.com/rust-lang/rust/pull/25522
7020 [bh]: https://github.com/rust-lang/rust/pull/25856
7021 [`BinaryHeap`]: https://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html
7022 [ll]: https://github.com/rust-lang/rust/pull/26022
7023 [`split_off`]: https://doc.rust-lang.org/nightly/collections/linked_list/struct.LinkedList.html#method.split_off
7024 [drop]: https://github.com/rust-lang/rust/pull/24935
7025
7026 Version 1.0.0 (2015-05-15)
7027 ========================
7028
7029 * ~1500 changes, numerous bugfixes
7030
7031 Highlights
7032 ----------
7033
7034 * The vast majority of the standard library is now `#[stable]`. It is
7035 no longer possible to use unstable features with a stable build of
7036 the compiler.
7037 * Many popular crates on [crates.io] now work on the stable release
7038 channel.
7039 * Arithmetic on basic integer types now [checks for overflow in debug
7040 builds][overflow].
7041
7042 Language
7043 --------
7044
7045 * Several [restrictions have been added to trait coherence][coh] in
7046 order to make it easier for upstream authors to change traits
7047 without breaking downstream code.
7048 * Digits of binary and octal literals are [lexed more eagerly][lex] to
7049 improve error messages and macro behavior. For example, `0b1234` is
7050 now lexed as `0b1234` instead of two tokens, `0b1` and `234`.
7051 * Trait bounds [are always invariant][inv], eliminating the need for
7052 the `PhantomFn` and `MarkerTrait` lang items, which have been
7053 removed.
7054 * ["-" is no longer a valid character in crate names][cr], the `extern crate
7055 "foo" as bar` syntax has been replaced with `extern crate foo as
7056 bar`, and Cargo now automatically translates "-" in *package* names
7057 to underscore for the crate name.
7058 * [Lifetime shadowing is an error][lt].
7059 * [`Send` no longer implies `'static`][send-rfc].
7060 * [UFCS now supports trait-less associated paths][moar-ufcs] like
7061 `MyType::default()`.
7062 * Primitive types [now have inherent methods][prim-inherent],
7063 obviating the need for extension traits like `SliceExt`.
7064 * Methods with `Self: Sized` in their `where` clause are [considered
7065 object-safe][self-sized], allowing many extension traits like
7066 `IteratorExt` to be merged into the traits they extended.
7067 * You can now [refer to associated types][assoc-where] whose
7068 corresponding trait bounds appear only in a `where` clause.
7069 * The final bits of [OIBIT landed][oibit-final], meaning that traits
7070 like `Send` and `Sync` are now library-defined.
7071 * A [Reflect trait][reflect] was introduced, which means that
7072 downcasting via the `Any` trait is effectively limited to concrete
7073 types. This helps retain the potentially-important "parametricity"
7074 property: generic code cannot behave differently for different type
7075 arguments except in minor ways.
7076 * The `unsafe_destructor` feature is now deprecated in favor of the
7077 [new `dropck`][dropck]. This change is a major reduction in unsafe
7078 code.
7079
7080 Libraries
7081 ---------
7082
7083 * The `thread_local` module [has been renamed to `std::thread`][th].
7084 * The methods of `IteratorExt` [have been moved to the `Iterator`
7085 trait itself][ie].
7086 * Several traits that implement Rust's conventions for type
7087 conversions, `AsMut`, `AsRef`, `From`, and `Into` have been
7088 [centralized in the `std::convert` module][con].
7089 * The `FromError` trait [was removed in favor of `From`][fe].
7090 * The basic sleep function [has moved to
7091 `std::thread::sleep_ms`][slp].
7092 * The `splitn` function now takes an `n` parameter that represents the
7093 number of items yielded by the returned iterator [instead of the
7094 number of 'splits'][spl].
7095 * [On Unix, all file descriptors are `CLOEXEC` by default][clo].
7096 * [Derived implementations of `PartialOrd` now order enums according
7097 to their explicitly-assigned discriminants][po].
7098 * [Methods for searching strings are generic over `Pattern`s][pat],
7099 implemented presently by `&char`, `&str`, `FnMut(char) -> bool` and
7100 some others.
7101 * [In method resolution, object methods are resolved before inherent
7102 methods][meth].
7103 * [`String::from_str` has been deprecated in favor of the `From` impl,
7104 `String::from`][sf].
7105 * [`io::Error` implements `Sync`][ios].
7106 * [The `words` method on `&str` has been replaced with
7107 `split_whitespace`][sw], to avoid answering the tricky question, 'what is
7108 a word?'
7109 * The new path and IO modules are complete and `#[stable]`. This
7110 was the major library focus for this cycle.
7111 * The path API was [revised][path-normalize] to normalize `.`,
7112 adjusting the tradeoffs in favor of the most common usage.
7113 * A large number of remaining APIs in `std` were also stabilized
7114 during this cycle; about 75% of the non-deprecated API surface
7115 is now stable.
7116 * The new [string pattern API][string-pattern] landed, which makes
7117 the string slice API much more internally consistent and flexible.
7118 * A new set of [generic conversion traits][conversion] replaced
7119 many existing ad hoc traits.
7120 * Generic numeric traits were [completely removed][num-traits]. This
7121 was made possible thanks to inherent methods for primitive types,
7122 and the removal gives maximal flexibility for designing a numeric
7123 hierarchy in the future.
7124 * The `Fn` traits are now related via [inheritance][fn-inherit]
7125 and provide ergonomic [blanket implementations][fn-blanket].
7126 * The `Index` and `IndexMut` traits were changed to
7127 [take the index by value][index-value], enabling code like
7128 `hash_map["string"]` to work.
7129 * `Copy` now [inherits][copy-clone] from `Clone`, meaning that all
7130 `Copy` data is known to be `Clone` as well.
7131
7132 Misc
7133 ----
7134
7135 * Many errors now have extended explanations that can be accessed with
7136 the `--explain` flag to `rustc`.
7137 * Many new examples have been added to the standard library
7138 documentation.
7139 * rustdoc has received a number of improvements focused on completion
7140 and polish.
7141 * Metadata was tuned, shrinking binaries [by 27%][metadata-shrink].
7142 * Much headway was made on ecosystem-wide CI, making it possible
7143 to [compare builds for breakage][ci-compare].
7144
7145
7146 [crates.io]: http://crates.io
7147 [clo]: https://github.com/rust-lang/rust/pull/24034
7148 [coh]: https://github.com/rust-lang/rfcs/blob/master/text/1023-rebalancing-coherence.md
7149 [con]: https://github.com/rust-lang/rust/pull/23875
7150 [cr]: https://github.com/rust-lang/rust/pull/23419
7151 [fe]: https://github.com/rust-lang/rust/pull/23879
7152 [ie]: https://github.com/rust-lang/rust/pull/23300
7153 [inv]: https://github.com/rust-lang/rust/pull/23938
7154 [ios]: https://github.com/rust-lang/rust/pull/24133
7155 [lex]: https://github.com/rust-lang/rfcs/blob/master/text/0879-small-base-lexing.md
7156 [lt]: https://github.com/rust-lang/rust/pull/24057
7157 [meth]: https://github.com/rust-lang/rust/pull/24056
7158 [pat]: https://github.com/rust-lang/rfcs/blob/master/text/0528-string-patterns.md
7159 [po]: https://github.com/rust-lang/rust/pull/24270
7160 [sf]: https://github.com/rust-lang/rust/pull/24517
7161 [slp]: https://github.com/rust-lang/rust/pull/23949
7162 [spl]: https://github.com/rust-lang/rfcs/blob/master/text/0979-align-splitn-with-other-languages.md
7163 [sw]: https://github.com/rust-lang/rfcs/blob/master/text/1054-str-words.md
7164 [th]: https://github.com/rust-lang/rfcs/blob/master/text/0909-move-thread-local-to-std-thread.md
7165 [send-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0458-send-improvements.md
7166 [moar-ufcs]: https://github.com/rust-lang/rust/pull/22172
7167 [prim-inherent]: https://github.com/rust-lang/rust/pull/23104
7168 [overflow]: https://github.com/rust-lang/rfcs/blob/master/text/0560-integer-overflow.md
7169 [metadata-shrink]: https://github.com/rust-lang/rust/pull/22971
7170 [self-sized]: https://github.com/rust-lang/rust/pull/22301
7171 [assoc-where]: https://github.com/rust-lang/rust/pull/22512
7172 [string-pattern]: https://github.com/rust-lang/rust/pull/22466
7173 [oibit-final]: https://github.com/rust-lang/rust/pull/21689
7174 [reflect]: https://github.com/rust-lang/rust/pull/23712
7175 [conversion]: https://github.com/rust-lang/rfcs/pull/529
7176 [num-traits]: https://github.com/rust-lang/rust/pull/23549
7177 [index-value]: https://github.com/rust-lang/rust/pull/23601
7178 [dropck]: https://github.com/rust-lang/rfcs/pull/769
7179 [ci-compare]: https://gist.github.com/brson/a30a77836fbec057cbee
7180 [fn-inherit]: https://github.com/rust-lang/rust/pull/23282
7181 [fn-blanket]: https://github.com/rust-lang/rust/pull/23895
7182 [copy-clone]: https://github.com/rust-lang/rust/pull/23860
7183 [path-normalize]: https://github.com/rust-lang/rust/pull/23229
7184
7185
7186 Version 1.0.0-alpha.2 (2015-02-20)
7187 =====================================
7188
7189 * ~1300 changes, numerous bugfixes
7190
7191 * Highlights
7192
7193 * The various I/O modules were [overhauled][io-rfc] to reduce
7194 unnecessary abstractions and provide better interoperation with
7195 the underlying platform. The old `io` module remains temporarily
7196 at `std::old_io`.
7197 * The standard library now [participates in feature gating][feat],
7198 so use of unstable libraries now requires a `#![feature(...)]`
7199 attribute. The impact of this change is [described on the
7200 forum][feat-forum]. [RFC][feat-rfc].
7201
7202 * Language
7203
7204 * `for` loops [now operate on the `IntoIterator` trait][into],
7205 which eliminates the need to call `.iter()`, etc. to iterate
7206 over collections. There are some new subtleties to remember
7207 though regarding what sort of iterators various types yield, in
7208 particular that `for foo in bar { }` yields values from a move
7209 iterator, destroying the original collection. [RFC][into-rfc].
7210 * Objects now have [default lifetime bounds][obj], so you don't
7211 have to write `Box<Trait+'static>` when you don't care about
7212 storing references. [RFC][obj-rfc].
7213 * In types that implement `Drop`, [lifetimes must outlive the
7214 value][drop]. This will soon make it possible to safely
7215 implement `Drop` for types where `#[unsafe_destructor]` is now
7216 required. Read the [gorgeous RFC][drop-rfc] for details.
7217 * The fully qualified <T as Trait>::X syntax lets you set the Self
7218 type for a trait method or associated type. [RFC][ufcs-rfc].
7219 * References to types that implement `Deref<U>` now [automatically
7220 coerce to references][deref] to the dereferenced type `U`,
7221 e.g. `&T where T: Deref<U>` automatically coerces to `&U`. This
7222 should eliminate many unsightly uses of `&*`, as when converting
7223 from references to vectors into references to
7224 slices. [RFC][deref-rfc].
7225 * The explicit [closure kind syntax][close] (`|&:|`, `|&mut:|`,
7226 `|:|`) is obsolete and closure kind is inferred from context.
7227 * [`Self` is a keyword][Self].
7228
7229 * Libraries
7230
7231 * The `Show` and `String` formatting traits [have been
7232 renamed][fmt] to `Debug` and `Display` to more clearly reflect
7233 their related purposes. Automatically getting a string
7234 conversion to use with `format!("{:?}", something_to_debug)` is
7235 now written `#[derive(Debug)]`.
7236 * Abstract [OS-specific string types][osstr], `std::ff::{OsString,
7237 OsStr}`, provide strings in platform-specific encodings for easier
7238 interop with system APIs. [RFC][osstr-rfc].
7239 * The `boxed::into_raw` and `Box::from_raw` functions [convert
7240 between `Box<T>` and `*mut T`][boxraw], a common pattern for
7241 creating raw pointers.
7242
7243 * Tooling
7244
7245 * Certain long error messages of the form 'expected foo found bar'
7246 are now [split neatly across multiple
7247 lines][multiline]. Examples in the PR.
7248 * On Unix Rust can be [uninstalled][un] by running
7249 `/usr/local/lib/rustlib/uninstall.sh`.
7250 * The `#[rustc_on_unimplemented]` attribute, requiring the
7251 'on_unimplemented' feature, lets rustc [display custom error
7252 messages when a trait is expected to be implemented for a type
7253 but is not][onun].
7254
7255 * Misc
7256
7257 * Rust is tested against a [LALR grammar][lalr], which parses
7258 almost all the Rust files that rustc does.
7259
7260 [boxraw]: https://github.com/rust-lang/rust/pull/21318
7261 [close]: https://github.com/rust-lang/rust/pull/21843
7262 [deref]: https://github.com/rust-lang/rust/pull/21351
7263 [deref-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0241-deref-conversions.md
7264 [drop]: https://github.com/rust-lang/rust/pull/21972
7265 [drop-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0769-sound-generic-drop.md
7266 [feat]: https://github.com/rust-lang/rust/pull/21248
7267 [feat-forum]: https://users.rust-lang.org/t/psa-important-info-about-rustcs-new-feature-staging/82/5
7268 [feat-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0507-release-channels.md
7269 [fmt]: https://github.com/rust-lang/rust/pull/21457
7270 [into]: https://github.com/rust-lang/rust/pull/20790
7271 [into-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0235-collections-conventions.md#intoiterator-and-iterable
7272 [io-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0517-io-os-reform.md
7273 [lalr]: https://github.com/rust-lang/rust/pull/21452
7274 [multiline]: https://github.com/rust-lang/rust/pull/19870
7275 [obj]: https://github.com/rust-lang/rust/pull/22230
7276 [obj-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0599-default-object-bound.md
7277 [onun]: https://github.com/rust-lang/rust/pull/20889
7278 [osstr]: https://github.com/rust-lang/rust/pull/21488
7279 [osstr-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0517-io-os-reform.md
7280 [Self]: https://github.com/rust-lang/rust/pull/22158
7281 [ufcs-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0132-ufcs.md
7282 [un]: https://github.com/rust-lang/rust/pull/22256
7283
7284
7285 Version 1.0.0-alpha (2015-01-09)
7286 ==================================
7287
7288 * ~2400 changes, numerous bugfixes
7289
7290 * Highlights
7291
7292 * The language itself is considered feature complete for 1.0,
7293 though there will be many usability improvements and bugfixes
7294 before the final release.
7295 * Nearly 50% of the public API surface of the standard library has
7296 been declared 'stable'. Those interfaces are unlikely to change
7297 before 1.0.
7298 * The long-running debate over integer types has been
7299 [settled][ints]: Rust will ship with types named `isize` and
7300 `usize`, rather than `int` and `uint`, for pointer-sized
7301 integers. Guidelines will be rolled out during the alpha cycle.
7302 * Most crates that are not `std` have been moved out of the Rust
7303 distribution into the Cargo ecosystem so they can evolve
7304 separately and don't need to be stabilized as quickly, including
7305 'time', 'getopts', 'num', 'regex', and 'term'.
7306 * Documentation continues to be expanded with more API coverage, more
7307 examples, and more in-depth explanations. The guides have been
7308 consolidated into [The Rust Programming Language][trpl].
7309 * "[Rust By Example][rbe]" is now maintained by the Rust team.
7310 * All official Rust binary installers now come with [Cargo], the
7311 Rust package manager.
7312
7313 * Language
7314
7315 * Closures have been [completely redesigned][unboxed] to be
7316 implemented in terms of traits, can now be used as generic type
7317 bounds and thus monomorphized and inlined, or via an opaque
7318 pointer (boxed) as in the old system. The new system is often
7319 referred to as 'unboxed' closures.
7320 * Traits now support [associated types][assoc], allowing families
7321 of related types to be defined together and used generically in
7322 powerful ways.
7323 * Enum variants are [namespaced by their type names][enum].
7324 * [`where` clauses][where] provide a more versatile and attractive
7325 syntax for specifying generic bounds, though the previous syntax
7326 remains valid.
7327 * Rust again picks a [fallback][fb] (either i32 or f64) for uninferred
7328 numeric types.
7329 * Rust [no longer has a runtime][rt] of any description, and only
7330 supports OS threads, not green threads.
7331 * At long last, Rust has been overhauled for 'dynamically-sized
7332 types' ([DST]), which integrates 'fat pointers' (object types,
7333 arrays, and `str`) more deeply into the type system, making it
7334 more consistent.
7335 * Rust now has a general [range syntax][range], `i..j`, `i..`, and
7336 `..j` that produce range types and which, when combined with the
7337 `Index` operator and multidispatch, leads to a convenient slice
7338 notation, `[i..j]`.
7339 * The new range syntax revealed an ambiguity in the fixed-length
7340 array syntax, so now fixed length arrays [are written `[T;
7341 N]`][arrays].
7342 * The `Copy` trait is no longer implemented automatically. Unsafe
7343 pointers no longer implement `Sync` and `Send` so types
7344 containing them don't automatically either. `Sync` and `Send`
7345 are now 'unsafe traits' so one can "forcibly" implement them via
7346 `unsafe impl` if a type confirms to the requirements for them
7347 even though the internals do not (e.g. structs containing unsafe
7348 pointers like `Arc`). These changes are intended to prevent some
7349 footguns and are collectively known as [opt-in built-in
7350 traits][oibit] (though `Sync` and `Send` will soon become pure
7351 library types unknown to the compiler).
7352 * Operator traits now take their operands [by value][ops], and
7353 comparison traits can use multidispatch to compare one type
7354 against multiple other types, allowing e.g. `String` to be
7355 compared with `&str`.
7356 * `if let` and `while let` are no longer feature-gated.
7357 * Rust has adopted a more [uniform syntax for escaping unicode
7358 characters][unicode].
7359 * `macro_rules!` [has been declared stable][mac]. Though it is a
7360 flawed system it is sufficiently popular that it must be usable
7361 for 1.0. Effort has gone into [future-proofing][mac-future] it
7362 in ways that will allow other macro systems to be developed in
7363 parallel, and won't otherwise impact the evolution of the
7364 language.
7365 * The prelude has been [pared back significantly][prelude] such
7366 that it is the minimum necessary to support the most pervasive
7367 code patterns, and through [generalized where clauses][where]
7368 many of the prelude extension traits have been consolidated.
7369 * Rust's rudimentary reflection [has been removed][refl], as it
7370 incurred too much code generation for little benefit.
7371 * [Struct variants][structvars] are no longer feature-gated.
7372 * Trait bounds can be [polymorphic over lifetimes][hrtb]. Also
7373 known as 'higher-ranked trait bounds', this crucially allows
7374 unboxed closures to work.
7375 * Macros invocations surrounded by parens or square brackets and
7376 not terminated by a semicolon are [parsed as
7377 expressions][macros], which makes expressions like `vec![1i32,
7378 2, 3].len()` work as expected.
7379 * Trait objects now implement their traits automatically, and
7380 traits that can be coerced to objects now must be [object
7381 safe][objsafe].
7382 * Automatically deriving traits is now done with `#[derive(...)]`
7383 not `#[deriving(...)]` for [consistency with other naming
7384 conventions][derive].
7385 * Importing the containing module or enum at the same time as
7386 items or variants they contain is [now done with `self` instead
7387 of `mod`][self], as in use `foo::{self, bar}`
7388 * Glob imports are no longer feature-gated.
7389 * The `box` operator and `box` patterns have been feature-gated
7390 pending a redesign. For now unique boxes should be allocated
7391 like other containers, with `Box::new`.
7392
7393 * Libraries
7394
7395 * A [series][coll1] of [efforts][coll2] to establish
7396 [conventions][coll3] for collections types has resulted in API
7397 improvements throughout the standard library.
7398 * New [APIs for error handling][err] provide ergonomic interop
7399 between error types, and [new conventions][err-conv] describe
7400 more clearly the recommended error handling strategies in Rust.
7401 * The `fail!` macro has been renamed to [`panic!`][panic] so that
7402 it is easier to discuss failure in the context of error handling
7403 without making clarifications as to whether you are referring to
7404 the 'fail' macro or failure more generally.
7405 * On Linux, `OsRng` prefers the new, more reliable `getrandom`
7406 syscall when available.
7407 * The 'serialize' crate has been renamed 'rustc-serialize' and
7408 moved out of the distribution to Cargo. Although it is widely
7409 used now, it is expected to be superseded in the near future.
7410 * The `Show` formatter, typically implemented with
7411 `#[derive(Show)]` is [now requested with the `{:?}`
7412 specifier][show] and is intended for use by all types, for uses
7413 such as `println!` debugging. The new `String` formatter must be
7414 implemented by hand, uses the `{}` specifier, and is intended
7415 for full-fidelity conversions of things that can logically be
7416 represented as strings.
7417
7418 * Tooling
7419
7420 * [Flexible target specification][flex] allows rustc's code
7421 generation to be configured to support otherwise-unsupported
7422 platforms.
7423 * Rust comes with rust-gdb and rust-lldb scripts that launch their
7424 respective debuggers with Rust-appropriate pretty-printing.
7425 * The Windows installation of Rust is distributed with the
7426 MinGW components currently required to link binaries on that
7427 platform.
7428
7429 * Misc
7430
7431 * Nullable enum optimizations have been extended to more types so
7432 that e.g. `Option<Vec<T>>` and `Option<String>` take up no more
7433 space than the inner types themselves.
7434 * Work has begun on supporting AArch64.
7435
7436 [Cargo]: https://crates.io
7437 [unboxed]: http://smallcultfollowing.com/babysteps/blog/2014/11/26/purging-proc/
7438 [enum]: https://github.com/rust-lang/rfcs/blob/master/text/0390-enum-namespacing.md
7439 [flex]: https://github.com/rust-lang/rfcs/blob/master/text/0131-target-specification.md
7440 [err]: https://github.com/rust-lang/rfcs/blob/master/text/0201-error-chaining.md
7441 [err-conv]: https://github.com/rust-lang/rfcs/blob/master/text/0236-error-conventions.md
7442 [rt]: https://github.com/rust-lang/rfcs/blob/master/text/0230-remove-runtime.md
7443 [mac]: https://github.com/rust-lang/rfcs/blob/master/text/0453-macro-reform.md
7444 [mac-future]: https://github.com/rust-lang/rfcs/pull/550
7445 [DST]: http://smallcultfollowing.com/babysteps/blog/2014/01/05/dst-take-5/
7446 [coll1]: https://github.com/rust-lang/rfcs/blob/master/text/0235-collections-conventions.md
7447 [coll2]: https://github.com/rust-lang/rfcs/blob/master/text/0509-collections-reform-part-2.md
7448 [coll3]: https://github.com/rust-lang/rfcs/blob/master/text/0216-collection-views.md
7449 [ops]: https://github.com/rust-lang/rfcs/blob/master/text/0439-cmp-ops-reform.md
7450 [prelude]: https://github.com/rust-lang/rfcs/blob/master/text/0503-prelude-stabilization.md
7451 [where]: https://github.com/rust-lang/rfcs/blob/master/text/0135-where.md
7452 [refl]: https://github.com/rust-lang/rfcs/blob/master/text/0379-remove-reflection.md
7453 [panic]: https://github.com/rust-lang/rfcs/blob/master/text/0221-panic.md
7454 [structvars]: https://github.com/rust-lang/rfcs/blob/master/text/0418-struct-variants.md
7455 [hrtb]: https://github.com/rust-lang/rfcs/blob/master/text/0387-higher-ranked-trait-bounds.md
7456 [unicode]: https://github.com/rust-lang/rfcs/blob/master/text/0446-es6-unicode-escapes.md
7457 [oibit]: https://github.com/rust-lang/rfcs/blob/master/text/0019-opt-in-builtin-traits.md
7458 [macros]: https://github.com/rust-lang/rfcs/blob/master/text/0378-expr-macros.md
7459 [range]: https://github.com/rust-lang/rfcs/blob/master/text/0439-cmp-ops-reform.md#indexing-and-slicing
7460 [arrays]: https://github.com/rust-lang/rfcs/blob/master/text/0520-new-array-repeat-syntax.md
7461 [show]: https://github.com/rust-lang/rfcs/blob/master/text/0504-show-stabilization.md
7462 [derive]: https://github.com/rust-lang/rfcs/blob/master/text/0534-deriving2derive.md
7463 [self]: https://github.com/rust-lang/rfcs/blob/master/text/0532-self-in-use.md
7464 [fb]: https://github.com/rust-lang/rfcs/blob/master/text/0212-restore-int-fallback.md
7465 [objsafe]: https://github.com/rust-lang/rfcs/blob/master/text/0255-object-safety.md
7466 [assoc]: https://github.com/rust-lang/rfcs/blob/master/text/0195-associated-items.md
7467 [ints]: https://github.com/rust-lang/rfcs/pull/544#issuecomment-68760871
7468 [trpl]: https://doc.rust-lang.org/book/index.html
7469 [rbe]: http://rustbyexample.com/
7470
7471
7472 Version 0.12.0 (2014-10-09)
7473 =============================
7474
7475 * ~1900 changes, numerous bugfixes
7476
7477 * Highlights
7478
7479 * The introductory documentation (now called The Rust Guide) has
7480 been completely rewritten, as have a number of supplementary
7481 guides.
7482 * Rust's package manager, Cargo, continues to improve and is
7483 sometimes considered to be quite awesome.
7484 * Many API's in `std` have been reviewed and updated for
7485 consistency with the in-development Rust coding
7486 guidelines. The standard library documentation tracks
7487 stabilization progress.
7488 * Minor libraries have been moved out-of-tree to the rust-lang org
7489 on GitHub: uuid, semver, glob, num, hexfloat, fourcc. They can
7490 be installed with Cargo.
7491 * Lifetime elision allows lifetime annotations to be left off of
7492 function declarations in many common scenarios.
7493 * Rust now works on 64-bit Windows.
7494
7495 * Language
7496 * Indexing can be overloaded with the `Index` and `IndexMut`
7497 traits.
7498 * The `if let` construct takes a branch only if the `let` pattern
7499 matches, currently behind the 'if_let' feature gate.
7500 * 'where clauses', a more flexible syntax for specifying trait
7501 bounds that is more aesthetic, have been added for traits and
7502 free functions. Where clauses will in the future make it
7503 possible to constrain associated types, which would be
7504 impossible with the existing syntax.
7505 * A new slicing syntax (e.g. `[0..4]`) has been introduced behind
7506 the 'slicing_syntax' feature gate, and can be overloaded with
7507 the `Slice` or `SliceMut` traits.
7508 * The syntax for matching of sub-slices has been changed to use a
7509 postfix `..` instead of prefix (.e.g. `[a, b, c..]`), for
7510 consistency with other uses of `..` and to future-proof
7511 potential additional uses of the syntax.
7512 * The syntax for matching inclusive ranges in patterns has changed
7513 from `0..3` to `0...4` to be consistent with the exclusive range
7514 syntax for slicing.
7515 * Matching of sub-slices in non-tail positions (e.g. `[a.., b,
7516 c]`) has been put behind the 'advanced_slice_patterns' feature
7517 gate and may be removed in the future.
7518 * Components of tuples and tuple structs can be extracted using
7519 the `value.0` syntax, currently behind the `tuple_indexing`
7520 feature gate.
7521 * The `#[crate_id]` attribute is no longer supported; versioning
7522 is handled by the package manager.
7523 * Renaming crate imports are now written `extern crate foo as bar`
7524 instead of `extern crate bar = foo`.
7525 * Renaming use statements are now written `use foo as bar` instead
7526 of `use bar = foo`.
7527 * `let` and `match` bindings and argument names in macros are now
7528 hygienic.
7529 * The new, more efficient, closure types ('unboxed closures') have
7530 been added under a feature gate, 'unboxed_closures'. These will
7531 soon replace the existing closure types, once higher-ranked
7532 trait lifetimes are added to the language.
7533 * `move` has been added as a keyword, for indicating closures
7534 that capture by value.
7535 * Mutation and assignment is no longer allowed in pattern guards.
7536 * Generic structs and enums can now have trait bounds.
7537 * The `Share` trait is now called `Sync` to free up the term
7538 'shared' to refer to 'shared reference' (the default reference
7539 type.
7540 * Dynamically-sized types have been mostly implemented,
7541 unifying the behavior of fat-pointer types with the rest of the
7542 type system.
7543 * As part of dynamically-sized types, the `Sized` trait has been
7544 introduced, which qualifying types implement by default, and
7545 which type parameters expect by default. To specify that a type
7546 parameter does not need to be sized, write `<Sized? T>`. Most
7547 types are `Sized`, notable exceptions being unsized arrays
7548 (`[T]`) and trait types.
7549 * Closures can return `!`, as in `|| -> !` or `proc() -> !`.
7550 * Lifetime bounds can now be applied to type parameters and object
7551 types.
7552 * The old, reference counted GC type, `Gc<T>` which was once
7553 denoted by the `@` sigil, has finally been removed. GC will be
7554 revisited in the future.
7555
7556 * Libraries
7557 * Library documentation has been improved for a number of modules.
7558 * Bit-vectors, collections::bitv has been modernized.
7559 * The url crate is deprecated in favor of
7560 http://github.com/servo/rust-url, which can be installed with
7561 Cargo.
7562 * Most I/O stream types can be cloned and subsequently closed from
7563 a different thread.
7564 * A `std::time::Duration` type has been added for use in I/O
7565 methods that rely on timers, as well as in the 'time' crate's
7566 `Timespec` arithmetic.
7567 * The runtime I/O abstraction layer that enabled the green thread
7568 scheduler to do non-thread-blocking I/O has been removed, along
7569 with the libuv-based implementation employed by the green thread
7570 scheduler. This will greatly simplify the future I/O work.
7571 * `collections::btree` has been rewritten to have a more
7572 idiomatic and efficient design.
7573
7574 * Tooling
7575 * rustdoc output now indicates the stability levels of API's.
7576 * The `--crate-name` flag can specify the name of the crate
7577 being compiled, like `#[crate_name]`.
7578 * The `-C metadata` specifies additional metadata to hash into
7579 symbol names, and `-C extra-filename` specifies additional
7580 information to put into the output filename, for use by the
7581 package manager for versioning.
7582 * debug info generation has continued to improve and should be
7583 more reliable under both gdb and lldb.
7584 * rustc has experimental support for compiling in parallel
7585 using the `-C codegen-units` flag.
7586 * rustc no longer encodes rpath information into binaries by
7587 default.
7588
7589 * Misc
7590 * Stack usage has been optimized with LLVM lifetime annotations.
7591 * Official Rust binaries on Linux are more compatible with older
7592 kernels and distributions, built on CentOS 5.10.
7593
7594
7595 Version 0.11.0 (2014-07-02)
7596 ==========================
7597
7598 * ~1700 changes, numerous bugfixes
7599
7600 * Language
7601 * ~[T] has been removed from the language. This type is superseded by
7602 the Vec<T> type.
7603 * ~str has been removed from the language. This type is superseded by
7604 the String type.
7605 * ~T has been removed from the language. This type is superseded by the
7606 Box<T> type.
7607 * @T has been removed from the language. This type is superseded by the
7608 standard library's std::gc::Gc<T> type.
7609 * Struct fields are now all private by default.
7610 * Vector indices and shift amounts are both required to be a `uint`
7611 instead of any integral type.
7612 * Byte character, byte string, and raw byte string literals are now all
7613 supported by prefixing the normal literal with a `b`.
7614 * Multiple ABIs are no longer allowed in an ABI string
7615 * The syntax for lifetimes on closures/procedures has been tweaked
7616 slightly: `<'a>|A, B|: 'b + K -> T`
7617 * Floating point modulus has been removed from the language; however it
7618 is still provided by a library implementation.
7619 * Private enum variants are now disallowed.
7620 * The `priv` keyword has been removed from the language.
7621 * A closure can no longer be invoked through a &-pointer.
7622 * The `use foo, bar, baz;` syntax has been removed from the language.
7623 * The transmute intrinsic no longer works on type parameters.
7624 * Statics now allow blocks/items in their definition.
7625 * Trait bounds are separated from objects with + instead of : now.
7626 * Objects can no longer be read while they are mutably borrowed.
7627 * The address of a static is now marked as insignificant unless the
7628 #[inline(never)] attribute is placed it.
7629 * The #[unsafe_destructor] attribute is now behind a feature gate.
7630 * Struct literals are no longer allowed in ambiguous positions such as
7631 if, while, match, and for..in.
7632 * Declaration of lang items and intrinsics are now feature-gated by
7633 default.
7634 * Integral literals no longer default to `int`, and floating point
7635 literals no longer default to `f64`. Literals must be suffixed with an
7636 appropriate type if inference cannot determine the type of the
7637 literal.
7638 * The Box<T> type is no longer implicitly borrowed to &mut T.
7639 * Procedures are now required to not capture borrowed references.
7640
7641 * Libraries
7642 * The standard library is now a "facade" over a number of underlying
7643 libraries. This means that development on the standard library should
7644 be speedier due to smaller crates, as well as a clearer line between
7645 all dependencies.
7646 * A new library, libcore, lives under the standard library's facade
7647 which is Rust's "0-assumption" library, suitable for embedded and
7648 kernel development for example.
7649 * A regex crate has been added to the standard distribution. This crate
7650 includes statically compiled regular expressions.
7651 * The unwrap/unwrap_err methods on Result require a Show bound for
7652 better error messages.
7653 * The return types of the std::comm primitives have been centralized
7654 around the Result type.
7655 * A number of I/O primitives have gained the ability to time out their
7656 operations.
7657 * A number of I/O primitives have gained the ability to close their
7658 reading/writing halves to cancel pending operations.
7659 * Reverse iterator methods have been removed in favor of `rev()` on
7660 their forward-iteration counterparts.
7661 * A bitflags! macro has been added to enable easy interop with C and
7662 management of bit flags.
7663 * A debug_assert! macro is now provided which is disabled when
7664 `--cfg ndebug` is passed to the compiler.
7665 * A graphviz crate has been added for creating .dot files.
7666 * The std::cast module has been migrated into std::mem.
7667 * The std::local_data api has been migrated from freestanding functions
7668 to being based on methods.
7669 * The Pod trait has been renamed to Copy.
7670 * jemalloc has been added as the default allocator for types.
7671 * The API for allocating memory has been changed to use proper alignment
7672 and sized deallocation
7673 * Connecting a TcpStream or binding a TcpListener is now based on a
7674 string address and a u16 port. This allows connecting to a hostname as
7675 opposed to an IP.
7676 * The Reader trait now contains a core method, read_at_least(), which
7677 correctly handles many repeated 0-length reads.
7678 * The process-spawning API is now centered around a builder-style
7679 Command struct.
7680 * The :? printing qualifier has been moved from the standard library to
7681 an external libdebug crate.
7682 * Eq/Ord have been renamed to PartialEq/PartialOrd. TotalEq/TotalOrd
7683 have been renamed to Eq/Ord.
7684 * The select/plural methods have been removed from format!. The escapes
7685 for { and } have also changed from \{ and \} to {{ and }},
7686 respectively.
7687 * The TaskBuilder API has been re-worked to be a true builder, and
7688 extension traits for spawning native/green tasks have been added.
7689
7690 * Tooling
7691 * All breaking changes to the language or libraries now have their
7692 commit message annotated with `[breaking-change]` to allow for easy
7693 discovery of breaking changes.
7694 * The compiler will now try to suggest how to annotate lifetimes if a
7695 lifetime-related error occurs.
7696 * Debug info continues to be improved greatly with general bug fixes and
7697 better support for situations like link time optimization (LTO).
7698 * Usage of syntax extensions when cross-compiling has been fixed.
7699 * Functionality equivalent to GCC & Clang's -ffunction-sections,
7700 -fdata-sections and --gc-sections has been enabled by default
7701 * The compiler is now stricter about where it will load module files
7702 from when a module is declared via `mod foo;`.
7703 * The #[phase(syntax)] attribute has been renamed to #[phase(plugin)].
7704 Syntax extensions are now discovered via a "plugin registrar" type
7705 which will be extended in the future to other various plugins.
7706 * Lints have been restructured to allow for dynamically loadable lints.
7707 * A number of rustdoc improvements:
7708 * The HTML output has been visually redesigned.
7709 * Markdown is now powered by hoedown instead of sundown.
7710 * Searching heuristics have been greatly improved.
7711 * The search index has been reduced in size by a great amount.
7712 * Cross-crate documentation via `pub use` has been greatly improved.
7713 * Primitive types are now hyperlinked and documented.
7714 * Documentation has been moved from static.rust-lang.org/doc to
7715 doc.rust-lang.org
7716 * A new sandbox, play.rust-lang.org, is available for running and
7717 sharing rust code examples on-line.
7718 * Unused attributes are now more robustly warned about.
7719 * The dead_code lint now warns about unused struct fields.
7720 * Cross-compiling to iOS is now supported.
7721 * Cross-compiling to mipsel is now supported.
7722 * Stability attributes are now inherited by default and no longer apply
7723 to intra-crate usage, only inter-crate usage.
7724 * Error message related to non-exhaustive match expressions have been
7725 greatly improved.
7726
7727
7728 Version 0.10 (2014-04-03)
7729 =========================
7730
7731 * ~1500 changes, numerous bugfixes
7732
7733 * Language
7734 * A new RFC process is now in place for modifying the language.
7735 * Patterns with `@`-pointers have been removed from the language.
7736 * Patterns with unique vectors (`~[T]`) have been removed from the
7737 language.
7738 * Patterns with unique strings (`~str`) have been removed from the
7739 language.
7740 * `@str` has been removed from the language.
7741 * `@[T]` has been removed from the language.
7742 * `@self` has been removed from the language.
7743 * `@Trait` has been removed from the language.
7744 * Headers on `~` allocations which contain `@` boxes inside the type for
7745 reference counting have been removed.
7746 * The semantics around the lifetimes of temporary expressions have changed,
7747 see #3511 and #11585 for more information.
7748 * Cross-crate syntax extensions are now possible, but feature gated. See
7749 #11151 for more information. This includes both `macro_rules!` macros as
7750 well as syntax extensions such as `format!`.
7751 * New lint modes have been added, and older ones have been turned on to be
7752 warn-by-default.
7753 * Unnecessary parentheses
7754 * Uppercase statics
7755 * Camel Case types
7756 * Uppercase variables
7757 * Publicly visible private types
7758 * `#[deriving]` with raw pointers
7759 * Unsafe functions can no longer be coerced to closures.
7760 * Various obscure macros such as `log_syntax!` are now behind feature gates.
7761 * The `#[simd]` attribute is now behind a feature gate.
7762 * Visibility is no longer allowed on `extern crate` statements, and
7763 unnecessary visibility (`priv`) is no longer allowed on `use` statements.
7764 * Trailing commas are now allowed in argument lists and tuple patterns.
7765 * The `do` keyword has been removed, it is now a reserved keyword.
7766 * Default type parameters have been implemented, but are feature gated.
7767 * Borrowed variables through captures in closures are now considered soundly.
7768 * `extern mod` is now `extern crate`
7769 * The `Freeze` trait has been removed.
7770 * The `Share` trait has been added for types that can be shared among
7771 threads.
7772 * Labels in macros are now hygienic.
7773 * Expression/statement macro invocations can be delimited with `{}` now.
7774 * Treatment of types allowed in `static mut` locations has been tweaked.
7775 * The `*` and `.` operators are now overloadable through the `Deref` and
7776 `DerefMut` traits.
7777 * `~Trait` and `proc` no longer have `Send` bounds by default.
7778 * Partial type hints are now supported with the `_` type marker.
7779 * An `Unsafe` type was introduced for interior mutability. It is now
7780 considered undefined to transmute from `&T` to `&mut T` without using the
7781 `Unsafe` type.
7782 * The #[linkage] attribute was implemented for extern statics/functions.
7783 * The inner attribute syntax has changed from `#[foo];` to `#![foo]`.
7784 * `Pod` was renamed to `Copy`.
7785
7786 * Libraries
7787 * The `libextra` library has been removed. It has now been decomposed into
7788 component libraries with smaller and more focused nuggets of
7789 functionality. The full list of libraries can be found on the
7790 documentation index page.
7791 * std: `std::condition` has been removed. All I/O errors are now propagated
7792 through the `Result` type. In order to assist with error handling, a
7793 `try!` macro for unwrapping errors with an early return and a lint for
7794 unused results has been added. See #12039 for more information.
7795 * std: The `vec` module has been renamed to `slice`.
7796 * std: A new vector type, `Vec<T>`, has been added in preparation for DST.
7797 This will become the only growable vector in the future.
7798 * std: `std::io` now has more public re-exports. Types such as `BufferedReader`
7799 are now found at `std::io::BufferedReader` instead of
7800 `std::io::buffered::BufferedReader`.
7801 * std: `print` and `println` are no longer in the prelude, the `print!` and
7802 `println!` macros are intended to be used instead.
7803 * std: `Rc` now has a `Weak` pointer for breaking cycles, and it no longer
7804 attempts to statically prevent cycles.
7805 * std: The standard distribution is adopting the policy of pushing failure
7806 to the user rather than failing in libraries. Many functions (such as
7807 `slice::last()`) now return `Option<T>` instead of `T` + failing.
7808 * std: `fmt::Default` has been renamed to `fmt::Show`, and it now has a new
7809 deriving mode: `#[deriving(Show)]`.
7810 * std: `ToStr` is now implemented for all types implementing `Show`.
7811 * std: The formatting trait methods now take `&self` instead of `&T`
7812 * std: The `invert()` method on iterators has been renamed to `rev()`
7813 * std: `std::num` has seen a reduction in the genericity of its traits,
7814 consolidating functionality into a few core traits.
7815 * std: Backtraces are now printed on task failure if the environment
7816 variable `RUST_BACKTRACE` is present.
7817 * std: Naming conventions for iterators have been standardized. More details
7818 can be found on the wiki's style guide.
7819 * std: `eof()` has been removed from the `Reader` trait. Specific types may
7820 still implement the function.
7821 * std: Networking types are now cloneable to allow simultaneous reads/writes.
7822 * std: `assert_approx_eq!` has been removed
7823 * std: The `e` and `E` formatting specifiers for floats have been added to
7824 print them in exponential notation.
7825 * std: The `Times` trait has been removed
7826 * std: Indications of variance and opting out of builtin bounds is done
7827 through marker types in `std::kinds::marker` now
7828 * std: `hash` has been rewritten, `IterBytes` has been removed, and
7829 `#[deriving(Hash)]` is now possible.
7830 * std: `SharedChan` has been removed, `Sender` is now cloneable.
7831 * std: `Chan` and `Port` were renamed to `Sender` and `Receiver`.
7832 * std: `Chan::new` is now `channel()`.
7833 * std: A new synchronous channel type has been implemented.
7834 * std: A `select!` macro is now provided for selecting over `Receiver`s.
7835 * std: `hashmap` and `trie` have been moved to `libcollections`
7836 * std: `run` has been rolled into `io::process`
7837 * std: `assert_eq!` now uses `{}` instead of `{:?}`
7838 * std: The equality and comparison traits have seen some reorganization.
7839 * std: `rand` has moved to `librand`.
7840 * std: `to_{lower,upper}case` has been implemented for `char`.
7841 * std: Logging has been moved to `liblog`.
7842 * collections: `HashMap` has been rewritten for higher performance and less
7843 memory usage.
7844 * native: The default runtime is now `libnative`. If `libgreen` is desired,
7845 it can be booted manually. The runtime guide has more information and
7846 examples.
7847 * native: All I/O functionality except signals has been implemented.
7848 * green: Task spawning with `libgreen` has been optimized with stack caching
7849 and various trimming of code.
7850 * green: Tasks spawned by `libgreen` now have an unmapped guard page.
7851 * sync: The `extra::sync` module has been updated to modern rust (and moved
7852 to the `sync` library), tweaking and improving various interfaces while
7853 dropping redundant functionality.
7854 * sync: A new `Barrier` type has been added to the `sync` library.
7855 * sync: An efficient mutex for native and green tasks has been implemented.
7856 * serialize: The `base64` module has seen some improvement. It treats
7857 newlines better, has non-string error values, and has seen general
7858 cleanup.
7859 * fourcc: A `fourcc!` macro was introduced
7860 * hexfloat: A `hexfloat!` macro was implemented for specifying floats via a
7861 hexadecimal literal.
7862
7863 * Tooling
7864 * `rustpkg` has been deprecated and removed from the main repository. Its
7865 replacement, `cargo`, is under development.
7866 * Nightly builds of rust are now available
7867 * The memory usage of rustc has been improved many times throughout this
7868 release cycle.
7869 * The build process supports disabling rpath support for the rustc binary
7870 itself.
7871 * Code generation has improved in some cases, giving more information to the
7872 LLVM optimization passes to enable more extensive optimizations.
7873 * Debuginfo compatibility with lldb on OSX has been restored.
7874 * The master branch is now gated on an android bot, making building for
7875 android much more reliable.
7876 * Output flags have been centralized into one `--emit` flag.
7877 * Crate type flags have been centralized into one `--crate-type` flag.
7878 * Codegen flags have been consolidated behind a `-C` flag.
7879 * Linking against outdated crates now has improved error messages.
7880 * Error messages with lifetimes will often suggest how to annotate the
7881 function to fix the error.
7882 * Many more types are documented in the standard library, and new guides
7883 were written.
7884 * Many `rustdoc` improvements:
7885 * code blocks are syntax highlighted.
7886 * render standalone markdown files.
7887 * the --test flag tests all code blocks by default.
7888 * exported macros are displayed.
7889 * re-exported types have their documentation inlined at the location of the
7890 first re-export.
7891 * search works across crates that have been rendered to the same output
7892 directory.
7893
7894
7895 Version 0.9 (2014-01-09)
7896 ==========================
7897
7898 * ~1800 changes, numerous bugfixes
7899
7900 * Language
7901 * The `float` type has been removed. Use `f32` or `f64` instead.
7902 * A new facility for enabling experimental features (feature gating) has
7903 been added, using the crate-level `#[feature(foo)]` attribute.
7904 * Managed boxes (@) are now behind a feature gate
7905 (`#[feature(managed_boxes)]`) in preparation for future removal. Use the
7906 standard library's `Gc` or `Rc` types instead.
7907 * `@mut` has been removed. Use `std::cell::{Cell, RefCell}` instead.
7908 * Jumping back to the top of a loop is now done with `continue` instead of
7909 `loop`.
7910 * Strings can no longer be mutated through index assignment.
7911 * Raw strings can be created via the basic `r"foo"` syntax or with matched
7912 hash delimiters, as in `r###"foo"###`.
7913 * `~fn` is now written `proc (args) -> retval { ... }` and may only be
7914 called once.
7915 * The `&fn` type is now written `|args| -> ret` to match the literal form.
7916 * `@fn`s have been removed.
7917 * `do` only works with procs in order to make it obvious what the cost
7918 of `do` is.
7919 * Single-element tuple-like structs can no longer be dereferenced to
7920 obtain the inner value. A more comprehensive solution for overloading
7921 the dereference operator will be provided in the future.
7922 * The `#[link(...)]` attribute has been replaced with
7923 `#[crate_id = "name#vers"]`.
7924 * Empty `impl`s must be terminated with empty braces and may not be
7925 terminated with a semicolon.
7926 * Keywords are no longer allowed as lifetime names; the `self` lifetime
7927 no longer has any special meaning.
7928 * The old `fmt!` string formatting macro has been removed.
7929 * `printf!` and `printfln!` (old-style formatting) removed in favor of
7930 `print!` and `println!`.
7931 * `mut` works in patterns now, as in `let (mut x, y) = (1, 2);`.
7932 * The `extern mod foo (name = "bar")` syntax has been removed. Use
7933 `extern mod foo = "bar"` instead.
7934 * New reserved keywords: `alignof`, `offsetof`, `sizeof`.
7935 * Macros can have attributes.
7936 * Macros can expand to items with attributes.
7937 * Macros can expand to multiple items.
7938 * The `asm!` macro is feature-gated (`#[feature(asm)]`).
7939 * Comments may be nested.
7940 * Values automatically coerce to trait objects they implement, without
7941 an explicit `as`.
7942 * Enum discriminants are no longer an entire word but as small as needed to
7943 contain all the variants. The `repr` attribute can be used to override
7944 the discriminant size, as in `#[repr(int)]` for integer-sized, and
7945 `#[repr(C)]` to match C enums.
7946 * Non-string literals are not allowed in attributes (they never worked).
7947 * The FFI now supports variadic functions.
7948 * Octal numeric literals, as in `0o7777`.
7949 * The `concat!` syntax extension performs compile-time string concatenation.
7950 * The `#[fixed_stack_segment]` and `#[rust_stack]` attributes have been
7951 removed as Rust no longer uses segmented stacks.
7952 * Non-ascii identifiers are feature-gated (`#[feature(non_ascii_idents)]`).
7953 * Ignoring all fields of an enum variant or tuple-struct is done with `..`,
7954 not `*`; ignoring remaining fields of a struct is also done with `..`,
7955 not `_`; ignoring a slice of a vector is done with `..`, not `.._`.
7956 * `rustc` supports the "win64" calling convention via `extern "win64"`.
7957 * `rustc` supports the "system" calling convention, which defaults to the
7958 preferred convention for the target platform, "stdcall" on 32-bit Windows,
7959 "C" elsewhere.
7960 * The `type_overflow` lint (default: warn) checks literals for overflow.
7961 * The `unsafe_block` lint (default: allow) checks for usage of `unsafe`.
7962 * The `attribute_usage` lint (default: warn) warns about unknown
7963 attributes.
7964 * The `unknown_features` lint (default: warn) warns about unknown
7965 feature gates.
7966 * The `dead_code` lint (default: warn) checks for dead code.
7967 * Rust libraries can be linked statically to one another
7968 * `#[link_args]` is behind the `link_args` feature gate.
7969 * Native libraries are now linked with `#[link(name = "foo")]`
7970 * Native libraries can be statically linked to a rust crate
7971 (`#[link(name = "foo", kind = "static")]`).
7972 * Native OS X frameworks are now officially supported
7973 (`#[link(name = "foo", kind = "framework")]`).
7974 * The `#[thread_local]` attribute creates thread-local (not task-local)
7975 variables. Currently behind the `thread_local` feature gate.
7976 * The `return` keyword may be used in closures.
7977 * Types that can be copied via a memcpy implement the `Pod` kind.
7978 * The `cfg` attribute can now be used on struct fields and enum variants.
7979
7980 * Libraries
7981 * std: The `option` and `result` API's have been overhauled to make them
7982 simpler, more consistent, and more composable.
7983 * std: The entire `std::io` module has been replaced with one that is
7984 more comprehensive and that properly interfaces with the underlying
7985 scheduler. File, TCP, UDP, Unix sockets, pipes, and timers are all
7986 implemented.
7987 * std: `io::util` contains a number of useful implementations of
7988 `Reader` and `Writer`, including `NullReader`, `NullWriter`,
7989 `ZeroReader`, `TeeReader`.
7990 * std: The reference counted pointer type `extra::rc` moved into std.
7991 * std: The `Gc` type in the `gc` module will replace `@` (it is currently
7992 just a wrapper around it).
7993 * std: The `Either` type has been removed.
7994 * std: `fmt::Default` can be implemented for any type to provide default
7995 formatting to the `format!` macro, as in `format!("{}", myfoo)`.
7996 * std: The `rand` API continues to be tweaked.
7997 * std: The `rust_begin_unwind` function, useful for inserting breakpoints
7998 on failure in gdb, is now named `rust_fail`.
7999 * std: The `each_key` and `each_value` methods on `HashMap` have been
8000 replaced by the `keys` and `values` iterators.
8001 * std: Functions dealing with type size and alignment have moved from the
8002 `sys` module to the `mem` module.
8003 * std: The `path` module was written and API changed.
8004 * std: `str::from_utf8` has been changed to cast instead of allocate.
8005 * std: `starts_with` and `ends_with` methods added to vectors via the
8006 `ImmutableEqVector` trait, which is in the prelude.
8007 * std: Vectors can be indexed with the `get_opt` method, which returns `None`
8008 if the index is out of bounds.
8009 * std: Task failure no longer propagates between tasks, as the model was
8010 complex, expensive, and incompatible with thread-based tasks.
8011 * std: The `Any` type can be used for dynamic typing.
8012 * std: `~Any` can be passed to the `fail!` macro and retrieved via
8013 `task::try`.
8014 * std: Methods that produce iterators generally do not have an `_iter`
8015 suffix now.
8016 * std: `cell::Cell` and `cell::RefCell` can be used to introduce mutability
8017 roots (mutable fields, etc.). Use instead of e.g. `@mut`.
8018 * std: `util::ignore` renamed to `prelude::drop`.
8019 * std: Slices have `sort` and `sort_by` methods via the `MutableVector`
8020 trait.
8021 * std: `vec::raw` has seen a lot of cleanup and API changes.
8022 * std: The standard library no longer includes any C++ code, and very
8023 minimal C, eliminating the dependency on libstdc++.
8024 * std: Runtime scheduling and I/O functionality has been factored out into
8025 extensible interfaces and is now implemented by two different crates:
8026 libnative, for native threading and I/O; and libgreen, for green threading
8027 and I/O. This paves the way for using the standard library in more limited
8028 embedded environments.
8029 * std: The `comm` module has been rewritten to be much faster, have a
8030 simpler, more consistent API, and to work for both native and green
8031 threading.
8032 * std: All libuv dependencies have been moved into the rustuv crate.
8033 * native: New implementations of runtime scheduling on top of OS threads.
8034 * native: New native implementations of TCP, UDP, file I/O, process spawning,
8035 and other I/O.
8036 * green: The green thread scheduler and message passing types are almost
8037 entirely lock-free.
8038 * extra: The `flatpipes` module had bitrotted and was removed.
8039 * extra: All crypto functions have been removed and Rust now has a policy of
8040 not reimplementing crypto in the standard library. In the future crypto
8041 will be provided by external crates with bindings to established libraries.
8042 * extra: `c_vec` has been modernized.
8043 * extra: The `sort` module has been removed. Use the `sort` method on
8044 mutable slices.
8045
8046 * Tooling
8047 * The `rust` and `rusti` commands have been removed, due to lack of
8048 maintenance.
8049 * `rustdoc` was completely rewritten.
8050 * `rustdoc` can test code examples in documentation.
8051 * `rustpkg` can test packages with the argument, 'test'.
8052 * `rustpkg` supports arbitrary dependencies, including C libraries.
8053 * `rustc`'s support for generating debug info is improved again.
8054 * `rustc` has better error reporting for unbalanced delimiters.
8055 * `rustc`'s JIT support was removed due to bitrot.
8056 * Executables and static libraries can be built with LTO (-Z lto)
8057 * `rustc` adds a `--dep-info` flag for communicating dependencies to
8058 build tools.
8059
8060
8061 Version 0.8 (2013-09-26)
8062 ============================
8063
8064 * ~2200 changes, numerous bugfixes
8065
8066 * Language
8067 * The `for` loop syntax has changed to work with the `Iterator` trait.
8068 * At long last, unwinding works on Windows.
8069 * Default methods are ready for use.
8070 * Many trait inheritance bugs fixed.
8071 * Owned and borrowed trait objects work more reliably.
8072 * `copy` is no longer a keyword. It has been replaced by the `Clone` trait.
8073 * rustc can omit emission of code for the `debug!` macro if it is passed
8074 `--cfg ndebug`
8075 * mod.rs is now "blessed". When loading `mod foo;`, rustc will now look
8076 for foo.rs, then foo/mod.rs, and will generate an error when both are
8077 present.
8078 * Strings no longer contain trailing nulls. The new `std::c_str` module
8079 provides new mechanisms for converting to C strings.
8080 * The type of foreign functions is now `extern "C" fn` instead of `*u8'.
8081 * The FFI has been overhauled such that foreign functions are called directly,
8082 instead of through a stack-switching wrapper.
8083 * Calling a foreign function must be done through a Rust function with the
8084 `#[fixed_stack_segment]` attribute.
8085 * The `externfn!` macro can be used to declare both a foreign function and
8086 a `#[fixed_stack_segment]` wrapper at once.
8087 * `pub` and `priv` modifiers on `extern` blocks are no longer parsed.
8088 * `unsafe` is no longer allowed on extern fns - they are all unsafe.
8089 * `priv` is disallowed everywhere except for struct fields and enum variants.
8090 * `&T` (besides `&'static T`) is no longer allowed in `@T`.
8091 * `ref` bindings in irrefutable patterns work correctly now.
8092 * `char` is now prevented from containing invalid code points.
8093 * Casting to `bool` is no longer allowed.
8094 * `\0` is now accepted as an escape in chars and strings.
8095 * `yield` is a reserved keyword.
8096 * `typeof` is a reserved keyword.
8097 * Crates may be imported by URL with `extern mod foo = "url";`.
8098 * Explicit enum discriminants may be given as uints as in `enum E { V = 0u }`
8099 * Static vectors can be initialized with repeating elements,
8100 e.g. `static foo: [u8, .. 100]: [0, .. 100];`.
8101 * Static structs can be initialized with functional record update,
8102 e.g. `static foo: Foo = Foo { a: 5, .. bar };`.
8103 * `cfg!` can be used to conditionally execute code based on the crate
8104 configuration, similarly to `#[cfg(...)]`.
8105 * The `unnecessary_qualification` lint detects unneeded module
8106 prefixes (default: allow).
8107 * Arithmetic operations have been implemented on the SIMD types in
8108 `std::unstable::simd`.
8109 * Exchange allocation headers were removed, reducing memory usage.
8110 * `format!` implements a completely new, extensible, and higher-performance
8111 string formatting system. It will replace `fmt!`.
8112 * `print!` and `println!` write formatted strings (using the `format!`
8113 extension) to stdout.
8114 * `write!` and `writeln!` write formatted strings (using the `format!`
8115 extension) to the new Writers in `std::rt::io`.
8116 * The library section in which a function or static is placed may
8117 be specified with `#[link_section = "..."]`.
8118 * The `proto!` syntax extension for defining bounded message protocols
8119 was removed.
8120 * `macro_rules!` is hygienic for `let` declarations.
8121 * The `#[export_name]` attribute specifies the name of a symbol.
8122 * `unreachable!` can be used to indicate unreachable code, and fails
8123 if executed.
8124
8125 * Libraries
8126 * std: Transitioned to the new runtime, written in Rust.
8127 * std: Added an experimental I/O library, `rt::io`, based on the new
8128 runtime.
8129 * std: A new generic `range` function was added to the prelude, replacing
8130 `uint::range` and friends.
8131 * std: `range_rev` no longer exists. Since range is an iterator it can be
8132 reversed with `range(lo, hi).invert()`.
8133 * std: The `chain` method on option renamed to `and_then`; `unwrap_or_default`
8134 renamed to `unwrap_or`.
8135 * std: The `iterator` module was renamed to `iter`.
8136 * std: Integral types now support the `checked_add`, `checked_sub`, and
8137 `checked_mul` operations for detecting overflow.
8138 * std: Many methods in `str`, `vec`, `option, `result` were renamed for
8139 consistency.
8140 * std: Methods are standardizing on conventions for casting methods:
8141 `to_foo` for copying, `into_foo` for moving, `as_foo` for temporary
8142 and cheap casts.
8143 * std: The `CString` type in `c_str` provides new ways to convert to and
8144 from C strings.
8145 * std: `DoubleEndedIterator` can yield elements in two directions.
8146 * std: The `mut_split` method on vectors partitions an `&mut [T]` into
8147 two splices.
8148 * std: `str::from_bytes` renamed to `str::from_utf8`.
8149 * std: `pop_opt` and `shift_opt` methods added to vectors.
8150 * std: The task-local data interface no longer uses @, and keys are
8151 no longer function pointers.
8152 * std: The `swap_unwrap` method of `Option` renamed to `take_unwrap`.
8153 * std: Added `SharedPort` to `comm`.
8154 * std: `Eq` has a default method for `ne`; only `eq` is required
8155 in implementations.
8156 * std: `Ord` has default methods for `le`, `gt` and `ge`; only `lt`
8157 is required in implementations.
8158 * std: `is_utf8` performance is improved, impacting many string functions.
8159 * std: `os::MemoryMap` provides cross-platform mmap.
8160 * std: `ptr::offset` is now unsafe, but also more optimized. Offsets that
8161 are not 'in-bounds' are considered undefined.
8162 * std: Many freestanding functions in `vec` removed in favor of methods.
8163 * std: Many freestanding functions on scalar types removed in favor of
8164 methods.
8165 * std: Many options to task builders were removed since they don't make
8166 sense in the new scheduler design.
8167 * std: More containers implement `FromIterator` so can be created by the
8168 `collect` method.
8169 * std: More complete atomic types in `unstable::atomics`.
8170 * std: `comm::PortSet` removed.
8171 * std: Mutating methods in the `Set` and `Map` traits have been moved into
8172 the `MutableSet` and `MutableMap` traits. `Container::is_empty`,
8173 `Map::contains_key`, `MutableMap::insert`, and `MutableMap::remove` have
8174 default implementations.
8175 * std: Various `from_str` functions were removed in favor of a generic
8176 `from_str` which is available in the prelude.
8177 * std: `util::unreachable` removed in favor of the `unreachable!` macro.
8178 * extra: `dlist`, the doubly-linked list was modernized.
8179 * extra: Added a `hex` module with `ToHex` and `FromHex` traits.
8180 * extra: Added `glob` module, replacing `std::os::glob`.
8181 * extra: `rope` was removed.
8182 * extra: `deque` was renamed to `ringbuf`. `RingBuf` implements `Deque`.
8183 * extra: `net`, and `timer` were removed. The experimental replacements
8184 are `std::rt::io::net` and `std::rt::io::timer`.
8185 * extra: Iterators implemented for `SmallIntMap`.
8186 * extra: Iterators implemented for `Bitv` and `BitvSet`.
8187 * extra: `SmallIntSet` removed. Use `BitvSet`.
8188 * extra: Performance of JSON parsing greatly improved.
8189 * extra: `semver` updated to SemVer 2.0.0.
8190 * extra: `term` handles more terminals correctly.
8191 * extra: `dbg` module removed.
8192 * extra: `par` module removed.
8193 * extra: `future` was cleaned up, with some method renames.
8194 * extra: Most free functions in `getopts` were converted to methods.
8195
8196 * Other
8197 * rustc's debug info generation (`-Z debug-info`) is greatly improved.
8198 * rustc accepts `--target-cpu` to compile to a specific CPU architecture,
8199 similarly to gcc's `--march` flag.
8200 * rustc's performance compiling small crates is much better.
8201 * rustpkg has received many improvements.
8202 * rustpkg supports git tags as package IDs.
8203 * rustpkg builds into target-specific directories so it can be used for
8204 cross-compiling.
8205 * The number of concurrent test tasks is controlled by the environment
8206 variable RUST_TEST_TASKS.
8207 * The test harness can now report metrics for benchmarks.
8208 * All tools have man pages.
8209 * Programs compiled with `--test` now support the `-h` and `--help` flags.
8210 * The runtime uses jemalloc for allocations.
8211 * Segmented stacks are temporarily disabled as part of the transition to
8212 the new runtime. Stack overflows are possible!
8213 * A new documentation backend, rustdoc_ng, is available for use. It is
8214 still invoked through the normal `rustdoc` command.
8215
8216
8217 Version 0.7 (2013-07-03)
8218 =======================
8219
8220 * ~2000 changes, numerous bugfixes
8221
8222 * Language
8223 * `impl`s no longer accept a visibility qualifier. Put them on methods
8224 instead.
8225 * The borrow checker has been rewritten with flow-sensitivity, fixing
8226 many bugs and inconveniences.
8227 * The `self` parameter no longer implicitly means `&'self self`,
8228 and can be explicitly marked with a lifetime.
8229 * Overloadable compound operators (`+=`, etc.) have been temporarily
8230 removed due to bugs.
8231 * The `for` loop protocol now requires `for`-iterators to return `bool`
8232 so they compose better.
8233 * The `Durable` trait is replaced with the `'static` bounds.
8234 * Trait default methods work more often.
8235 * Structs with the `#[packed]` attribute have byte alignment and
8236 no padding between fields.
8237 * Type parameters bound by `Copy` must now be copied explicitly with
8238 the `copy` keyword.
8239 * It is now illegal to move out of a dereferenced unsafe pointer.
8240 * `Option<~T>` is now represented as a nullable pointer.
8241 * `@mut` does dynamic borrow checks correctly.
8242 * The `main` function is only detected at the topmost level of the crate.
8243 The `#[main]` attribute is still valid anywhere.
8244 * Struct fields may no longer be mutable. Use inherited mutability.
8245 * The `#[no_send]` attribute makes a type that would otherwise be
8246 `Send`, not.
8247 * The `#[no_freeze]` attribute makes a type that would otherwise be
8248 `Freeze`, not.
8249 * Unbounded recursion will abort the process after reaching the limit
8250 specified by the `RUST_MAX_STACK` environment variable (default: 1GB).
8251 * The `vecs_implicitly_copyable` lint mode has been removed. Vectors
8252 are never implicitly copyable.
8253 * `#[static_assert]` makes compile-time assertions about static bools.
8254 * At long last, 'argument modes' no longer exist.
8255 * The rarely used `use mod` statement no longer exists.
8256
8257 * Syntax extensions
8258 * `fail!` and `assert!` accept `~str`, `&'static str` or `fmt!`-style
8259 argument list.
8260 * `Encodable`, `Decodable`, `Ord`, `TotalOrd`, `TotalEq`, `DeepClone`,
8261 `Rand`, `Zero` and `ToStr` can all be automatically derived with
8262 `#[deriving(...)]`.
8263 * The `bytes!` macro returns a vector of bytes for string, u8, char,
8264 and unsuffixed integer literals.
8265
8266 * Libraries
8267 * The `core` crate was renamed to `std`.
8268 * The `std` crate was renamed to `extra`.
8269 * More and improved documentation.
8270 * std: `iterator` module for external iterator objects.
8271 * Many old-style (internal, higher-order function) iterators replaced by
8272 implementations of `Iterator`.
8273 * std: Many old internal vector and string iterators,
8274 incl. `any`, `all`. removed.
8275 * std: The `finalize` method of `Drop` renamed to `drop`.
8276 * std: The `drop` method now takes `&mut self` instead of `&self`.
8277 * std: The prelude no longer re-exports any modules, only types and traits.
8278 * std: Prelude additions: `print`, `println`, `FromStr`, `ApproxEq`, `Equiv`,
8279 `Iterator`, `IteratorUtil`, many numeric traits, many tuple traits.
8280 * std: New numeric traits: `Fractional`, `Real`, `RealExt`, `Integer`, `Ratio`,
8281 `Algebraic`, `Trigonometric`, `Exponential`, `Primitive`.
8282 * std: Tuple traits and accessors defined for up to 12-tuples, e.g.
8283 `(0, 1, 2).n2()` or `(0, 1, 2).n2_ref()`.
8284 * std: Many types implement `Clone`.
8285 * std: `path` type renamed to `Path`.
8286 * std: `mut` module and `Mut` type removed.
8287 * std: Many standalone functions removed in favor of methods and iterators
8288 in `vec`, `str`. In the future methods will also work as functions.
8289 * std: `reinterpret_cast` removed. Use `transmute`.
8290 * std: ascii string handling in `std::ascii`.
8291 * std: `Rand` is implemented for ~/@.
8292 * std: `run` module for spawning processes overhauled.
8293 * std: Various atomic types added to `unstable::atomic`.
8294 * std: Various types implement `Zero`.
8295 * std: `LinearMap` and `LinearSet` renamed to `HashMap` and `HashSet`.
8296 * std: Borrowed pointer functions moved from `ptr` to `borrow`.
8297 * std: Added `os::mkdir_recursive`.
8298 * std: Added `os::glob` function performs filesystems globs.
8299 * std: `FuzzyEq` renamed to `ApproxEq`.
8300 * std: `Map` now defines `pop` and `swap` methods.
8301 * std: `Cell` constructors converted to static methods.
8302 * extra: `rc` module adds the reference counted pointers, `Rc` and `RcMut`.
8303 * extra: `flate` module moved from `std` to `extra`.
8304 * extra: `fileinput` module for iterating over a series of files.
8305 * extra: `Complex` number type and `complex` module.
8306 * extra: `Rational` number type and `rational` module.
8307 * extra: `BigInt`, `BigUint` implement numeric and comparison traits.
8308 * extra: `term` uses terminfo now, is more correct.
8309 * extra: `arc` functions converted to methods.
8310 * extra: Implementation of fixed output size variations of SHA-2.
8311
8312 * Tooling
8313 * `unused_variables` lint mode for unused variables (default: warn).
8314 * `unused_unsafe` lint mode for detecting unnecessary `unsafe` blocks
8315 (default: warn).
8316 * `unused_mut` lint mode for identifying unused `mut` qualifiers
8317 (default: warn).
8318 * `dead_assignment` lint mode for unread variables (default: warn).
8319 * `unnecessary_allocation` lint mode detects some heap allocations that are
8320 immediately borrowed so could be written without allocating (default: warn).
8321 * `missing_doc` lint mode (default: allow).
8322 * `unreachable_code` lint mode (default: warn).
8323 * The `rusti` command has been rewritten and a number of bugs addressed.
8324 * rustc outputs in color on more terminals.
8325 * rustc accepts a `--link-args` flag to pass arguments to the linker.
8326 * rustc accepts a `-Z print-link-args` flag for debugging linkage.
8327 * Compiling with `-g` will make the binary record information about
8328 dynamic borrowcheck failures for debugging.
8329 * rustdoc has a nicer stylesheet.
8330 * Various improvements to rustdoc.
8331 * Improvements to rustpkg (see the detailed release notes).
8332
8333
8334 Version 0.6 (2013-04-03)
8335 ========================
8336
8337 * ~2100 changes, numerous bugfixes
8338
8339 * Syntax changes
8340 * The self type parameter in traits is now spelled `Self`
8341 * The `self` parameter in trait and impl methods must now be explicitly
8342 named (for example: `fn f(&self) { }`). Implicit self is deprecated.
8343 * Static methods no longer require the `static` keyword and instead
8344 are distinguished by the lack of a `self` parameter
8345 * Replaced the `Durable` trait with the `'static` lifetime
8346 * The old closure type syntax with the trailing sigil has been
8347 removed in favor of the more consistent leading sigil
8348 * `super` is a keyword, and may be prefixed to paths
8349 * Trait bounds are separated with `+` instead of whitespace
8350 * Traits are implemented with `impl Trait for Type`
8351 instead of `impl Type: Trait`
8352 * Lifetime syntax is now `&'l foo` instead of `&l/foo`
8353 * The `export` keyword has finally been removed
8354 * The `move` keyword has been removed (see "Semantic changes")
8355 * The interior mutability qualifier on vectors, `[mut T]`, has been
8356 removed. Use `&mut [T]`, etc.
8357 * `mut` is no longer valid in `~mut T`. Use inherited mutability
8358 * `fail` is no longer a keyword. Use `fail!()`
8359 * `assert` is no longer a keyword. Use `assert!()`
8360 * `log` is no longer a keyword. use `debug!`, etc.
8361 * 1-tuples may be represented as `(T,)`
8362 * Struct fields may no longer be `mut`. Use inherited mutability,
8363 `@mut T`, `core::mut` or `core::cell`
8364 * `extern mod { ... }` is no longer valid syntax for foreign
8365 function modules. Use extern blocks: `extern { ... }`
8366 * Newtype enums removed. Use tuple-structs.
8367 * Trait implementations no longer support visibility modifiers
8368 * Pattern matching over vectors improved and expanded
8369 * `const` renamed to `static` to correspond to lifetime name,
8370 and make room for future `static mut` unsafe mutable globals.
8371 * Replaced `#[deriving_eq]` with `#[deriving(Eq)]`, etc.
8372 * `Clone` implementations can be automatically generated with
8373 `#[deriving(Clone)]`
8374 * Casts to traits must use a pointer sigil, e.g. `@foo as @Bar`
8375 instead of `foo as Bar`.
8376 * Fixed length vector types are now written as `[int, .. 3]`
8377 instead of `[int * 3]`.
8378 * Fixed length vector types can express the length as a constant
8379 expression. (ex: `[int, .. GL_BUFFER_SIZE - 2]`)
8380
8381 * Semantic changes
8382 * Types with owned pointers or custom destructors move by default,
8383 eliminating the `move` keyword
8384 * All foreign functions are considered unsafe
8385 * &mut is now unaliasable
8386 * Writes to borrowed @mut pointers are prevented dynamically
8387 * () has size 0
8388 * The name of the main function can be customized using #[main]
8389 * The default type of an inferred closure is &fn instead of @fn
8390 * `use` statements may no longer be "chained" - they cannot import
8391 identifiers imported by previous `use` statements
8392 * `use` statements are crate relative, importing from the "top"
8393 of the crate by default. Paths may be prefixed with `super::`
8394 or `self::` to change the search behavior.
8395 * Method visibility is inherited from the implementation declaration
8396 * Structural records have been removed
8397 * Many more types can be used in static items, including enums
8398 'static-lifetime pointers and vectors
8399 * Pattern matching over vectors improved and expanded
8400 * Typechecking of closure types has been overhauled to
8401 improve inference and eliminate unsoundness
8402 * Macros leave scope at the end of modules, unless that module is
8403 tagged with #[macro_escape]
8404
8405 * Libraries
8406 * Added big integers to `std::bigint`
8407 * Removed `core::oldcomm` module
8408 * Added pipe-based `core::comm` module
8409 * Numeric traits have been reorganized under `core::num`
8410 * `vec::slice` finally returns a slice
8411 * `debug!` and friends don't require a format string, e.g. `debug!(Foo)`
8412 * Containers reorganized around traits in `core::container`
8413 * `core::dvec` removed, `~[T]` is a drop-in replacement
8414 * `core::send_map` renamed to `core::hashmap`
8415 * `std::map` removed; replaced with `core::hashmap`
8416 * `std::treemap` reimplemented as an owned balanced tree
8417 * `std::deque` and `std::smallintmap` reimplemented as owned containers
8418 * `core::trie` added as a fast ordered map for integer keys
8419 * Set types added to `core::hashmap`, `core::trie` and `std::treemap`
8420 * `Ord` split into `Ord` and `TotalOrd`. `Ord` is still used to
8421 overload the comparison operators, whereas `TotalOrd` is used
8422 by certain container types
8423
8424 * Other
8425 * Replaced the 'cargo' package manager with 'rustpkg'
8426 * Added all-purpose 'rust' tool
8427 * `rustc --test` now supports benchmarks with the `#[bench]` attribute
8428 * rustc now *attempts* to offer spelling suggestions
8429 * Improved support for ARM and Android
8430 * Preliminary MIPS backend
8431 * Improved foreign function ABI implementation for x86, x86_64
8432 * Various memory usage improvements
8433 * Rust code may be embedded in foreign code under limited circumstances
8434 * Inline assembler supported by new asm!() syntax extension.
8435
8436
8437 Version 0.5 (2012-12-21)
8438 ===========================
8439
8440 * ~900 changes, numerous bugfixes
8441
8442 * Syntax changes
8443 * Removed `<-` move operator
8444 * Completed the transition from the `#fmt` extension syntax to `fmt!`
8445 * Removed old fixed length vector syntax - `[T]/N`
8446 * New token-based quasi-quoters, `quote_tokens!`, `quote_expr!`, etc.
8447 * Macros may now expand to items and statements
8448 * `a.b()` is always parsed as a method call, never as a field projection
8449 * `Eq` and `IterBytes` implementations can be automatically generated
8450 with `#[deriving_eq]` and `#[deriving_iter_bytes]` respectively
8451 * Removed the special crate language for `.rc` files
8452 * Function arguments may consist of any irrefutable pattern
8453
8454 * Semantic changes
8455 * `&` and `~` pointers may point to objects
8456 * Tuple structs - `struct Foo(Bar, Baz)`. Will replace newtype enums.
8457 * Enum variants may be structs
8458 * Destructors can be added to all nominal types with the Drop trait
8459 * Structs and nullary enum variants may be constants
8460 * Values that cannot be implicitly copied are now automatically moved
8461 without writing `move` explicitly
8462 * `&T` may now be coerced to `*T`
8463 * Coercions happen in `let` statements as well as function calls
8464 * `use` statements now take crate-relative paths
8465 * The module and type namespaces have been merged so that static
8466 method names can be resolved under the trait in which they are
8467 declared
8468
8469 * Improved support for language features
8470 * Trait inheritance works in many scenarios
8471 * More support for explicit self arguments in methods - `self`, `&self`
8472 `@self`, and `~self` all generally work as expected
8473 * Static methods work in more situations
8474 * Experimental: Traits may declare default methods for the implementations
8475 to use
8476
8477 * Libraries
8478 * New condition handling system in `core::condition`
8479 * Timsort added to `std::sort`
8480 * New priority queue, `std::priority_queue`
8481 * Pipes for serializable types, `std::flatpipes'
8482 * Serialization overhauled to be trait-based
8483 * Expanded `getopts` definitions
8484 * Moved futures to `std`
8485 * More functions are pure now
8486 * `core::comm` renamed to `oldcomm`. Still deprecated
8487 * `rustdoc` and `cargo` are libraries now
8488
8489 * Misc
8490 * Added a preliminary REPL, `rusti`
8491 * License changed from MIT to dual MIT/APL2
8492
8493
8494 Version 0.4 (2012-10-15)
8495 ==========================
8496
8497 * ~2000 changes, numerous bugfixes
8498
8499 * Syntax
8500 * All keywords are now strict and may not be used as identifiers anywhere
8501 * Keyword removal: 'again', 'import', 'check', 'new', 'owned', 'send',
8502 'of', 'with', 'to', 'class'.
8503 * Classes are replaced with simpler structs
8504 * Explicit method self types
8505 * `ret` became `return` and `alt` became `match`
8506 * `import` is now `use`; `use is now `extern mod`
8507 * `extern mod { ... }` is now `extern { ... }`
8508 * `use mod` is the recommended way to import modules
8509 * `pub` and `priv` replace deprecated export lists
8510 * The syntax of `match` pattern arms now uses fat arrow (=>)
8511 * `main` no longer accepts an args vector; use `os::args` instead
8512
8513 * Semantics
8514 * Trait implementations are now coherent, ala Haskell typeclasses
8515 * Trait methods may be static
8516 * Argument modes are deprecated
8517 * Borrowed pointers are much more mature and recommended for use
8518 * Strings and vectors in the static region are stored in constant memory
8519 * Typestate was removed
8520 * Resolution rewritten to be more reliable
8521 * Support for 'dual-mode' data structures (freezing and thawing)
8522
8523 * Libraries
8524 * Most binary operators can now be overloaded via the traits in
8525 `core::ops'
8526 * `std::net::url` for representing URLs
8527 * Sendable hash maps in `core::send_map`
8528 * `core::task' gained a (currently unsafe) task-local storage API
8529
8530 * Concurrency
8531 * An efficient new intertask communication primitive called the pipe,
8532 along with a number of higher-level channel types, in `core::pipes`
8533 * `std::arc`, an atomically reference counted, immutable, shared memory
8534 type
8535 * `std::sync`, various exotic synchronization tools based on arcs and pipes
8536 * Futures are now based on pipes and sendable
8537 * More robust linked task failure
8538 * Improved task builder API
8539
8540 * Other
8541 * Improved error reporting
8542 * Preliminary JIT support
8543 * Preliminary work on precise GC
8544 * Extensive architectural improvements to rustc
8545 * Begun a transition away from buggy C++-based reflection (shape) code to
8546 Rust-based (visitor) code
8547 * All hash functions and tables converted to secure, randomized SipHash
8548
8549
8550 Version 0.3 (2012-07-12)
8551 ========================
8552
8553 * ~1900 changes, numerous bugfixes
8554
8555 * New coding conveniences
8556 * Integer-literal suffix inference
8557 * Per-item control over warnings, errors
8558 * #[cfg(windows)] and #[cfg(unix)] attributes
8559 * Documentation comments
8560 * More compact closure syntax
8561 * 'do' expressions for treating higher-order functions as
8562 control structures
8563 * *-patterns (wildcard extended to all constructor fields)
8564
8565 * Semantic cleanup
8566 * Name resolution pass and exhaustiveness checker rewritten
8567 * Region pointers and borrow checking supersede alias
8568 analysis
8569 * Init-ness checking is now provided by a region-based liveness
8570 pass instead of the typestate pass; same for last-use analysis
8571 * Extensive work on region pointers
8572
8573 * Experimental new language features
8574 * Slices and fixed-size, interior-allocated vectors
8575 * #!-comments for lang versioning, shell execution
8576 * Destructors and iface implementation for classes;
8577 type-parameterized classes and class methods
8578 * 'const' type kind for types that can be used to implement
8579 shared-memory concurrency patterns
8580
8581 * Type reflection
8582
8583 * Removal of various obsolete features
8584 * Keywords: 'be', 'prove', 'syntax', 'note', 'mutable', 'bind',
8585 'crust', 'native' (now 'extern'), 'cont' (now 'again')
8586
8587 * Constructs: do-while loops ('do' repurposed), fn binding,
8588 resources (replaced by destructors)
8589
8590 * Compiler reorganization
8591 * Syntax-layer of compiler split into separate crate
8592 * Clang (from LLVM project) integrated into build
8593 * Typechecker split into sub-modules
8594
8595 * New library code
8596 * New time functions
8597 * Extension methods for many built-in types
8598 * Arc: atomic-refcount read-only / exclusive-use shared cells
8599 * Par: parallel map and search routines
8600 * Extensive work on libuv interface
8601 * Much vector code moved to libraries
8602 * Syntax extensions: #line, #col, #file, #mod, #stringify,
8603 #include, #include_str, #include_bin
8604
8605 * Tool improvements
8606 * Cargo automatically resolves dependencies
8607
8608
8609 Version 0.2 (2012-03-29)
8610 =========================
8611
8612 * >1500 changes, numerous bugfixes
8613
8614 * New docs and doc tooling
8615
8616 * New port: FreeBSD x86_64
8617
8618 * Compilation model enhancements
8619 * Generics now specialized, multiply instantiated
8620 * Functions now inlined across separate crates
8621
8622 * Scheduling, stack and threading fixes
8623 * Noticeably improved message-passing performance
8624 * Explicit schedulers
8625 * Callbacks from C
8626 * Helgrind clean
8627
8628 * Experimental new language features
8629 * Operator overloading
8630 * Region pointers
8631 * Classes
8632
8633 * Various language extensions
8634 * C-callback function types: 'crust fn ...'
8635 * Infinite-loop construct: 'loop { ... }'
8636 * Shorten 'mutable' to 'mut'
8637 * Required mutable-local qualifier: 'let mut ...'
8638 * Basic glob-exporting: 'export foo::*;'
8639 * Alt now exhaustive, 'alt check' for runtime-checked
8640 * Block-function form of 'for' loop, with 'break' and 'ret'.
8641
8642 * New library code
8643 * AST quasi-quote syntax extension
8644 * Revived libuv interface
8645 * New modules: core::{future, iter}, std::arena
8646 * Merged per-platform std::{os*, fs*} to core::{libc, os}
8647 * Extensive cleanup, regularization in libstd, libcore
8648
8649
8650 Version 0.1 (2012-01-20)
8651 ===============================
8652
8653 * Most language features work, including:
8654 * Unique pointers, unique closures, move semantics
8655 * Interface-constrained generics
8656 * Static interface dispatch
8657 * Stack growth
8658 * Multithread task scheduling
8659 * Typestate predicates
8660 * Failure unwinding, destructors
8661 * Pattern matching and destructuring assignment
8662 * Lightweight block-lambda syntax
8663 * Preliminary macro-by-example
8664
8665 * Compiler works with the following configurations:
8666 * Linux: x86 and x86_64 hosts and targets
8667 * macOS: x86 and x86_64 hosts and targets
8668 * Windows: x86 hosts and targets
8669
8670 * Cross compilation / multi-target configuration supported.
8671
8672 * Preliminary API-documentation and package-management tools included.
8673
8674 Known issues:
8675
8676 * Documentation is incomplete.
8677
8678 * Performance is below intended target.
8679
8680 * Standard library APIs are subject to extensive change, reorganization.
8681
8682 * Language-level versioning is not yet operational - future code will
8683 break unexpectedly.