]> git.lizzy.rs Git - rust.git/blob - RELEASES.md
Rollup merge of #37622 - ollie27:cstring, r=alexcrichton
[rust.git] / RELEASES.md
1 Version 1.12.1 (2016-10-20)
2 ===========================
3
4 Regression Fixes
5 ----------------
6
7 * [ICE: 'rustc' panicked at 'assertion failed: concrete_substs.is_normalized_for_trans()' #36381][36381]
8 * [Confusion with double negation and booleans][36856]
9 * [rustc 1.12.0 fails with SIGSEGV in release mode (syn crate 0.8.0)][36875]
10 * [Rustc 1.12.0 Windows build of `ethcore` crate fails with LLVM error][36924]
11 * [1.12.0: High memory usage when linking in release mode with debug info][36926]
12 * [Corrupted memory after updated to 1.12][36936]
13 * ["Let NullaryConstructor = something;" causes internal compiler error: "tried to overwrite interned AdtDef"][37026]
14 * [Fix ICE: inject bitcast if types mismatch for invokes/calls/stores][37112]
15 * [debuginfo: Handle spread_arg case in MIR-trans in a more stable way.][37153]
16
17 [36381]: https://github.com/rust-lang/rust/issues/36381
18 [36856]: https://github.com/rust-lang/rust/issues/36856
19 [36875]: https://github.com/rust-lang/rust/issues/36875
20 [36924]: https://github.com/rust-lang/rust/issues/36924
21 [36926]: https://github.com/rust-lang/rust/issues/36926
22 [36936]: https://github.com/rust-lang/rust/issues/36936
23 [37026]: https://github.com/rust-lang/rust/issues/37026
24 [37112]: https://github.com/rust-lang/rust/issues/37112
25 [37153]: https://github.com/rust-lang/rust/issues/37153
26
27
28 Version 1.12.0 (2016-09-29)
29 ===========================
30
31 Highlights
32 ----------
33
34 * [`rustc` translates code to LLVM IR via its own "middle" IR (MIR)]
35   (https://github.com/rust-lang/rust/pull/34096).
36   This translation pass is far simpler than the previous AST->LLVM pass, and
37   creates opportunities to perform new optimizations directly on the MIR. It
38   was previously described [on the Rust blog]
39   (https://blog.rust-lang.org/2016/04/19/MIR.html).
40 * [`rustc` presents a new, more readable error format, along with
41   machine-readable JSON error output for use by IDEs]
42   (https://github.com/rust-lang/rust/pull/35401).
43   Most common editors supporting Rust have been updated to work with it. It was
44   previously described [on the Rust blog]
45   (https://blog.rust-lang.org/2016/08/10/Shape-of-errors-to-come.html).
46
47 Compiler
48 --------
49
50 * [`rustc` translates code to LLVM IR via its own "middle" IR (MIR)]
51   (https://github.com/rust-lang/rust/pull/34096).
52   This translation pass is far simpler than the previous AST->LLVM pass, and
53   creates opportunities to perform new optimizations directly on the MIR. It
54   was previously described [on the Rust blog]
55   (https://blog.rust-lang.org/2016/04/19/MIR.html).
56 * [Print the Rust target name, not the LLVM target name, with
57   `--print target-list`]
58   (https://github.com/rust-lang/rust/pull/35489)
59 * [The computation of `TypeId` is correct in some cases where it was previously
60   producing inconsistent results]
61   (https://github.com/rust-lang/rust/pull/35267)
62 * [The `mips-unknown-linux-gnu` target uses hardware floating point by default]
63   (https://github.com/rust-lang/rust/pull/34910)
64 * [The `rustc` arguments, `--print target-cpus`, `--print target-features`,
65   `--print relocation-models`, and `--print code-models` print the available
66   options to the `-C target-cpu`, `-C target-feature`, `-C relocation-model` and
67   `-C code-model` code generation arguments]
68   (https://github.com/rust-lang/rust/pull/34845)
69 * [`rustc` supports three new MUSL targets on ARM: `arm-unknown-linux-musleabi`,
70   `arm-unknown-linux-musleabihf`, and `armv7-unknown-linux-musleabihf`]
71   (https://github.com/rust-lang/rust/pull/35060).
72   These targets produce statically-linked binaries. There are no binary release
73   builds yet though.
74
75 Diagnostics
76 -----------
77
78 * [`rustc` presents a new, more readable error format, along with
79   machine-readable JSON error output for use by IDEs]
80   (https://github.com/rust-lang/rust/pull/35401).
81   Most common editors supporting Rust have been updated to work with it. It was
82   previously described [on the Rust blog]
83   (https://blog.rust-lang.org/2016/08/10/Shape-of-errors-to-come.html).
84 * [In error descriptions, references are now described in plain English,
85   instead of as "&-ptr"]
86   (https://github.com/rust-lang/rust/pull/35611)
87 * [In error type descriptions, unknown numeric types are named `{integer}` or
88   `{float}` instead of `_`]
89   (https://github.com/rust-lang/rust/pull/35080)
90 * [`rustc` emits a clearer error when inner attributes follow a doc comment]
91   (https://github.com/rust-lang/rust/pull/34676)
92
93 Language
94 --------
95
96 * [`macro_rules!` invocations can be made within `macro_rules!` invocations]
97   (https://github.com/rust-lang/rust/pull/34925)
98 * [`macro_rules!` meta-variables are hygienic]
99   (https://github.com/rust-lang/rust/pull/35453)
100 * [`macro_rules!` `tt` matchers can be reparsed correctly, making them much more
101   useful]
102   (https://github.com/rust-lang/rust/pull/34908)
103 * [`macro_rules!` `stmt` matchers correctly consume the entire contents when
104   inside non-braces invocations]
105   (https://github.com/rust-lang/rust/pull/34886)
106 * [Semicolons are properly required as statement delimeters inside
107   `macro_rules!` invocations]
108   (https://github.com/rust-lang/rust/pull/34660)
109 * [`cfg_attr` works on `path` attributes]
110   (https://github.com/rust-lang/rust/pull/34546)
111
112 Stabilized APIs
113 ---------------
114
115 * [`Cell::as_ptr`]
116   (https://doc.rust-lang.org/std/cell/struct.Cell.html#method.as_ptr)
117 * [`RefCell::as_ptr`]
118   (https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.as_ptr)
119 * [`IpAddr::is_unspecified`]
120   (https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_unspecified)
121 * [`IpAddr::is_loopback`]
122   (https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_loopback)
123 * [`IpAddr::is_multicast`]
124   (https://doc.rust-lang.org/std/net/enum.IpAddr.html#method.is_multicast)
125 * [`Ipv4Addr::is_unspecified`]
126   (https://doc.rust-lang.org/std/net/struct.Ipv4Addr.html#method.is_unspecified)
127 * [`Ipv6Addr::octets`]
128   (https://doc.rust-lang.org/std/net/struct.Ipv6Addr.html#method.octets)
129 * [`LinkedList::contains`]
130   (https://doc.rust-lang.org/std/collections/linked_list/struct.LinkedList.html#method.contains)
131 * [`VecDeque::contains`]
132   (https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.contains)
133 * [`ExitStatusExt::from_raw`]
134   (https://doc.rust-lang.org/std/os/unix/process/trait.ExitStatusExt.html#tymethod.from_raw).
135   Both on Unix and Windows.
136 * [`Receiver::recv_timeout`]
137   (https://doc.rust-lang.org/std/sync/mpsc/struct.Receiver.html#method.recv_timeout)
138 * [`RecvTimeoutError`]
139   (https://doc.rust-lang.org/std/sync/mpsc/enum.RecvTimeoutError.html)
140 * [`BinaryHeap::peek_mut`]
141   (https://doc.rust-lang.org/std/collections/binary_heap/struct.BinaryHeap.html#method.peek_mut)
142 * [`PeekMut`]
143   (https://doc.rust-lang.org/std/collections/binary_heap/struct.PeekMut.html)
144 * [`iter::Product`]
145   (https://doc.rust-lang.org/std/iter/trait.Product.html)
146 * [`iter::Sum`]
147   (https://doc.rust-lang.org/std/iter/trait.Sum.html)
148 * [`OccupiedEntry::remove_entry`]
149   (https://doc.rust-lang.org/std/collections/btree_map/struct.OccupiedEntry.html#method.remove_entry)
150 * [`VacantEntry::into_key`]
151   (https://doc.rust-lang.org/std/collections/btree_map/struct.VacantEntry.html#method.into_key)
152
153 Libraries
154 ---------
155
156 * [The `format!` macro and friends now allow a single argument to be formatted
157   in multiple styles]
158   (https://github.com/rust-lang/rust/pull/33642)
159 * [The lifetime bounds on `[T]::binary_search_by` and
160   `[T]::binary_search_by_key` have been adjusted to be more flexible]
161   (https://github.com/rust-lang/rust/pull/34762)
162 * [`Option` implements `From` for its contained type]
163   (https://github.com/rust-lang/rust/pull/34828)
164 * [`Cell`, `RefCell` and `UnsafeCell` implement `From` for their contained type]
165   (https://github.com/rust-lang/rust/pull/35392)
166 * [`RwLock` panics if the reader count overflows]
167   (https://github.com/rust-lang/rust/pull/35378)
168 * [`vec_deque::Drain`, `hash_map::Drain` and `hash_set::Drain` are covariant]
169   (https://github.com/rust-lang/rust/pull/35354)
170 * [`vec::Drain` and `binary_heap::Drain` are covariant]
171   (https://github.com/rust-lang/rust/pull/34951)
172 * [`Cow<str>` implements `FromIterator` for `char`, `&str` and `String`]
173   (https://github.com/rust-lang/rust/pull/35064)
174 * [Sockets on Linux are correctly closed in subprocesses via `SOCK_CLOEXEC`]
175   (https://github.com/rust-lang/rust/pull/34946)
176 * [`hash_map::Entry`, `hash_map::VacantEntry` and `hash_map::OccupiedEntry`
177   implement `Debug`]
178   (https://github.com/rust-lang/rust/pull/34937)
179 * [`btree_map::Entry`, `btree_map::VacantEntry` and `btree_map::OccupiedEntry`
180   implement `Debug`]
181   (https://github.com/rust-lang/rust/pull/34885)
182 * [`String` implements `AddAssign`]
183   (https://github.com/rust-lang/rust/pull/34890)
184 * [Variadic `extern fn` pointers implement the `Clone`, `PartialEq`, `Eq`,
185   `PartialOrd`, `Ord`, `Hash`, `fmt::Pointer`, and `fmt::Debug` traits]
186   (https://github.com/rust-lang/rust/pull/34879)
187 * [`FileType` implements `Debug`]
188   (https://github.com/rust-lang/rust/pull/34757)
189 * [References to `Mutex` and `RwLock` are unwind-safe]
190   (https://github.com/rust-lang/rust/pull/34756)
191 * [`mpsc::sync_channel` `Receiver`s return any available message before
192   reporting a disconnect]
193   (https://github.com/rust-lang/rust/pull/34731)
194 * [Unicode definitions have been updated to 9.0]
195   (https://github.com/rust-lang/rust/pull/34599)
196 * [`env` iterators implement `DoubleEndedIterator`]
197   (https://github.com/rust-lang/rust/pull/33312)
198
199 Cargo
200 -----
201
202 * [Support local mirrors of registries]
203   (https://github.com/rust-lang/cargo/pull/2857)
204 * [Add support for command aliases]
205   (https://github.com/rust-lang/cargo/pull/2679)
206 * [Allow `opt-level="s"` / `opt-level="z"` in profile overrides]
207   (https://github.com/rust-lang/cargo/pull/3007)
208 * [Make `cargo doc --open --target` work as expected]
209   (https://github.com/rust-lang/cargo/pull/2988)
210 * [Speed up noop registry updates]
211   (https://github.com/rust-lang/cargo/pull/2974)
212 * [Update OpenSSL]
213   (https://github.com/rust-lang/cargo/pull/2971)
214 * [Fix `--panic=abort` with plugins]
215   (https://github.com/rust-lang/cargo/pull/2954)
216 * [Always pass `-C metadata` to the compiler]
217   (https://github.com/rust-lang/cargo/pull/2946)
218 * [Fix depending on git repos with workspaces]
219   (https://github.com/rust-lang/cargo/pull/2938)
220 * [Add a `--lib` flag to `cargo new`]
221   (https://github.com/rust-lang/cargo/pull/2921)
222 * [Add `http.cainfo` for custom certs]
223   (https://github.com/rust-lang/cargo/pull/2917)
224 * [Indicate the compilation profile after compiling]
225   (https://github.com/rust-lang/cargo/pull/2909)
226 * [Allow enabling features for dependencies with `--features`]
227   (https://github.com/rust-lang/cargo/pull/2876)
228 * [Add `--jobs` flag to `cargo package`]
229   (https://github.com/rust-lang/cargo/pull/2867)
230 * [Add `--dry-run` to `cargo publish`]
231   (https://github.com/rust-lang/cargo/pull/2849)
232 * [Add support for `RUSTDOCFLAGS`]
233   (https://github.com/rust-lang/cargo/pull/2794)
234
235 Performance
236 -----------
237
238 * [`panic::catch_unwind` is more optimized]
239   (https://github.com/rust-lang/rust/pull/35444)
240 * [`panic::catch_unwind` no longer accesses thread-local storage on entry]
241   (https://github.com/rust-lang/rust/pull/34866)
242
243 Tooling
244 -------
245
246 * [Test binaries now support a `--test-threads` argument to specify the number
247   of threads used to run tests, and which acts the same as the
248   `RUST_TEST_THREADS` environment variable]
249   (https://github.com/rust-lang/rust/pull/35414)  
250 * [The test runner now emits a warning when tests run over 60 seconds]
251   (https://github.com/rust-lang/rust/pull/35405)
252 * [rustdoc: Fix methods in search results]
253   (https://github.com/rust-lang/rust/pull/34752)
254 * [`rust-lldb` warns about unsupported versions of LLDB]
255   (https://github.com/rust-lang/rust/pull/34646)
256 * [Rust releases now come with source packages that can be installed by rustup
257   via `rustup component add rust-src`]
258   (https://github.com/rust-lang/rust/pull/34366).
259   The resulting source code can be used by tools and IDES, located in the
260   sysroot under `lib/rustlib/src`.
261
262 Misc
263 ----
264
265 * [The compiler can now be built against LLVM 3.9]
266   (https://github.com/rust-lang/rust/pull/35594)
267 * Many minor improvements to the documentation.
268 * [The Rust exception handling "personality" routine is now written in Rust]
269   (https://github.com/rust-lang/rust/pull/34832)
270
271 Compatibility Notes
272 -------------------
273
274 * [When printing Windows `OsStr`s, unpaired surrogate codepoints are escaped
275   with the lowercase format instead of the uppercase]
276   (https://github.com/rust-lang/rust/pull/35084)
277 * [When formatting strings, if "precision" is specified, the "fill",
278   "align" and "width" specifiers are no longer ignored]
279   (https://github.com/rust-lang/rust/pull/34544)
280 * [The `Debug` impl for strings no longer escapes all non-ASCII characters]
281   (https://github.com/rust-lang/rust/pull/34485)
282
283
284 Version 1.11.0 (2016-08-18)
285 ===========================
286
287 Language
288 --------
289
290 * [`cfg_attr` works on `path` attributes]
291   (https://github.com/rust-lang/rust/pull/34546)
292 * [Support nested `cfg_attr` attributes]
293   (https://github.com/rust-lang/rust/pull/34216)
294 * [Allow statement-generating braced macro invocations at the end of blocks]
295   (https://github.com/rust-lang/rust/pull/34436)
296 * [Macros can be expanded inside of trait definitions]
297   (https://github.com/rust-lang/rust/pull/34213)
298 * [`#[macro_use]` works properly when it is itself expanded from a macro]
299   (https://github.com/rust-lang/rust/pull/34032)
300
301 Stabilized APIs
302 ---------------
303
304 * [`BinaryHeap::append`]
305   (https://doc.rust-lang.org/std/collections/binary_heap/struct.BinaryHeap.html#method.append)
306 * [`BTreeMap::append`]
307   (https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.append)
308 * [`BTreeMap::split_off`]
309   (https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.split_off)
310 * [`BTreeSet::append`]
311   (https://doc.rust-lang.org/std/collections/btree_set/struct.BTreeSet.html#method.append)
312 * [`BTreeSet::split_off`]
313   (https://doc.rust-lang.org/std/collections/btree_set/struct.BTreeSet.html#method.split_off)
314 * [`f32::to_degrees`]
315   (https://doc.rust-lang.org/std/primitive.f32.html#method.to_degrees)
316   (in libcore - previously stabilized in libstd)
317 * [`f32::to_radians`]
318   (https://doc.rust-lang.org/std/primitive.f32.html#method.to_radians)
319   (in libcore - previously stabilized in libstd)
320 * [`f64::to_degrees`]
321   (https://doc.rust-lang.org/std/primitive.f64.html#method.to_degrees)
322   (in libcore - previously stabilized in libstd)
323 * [`f64::to_radians`]
324   (https://doc.rust-lang.org/std/primitive.f64.html#method.to_radians)
325   (in libcore - previously stabilized in libstd)
326 * [`Iterator::sum`]
327   (https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.sum)
328 * [`Iterator::product`]
329   (https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.sum)
330 * [`Cell::get_mut`]
331   (https://doc.rust-lang.org/std/cell/struct.Cell.html#method.get_mut)
332 * [`RefCell::get_mut`]
333   (https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.get_mut)
334
335 Libraries
336 ---------
337
338 * [The `thread_local!` macro supports multiple definitions in a single
339    invocation, and can apply attributes]
340   (https://github.com/rust-lang/rust/pull/34077)
341 * [`Cow` implements `Default`]
342   (https://github.com/rust-lang/rust/pull/34305)
343 * [`Wrapping` implements binary, octal, lower-hex and upper-hex
344   `Display` formatting]
345   (https://github.com/rust-lang/rust/pull/34190)
346 * [The range types implement `Hash`]
347   (https://github.com/rust-lang/rust/pull/34180)
348 * [`lookup_host` ignores unknown address types]
349   (https://github.com/rust-lang/rust/pull/34067)
350 * [`assert_eq!` accepts a custom error message, like `assert!` does]
351   (https://github.com/rust-lang/rust/pull/33976)
352 * [The main thread is now called "main" instead of "&lt;main&gt;"]
353   (https://github.com/rust-lang/rust/pull/33803)
354
355 Cargo
356 -----
357
358 * [Disallow specifying features of transitive deps]
359   (https://github.com/rust-lang/cargo/pull/2821)
360 * [Add color support for Windows consoles]
361   (https://github.com/rust-lang/cargo/pull/2804)
362 * [Fix `harness = false` on `[lib]` sections]
363   (https://github.com/rust-lang/cargo/pull/2795)
364 * [Don't panic when `links` contains a '.']
365   (https://github.com/rust-lang/cargo/pull/2787)
366 * [Build scripts can emit warnings]
367   (https://github.com/rust-lang/cargo/pull/2630),
368   and `-vv` prints warnings for all crates.
369 * [Ignore file locks on OS X NFS mounts]
370   (https://github.com/rust-lang/cargo/pull/2720)
371 * [Don't warn about `package.metadata` keys]
372   (https://github.com/rust-lang/cargo/pull/2668).
373   This provides room for expansion by arbitrary tools.
374 * [Add support for cdylib crate types]
375   (https://github.com/rust-lang/cargo/pull/2741)
376 * [Prevent publishing crates when files are dirty]
377   (https://github.com/rust-lang/cargo/pull/2781)
378 * [Don't fetch all crates on clean]
379   (https://github.com/rust-lang/cargo/pull/2704)
380 * [Propagate --color option to rustc]
381   (https://github.com/rust-lang/cargo/pull/2779)
382 * [Fix `cargo doc --open` on Windows]
383   (https://github.com/rust-lang/cargo/pull/2780)
384 * [Improve autocompletion]
385   (https://github.com/rust-lang/cargo/pull/2772)
386 * [Configure colors of stderr as well as stdout]
387   (https://github.com/rust-lang/cargo/pull/2739)
388
389 Performance
390 -----------
391
392 * [Caching projections speeds up type check dramatically for some
393   workloads]
394   (https://github.com/rust-lang/rust/pull/33816)
395 * [The default `HashMap` hasher is SipHash 1-3 instead of SipHash 2-4]
396   (https://github.com/rust-lang/rust/pull/33940)
397   This hasher is faster, but is believed to provide sufficient
398   protection from collision attacks.
399 * [Comparison of `Ipv4Addr` is 10x faster]
400   (https://github.com/rust-lang/rust/pull/33891)
401
402 Rustdoc
403 -------
404
405 * [Fix empty implementation section on some module pages]
406   (https://github.com/rust-lang/rust/pull/34536)
407 * [Fix inlined renamed reexports in import lists]
408   (https://github.com/rust-lang/rust/pull/34479)
409 * [Fix search result layout for enum variants and struct fields]
410   (https://github.com/rust-lang/rust/pull/34477)
411 * [Fix issues with source links to external crates]
412   (https://github.com/rust-lang/rust/pull/34387)
413 * [Fix redirect pages for renamed reexports]
414   (https://github.com/rust-lang/rust/pull/34245)
415
416 Tooling
417 -------
418
419 * [rustc is better at finding the MSVC toolchain]
420   (https://github.com/rust-lang/rust/pull/34492)
421 * [When emitting debug info, rustc emits frame pointers for closures,
422   shims and glue, as it does for all other functions]
423   (https://github.com/rust-lang/rust/pull/33909)
424 * [rust-lldb warns about unsupported versions of LLDB]
425   (https://github.com/rust-lang/rust/pull/34646)
426 * Many more errors have been given error codes and extended
427   explanations
428 * API documentation continues to be improved, with many new examples
429
430 Misc
431 ----
432
433 * [rustc no longer hangs when dependencies recursively re-export
434   submodules]
435   (https://github.com/rust-lang/rust/pull/34542)
436 * [rustc requires LLVM 3.7+]
437   (https://github.com/rust-lang/rust/pull/34104)
438 * [The 'How Safe and Unsafe Interact' chapter of The Rustonomicon was
439   rewritten]
440   (https://github.com/rust-lang/rust/pull/33895)
441 * [rustc support 16-bit pointer sizes]
442   (https://github.com/rust-lang/rust/pull/33460).
443   No targets use this yet, but it works toward AVR support.
444
445 Compatibility Notes
446 -------------------
447
448 * [`const`s and `static`s may not have unsized types]
449   (https://github.com/rust-lang/rust/pull/34443)
450 * [The new follow-set rules that place restrictions on `macro_rules!`
451   in order to ensure syntax forward-compatibility have been enabled]
452   (https://github.com/rust-lang/rust/pull/33982)
453   This was an [ammendment to RFC 550]
454   (https://github.com/rust-lang/rfcs/pull/1384),
455   and has been a warning since 1.10.
456 * [`cfg` attribute process has been refactored to fix various bugs]
457   (https://github.com/rust-lang/rust/pull/33706).
458   This causes breakage in some corner cases.
459
460
461 Version 1.10.0 (2016-07-07)
462 ===========================
463
464 Language
465 --------
466
467 * [Allow `concat_idents!` in type positions as well as in expression
468   positions]
469   (https://github.com/rust-lang/rust/pull/33735).
470 * [`Copy` types are required to have a trivial implementation of `Clone`]
471   (https://github.com/rust-lang/rust/pull/33420).
472   [RFC 1521](https://github.com/rust-lang/rfcs/blob/master/text/1521-copy-clone-semantics.md).
473 * [Single-variant enums support the `#[repr(..)]` attribute]
474   (https://github.com/rust-lang/rust/pull/33355).
475 * [Fix `#[derive(RustcEncodable)]` in the presence of other `encode` methods]
476   (https://github.com/rust-lang/rust/pull/32908).
477 * [`panic!` can be converted to a runtime abort with the
478   `-C panic=abort` flag]
479   (https://github.com/rust-lang/rust/pull/32900).
480   [RFC 1513](https://github.com/rust-lang/rfcs/blob/master/text/1513-less-unwinding.md).
481 * [Add a new crate type, 'cdylib']
482   (https://github.com/rust-lang/rust/pull/33553).
483   cdylibs are dynamic libraries suitable for loading by non-Rust hosts.
484   [RFC 1510](https://github.com/rust-lang/rfcs/blob/master/text/1510-rdylib.md).
485   Note that Cargo does not yet directly support cdylibs.
486
487 Stabilized APIs
488 ---------------
489
490 * `os::windows::fs::OpenOptionsExt::access_mode`
491 * `os::windows::fs::OpenOptionsExt::share_mode`
492 * `os::windows::fs::OpenOptionsExt::custom_flags`
493 * `os::windows::fs::OpenOptionsExt::attributes`
494 * `os::windows::fs::OpenOptionsExt::security_qos_flags`
495 * `os::unix::fs::OpenOptionsExt::custom_flags`
496 * [`sync::Weak::new`]
497   (http://doc.rust-lang.org/alloc/arc/struct.Weak.html#method.new)
498 * `Default for sync::Weak`
499 * [`panic::set_hook`]
500   (http://doc.rust-lang.org/std/panic/fn.set_hook.html)
501 * [`panic::take_hook`]
502   (http://doc.rust-lang.org/std/panic/fn.take_hook.html)
503 * [`panic::PanicInfo`]
504   (http://doc.rust-lang.org/std/panic/struct.PanicInfo.html)
505 * [`panic::PanicInfo::payload`]
506   (http://doc.rust-lang.org/std/panic/struct.PanicInfo.html#method.payload)
507 * [`panic::PanicInfo::location`]
508   (http://doc.rust-lang.org/std/panic/struct.PanicInfo.html#method.location)
509 * [`panic::Location`]
510   (http://doc.rust-lang.org/std/panic/struct.Location.html)
511 * [`panic::Location::file`]
512   (http://doc.rust-lang.org/std/panic/struct.Location.html#method.file)
513 * [`panic::Location::line`]
514   (http://doc.rust-lang.org/std/panic/struct.Location.html#method.line)
515 * [`ffi::CStr::from_bytes_with_nul`]
516   (http://doc.rust-lang.org/std/ffi/struct.CStr.html#method.from_bytes_with_nul)
517 * [`ffi::CStr::from_bytes_with_nul_unchecked`]
518   (http://doc.rust-lang.org/std/ffi/struct.CStr.html#method.from_bytes_with_nul_unchecked)
519 * [`ffi::FromBytesWithNulError`]
520   (http://doc.rust-lang.org/std/ffi/struct.FromBytesWithNulError.html)
521 * [`fs::Metadata::modified`]
522   (http://doc.rust-lang.org/std/fs/struct.Metadata.html#method.modified)
523 * [`fs::Metadata::accessed`]
524   (http://doc.rust-lang.org/std/fs/struct.Metadata.html#method.accessed)
525 * [`fs::Metadata::created`]
526   (http://doc.rust-lang.org/std/fs/struct.Metadata.html#method.created)
527 * `sync::atomic::Atomic{Usize,Isize,Bool,Ptr}::compare_exchange`
528 * `sync::atomic::Atomic{Usize,Isize,Bool,Ptr}::compare_exchange_weak`
529 * `collections::{btree,hash}_map::{Occupied,Vacant,}Entry::key`
530 * `os::unix::net::{UnixStream, UnixListener, UnixDatagram, SocketAddr}`
531 * [`SocketAddr::is_unnamed`]
532   (http://doc.rust-lang.org/std/os/unix/net/struct.SocketAddr.html#method.is_unnamed)
533 * [`SocketAddr::as_pathname`]
534   (http://doc.rust-lang.org/std/os/unix/net/struct.SocketAddr.html#method.as_pathname)
535 * [`UnixStream::connect`]
536   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.connect)
537 * [`UnixStream::pair`]
538   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.pair)
539 * [`UnixStream::try_clone`]
540   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.try_clone)
541 * [`UnixStream::local_addr`]
542   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.local_addr)
543 * [`UnixStream::peer_addr`]
544   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.peer_addr)
545 * [`UnixStream::set_read_timeout`]
546   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.read_timeout)
547 * [`UnixStream::set_write_timeout`]
548   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.write_timeout)
549 * [`UnixStream::read_timeout`]
550   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.read_timeout)
551 * [`UnixStream::write_timeout`]
552   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.write_timeout)
553 * [`UnixStream::set_nonblocking`]
554   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.set_nonblocking)
555 * [`UnixStream::take_error`]
556   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.take_error)
557 * [`UnixStream::shutdown`]
558   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html#method.shutdown)
559 * Read/Write/RawFd impls for `UnixStream`
560 * [`UnixListener::bind`]
561   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.bind)
562 * [`UnixListener::accept`]
563   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.accept)
564 * [`UnixListener::try_clone`]
565   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.try_clone)
566 * [`UnixListener::local_addr`]
567   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.local_addr)
568 * [`UnixListener::set_nonblocking`]
569   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.set_nonblocking)
570 * [`UnixListener::take_error`]
571   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.take_error)
572 * [`UnixListener::incoming`]
573   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html#method.incoming)
574 * RawFd impls for `UnixListener`
575 * [`UnixDatagram::bind`]
576   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.bind)
577 * [`UnixDatagram::unbound`]
578   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.unbound)
579 * [`UnixDatagram::pair`]
580   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.pair)
581 * [`UnixDatagram::connect`]
582   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.connect)
583 * [`UnixDatagram::try_clone`]
584   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.try_clone)
585 * [`UnixDatagram::local_addr`]
586   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.local_addr)
587 * [`UnixDatagram::peer_addr`]
588   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.peer_addr)
589 * [`UnixDatagram::recv_from`]
590   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.recv_from)
591 * [`UnixDatagram::recv`]
592   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.recv)
593 * [`UnixDatagram::send_to`]
594   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.send_to)
595 * [`UnixDatagram::send`]
596   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.send)
597 * [`UnixDatagram::set_read_timeout`]
598   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.set_read_timeout)
599 * [`UnixDatagram::set_write_timeout`]
600   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.set_write_timeout)
601 * [`UnixDatagram::read_timeout`]
602   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.read_timeout)
603 * [`UnixDatagram::write_timeout`]
604   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.write_timeout)
605 * [`UnixDatagram::set_nonblocking`]
606   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.set_nonblocking)
607 * [`UnixDatagram::take_error`]
608   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.take_error)
609 * [`UnixDatagram::shutdown`]
610   (http://doc.rust-lang.org/std/os/unix/net/struct.UnixDatagram.html#method.shutdown)
611 * RawFd impls for `UnixDatagram`
612 * `{BTree,Hash}Map::values_mut`
613 * [`<[_]>::binary_search_by_key`]
614   (http://doc.rust-lang.org/beta/std/primitive.slice.html#method.binary_search_by_key)
615
616 Libraries
617 ---------
618
619 * [The `abs_sub` method of floats is deprecated]
620   (https://github.com/rust-lang/rust/pull/33664).
621   The semantics of this minor method are subtle and probably not what
622   most people want.
623 * [Add implementation of Ord for Cell<T> and RefCell<T> where T: Ord]
624   (https://github.com/rust-lang/rust/pull/33306).
625 * [On Linux, if `HashMap`s can't be initialized with `getrandom` they
626   will fall back to `/dev/urandom` temporarily to avoid blocking
627   during early boot]
628   (https://github.com/rust-lang/rust/pull/33086).
629 * [Implemented negation for wrapping numerals]
630   (https://github.com/rust-lang/rust/pull/33067).
631 * [Implement `Clone` for `binary_heap::IntoIter`]
632   (https://github.com/rust-lang/rust/pull/33050).
633 * [Implement `Display` and `Hash` for `std::num::Wrapping`]
634   (https://github.com/rust-lang/rust/pull/33023).
635 * [Add `Default` implementation for `&CStr`, `CString`]
636   (https://github.com/rust-lang/rust/pull/32990).
637 * [Implement `From<Vec<T>>` and `Into<Vec<T>>` for `VecDeque<T>`]
638   (https://github.com/rust-lang/rust/pull/32866).
639 * [Implement `Default` for `UnsafeCell`, `fmt::Error`, `Condvar`,
640   `Mutex`, `RwLock`]
641   (https://github.com/rust-lang/rust/pull/32785).
642
643 Cargo
644 -----
645 * [Cargo.toml supports the `profile.*.panic` option]
646   (https://github.com/rust-lang/cargo/pull/2687).
647   This controls the runtime behavior of the `panic!` macro
648   and can be either "unwind" (the default), or "abort".
649   [RFC 1513](https://github.com/rust-lang/rfcs/blob/master/text/1513-less-unwinding.md).
650 * [Don't throw away errors with `-p` arguments]
651   (https://github.com/rust-lang/cargo/pull/2723).
652 * [Report status to stderr instead of stdout]
653   (https://github.com/rust-lang/cargo/pull/2693).
654 * [Build scripts are passed a `CARGO_MANIFEST_LINKS` environment
655   variable that corresponds to the `links` field of the manifest]
656   (https://github.com/rust-lang/cargo/pull/2710).
657 * [Ban keywords from crate names]
658   (https://github.com/rust-lang/cargo/pull/2707).
659 * [Canonicalize `CARGO_HOME` on Windows]
660   (https://github.com/rust-lang/cargo/pull/2604).
661 * [Retry network requests]
662   (https://github.com/rust-lang/cargo/pull/2396).
663   By default they are retried twice, which can be customized with the
664   `net.retry` value in `.cargo/config`.
665 * [Don't print extra error info for failing subcommands]
666   (https://github.com/rust-lang/cargo/pull/2674).
667 * [Add `--force` flag to `cargo install`]
668   (https://github.com/rust-lang/cargo/pull/2405).
669 * [Don't use `flock` on NFS mounts]
670   (https://github.com/rust-lang/cargo/pull/2623).
671 * [Prefer building `cargo install` artifacts in temporary directories]
672   (https://github.com/rust-lang/cargo/pull/2610).
673   Makes it possible to install multiple crates in parallel.
674 * [Add `cargo test --doc`]
675   (https://github.com/rust-lang/cargo/pull/2578).
676 * [Add `cargo --explain`]
677   (https://github.com/rust-lang/cargo/pull/2551).
678 * [Don't print warnings when `-q` is passed]
679   (https://github.com/rust-lang/cargo/pull/2576).
680 * [Add `cargo doc --lib` and `--bin`]
681   (https://github.com/rust-lang/cargo/pull/2577).
682 * [Don't require build script output to be UTF-8]
683   (https://github.com/rust-lang/cargo/pull/2560).
684 * [Correctly attempt multiple git usernames]
685   (https://github.com/rust-lang/cargo/pull/2584).
686
687 Performance
688 -----------
689
690 * [rustc memory usage was reduced by refactoring the context used for
691   type checking]
692   (https://github.com/rust-lang/rust/pull/33425).
693 * [Speed up creation of `HashMap`s by caching the random keys used
694   to initialize the hash state]
695   (https://github.com/rust-lang/rust/pull/33318).
696 * [The `find` implementation for `Chain` iterators is 2x faster]
697   (https://github.com/rust-lang/rust/pull/33289).
698 * [Trait selection optimizations speed up type checking by 15%]
699   (https://github.com/rust-lang/rust/pull/33138).
700 * [Efficient trie lookup for boolean Unicode properties]
701   (https://github.com/rust-lang/rust/pull/33098).
702   10x faster than the previous lookup tables.
703 * [Special case `#[derive(Copy, Clone)]` to avoid bloat]
704   (https://github.com/rust-lang/rust/pull/31414).
705
706 Usability
707 ---------
708
709 * Many incremental improvements to documentation and rustdoc.
710 * [rustdoc: List blanket trait impls]
711   (https://github.com/rust-lang/rust/pull/33514).
712 * [rustdoc: Clean up ABI rendering]
713   (https://github.com/rust-lang/rust/pull/33151).
714 * [Indexing with the wrong type produces a more informative error]
715   (https://github.com/rust-lang/rust/pull/33401).
716 * [Improve diagnostics for constants being used in irrefutable patterns]
717   (https://github.com/rust-lang/rust/pull/33406).
718 * [When many method candidates are in scope limit the suggestions to 10]
719   (https://github.com/rust-lang/rust/pull/33338).
720 * [Remove confusing suggestion when calling a `fn` type]
721   (https://github.com/rust-lang/rust/pull/33325).
722 * [Do not suggest changing `&mut self` to `&mut mut self`]
723   (https://github.com/rust-lang/rust/pull/33319).
724
725 Misc
726 ----
727
728 * [Update i686-linux-android features to match Android ABI]
729   (https://github.com/rust-lang/rust/pull/33651).
730 * [Update aarch64-linux-android features to match Android ABI]
731   (https://github.com/rust-lang/rust/pull/33500).
732 * [`std` no longer prints backtraces on platforms where the running
733   module must be loaded with `env::current_exe`, which can't be relied
734   on](https://github.com/rust-lang/rust/pull/33554).
735 * This release includes std binaries for the i586-unknown-linux-gnu,
736   i686-unknown-linux-musl, and armv7-linux-androideabi targets. The
737   i586 target is for old x86 hardware without SSE2, and the armv7
738   target is for Android running on modern ARM architectures.
739 * [The `rust-gdb` and `rust-lldb` scripts are distributed on all
740   Unix platforms](https://github.com/rust-lang/rust/pull/32835).
741 * [On Unix the runtime aborts by calling `libc::abort` instead of
742   generating an illegal instruction]
743   (https://github.com/rust-lang/rust/pull/31457).
744 * [Rust is now bootstrapped from the previous release of Rust,
745   instead of a snapshot from an arbitrary commit]
746   (https://github.com/rust-lang/rust/pull/32942).
747
748 Compatibility Notes
749 -------------------
750
751 * [`AtomicBool` is now bool-sized, not word-sized]
752   (https://github.com/rust-lang/rust/pull/33579).
753 * [`target_env` for Linux ARM targets is just `gnu`, not
754   `gnueabihf`, `gnueabi`, etc]
755   (https://github.com/rust-lang/rust/pull/33403).
756 * [Consistently panic on overflow in `Duration::new`]
757   (https://github.com/rust-lang/rust/pull/33072).
758 * [Change `String::truncate` to panic less]
759   (https://github.com/rust-lang/rust/pull/32977).
760 * [Add `:block` to the follow set for `:ty` and `:path`]
761   (https://github.com/rust-lang/rust/pull/32945).
762   Affects how macros are parsed.
763 * [Fix macro hygiene bug]
764   (https://github.com/rust-lang/rust/pull/32923).
765 * [Feature-gated attributes on macro-generated macro invocations are
766   now rejected]
767   (https://github.com/rust-lang/rust/pull/32791).
768 * [Suppress fallback and ambiguity errors during type inference]
769   (https://github.com/rust-lang/rust/pull/32258).
770   This caused some minor changes to type inference.
771
772
773 Version 1.9.0 (2016-05-26)
774 ==========================
775
776 Language
777 --------
778
779 * The `#[deprecated]` attribute when applied to an API will generate
780   warnings when used. The warnings may be suppressed with
781   `#[allow(deprecated)]`. [RFC 1270].
782 * [`fn` item types are zero sized, and each `fn` names a unique
783   type][1.9fn]. This will break code that transmutes `fn`s, so calling
784   `transmute` on a `fn` type will generate a warning for a few cycles,
785   then will be converted to an error.
786 * [Field and method resolution understand visibility, so private
787   fields and methods cannot prevent the proper use of public fields
788   and methods][1.9fv].
789 * [The parser considers unicode codepoints in the
790   `PATTERN_WHITE_SPACE` category to be whitespace][1.9ws].
791
792 Stabilized APIs
793 ---------------
794
795 * [`std::panic`]
796 * [`std::panic::catch_unwind`][] (renamed from `recover`)
797 * [`std::panic::resume_unwind`][] (renamed from `propagate`)
798 * [`std::panic::AssertUnwindSafe`][] (renamed from `AssertRecoverSafe`)
799 * [`std::panic::UnwindSafe`][] (renamed from `RecoverSafe`)
800 * [`str::is_char_boundary`]
801 * [`<*const T>::as_ref`]
802 * [`<*mut T>::as_ref`]
803 * [`<*mut T>::as_mut`]
804 * [`AsciiExt::make_ascii_uppercase`]
805 * [`AsciiExt::make_ascii_lowercase`]
806 * [`char::decode_utf16`]
807 * [`char::DecodeUtf16`]
808 * [`char::DecodeUtf16Error`]
809 * [`char::DecodeUtf16Error::unpaired_surrogate`]
810 * [`BTreeSet::take`]
811 * [`BTreeSet::replace`]
812 * [`BTreeSet::get`]
813 * [`HashSet::take`]
814 * [`HashSet::replace`]
815 * [`HashSet::get`]
816 * [`OsString::with_capacity`]
817 * [`OsString::clear`]
818 * [`OsString::capacity`]
819 * [`OsString::reserve`]
820 * [`OsString::reserve_exact`]
821 * [`OsStr::is_empty`]
822 * [`OsStr::len`]
823 * [`std::os::unix::thread`]
824 * [`RawPthread`]
825 * [`JoinHandleExt`]
826 * [`JoinHandleExt::as_pthread_t`]
827 * [`JoinHandleExt::into_pthread_t`]
828 * [`HashSet::hasher`]
829 * [`HashMap::hasher`]
830 * [`CommandExt::exec`]
831 * [`File::try_clone`]
832 * [`SocketAddr::set_ip`]
833 * [`SocketAddr::set_port`]
834 * [`SocketAddrV4::set_ip`]
835 * [`SocketAddrV4::set_port`]
836 * [`SocketAddrV6::set_ip`]
837 * [`SocketAddrV6::set_port`]
838 * [`SocketAddrV6::set_flowinfo`]
839 * [`SocketAddrV6::set_scope_id`]
840 * [`slice::copy_from_slice`]
841 * [`ptr::read_volatile`]
842 * [`ptr::write_volatile`]
843 * [`OpenOptions::create_new`]
844 * [`TcpStream::set_nodelay`]
845 * [`TcpStream::nodelay`]
846 * [`TcpStream::set_ttl`]
847 * [`TcpStream::ttl`]
848 * [`TcpStream::set_only_v6`]
849 * [`TcpStream::only_v6`]
850 * [`TcpStream::take_error`]
851 * [`TcpStream::set_nonblocking`]
852 * [`TcpListener::set_ttl`]
853 * [`TcpListener::ttl`]
854 * [`TcpListener::set_only_v6`]
855 * [`TcpListener::only_v6`]
856 * [`TcpListener::take_error`]
857 * [`TcpListener::set_nonblocking`]
858 * [`UdpSocket::set_broadcast`]
859 * [`UdpSocket::broadcast`]
860 * [`UdpSocket::set_multicast_loop_v4`]
861 * [`UdpSocket::multicast_loop_v4`]
862 * [`UdpSocket::set_multicast_ttl_v4`]
863 * [`UdpSocket::multicast_ttl_v4`]
864 * [`UdpSocket::set_multicast_loop_v6`]
865 * [`UdpSocket::multicast_loop_v6`]
866 * [`UdpSocket::set_multicast_ttl_v6`]
867 * [`UdpSocket::multicast_ttl_v6`]
868 * [`UdpSocket::set_ttl`]
869 * [`UdpSocket::ttl`]
870 * [`UdpSocket::set_only_v6`]
871 * [`UdpSocket::only_v6`]
872 * [`UdpSocket::join_multicast_v4`]
873 * [`UdpSocket::join_multicast_v6`]
874 * [`UdpSocket::leave_multicast_v4`]
875 * [`UdpSocket::leave_multicast_v6`]
876 * [`UdpSocket::take_error`]
877 * [`UdpSocket::connect`]
878 * [`UdpSocket::send`]
879 * [`UdpSocket::recv`]
880 * [`UdpSocket::set_nonblocking`]
881
882 Libraries
883 ---------
884
885 * [`std::sync::Once` is poisoned if its initialization function
886   fails][1.9o].
887 * [`cell::Ref` and `cell::RefMut` can contain unsized types][1.9cu].
888 * [Most types implement `fmt::Debug`][1.9db].
889 * [The default buffer size used by `BufReader` and `BufWriter` was
890   reduced to 8K, from 64K][1.9bf]. This is in line with the buffer size
891   used by other languages.
892 * [`Instant`, `SystemTime` and `Duration` implement `+=` and `-=`.
893   `Duration` additionally implements `*=` and `/=`][1.9ta].
894 * [`Skip` is a `DoubleEndedIterator`][1.9sk].
895 * [`From<[u8; 4]>` is implemented for `Ipv4Addr`][1.9fi].
896 * [`Chain` implements `BufRead`][1.9ch].
897 * [`HashMap`, `HashSet` and iterators are covariant][1.9hc].
898
899 Cargo
900 -----
901
902 * [Cargo can now run concurrently][1.9cc].
903 * [Top-level overrides allow specific revisions of crates to be
904   overridden through the entire crate graph][1.9ct].  This is intended
905   to make upgrades easier for large projects, by allowing crates to be
906   forked temporarily until they've been upgraded and republished.
907 * [Cargo exports a `CARGO_PKG_AUTHORS` environment variable][1.9cp].
908 * [Cargo will pass the contents of the `RUSTFLAGS` variable to `rustc`
909   on the commandline][1.9cf]. `rustc` arguments can also be specified
910   in the `build.rustflags` configuration key.
911
912 Performance
913 -----------
914
915 * [The time complexity of comparing variables for equivalence during type
916   unification is reduced from _O_(_n_!) to _O_(_n_)][1.9tu]. This leads
917   to major compilation time improvement in some scenarios.
918 * [`ToString` is specialized for `str`, giving it the same performance
919   as `to_owned`][1.9ts].
920 * [Spawning processes with `Command::output` no longer creates extra
921   threads][1.9sp].
922 * [`#[derive(PartialEq)]` and `#[derive(PartialOrd)]` emit less code
923   for C-like enums][1.9cl].
924
925 Misc
926 ----
927
928 * [Passing the `--quiet` flag to a test runner will produce
929   much-abbreviated output][1.9q].
930 * The Rust Project now publishes std binaries for the
931   `mips-unknown-linux-musl`, `mipsel-unknown-linux-musl`, and
932   `i586-pc-windows-msvc` targets.
933
934 Compatibility Notes
935 -------------------
936
937 * [`std::sync::Once` is poisoned if its initialization function
938   fails][1.9o].
939 * [It is illegal to define methods with the same name in overlapping
940   inherent `impl` blocks][1.9sn].
941 * [`fn` item types are zero sized, and each `fn` names a unique
942   type][1.9fn]. This will break code that transmutes `fn`s, so calling
943   `transmute` on a `fn` type will generate a warning for a few cycles,
944   then will be converted to an error.
945 * [Improvements to const evaluation may trigger new errors when integer
946   literals are out of range][1.9ce].
947
948
949 [1.9bf]: https://github.com/rust-lang/rust/pull/32695
950 [1.9cc]: https://github.com/rust-lang/cargo/pull/2486
951 [1.9ce]: https://github.com/rust-lang/rust/pull/30587
952 [1.9cf]: https://github.com/rust-lang/cargo/pull/2241
953 [1.9ch]: https://github.com/rust-lang/rust/pull/32541
954 [1.9cl]: https://github.com/rust-lang/rust/pull/31977
955 [1.9cp]: https://github.com/rust-lang/cargo/pull/2465
956 [1.9ct]: https://github.com/rust-lang/cargo/pull/2385
957 [1.9cu]: https://github.com/rust-lang/rust/pull/32652
958 [1.9db]: https://github.com/rust-lang/rust/pull/32054
959 [1.9fi]: https://github.com/rust-lang/rust/pull/32050
960 [1.9fn]: https://github.com/rust-lang/rust/pull/31710
961 [1.9fv]: https://github.com/rust-lang/rust/pull/31938
962 [1.9hc]: https://github.com/rust-lang/rust/pull/32635
963 [1.9o]: https://github.com/rust-lang/rust/pull/32325
964 [1.9q]: https://github.com/rust-lang/rust/pull/31887
965 [1.9sk]: https://github.com/rust-lang/rust/pull/31700
966 [1.9sn]: https://github.com/rust-lang/rust/pull/31925
967 [1.9sp]: https://github.com/rust-lang/rust/pull/31618
968 [1.9ta]: https://github.com/rust-lang/rust/pull/32448
969 [1.9ts]: https://github.com/rust-lang/rust/pull/32586
970 [1.9tu]: https://github.com/rust-lang/rust/pull/32062
971 [1.9ws]: https://github.com/rust-lang/rust/pull/29734
972 [RFC 1270]: https://github.com/rust-lang/rfcs/blob/master/text/1270-deprecation.md
973 [`<*const T>::as_ref`]: http://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.as_ref
974 [`<*mut T>::as_mut`]: http://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.as_mut
975 [`<*mut T>::as_ref`]: http://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.as_ref
976 [`slice::copy_from_slice`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.copy_from_slice
977 [`AsciiExt::make_ascii_lowercase`]: http://doc.rust-lang.org/nightly/std/ascii/trait.AsciiExt.html#tymethod.make_ascii_lowercase
978 [`AsciiExt::make_ascii_uppercase`]: http://doc.rust-lang.org/nightly/std/ascii/trait.AsciiExt.html#tymethod.make_ascii_uppercase
979 [`BTreeSet::get`]: http://doc.rust-lang.org/nightly/collections/btree/set/struct.BTreeSet.html#method.get
980 [`BTreeSet::replace`]: http://doc.rust-lang.org/nightly/collections/btree/set/struct.BTreeSet.html#method.replace
981 [`BTreeSet::take`]: http://doc.rust-lang.org/nightly/collections/btree/set/struct.BTreeSet.html#method.take
982 [`CommandExt::exec`]: http://doc.rust-lang.org/nightly/std/os/unix/process/trait.CommandExt.html#tymethod.exec
983 [`File::try_clone`]: http://doc.rust-lang.org/nightly/std/fs/struct.File.html#method.try_clone
984 [`HashMap::hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashMap.html#method.hasher
985 [`HashSet::get`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.get
986 [`HashSet::hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.hasher
987 [`HashSet::replace`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.replace
988 [`HashSet::take`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.take
989 [`JoinHandleExt::as_pthread_t`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/trait.JoinHandleExt.html#tymethod.as_pthread_t
990 [`JoinHandleExt::into_pthread_t`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/trait.JoinHandleExt.html#tymethod.into_pthread_t
991 [`JoinHandleExt`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/trait.JoinHandleExt.html
992 [`OpenOptions::create_new`]: http://doc.rust-lang.org/nightly/std/fs/struct.OpenOptions.html#method.create_new
993 [`OsStr::is_empty`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsStr.html#method.is_empty
994 [`OsStr::len`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsStr.html#method.len
995 [`OsString::capacity`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.capacity
996 [`OsString::clear`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.clear
997 [`OsString::reserve_exact`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.reserve_exact
998 [`OsString::reserve`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.reserve
999 [`OsString::with_capacity`]: http://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.with_capacity
1000 [`RawPthread`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/type.RawPthread.html
1001 [`SocketAddr::set_ip`]: http://doc.rust-lang.org/nightly/std/net/enum.SocketAddr.html#method.set_ip
1002 [`SocketAddr::set_port`]: http://doc.rust-lang.org/nightly/std/net/enum.SocketAddr.html#method.set_port
1003 [`SocketAddrV4::set_ip`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV4.html#method.set_ip
1004 [`SocketAddrV4::set_port`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV4.html#method.set_port
1005 [`SocketAddrV6::set_flowinfo`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_flowinfo
1006 [`SocketAddrV6::set_ip`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_ip
1007 [`SocketAddrV6::set_port`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_port
1008 [`SocketAddrV6::set_scope_id`]: http://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_scope_id
1009 [`TcpListener::only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.only_v6
1010 [`TcpListener::set_nonblocking`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_nonblocking
1011 [`TcpListener::set_only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_only_v6
1012 [`TcpListener::set_ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_ttl
1013 [`TcpListener::take_error`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.take_error
1014 [`TcpListener::ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.ttl
1015 [`TcpStream::nodelay`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.nodelay
1016 [`TcpStream::only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.only_v6
1017 [`TcpStream::set_nodelay`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_nodelay
1018 [`TcpStream::set_nonblocking`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_nonblocking
1019 [`TcpStream::set_only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_only_v6
1020 [`TcpStream::set_ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_ttl
1021 [`TcpStream::take_error`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.take_error
1022 [`TcpStream::ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.ttl
1023 [`UdpSocket::broadcast`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.broadcast
1024 [`UdpSocket::connect`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.connect
1025 [`UdpSocket::join_multicast_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.join_multicast_v4
1026 [`UdpSocket::join_multicast_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.join_multicast_v6
1027 [`UdpSocket::leave_multicast_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.leave_multicast_v4
1028 [`UdpSocket::leave_multicast_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.leave_multicast_v6
1029 [`UdpSocket::multicast_loop_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_loop_v4
1030 [`UdpSocket::multicast_loop_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_loop_v6
1031 [`UdpSocket::multicast_ttl_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_ttl_v4
1032 [`UdpSocket::multicast_ttl_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.multicast_ttl_v6
1033 [`UdpSocket::only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.only_v6
1034 [`UdpSocket::recv`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.recv
1035 [`UdpSocket::send`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.send
1036 [`UdpSocket::set_broadcast`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_broadcast
1037 [`UdpSocket::set_multicast_loop_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_loop_v4
1038 [`UdpSocket::set_multicast_loop_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_loop_v6
1039 [`UdpSocket::set_multicast_ttl_v4`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_ttl_v4
1040 [`UdpSocket::set_multicast_ttl_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_multicast_ttl_v6
1041 [`UdpSocket::set_nonblocking`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_nonblocking
1042 [`UdpSocket::set_only_v6`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_only_v6
1043 [`UdpSocket::set_ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.set_ttl
1044 [`UdpSocket::take_error`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.take_error
1045 [`UdpSocket::ttl`]: http://doc.rust-lang.org/nightly/std/net/struct.UdpSocket.html#method.ttl
1046 [`char::DecodeUtf16Error::unpaired_surrogate`]: http://doc.rust-lang.org/nightly/std/char/struct.DecodeUtf16Error.html#method.unpaired_surrogate
1047 [`char::DecodeUtf16Error`]: http://doc.rust-lang.org/nightly/std/char/struct.DecodeUtf16Error.html
1048 [`char::DecodeUtf16`]: http://doc.rust-lang.org/nightly/std/char/struct.DecodeUtf16.html
1049 [`char::decode_utf16`]: http://doc.rust-lang.org/nightly/std/char/fn.decode_utf16.html
1050 [`ptr::read_volatile`]: http://doc.rust-lang.org/nightly/std/ptr/fn.read_volatile.html
1051 [`ptr::write_volatile`]: http://doc.rust-lang.org/nightly/std/ptr/fn.write_volatile.html
1052 [`std::os::unix::thread`]: http://doc.rust-lang.org/nightly/std/os/unix/thread/index.html
1053 [`std::panic::AssertUnwindSafe`]: http://doc.rust-lang.org/nightly/std/panic/struct.AssertUnwindSafe.html
1054 [`std::panic::UnwindSafe`]: http://doc.rust-lang.org/nightly/std/panic/trait.UnwindSafe.html
1055 [`std::panic::catch_unwind`]: http://doc.rust-lang.org/nightly/std/panic/fn.catch_unwind.html
1056 [`std::panic::resume_unwind`]: http://doc.rust-lang.org/nightly/std/panic/fn.resume_unwind.html
1057 [`std::panic`]: http://doc.rust-lang.org/nightly/std/panic/index.html
1058 [`str::is_char_boundary`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.is_char_boundary
1059
1060
1061 Version 1.8.0 (2016-04-14)
1062 ==========================
1063
1064 Language
1065 --------
1066
1067 * Rust supports overloading of compound assignment statements like
1068   `+=` by implementing the [`AddAssign`], [`SubAssign`],
1069   [`MulAssign`], [`DivAssign`], [`RemAssign`], [`BitAndAssign`],
1070   [`BitOrAssign`], [`BitXorAssign`], [`ShlAssign`], or [`ShrAssign`]
1071   traits. [RFC 953].
1072 * Empty structs can be defined with braces, as in `struct Foo { }`, in
1073   addition to the non-braced form, `struct Foo;`. [RFC 218].
1074
1075 Libraries
1076 ---------
1077
1078 * Stabilized APIs:
1079   * [`str::encode_utf16`][] (renamed from `utf16_units`)
1080   * [`str::EncodeUtf16`][] (renamed from `Utf16Units`)
1081   * [`Ref::map`]
1082   * [`RefMut::map`]
1083   * [`ptr::drop_in_place`]
1084   * [`time::Instant`]
1085   * [`time::SystemTime`]
1086   * [`Instant::now`]
1087   * [`Instant::duration_since`][] (renamed from `duration_from_earlier`)
1088   * [`Instant::elapsed`]
1089   * [`SystemTime::now`]
1090   * [`SystemTime::duration_since`][] (renamed from `duration_from_earlier`)
1091   * [`SystemTime::elapsed`]
1092   * Various `Add`/`Sub` impls for `Time` and `SystemTime`
1093   * [`SystemTimeError`]
1094   * [`SystemTimeError::duration`]
1095   * Various impls for `SystemTimeError`
1096   * [`UNIX_EPOCH`]
1097   * [`AddAssign`], [`SubAssign`], [`MulAssign`], [`DivAssign`],
1098     [`RemAssign`], [`BitAndAssign`], [`BitOrAssign`],
1099     [`BitXorAssign`], [`ShlAssign`], [`ShrAssign`].
1100 * [The `write!` and `writeln!` macros correctly emit errors if any of
1101   their arguments can't be formatted][1.8w].
1102 * [Various I/O functions support large files on 32-bit Linux][1.8l].
1103 * [The Unix-specific `raw` modules, which contain a number of
1104   redefined C types are deprecated][1.8r], including `os::raw::unix`,
1105   `os::raw::macos`, and `os::raw::linux`. These modules defined types
1106   such as `ino_t` and `dev_t`. The inconsistency of these definitions
1107   across platforms was making it difficult to implement `std`
1108   correctly. Those that need these definitions should use the `libc`
1109   crate. [RFC 1415].
1110 * The Unix-specific `MetadataExt` traits, including
1111   `os::unix::fs::MetadataExt`, which expose values such as inode
1112   numbers [no longer return platform-specific types][1.8r], but
1113   instead return widened integers. [RFC 1415].
1114 * [`btree_set::{IntoIter, Iter, Range}` are covariant][1.8cv].
1115 * [Atomic loads and stores are not volatile][1.8a].
1116 * [All types in `sync::mpsc` implement `fmt::Debug`][1.8mp].
1117
1118 Performance
1119 -----------
1120
1121 * [Inlining hash functions lead to a 3% compile-time improvement in
1122   some workloads][1.8h].
1123 * When using jemalloc, its symbols are [unprefixed so that it
1124   overrides the libc malloc implementation][1.8h]. This means that for
1125   rustc, LLVM is now using jemalloc, which results in a 6%
1126   compile-time improvement on a specific workload.
1127 * [Avoid quadratic growth in function size due to cleanups][1.8cu].
1128
1129 Misc
1130 ----
1131
1132 * [32-bit MSVC builds finally implement unwinding][1.8ms].
1133   i686-pc-windows-msvc is now considered a tier-1 platform.
1134 * [The `--print targets` flag prints a list of supported targets][1.8t].
1135 * [The `--print cfg` flag prints the `cfg`s defined for the current
1136   target][1.8cf].
1137 * [`rustc` can be built with an new Cargo-based build system, written
1138   in Rust][1.8b].  It will eventually replace Rust's Makefile-based
1139   build system. To enable it configure with `configure --rustbuild`.
1140 * [Errors for non-exhaustive `match` patterns now list up to 3 missing
1141   variants while also indicating the total number of missing variants
1142   if more than 3][1.8m].
1143 * [Executable stacks are disabled on Linux and BSD][1.8nx].
1144 * The Rust Project now publishes binary releases of the standard
1145   library for a number of tier-2 targets:
1146   `armv7-unknown-linux-gnueabihf`, `powerpc-unknown-linux-gnu`,
1147   `powerpc64-unknown-linux-gnu`, `powerpc64le-unknown-linux-gnu`
1148   `x86_64-rumprun-netbsd`. These can be installed with
1149   tools such as [multirust][1.8mr].
1150
1151 Cargo
1152 -----
1153
1154 * [`cargo init` creates a new Cargo project in the current
1155   directory][1.8ci].  It is otherwise like `cargo new`.
1156 * [Cargo has configuration keys for `-v` and
1157   `--color`][1.8cc]. `verbose` and `color`, respectively, go in the
1158   `[term]` section of `.cargo/config`.
1159 * [Configuration keys that evaluate to strings or integers can be set
1160   via environment variables][1.8ce]. For example the `build.jobs` key
1161   can be set via `CARGO_BUILD_JOBS`. Environment variables take
1162   precedence over config files.
1163 * [Target-specific dependencies support Rust `cfg` syntax for
1164   describing targets][1.8cfg] so that dependencies for multiple
1165   targets can be specified together. [RFC 1361].
1166 * [The environment variables `CARGO_TARGET_ROOT`, `RUSTC`, and
1167   `RUSTDOC` take precedence over the `build.target-dir`,
1168   `build.rustc`, and `build.rustdoc` configuration values][1.8cv].
1169 * [The child process tree is killed on Windows when Cargo is
1170   killed][1.8ck].
1171 * [The `build.target` configuration value sets the target platform,
1172   like `--target`][1.8ct].
1173
1174 Compatibility Notes
1175 -------------------
1176
1177 * [Unstable compiler flags have been further restricted][1.8u]. Since
1178   1.0 `-Z` flags have been considered unstable, and other flags that
1179   were considered unstable additionally required passing `-Z
1180   unstable-options` to access. Unlike unstable language and library
1181   features though, these options have been accessible on the stable
1182   release channel. Going forward, *new unstable flags will not be
1183   available on the stable release channel*, and old unstable flags
1184   will warn about their usage. In the future, all unstable flags will
1185   be unavailable on the stable release channel.
1186 * [It is no longer possible to `match` on empty enum variants using
1187   the `Variant(..)` syntax][1.8v]. This has been a warning since 1.6.
1188 * The Unix-specific `MetadataExt` traits, including
1189   `os::unix::fs::MetadataExt`, which expose values such as inode
1190   numbers [no longer return platform-specific types][1.8r], but
1191   instead return widened integers. [RFC 1415].
1192 * [Modules sourced from the filesystem cannot appear within arbitrary
1193   blocks, but only within other modules][1.8mf].
1194 * [`--cfg` compiler flags are parsed strictly as identifiers][1.8c].
1195 * On Unix, [stack overflow triggers a runtime abort instead of a
1196   SIGSEGV][1.8so].
1197 * [`Command::spawn` and its equivalents return an error if any of
1198   its command-line arguments contain interior `NUL`s][1.8n].
1199 * [Tuple and unit enum variants from other crates are in the type
1200   namespace][1.8tn].
1201 * [On Windows `rustc` emits `.lib` files for the `staticlib` library
1202   type instead of `.a` files][1.8st]. Additionally, for the MSVC
1203   toolchain, `rustc` emits import libraries named `foo.dll.lib`
1204   instead of `foo.lib`.
1205
1206
1207 [1.8a]: https://github.com/rust-lang/rust/pull/30962
1208 [1.8b]: https://github.com/rust-lang/rust/pull/31123
1209 [1.8c]: https://github.com/rust-lang/rust/pull/31530
1210 [1.8cc]: https://github.com/rust-lang/cargo/pull/2397
1211 [1.8ce]: https://github.com/rust-lang/cargo/pull/2398
1212 [1.8cf]: https://github.com/rust-lang/rust/pull/31278
1213 [1.8cfg]: https://github.com/rust-lang/cargo/pull/2328
1214 [1.8ci]: https://github.com/rust-lang/cargo/pull/2081
1215 [1.8ck]: https://github.com/rust-lang/cargo/pull/2370
1216 [1.8ct]: https://github.com/rust-lang/cargo/pull/2335
1217 [1.8cu]: https://github.com/rust-lang/rust/pull/31390
1218 [1.8cv]: https://github.com/rust-lang/cargo/issues/2365
1219 [1.8cv]: https://github.com/rust-lang/rust/pull/30998
1220 [1.8h]: https://github.com/rust-lang/rust/pull/31460
1221 [1.8l]: https://github.com/rust-lang/rust/pull/31668
1222 [1.8m]: https://github.com/rust-lang/rust/pull/31020
1223 [1.8mf]: https://github.com/rust-lang/rust/pull/31534
1224 [1.8mp]: https://github.com/rust-lang/rust/pull/30894
1225 [1.8mr]: https://users.rust-lang.org/t/multirust-0-8-with-cross-std-installation/4901
1226 [1.8ms]: https://github.com/rust-lang/rust/pull/30448
1227 [1.8n]: https://github.com/rust-lang/rust/pull/31056
1228 [1.8nx]: https://github.com/rust-lang/rust/pull/30859
1229 [1.8r]: https://github.com/rust-lang/rust/pull/31551
1230 [1.8so]: https://github.com/rust-lang/rust/pull/31333
1231 [1.8st]: https://github.com/rust-lang/rust/pull/29520
1232 [1.8t]: https://github.com/rust-lang/rust/pull/31358
1233 [1.8tn]: https://github.com/rust-lang/rust/pull/30882
1234 [1.8u]: https://github.com/rust-lang/rust/pull/31793
1235 [1.8v]: https://github.com/rust-lang/rust/pull/31757
1236 [1.8w]: https://github.com/rust-lang/rust/pull/31904
1237 [RFC 1361]: https://github.com/rust-lang/rfcs/blob/master/text/1361-cargo-cfg-dependencies.md
1238 [RFC 1415]: https://github.com/rust-lang/rfcs/blob/master/text/1415-trim-std-os.md
1239 [RFC 218]: https://github.com/rust-lang/rfcs/blob/master/text/0218-empty-struct-with-braces.md
1240 [RFC 953]: https://github.com/rust-lang/rfcs/blob/master/text/0953-op-assign.md
1241 [`AddAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.AddAssign.html
1242 [`BitAndAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.BitAndAssign.html
1243 [`BitOrAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.BitOrAssign.html
1244 [`BitXorAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.BitXorAssign.html
1245 [`DivAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.DivAssign.html
1246 [`Instant::duration_since`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html#method.duration_since
1247 [`Instant::elapsed`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html#method.elapsed
1248 [`Instant::now`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html#method.now
1249 [`MulAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.MulAssign.html
1250 [`Ref::map`]: http://doc.rust-lang.org/nightly/std/cell/struct.Ref.html#method.map
1251 [`RefMut::map`]: http://doc.rust-lang.org/nightly/std/cell/struct.RefMut.html#method.map
1252 [`RemAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.RemAssign.html
1253 [`ShlAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.ShlAssign.html
1254 [`ShrAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.ShrAssign.html
1255 [`SubAssign`]: http://doc.rust-lang.org/nightly/std/ops/trait.SubAssign.html
1256 [`SystemTime::duration_since`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html#method.duration_since
1257 [`SystemTime::elapsed`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html#method.elapsed
1258 [`SystemTime::now`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html#method.now
1259 [`SystemTimeError::duration`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTimeError.html#method.duration
1260 [`SystemTimeError`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTimeError.html
1261 [`UNIX_EPOCH`]: http://doc.rust-lang.org/nightly/std/time/constant.UNIX_EPOCH.html
1262 [`ptr::drop_in_place`]: http://doc.rust-lang.org/nightly/std/ptr/fn.drop_in_place.html
1263 [`str::EncodeUtf16`]: http://doc.rust-lang.org/nightly/std/str/struct.EncodeUtf16.html
1264 [`str::encode_utf16`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.encode_utf16
1265 [`time::Instant`]: http://doc.rust-lang.org/nightly/std/time/struct.Instant.html
1266 [`time::SystemTime`]: http://doc.rust-lang.org/nightly/std/time/struct.SystemTime.html
1267
1268
1269 Version 1.7.0 (2016-03-03)
1270 ==========================
1271
1272 Libraries
1273 ---------
1274
1275 * Stabilized APIs
1276   * `Path`
1277     * [`Path::strip_prefix`][] (renamed from relative_from)
1278     * [`path::StripPrefixError`][] (new error type returned from strip_prefix)
1279   * `Ipv4Addr`
1280     * [`Ipv4Addr::is_loopback`]
1281     * [`Ipv4Addr::is_private`]
1282     * [`Ipv4Addr::is_link_local`]
1283     * [`Ipv4Addr::is_multicast`]
1284     * [`Ipv4Addr::is_broadcast`]
1285     * [`Ipv4Addr::is_documentation`]
1286   * `Ipv6Addr`
1287     * [`Ipv6Addr::is_unspecified`]
1288     * [`Ipv6Addr::is_loopback`]
1289     * [`Ipv6Addr::is_multicast`]
1290   * `Vec`
1291     * [`Vec::as_slice`]
1292     * [`Vec::as_mut_slice`]
1293   * `String`
1294     * [`String::as_str`]
1295     * [`String::as_mut_str`]
1296   * Slices
1297     * `<[T]>::`[`clone_from_slice`], which now requires the two slices to
1298     be the same length
1299     * `<[T]>::`[`sort_by_key`]
1300   * checked, saturated, and overflowing operations
1301     * [`i32::checked_rem`], [`i32::checked_neg`], [`i32::checked_shl`], [`i32::checked_shr`]
1302     * [`i32::saturating_mul`]
1303     * [`i32::overflowing_add`], [`i32::overflowing_sub`], [`i32::overflowing_mul`], [`i32::overflowing_div`]
1304     * [`i32::overflowing_rem`], [`i32::overflowing_neg`], [`i32::overflowing_shl`], [`i32::overflowing_shr`]
1305     * [`u32::checked_rem`], [`u32::checked_neg`], [`u32::checked_shl`], [`u32::checked_shl`]
1306     * [`u32::saturating_mul`]
1307     * [`u32::overflowing_add`], [`u32::overflowing_sub`], [`u32::overflowing_mul`], [`u32::overflowing_div`]
1308     * [`u32::overflowing_rem`], [`u32::overflowing_neg`], [`u32::overflowing_shl`], [`u32::overflowing_shr`]
1309     * and checked, saturated, and overflowing operations for other primitive types
1310   * FFI
1311     * [`ffi::IntoStringError`]
1312     * [`CString::into_string`]
1313     * [`CString::into_bytes`]
1314     * [`CString::into_bytes_with_nul`]
1315     * `From<CString> for Vec<u8>`
1316   * `IntoStringError`
1317     * [`IntoStringError::into_cstring`]
1318     * [`IntoStringError::utf8_error`]
1319     * `Error for IntoStringError`
1320   * Hashing
1321     * [`std::hash::BuildHasher`]
1322     * [`BuildHasher::Hasher`]
1323     * [`BuildHasher::build_hasher`]
1324     * [`std::hash::BuildHasherDefault`]
1325     * [`HashMap::with_hasher`]
1326     * [`HashMap::with_capacity_and_hasher`]
1327     * [`HashSet::with_hasher`]
1328     * [`HashSet::with_capacity_and_hasher`]
1329     * [`std::collections::hash_map::RandomState`]
1330     * [`RandomState::new`]
1331 * [Validating UTF-8 is faster by a factor of between 7 and 14x for
1332   ASCII input][1.7utf8]. This means that creating `String`s and `str`s
1333   from bytes is faster.
1334 * [The performance of `LineWriter` (and thus `io::stdout`) was
1335   improved by using `memchr` to search for newlines][1.7m].
1336 * [`f32::to_degrees` and `f32::to_radians` are stable][1.7f]. The
1337   `f64` variants were stabilized previously.
1338 * [`BTreeMap` was rewritten to use less memory and improve the performance
1339   of insertion and iteration, the latter by as much as 5x][1.7bm].
1340 * [`BTreeSet` and its iterators, `Iter`, `IntoIter`, and `Range` are
1341   covariant over their contained type][1.7bt].
1342 * [`LinkedList` and its iterators, `Iter` and `IntoIter` are covariant
1343   over their contained type][1.7ll].
1344 * [`str::replace` now accepts a `Pattern`][1.7rp], like other string
1345   searching methods.
1346 * [`Any` is implemented for unsized types][1.7a].
1347 * [`Hash` is implemented for `Duration`][1.7h].
1348
1349 Misc
1350 ----
1351
1352 * [When running tests with `--test`, rustdoc will pass `--cfg`
1353   arguments to the compiler][1.7dt].
1354 * [The compiler is built with RPATH information by default][1.7rpa].
1355   This means that it will be possible to run `rustc` when installed in
1356   unusual configurations without configuring the dynamic linker search
1357   path explicitly.
1358 * [`rustc` passes `--enable-new-dtags` to GNU ld][1.7dta]. This makes
1359   any RPATH entries (emitted with `-C rpath`) *not* take precedence
1360   over `LD_LIBRARY_PATH`.
1361
1362 Cargo
1363 -----
1364
1365 * [`cargo rustc` accepts a `--profile` flag that runs `rustc` under
1366   any of the compilation profiles, 'dev', 'bench', or 'test'][1.7cp].
1367 * [The `rerun-if-changed` build script directive no longer causes the
1368   build script to incorrectly run twice in certain scenarios][1.7rr].
1369
1370 Compatibility Notes
1371 -------------------
1372
1373 * Soundness fixes to the interactions between associated types and
1374   lifetimes, specified in [RFC 1214], [now generate errors][1.7sf] for
1375   code that violates the new rules. This is a significant change that
1376   is known to break existing code, so it has emitted warnings for the
1377   new error cases since 1.4 to give crate authors time to adapt. The
1378   details of what is changing are subtle; read the RFC for more.
1379 * [Several bugs in the compiler's visibility calculations were
1380   fixed][1.7v]. Since this was found to break significant amounts of
1381   code, the new errors will be emitted as warnings for several release
1382   cycles, under the `private_in_public` lint.
1383 * Defaulted type parameters were accidentally accepted in positions
1384   that were not intended. In this release, [defaulted type parameters
1385   appearing outside of type definitions will generate a
1386   warning][1.7d], which will become an error in future releases.
1387 * [Parsing "." as a float results in an error instead of 0][1.7p].
1388   That is, `".".parse::<f32>()` returns `Err`, not `Ok(0.0)`.
1389 * [Borrows of closure parameters may not outlive the closure][1.7bc].
1390
1391 [1.7a]: https://github.com/rust-lang/rust/pull/30928
1392 [1.7bc]: https://github.com/rust-lang/rust/pull/30341
1393 [1.7bm]: https://github.com/rust-lang/rust/pull/30426
1394 [1.7bt]: https://github.com/rust-lang/rust/pull/30998
1395 [1.7cp]: https://github.com/rust-lang/cargo/pull/2224
1396 [1.7d]: https://github.com/rust-lang/rust/pull/30724
1397 [1.7dt]: https://github.com/rust-lang/rust/pull/30372
1398 [1.7dta]: https://github.com/rust-lang/rust/pull/30394
1399 [1.7f]: https://github.com/rust-lang/rust/pull/30672
1400 [1.7h]: https://github.com/rust-lang/rust/pull/30818
1401 [1.7ll]: https://github.com/rust-lang/rust/pull/30663
1402 [1.7m]: https://github.com/rust-lang/rust/pull/30381
1403 [1.7p]: https://github.com/rust-lang/rust/pull/30681
1404 [1.7rp]: https://github.com/rust-lang/rust/pull/29498
1405 [1.7rpa]: https://github.com/rust-lang/rust/pull/30353
1406 [1.7rr]: https://github.com/rust-lang/cargo/pull/2279
1407 [1.7sf]: https://github.com/rust-lang/rust/pull/30389
1408 [1.7utf8]: https://github.com/rust-lang/rust/pull/30740
1409 [1.7v]: https://github.com/rust-lang/rust/pull/29973
1410 [RFC 1214]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
1411 [`BuildHasher::Hasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hasher.html
1412 [`BuildHasher::build_hasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.BuildHasher.html#tymethod.build_hasher
1413 [`CString::into_bytes_with_nul`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_bytes_with_nul
1414 [`CString::into_bytes`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_bytes
1415 [`CString::into_string`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_string
1416 [`HashMap::with_capacity_and_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashMap.html#method.with_capacity_and_hasher
1417 [`HashMap::with_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashMap.html#method.with_hasher
1418 [`HashSet::with_capacity_and_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.with_capacity_and_hasher
1419 [`HashSet::with_hasher`]: http://doc.rust-lang.org/nightly/std/collections/struct.HashSet.html#method.with_hasher
1420 [`IntoStringError::into_cstring`]: http://doc.rust-lang.org/nightly/std/ffi/struct.IntoStringError.html#method.into_cstring
1421 [`IntoStringError::utf8_error`]: http://doc.rust-lang.org/nightly/std/ffi/struct.IntoStringError.html#method.utf8_error
1422 [`Ipv4Addr::is_broadcast`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_broadcast
1423 [`Ipv4Addr::is_documentation`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_documentation
1424 [`Ipv4Addr::is_link_local`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_link_local
1425 [`Ipv4Addr::is_loopback`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_loopback
1426 [`Ipv4Addr::is_multicast`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_multicast
1427 [`Ipv4Addr::is_private`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv4Addr.html#method.is_private
1428 [`Ipv6Addr::is_loopback`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_loopback
1429 [`Ipv6Addr::is_multicast`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_multicast
1430 [`Ipv6Addr::is_unspecified`]: http://doc.rust-lang.org/nightly/std/net/struct.Ipv6Addr.html#method.is_unspecified
1431 [`Path::strip_prefix`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.strip_prefix
1432 [`RandomState::new`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.RandomState.html#method.new
1433 [`String::as_mut_str`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.as_mut_str
1434 [`String::as_str`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.as_str
1435 [`Vec::as_mut_slice`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.as_mut_slice
1436 [`Vec::as_slice`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.as_slice
1437 [`clone_from_slice`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.clone_from_slice
1438 [`ffi::IntoStringError`]: http://doc.rust-lang.org/nightly/std/ffi/struct.IntoStringError.html
1439 [`i32::checked_neg`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_neg
1440 [`i32::checked_rem`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_rem
1441 [`i32::checked_shl`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_shl
1442 [`i32::checked_shr`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.checked_shr
1443 [`i32::overflowing_add`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_add
1444 [`i32::overflowing_div`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_div
1445 [`i32::overflowing_mul`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_mul
1446 [`i32::overflowing_neg`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_neg
1447 [`i32::overflowing_rem`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_rem
1448 [`i32::overflowing_shl`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_shl
1449 [`i32::overflowing_shr`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_shr
1450 [`i32::overflowing_sub`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.overflowing_sub
1451 [`i32::saturating_mul`]: http://doc.rust-lang.org/nightly/std/primitive.i32.html#method.saturating_mul
1452 [`path::StripPrefixError`]: http://doc.rust-lang.org/nightly/std/path/struct.StripPrefixError.html
1453 [`sort_by_key`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.sort_by_key
1454 [`std::collections::hash_map::RandomState`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.RandomState.html
1455 [`std::hash::BuildHasherDefault`]: http://doc.rust-lang.org/nightly/std/hash/struct.BuildHasherDefault.html
1456 [`std::hash::BuildHasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.BuildHasher.html
1457 [`u32::checked_neg`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_neg
1458 [`u32::checked_rem`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_rem
1459 [`u32::checked_neg`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_neg
1460 [`u32::checked_shl`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.checked_shl
1461 [`u32::overflowing_add`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_add
1462 [`u32::overflowing_div`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_div
1463 [`u32::overflowing_mul`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_mul
1464 [`u32::overflowing_neg`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_neg
1465 [`u32::overflowing_rem`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_rem
1466 [`u32::overflowing_shl`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_shl
1467 [`u32::overflowing_shr`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_shr
1468 [`u32::overflowing_sub`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.overflowing_sub
1469 [`u32::saturating_mul`]: http://doc.rust-lang.org/nightly/std/primitive.u32.html#method.saturating_mul
1470
1471
1472 Version 1.6.0 (2016-01-21)
1473 ==========================
1474
1475 Language
1476 --------
1477
1478 * The `#![no_std]` attribute causes a crate to not be linked to the
1479   standard library, but only the [core library][1.6co], as described
1480   in [RFC 1184]. The core library defines common types and traits but
1481   has no platform dependencies whatsoever, and is the basis for Rust
1482   software in environments that cannot support a full port of the
1483   standard library, such as operating systems. Most of the core
1484   library is now stable.
1485
1486 Libraries
1487 ---------
1488
1489 * Stabilized APIs:
1490   [`Read::read_exact`],
1491   [`ErrorKind::UnexpectedEof`][] (renamed from `UnexpectedEOF`),
1492   [`fs::DirBuilder`], [`fs::DirBuilder::new`],
1493   [`fs::DirBuilder::recursive`], [`fs::DirBuilder::create`],
1494   [`os::unix::fs::DirBuilderExt`],
1495   [`os::unix::fs::DirBuilderExt::mode`], [`vec::Drain`],
1496   [`vec::Vec::drain`], [`string::Drain`], [`string::String::drain`],
1497   [`vec_deque::Drain`], [`vec_deque::VecDeque::drain`],
1498   [`collections::hash_map::Drain`],
1499   [`collections::hash_map::HashMap::drain`],
1500   [`collections::hash_set::Drain`],
1501   [`collections::hash_set::HashSet::drain`],
1502   [`collections::binary_heap::Drain`],
1503   [`collections::binary_heap::BinaryHeap::drain`],
1504   [`Vec::extend_from_slice`][] (renamed from `push_all`),
1505   [`Mutex::get_mut`], [`Mutex::into_inner`], [`RwLock::get_mut`],
1506   [`RwLock::into_inner`],
1507   [`Iterator::min_by_key`][] (renamed from `min_by`),
1508   [`Iterator::max_by_key`][] (renamed from `max_by`).
1509 * The [core library][1.6co] is stable, as are most of its APIs.
1510 * [The `assert_eq!` macro supports arguments that don't implement
1511   `Sized`][1.6ae], such as arrays. In this way it behaves more like
1512   `assert!`.
1513 * Several timer functions that take duration in milliseconds [are
1514   deprecated in favor of those that take `Duration`][1.6ms]. These
1515   include `Condvar::wait_timeout_ms`, `thread::sleep_ms`, and
1516   `thread::park_timeout_ms`.
1517 * The algorithm by which `Vec` reserves additional elements was
1518   [tweaked to not allocate excessive space][1.6a] while still growing
1519   exponentially.
1520 * `From` conversions are [implemented from integers to floats][1.6f]
1521   in cases where the conversion is lossless. Thus they are not
1522   implemented for 32-bit ints to `f32`, nor for 64-bit ints to `f32`
1523   or `f64`. They are also not implemented for `isize` and `usize`
1524   because the implementations would be platform-specific. `From` is
1525   also implemented from `f32` to `f64`.
1526 * `From<&Path>` and `From<PathBuf>` are implemented for `Cow<Path>`.
1527 * `From<T>` is implemented for `Box<T>`, `Rc<T>` and `Arc<T>`.
1528 * `IntoIterator` is implemented for `&PathBuf` and `&Path`.
1529 * [`BinaryHeap` was refactored][1.6bh] for modest performance
1530   improvements.
1531 * Sorting slices that are already sorted [is 50% faster in some
1532   cases][1.6s].
1533
1534 Cargo
1535 -----
1536
1537 * Cargo will look in `$CARGO_HOME/bin` for subcommands [by default][1.6c].
1538 * Cargo build scripts can specify their dependencies by emitting the
1539   [`rerun-if-changed`][1.6rr] key.
1540 * crates.io will reject publication of crates with dependencies that
1541   have a wildcard version constraint. Crates with wildcard
1542   dependencies were seen to cause a variety of problems, as described
1543   in [RFC 1241]. Since 1.5 publication of such crates has emitted a
1544   warning.
1545 * `cargo clean` [accepts a `--release` flag][1.6cc] to clean the
1546   release folder.  A variety of artifacts that Cargo failed to clean
1547   are now correctly deleted.
1548
1549 Misc
1550 ----
1551
1552 * The `unreachable_code` lint [warns when a function call's argument
1553   diverges][1.6dv].
1554 * The parser indicates [failures that may be caused by
1555   confusingly-similar Unicode characters][1.6uc]
1556 * Certain macro errors [are reported at definition time][1.6m], not
1557   expansion.
1558
1559 Compatibility Notes
1560 -------------------
1561
1562 * The compiler no longer makes use of the [`RUST_PATH`][1.6rp]
1563   environment variable when locating crates. This was a pre-cargo
1564   feature for integrating with the package manager that was
1565   accidentally never removed.
1566 * [A number of bugs were fixed in the privacy checker][1.6p] that
1567   could cause previously-accepted code to break.
1568 * [Modules and unit/tuple structs may not share the same name][1.6ts].
1569 * [Bugs in pattern matching unit structs were fixed][1.6us]. The tuple
1570   struct pattern syntax (`Foo(..)`) can no longer be used to match
1571   unit structs. This is a warning now, but will become an error in
1572   future releases. Patterns that share the same name as a const are
1573   now an error.
1574 * A bug was fixed that causes [rustc not to apply default type
1575   parameters][1.6xc] when resolving certain method implementations of
1576   traits defined in other crates.
1577
1578 [1.6a]: https://github.com/rust-lang/rust/pull/29454
1579 [1.6ae]: https://github.com/rust-lang/rust/pull/29770
1580 [1.6bh]: https://github.com/rust-lang/rust/pull/29811
1581 [1.6c]: https://github.com/rust-lang/cargo/pull/2192
1582 [1.6cc]: https://github.com/rust-lang/cargo/pull/2131
1583 [1.6co]: http://doc.rust-lang.org/beta/core/index.html
1584 [1.6dv]: https://github.com/rust-lang/rust/pull/30000
1585 [1.6f]: https://github.com/rust-lang/rust/pull/29129
1586 [1.6m]: https://github.com/rust-lang/rust/pull/29828
1587 [1.6ms]: https://github.com/rust-lang/rust/pull/29604
1588 [1.6p]: https://github.com/rust-lang/rust/pull/29726
1589 [1.6rp]: https://github.com/rust-lang/rust/pull/30034
1590 [1.6rr]: https://github.com/rust-lang/cargo/pull/2134
1591 [1.6s]: https://github.com/rust-lang/rust/pull/29675
1592 [1.6ts]: https://github.com/rust-lang/rust/issues/21546
1593 [1.6uc]: https://github.com/rust-lang/rust/pull/29837
1594 [1.6us]: https://github.com/rust-lang/rust/pull/29383
1595 [1.6xc]: https://github.com/rust-lang/rust/issues/30123
1596 [RFC 1184]: https://github.com/rust-lang/rfcs/blob/master/text/1184-stabilize-no_std.md
1597 [RFC 1241]: https://github.com/rust-lang/rfcs/blob/master/text/1241-no-wildcard-deps.md
1598 [`ErrorKind::UnexpectedEof`]: http://doc.rust-lang.org/nightly/std/io/enum.ErrorKind.html#variant.UnexpectedEof
1599 [`Iterator::max_by_key`]: http://doc.rust-lang.org/nightly/std/iter/trait.Iterator.html#method.max_by_key
1600 [`Iterator::min_by_key`]: http://doc.rust-lang.org/nightly/std/iter/trait.Iterator.html#method.min_by_key
1601 [`Mutex::get_mut`]: http://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html#method.get_mut
1602 [`Mutex::into_inner`]: http://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html#method.into_inner
1603 [`Read::read_exact`]: http://doc.rust-lang.org/nightly/std/io/trait.Read.html#method.read_exact
1604 [`RwLock::get_mut`]: http://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html#method.get_mut
1605 [`RwLock::into_inner`]: http://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html#method.into_inner
1606 [`Vec::extend_from_slice`]: http://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html#method.extend_from_slice
1607 [`collections::binary_heap::BinaryHeap::drain`]: http://doc.rust-lang.org/nightly/std/collections/binary_heap/struct.BinaryHeap.html#method.drain
1608 [`collections::binary_heap::Drain`]: http://doc.rust-lang.org/nightly/std/collections/binary_heap/struct.Drain.html
1609 [`collections::hash_map::Drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.Drain.html
1610 [`collections::hash_map::HashMap::drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_map/struct.HashMap.html#method.drain
1611 [`collections::hash_set::Drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_set/struct.Drain.html
1612 [`collections::hash_set::HashSet::drain`]: http://doc.rust-lang.org/nightly/std/collections/hash_set/struct.HashSet.html#method.drain
1613 [`fs::DirBuilder::create`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html#method.create
1614 [`fs::DirBuilder::new`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html#method.new
1615 [`fs::DirBuilder::recursive`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html#method.recursive
1616 [`fs::DirBuilder`]: http://doc.rust-lang.org/nightly/std/fs/struct.DirBuilder.html
1617 [`os::unix::fs::DirBuilderExt::mode`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.DirBuilderExt.html#tymethod.mode
1618 [`os::unix::fs::DirBuilderExt`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.DirBuilderExt.html
1619 [`string::Drain`]: http://doc.rust-lang.org/nightly/std/string/struct.Drain.html
1620 [`string::String::drain`]: http://doc.rust-lang.org/nightly/std/string/struct.String.html#method.drain
1621 [`vec::Drain`]: http://doc.rust-lang.org/nightly/std/vec/struct.Drain.html
1622 [`vec::Vec::drain`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.drain
1623 [`vec_deque::Drain`]: http://doc.rust-lang.org/nightly/std/collections/vec_deque/struct.Drain.html
1624 [`vec_deque::VecDeque::drain`]: http://doc.rust-lang.org/nightly/std/collections/vec_deque/struct.VecDeque.html#method.drain
1625
1626
1627 Version 1.5.0 (2015-12-10)
1628 ==========================
1629
1630 * ~700 changes, numerous bugfixes
1631
1632 Highlights
1633 ----------
1634
1635 * Stabilized APIs:
1636   [`BinaryHeap::from`], [`BinaryHeap::into_sorted_vec`],
1637   [`BinaryHeap::into_vec`], [`Condvar::wait_timeout`],
1638   [`FileTypeExt::is_block_device`], [`FileTypeExt::is_char_device`],
1639   [`FileTypeExt::is_fifo`], [`FileTypeExt::is_socket`],
1640   [`FileTypeExt`], [`Formatter::alternate`], [`Formatter::fill`],
1641   [`Formatter::precision`], [`Formatter::sign_aware_zero_pad`],
1642   [`Formatter::sign_minus`], [`Formatter::sign_plus`],
1643   [`Formatter::width`], [`Iterator::cmp`], [`Iterator::eq`],
1644   [`Iterator::ge`], [`Iterator::gt`], [`Iterator::le`],
1645   [`Iterator::lt`], [`Iterator::ne`], [`Iterator::partial_cmp`],
1646   [`Path::canonicalize`], [`Path::exists`], [`Path::is_dir`],
1647   [`Path::is_file`], [`Path::metadata`], [`Path::read_dir`],
1648   [`Path::read_link`], [`Path::symlink_metadata`],
1649   [`Utf8Error::valid_up_to`], [`Vec::resize`],
1650   [`VecDeque::as_mut_slices`], [`VecDeque::as_slices`],
1651   [`VecDeque::insert`], [`VecDeque::shrink_to_fit`],
1652   [`VecDeque::swap_remove_back`], [`VecDeque::swap_remove_front`],
1653   [`slice::split_first_mut`], [`slice::split_first`],
1654   [`slice::split_last_mut`], [`slice::split_last`],
1655   [`char::from_u32_unchecked`], [`fs::canonicalize`],
1656   [`str::MatchIndices`], [`str::RMatchIndices`],
1657   [`str::match_indices`], [`str::rmatch_indices`],
1658   [`str::slice_mut_unchecked`], [`string::ParseError`].
1659 * Rust applications hosted on crates.io can be installed locally to
1660   `~/.cargo/bin` with the [`cargo install`] command. Among other
1661   things this makes it easier to augment Cargo with new subcommands:
1662   when a binary named e.g. `cargo-foo` is found in `$PATH` it can be
1663   invoked as `cargo foo`.
1664 * Crates with wildcard (`*`) dependencies will [emit warnings when
1665   published][1.5w]. In 1.6 it will no longer be possible to publish
1666   crates with wildcard dependencies.
1667
1668 Breaking Changes
1669 ----------------
1670
1671 * The rules determining when a particular lifetime must outlive
1672   a particular value (known as '[dropck]') have been [modified
1673   to not rely on parametricity][1.5p].
1674 * [Implementations of `AsRef` and `AsMut` were added to `Box`, `Rc`,
1675   and `Arc`][1.5a]. Because these smart pointer types implement
1676   `Deref`, this causes breakage in cases where the interior type
1677   contains methods of the same name.
1678 * [Correct a bug in Rc/Arc][1.5c] that caused [dropck] to be unaware
1679   that they could drop their content. Soundness fix.
1680 * All method invocations are [properly checked][1.5wf1] for
1681   [well-formedness][1.5wf2]. Soundness fix.
1682 * Traits whose supertraits contain `Self` are [not object
1683   safe][1.5o]. Soundness fix.
1684 * Target specifications support a [`no_default_libraries`][1.5nd]
1685   setting that controls whether `-nodefaultlibs` is passed to the
1686   linker, and in turn the `is_like_windows` setting no longer affects
1687   the `-nodefaultlibs` flag.
1688 * `#[derive(Show)]`, long-deprecated, [has been removed][1.5ds].
1689 * The `#[inline]` and `#[repr]` attributes [can only appear
1690   in valid locations][1.5at].
1691 * Native libraries linked from the local crate are [passed to
1692   the linker before native libraries from upstream crates][1.5nl].
1693 * Two rarely-used attributes, `#[no_debug]` and
1694   `#[omit_gdb_pretty_printer_section]` [are feature gated][1.5fg].
1695 * Negation of unsigned integers, which has been a warning for
1696   several releases, [is now behind a feature gate and will
1697   generate errors][1.5nu].
1698 * The parser accidentally accepted visibility modifiers on
1699   enum variants, a bug [which has been fixed][1.5ev].
1700 * [A bug was fixed that allowed `use` statements to import unstable
1701   features][1.5use].
1702
1703 Language
1704 --------
1705
1706 * When evaluating expressions at compile-time that are not
1707   compile-time constants (const-evaluating expressions in non-const
1708   contexts), incorrect code such as overlong bitshifts and arithmetic
1709   overflow will [generate a warning instead of an error][1.5ce],
1710   delaying the error until runtime. This will allow the
1711   const-evaluator to be expanded in the future backwards-compatibly.
1712 * The `improper_ctypes` lint [no longer warns about using `isize` and
1713   `usize` in FFI][1.5ict].
1714
1715 Libraries
1716 ---------
1717
1718 * `Arc<T>` and `Rc<T>` are [covariant with respect to `T` instead of
1719   invariant][1.5c].
1720 * `Default` is [implemented for mutable slices][1.5d].
1721 * `FromStr` is [implemented for `SockAddrV4` and `SockAddrV6`][1.5s].
1722 * There are now `From` conversions [between floating point
1723   types][1.5f] where the conversions are lossless.
1724 * Thera are now `From` conversions [between integer types][1.5i] where
1725   the conversions are lossless.
1726 * [`fs::Metadata` implements `Clone`][1.5fs].
1727 * The `parse` method [accepts a leading "+" when parsing
1728   integers][1.5pi].
1729 * [`AsMut` is implemented for `Vec`][1.5am].
1730 * The `clone_from` implementations for `String` and `BinaryHeap` [have
1731   been optimized][1.5cf] and no longer rely on the default impl.
1732 * The `extern "Rust"`, `extern "C"`, `unsafe extern "Rust"` and
1733   `unsafe extern "C"` function types now [implement `Clone`,
1734   `PartialEq`, `Eq`, `PartialOrd`, `Ord`, `Hash`, `fmt::Pointer`, and
1735   `fmt::Debug` for up to 12 arguments][1.5fp].
1736 * [Dropping `Vec`s is much faster in unoptimized builds when the
1737   element types don't implement `Drop`][1.5dv].
1738 * A bug that caused in incorrect behavior when [combining `VecDeque`
1739   with zero-sized types][1.5vdz] was resolved.
1740 * [`PartialOrd` for slices is faster][1.5po].
1741
1742 Miscellaneous
1743 -------------
1744
1745 * [Crate metadata size was reduced by 20%][1.5md].
1746 * [Improvements to code generation reduced the size of libcore by 3.3
1747   MB and rustc's memory usage by 18MB][1.5m].
1748 * [Improvements to deref translation increased performance in
1749   unoptimized builds][1.5dr].
1750 * Various errors in trait resolution [are deduplicated to only be
1751   reported once][1.5te].
1752 * Rust has preliminary [support for rumprun kernels][1.5rr].
1753 * Rust has preliminary [support for NetBSD on amd64][1.5na].
1754
1755 [1.5use]: https://github.com/rust-lang/rust/pull/28364
1756 [1.5po]: https://github.com/rust-lang/rust/pull/28436
1757 [1.5ev]: https://github.com/rust-lang/rust/pull/28442
1758 [1.5nu]: https://github.com/rust-lang/rust/pull/28468
1759 [1.5dr]: https://github.com/rust-lang/rust/pull/28491
1760 [1.5vdz]: https://github.com/rust-lang/rust/pull/28494
1761 [1.5md]: https://github.com/rust-lang/rust/pull/28521
1762 [1.5fg]: https://github.com/rust-lang/rust/pull/28522
1763 [1.5dv]: https://github.com/rust-lang/rust/pull/28531
1764 [1.5na]: https://github.com/rust-lang/rust/pull/28543
1765 [1.5fp]: https://github.com/rust-lang/rust/pull/28560
1766 [1.5rr]: https://github.com/rust-lang/rust/pull/28593
1767 [1.5cf]: https://github.com/rust-lang/rust/pull/28602
1768 [1.5nl]: https://github.com/rust-lang/rust/pull/28605
1769 [1.5te]: https://github.com/rust-lang/rust/pull/28645
1770 [1.5at]: https://github.com/rust-lang/rust/pull/28650
1771 [1.5am]: https://github.com/rust-lang/rust/pull/28663
1772 [1.5m]: https://github.com/rust-lang/rust/pull/28778
1773 [1.5ict]: https://github.com/rust-lang/rust/pull/28779
1774 [1.5a]: https://github.com/rust-lang/rust/pull/28811
1775 [1.5pi]: https://github.com/rust-lang/rust/pull/28826
1776 [1.5ce]: https://github.com/rust-lang/rfcs/blob/master/text/1229-compile-time-asserts.md
1777 [1.5p]: https://github.com/rust-lang/rfcs/blob/master/text/1238-nonparametric-dropck.md
1778 [1.5i]: https://github.com/rust-lang/rust/pull/28921
1779 [1.5fs]: https://github.com/rust-lang/rust/pull/29021
1780 [1.5f]: https://github.com/rust-lang/rust/pull/29129
1781 [1.5ds]: https://github.com/rust-lang/rust/pull/29148
1782 [1.5s]: https://github.com/rust-lang/rust/pull/29190
1783 [1.5d]: https://github.com/rust-lang/rust/pull/29245
1784 [1.5o]: https://github.com/rust-lang/rust/pull/29259
1785 [1.5nd]: https://github.com/rust-lang/rust/pull/28578
1786 [1.5wf2]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
1787 [1.5wf1]: https://github.com/rust-lang/rust/pull/28669
1788 [dropck]: https://doc.rust-lang.org/nightly/nomicon/dropck.html
1789 [1.5c]: https://github.com/rust-lang/rust/pull/29110
1790 [1.5w]: https://github.com/rust-lang/rfcs/blob/master/text/1241-no-wildcard-deps.md
1791 [`cargo install`]: https://github.com/rust-lang/rfcs/blob/master/text/1200-cargo-install.md
1792 [`BinaryHeap::from`]: http://doc.rust-lang.org/nightly/std/convert/trait.From.html#method.from
1793 [`BinaryHeap::into_sorted_vec`]: http://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html#method.into_sorted_vec
1794 [`BinaryHeap::into_vec`]: http://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html#method.into_vec
1795 [`Condvar::wait_timeout`]: http://doc.rust-lang.org/nightly/std/sync/struct.Condvar.html#method.wait_timeout
1796 [`FileTypeExt::is_block_device`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_block_device
1797 [`FileTypeExt::is_char_device`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_char_device
1798 [`FileTypeExt::is_fifo`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_fifo
1799 [`FileTypeExt::is_socket`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html#tymethod.is_socket
1800 [`FileTypeExt`]: http://doc.rust-lang.org/nightly/std/os/unix/fs/trait.FileTypeExt.html
1801 [`Formatter::alternate`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.alternate
1802 [`Formatter::fill`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.fill
1803 [`Formatter::precision`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.precision
1804 [`Formatter::sign_aware_zero_pad`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.sign_aware_zero_pad
1805 [`Formatter::sign_minus`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.sign_minus
1806 [`Formatter::sign_plus`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.sign_plus
1807 [`Formatter::width`]: http://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.width
1808 [`Iterator::cmp`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.cmp
1809 [`Iterator::eq`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.eq
1810 [`Iterator::ge`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.ge
1811 [`Iterator::gt`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.gt
1812 [`Iterator::le`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.le
1813 [`Iterator::lt`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.lt
1814 [`Iterator::ne`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.ne
1815 [`Iterator::partial_cmp`]: http://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#method.partial_cmp
1816 [`Path::canonicalize`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.canonicalize
1817 [`Path::exists`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.exists
1818 [`Path::is_dir`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.is_dir
1819 [`Path::is_file`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.is_file
1820 [`Path::metadata`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.metadata
1821 [`Path::read_dir`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.read_dir
1822 [`Path::read_link`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.read_link
1823 [`Path::symlink_metadata`]: http://doc.rust-lang.org/nightly/std/path/struct.Path.html#method.symlink_metadata
1824 [`Utf8Error::valid_up_to`]: http://doc.rust-lang.org/nightly/core/str/struct.Utf8Error.html#method.valid_up_to
1825 [`Vec::resize`]: http://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.resize
1826 [`VecDeque::as_mut_slices`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.as_mut_slices
1827 [`VecDeque::as_slices`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.as_slices
1828 [`VecDeque::insert`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.insert
1829 [`VecDeque::shrink_to_fit`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.shrink_to_fit
1830 [`VecDeque::swap_remove_back`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.swap_remove_back
1831 [`VecDeque::swap_remove_front`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.swap_remove_front
1832 [`slice::split_first_mut`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_first_mut
1833 [`slice::split_first`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_first
1834 [`slice::split_last_mut`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_last_mut
1835 [`slice::split_last`]: http://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_last
1836 [`char::from_u32_unchecked`]: http://doc.rust-lang.org/nightly/std/char/fn.from_u32_unchecked.html
1837 [`fs::canonicalize`]: http://doc.rust-lang.org/nightly/std/fs/fn.canonicalize.html
1838 [`str::MatchIndices`]: http://doc.rust-lang.org/nightly/std/str/struct.MatchIndices.html
1839 [`str::RMatchIndices`]: http://doc.rust-lang.org/nightly/std/str/struct.RMatchIndices.html
1840 [`str::match_indices`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.match_indices
1841 [`str::rmatch_indices`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.rmatch_indices
1842 [`str::slice_mut_unchecked`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.slice_mut_unchecked
1843 [`string::ParseError`]: http://doc.rust-lang.org/nightly/std/string/enum.ParseError.html
1844
1845 Version 1.4.0 (2015-10-29)
1846 ==========================
1847
1848 * ~1200 changes, numerous bugfixes
1849
1850 Highlights
1851 ----------
1852
1853 * Windows builds targeting the 64-bit MSVC ABI and linker (instead of
1854   GNU) are now supported and recommended for use.
1855
1856 Breaking Changes
1857 ----------------
1858
1859 * [Several changes have been made to fix type soundness and improve
1860   the behavior of associated types][sound]. See [RFC 1214]. Although
1861   we have mostly introduced these changes as warnings this release, to
1862   become errors next release, there are still some scenarios that will
1863   see immediate breakage.
1864 * [The `str::lines` and `BufRead::lines` iterators treat `\r\n` as
1865   line breaks in addition to `\n`][crlf].
1866 * [Loans of `'static` lifetime extend to the end of a function][stat].
1867 * [`str::parse` no longer introduces avoidable rounding error when
1868   parsing floating point numbers. Together with earlier changes to
1869   float formatting/output, "round trips" like f.to_string().parse()
1870   now preserve the value of f exactly. Additionally, leading plus
1871   signs are now accepted][fp3].
1872
1873
1874 Language
1875 --------
1876
1877 * `use` statements that import multiple items [can now rename
1878   them][i], as in `use foo::{bar as kitten, baz as puppy}`.
1879 * [Binops work correctly on fat pointers][binfat].
1880 * `pub extern crate`, which does not behave as expected, [issues a
1881   warning][pec] until a better solution is found.
1882
1883 Libraries
1884 ---------
1885
1886 * [Many APIs were stabilized][stab]: `<Box<str>>::into_string`,
1887   [`Arc::downgrade`], [`Arc::get_mut`], [`Arc::make_mut`],
1888   [`Arc::try_unwrap`], [`Box::from_raw`], [`Box::into_raw`], [`CStr::to_str`],
1889   [`CStr::to_string_lossy`], [`CString::from_raw`], [`CString::into_raw`],
1890   [`IntoRawFd::into_raw_fd`], [`IntoRawFd`],
1891   `IntoRawHandle::into_raw_handle`, `IntoRawHandle`,
1892   `IntoRawSocket::into_raw_socket`, `IntoRawSocket`, [`Rc::downgrade`],
1893   [`Rc::get_mut`], [`Rc::make_mut`], [`Rc::try_unwrap`], [`Result::expect`],
1894   [`String::into_boxed_str`], [`TcpStream::read_timeout`],
1895   [`TcpStream::set_read_timeout`], [`TcpStream::set_write_timeout`],
1896   [`TcpStream::write_timeout`], [`UdpSocket::read_timeout`],
1897   [`UdpSocket::set_read_timeout`], [`UdpSocket::set_write_timeout`],
1898   [`UdpSocket::write_timeout`], `Vec::append`, `Vec::split_off`,
1899   [`VecDeque::append`], [`VecDeque::retain`], [`VecDeque::split_off`],
1900   [`rc::Weak::upgrade`], [`rc::Weak`], [`slice::Iter::as_slice`],
1901   [`slice::IterMut::into_slice`], [`str::CharIndices::as_str`],
1902   [`str::Chars::as_str`], [`str::split_at_mut`], [`str::split_at`],
1903   [`sync::Weak::upgrade`], [`sync::Weak`], [`thread::park_timeout`],
1904   [`thread::sleep`].
1905 * [Some APIs were deprecated][dep]: `BTreeMap::with_b`,
1906   `BTreeSet::with_b`, `Option::as_mut_slice`, `Option::as_slice`,
1907   `Result::as_mut_slice`, `Result::as_slice`, `f32::from_str_radix`,
1908   `f64::from_str_radix`.
1909 * [Reverse-searching strings is faster with the 'two-way'
1910   algorithm][s].
1911 * [`std::io::copy` allows `?Sized` arguments][cc].
1912 * The `Windows`, `Chunks`, and `ChunksMut` iterators over slices all
1913   [override `count`, `nth` and `last` with an O(1)
1914   implementation][it].
1915 * [`Default` is implemented for arrays up to `[T; 32]`][d].
1916 * [`IntoRawFd` has been added to the Unix-specific prelude,
1917   `IntoRawSocket` and `IntoRawHandle` to the Windows-specific
1918   prelude][pr].
1919 * [`Extend<String>` and `FromIterator<String` are both implemented for
1920   `String`][es].
1921 * [`IntoIterator` is implemented for references to `Option` and
1922   `Result`][into2].
1923 * [`HashMap` and `HashSet` implement `Extend<&T>` where `T:
1924   Copy`][ext] as part of [RFC 839]. This will cause type inferance
1925   breakage in rare situations.
1926 * [`BinaryHeap` implements `Debug`][bh2].
1927 * [`Borrow` and `BorrowMut` are implemented for fixed-size
1928   arrays][bm].
1929 * [`extern fn`s with the "Rust" and "C" ABIs implement common
1930   traits including `Eq`, `Ord`, `Debug`, `Hash`][fp].
1931 * [String comparison is faster][faststr].
1932 * `&mut T` where `T: std::fmt::Write` [also implements
1933   `std::fmt::Write`][mutw].
1934 * [A stable regression in `VecDeque::push_back` and other
1935   capicity-altering methods that caused panics for zero-sized types
1936   was fixed][vd].
1937 * [Function pointers implement traits for up to 12 parameters][fp2].
1938
1939 Miscellaneous
1940 -------------
1941
1942 * The compiler [no longer uses the 'morestack' feature to prevent
1943   stack overflow][mm]. Instead it uses guard pages and stack
1944   probes (though stack probes are not yet implemented on any platform
1945   but Windows).
1946 * [The compiler matches traits faster when projections are involved][p].
1947 * The 'improper_ctypes' lint [no longer warns about use of `isize` and
1948   `usize`][ffi].
1949 * [Cargo now displays useful information about what its doing during
1950   `cargo update`][cu].
1951
1952 [`Arc::downgrade`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.downgrade
1953 [`Arc::make_mut`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.make_mut
1954 [`Arc::get_mut`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.get_mut
1955 [`Arc::try_unwrap`]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.try_unwrap
1956 [`Box::from_raw`]: http://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html#method.from_raw
1957 [`Box::into_raw`]: http://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html#method.into_raw
1958 [`CStr::to_str`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html#method.to_str
1959 [`CStr::to_string_lossy`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html#method.to_string_lossy
1960 [`CString::from_raw`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.from_raw
1961 [`CString::into_raw`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_raw
1962 [`IntoRawFd::into_raw_fd`]: http://doc.rust-lang.org/nightly/std/os/unix/io/trait.IntoRawFd.html#tymethod.into_raw_fd
1963 [`IntoRawFd`]: http://doc.rust-lang.org/nightly/std/os/unix/io/trait.IntoRawFd.html
1964 [`Rc::downgrade`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.downgrade
1965 [`Rc::get_mut`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.get_mut
1966 [`Rc::make_mut`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.make_mut
1967 [`Rc::try_unwrap`]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.try_unwrap
1968 [`Result::expect`]: http://doc.rust-lang.org/nightly/core/result/enum.Result.html#method.expect
1969 [`String::into_boxed_str`]: http://doc.rust-lang.org/nightly/collections/string/struct.String.html#method.into_boxed_str
1970 [`TcpStream::read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.read_timeout
1971 [`TcpStream::set_read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_read_timeout
1972 [`TcpStream::write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.write_timeout
1973 [`TcpStream::set_write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_write_timeout
1974 [`UdpSocket::read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.read_timeout
1975 [`UdpSocket::set_read_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_read_timeout
1976 [`UdpSocket::write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.write_timeout
1977 [`UdpSocket::set_write_timeout`]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_write_timeout
1978 [`VecDeque::append`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.append
1979 [`VecDeque::retain`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.retain
1980 [`VecDeque::split_off`]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.split_off
1981 [`rc::Weak::upgrade`]: http://doc.rust-lang.org/nightly/std/rc/struct.Weak.html#method.upgrade
1982 [`rc::Weak`]: http://doc.rust-lang.org/nightly/std/rc/struct.Weak.html
1983 [`slice::Iter::as_slice`]: http://doc.rust-lang.org/nightly/std/slice/struct.Iter.html#method.as_slice
1984 [`slice::IterMut::into_slice`]: http://doc.rust-lang.org/nightly/std/slice/struct.IterMut.html#method.into_slice
1985 [`str::CharIndices::as_str`]: http://doc.rust-lang.org/nightly/std/str/struct.CharIndices.html#method.as_str
1986 [`str::Chars::as_str`]: http://doc.rust-lang.org/nightly/std/str/struct.Chars.html#method.as_str
1987 [`str::split_at_mut`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_at_mut
1988 [`str::split_at`]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_at
1989 [`sync::Weak::upgrade`]: http://doc.rust-lang.org/nightly/std/sync/struct.Weak.html#method.upgrade
1990 [`sync::Weak`]: http://doc.rust-lang.org/nightly/std/sync/struct.Weak.html
1991 [`thread::park_timeout`]: http://doc.rust-lang.org/nightly/std/thread/fn.park_timeout.html
1992 [`thread::sleep`]: http://doc.rust-lang.org/nightly/std/thread/fn.sleep.html
1993 [bh2]: https://github.com/rust-lang/rust/pull/28156
1994 [binfat]: https://github.com/rust-lang/rust/pull/28270
1995 [bm]: https://github.com/rust-lang/rust/pull/28197
1996 [cc]: https://github.com/rust-lang/rust/pull/27531
1997 [crlf]: https://github.com/rust-lang/rust/pull/28034
1998 [cu]: https://github.com/rust-lang/cargo/pull/1931
1999 [d]: https://github.com/rust-lang/rust/pull/27825
2000 [dep]: https://github.com/rust-lang/rust/pull/28339
2001 [es]: https://github.com/rust-lang/rust/pull/27956
2002 [ext]: https://github.com/rust-lang/rust/pull/28094
2003 [faststr]: https://github.com/rust-lang/rust/pull/28338
2004 [ffi]: https://github.com/rust-lang/rust/pull/28779
2005 [fp]: https://github.com/rust-lang/rust/pull/28268
2006 [fp2]: https://github.com/rust-lang/rust/pull/28560
2007 [fp3]: https://github.com/rust-lang/rust/pull/27307
2008 [i]: https://github.com/rust-lang/rust/pull/27451
2009 [into2]: https://github.com/rust-lang/rust/pull/28039
2010 [it]: https://github.com/rust-lang/rust/pull/27652
2011 [mm]: https://github.com/rust-lang/rust/pull/27338
2012 [mutw]: https://github.com/rust-lang/rust/pull/28368
2013 [sound]: https://github.com/rust-lang/rust/pull/27641
2014 [p]: https://github.com/rust-lang/rust/pull/27866
2015 [pec]: https://github.com/rust-lang/rust/pull/28486
2016 [pr]: https://github.com/rust-lang/rust/pull/27896
2017 [RFC 839]: https://github.com/rust-lang/rfcs/blob/master/text/0839-embrace-extend-extinguish.md
2018 [RFC 1214]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md
2019 [s]: https://github.com/rust-lang/rust/pull/27474
2020 [stab]: https://github.com/rust-lang/rust/pull/28339
2021 [stat]: https://github.com/rust-lang/rust/pull/28321
2022 [vd]: https://github.com/rust-lang/rust/pull/28494
2023
2024 Version 1.3.0 (2015-09-17)
2025 ==============================
2026
2027 * ~900 changes, numerous bugfixes
2028
2029 Highlights
2030 ----------
2031
2032 * The [new object lifetime defaults][nold] have been [turned
2033   on][nold2] after a cycle of warnings about the change. Now types
2034   like `&'a Box<Trait>` (or `&'a Rc<Trait>`, etc) will change from
2035   being interpreted as `&'a Box<Trait+'a>` to `&'a
2036   Box<Trait+'static>`.
2037 * [The Rustonomicon][nom] is a new book in the official documentation
2038   that dives into writing unsafe Rust.
2039 * The [`Duration`] API, [has been stabilized][ds]. This basic unit of
2040   timekeeping is employed by other std APIs, as well as out-of-tree
2041   time crates.
2042
2043 Breaking Changes
2044 ----------------
2045
2046 * The [new object lifetime defaults][nold] have been [turned
2047   on][nold2] after a cycle of warnings about the change.
2048 * There is a known [regression][lr] in how object lifetime elision is
2049   interpreted, the proper solution for which is undetermined.
2050 * The `#[prelude_import]` attribute, an internal implementation
2051   detail, was accidentally stabilized previously. [It has been put
2052   behind the `prelude_import` feature gate][pi]. This change is
2053   believed to break no existing code.
2054 * The behavior of [`size_of_val`][dst1] and [`align_of_val`][dst2] is
2055   [more sane for dynamically sized types][dst3]. Code that relied on
2056   the previous behavior is thought to be broken.
2057 * The `dropck` rules, which checks that destructors can't access
2058   destroyed values, [have been updated][dropck] to match the
2059   [RFC][dropckrfc]. This fixes some soundness holes, and as such will
2060   cause some previously-compiling code to no longer build.
2061
2062 Language
2063 --------
2064
2065 * The [new object lifetime defaults][nold] have been [turned
2066   on][nold2] after a cycle of warnings about the change.
2067 * Semicolons may [now follow types and paths in
2068   macros](https://github.com/rust-lang/rust/pull/27000).
2069 * The behavior of [`size_of_val`][dst1] and [`align_of_val`][dst2] is
2070   [more sane for dynamically sized types][dst3]. Code that relied on
2071   the previous behavior is not known to exist, and suspected to be
2072   broken.
2073 * `'static` variables [may now be recursive][st].
2074 * `ref` bindings choose between [`Deref`] and [`DerefMut`]
2075   implementations correctly.
2076 * The `dropck` rules, which checks that destructors can't access
2077   destroyed values, [have been updated][dropck] to match the
2078   [RFC][dropckrfc].
2079
2080 Libraries
2081 ---------
2082
2083 * The [`Duration`] API, [has been stabilized][ds], as well as the
2084   `std::time` module, which presently contains only `Duration`.
2085 * `Box<str>` and `Box<[T]>` both implement `Clone`.
2086 * The owned C string, [`CString`], implements [`Borrow`] and the
2087   borrowed C string, [`CStr`], implements [`ToOwned`]. The two of
2088   these allow C strings to be borrowed and cloned in generic code.
2089 * [`CStr`] implements [`Debug`].
2090 * [`AtomicPtr`] implements [`Debug`].
2091 * [`Error`] trait objects [can be downcast to their concrete types][e]
2092   in many common configurations, using the [`is`], [`downcast`],
2093   [`downcast_ref`] and [`downcast_mut`] methods, similarly to the
2094   [`Any`] trait.
2095 * Searching for substrings now [employs the two-way algorithm][search]
2096   instead of doing a naive search. This gives major speedups to a
2097   number of methods, including [`contains`][sc], [`find`][sf],
2098   [`rfind`][srf], [`split`][ss]. [`starts_with`][ssw] and
2099   [`ends_with`][sew] are also faster.
2100 * The performance of `PartialEq` for slices is [much faster][ps].
2101 * The [`Hash`] trait offers the default method, [`hash_slice`], which
2102   is overridden and optimized by the implementations for scalars.
2103 * The [`Hasher`] trait now has a number of specialized `write_*`
2104   methods for primitive types, for efficiency.
2105 * The I/O-specific error type, [`std::io::Error`][ie], gained a set of
2106   methods for accessing the 'inner error', if any: [`get_ref`][iegr],
2107   [`get_mut`][iegm], [`into_inner`][ieii]. As well, the implementation
2108   of [`std::error::Error::cause`][iec] also delegates to the inner
2109   error.
2110 * [`process::Child`][pc] gained the [`id`] method, which returns a
2111   `u32` representing the platform-specific process identifier.
2112 * The [`connect`] method on slices is deprecated, replaced by the new
2113   [`join`] method (note that both of these are on the *unstable*
2114   [`SliceConcatExt`] trait, but through the magic of the prelude are
2115   available to stable code anyway).
2116 * The [`Div`] operator is implemented for [`Wrapping`] types.
2117 * [`DerefMut` is implemented for `String`][dms].
2118 * Performance of SipHash (the default hasher for `HashMap`) is
2119   [better for long data][sh].
2120 * [`AtomicPtr`] implements [`Send`].
2121 * The [`read_to_end`] implementations for [`Stdin`] and [`File`]
2122   are now [specialized to use uninitalized buffers for increased
2123   performance][rte].
2124 * Lifetime parameters of foreign functions [are now resolved
2125   properly][f].
2126
2127 Misc
2128 ----
2129
2130 * Rust can now, with some coercion, [produce programs that run on
2131   Windows XP][xp], though XP is not considered a supported platform.
2132 * Porting Rust on Windows from the GNU toolchain to MSVC continues
2133   ([1][win1], [2][win2], [3][win3], [4][win4]). It is still not
2134   recommended for use in 1.3, though should be fully-functional
2135   in the [64-bit 1.4 beta][b14].
2136 * On Fedora-based systems installation will [properly configure the
2137   dynamic linker][fl].
2138 * The compiler gained many new extended error descriptions, which can
2139   be accessed with the `--explain` flag.
2140 * The `dropck` pass, which checks that destructors can't access
2141   destroyed values, [has been rewritten][dropck]. This fixes some
2142   soundness holes, and as such will cause some previously-compiling
2143   code to no longer build.
2144 * `rustc` now uses [LLVM to write archive files where possible][ar].
2145   Eventually this will eliminate the compiler's dependency on the ar
2146   utility.
2147 * Rust has [preliminary support for i686 FreeBSD][fb] (it has long
2148   supported FreeBSD on x86_64).
2149 * The [`unused_mut`][lum], [`unconditional_recursion`][lur],
2150   [`improper_ctypes`][lic], and [`negate_unsigned`][lnu] lints are
2151   more strict.
2152 * If landing pads are disabled (with `-Z no-landing-pads`), [`panic!`
2153   will kill the process instead of leaking][nlp].
2154
2155 [`Any`]: http://doc.rust-lang.org/nightly/std/any/trait.Any.html
2156 [`AtomicPtr`]: http://doc.rust-lang.org/nightly/std/sync/atomic/struct.AtomicPtr.html
2157 [`Borrow`]: http://doc.rust-lang.org/nightly/std/borrow/trait.Borrow.html
2158 [`CStr`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html
2159 [`CString`]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html
2160 [`Debug`]: http://doc.rust-lang.org/nightly/std/fmt/trait.Debug.html
2161 [`DerefMut`]: http://doc.rust-lang.org/nightly/std/ops/trait.DerefMut.html
2162 [`Deref`]: http://doc.rust-lang.org/nightly/std/ops/trait.Deref.html
2163 [`Div`]: http://doc.rust-lang.org/nightly/std/ops/trait.Div.html
2164 [`Duration`]: http://doc.rust-lang.org/nightly/std/time/struct.Duration.html
2165 [`Error`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html
2166 [`File`]: http://doc.rust-lang.org/nightly/std/fs/struct.File.html
2167 [`Hash`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html
2168 [`Hasher`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hasher.html
2169 [`Send`]: http://doc.rust-lang.org/nightly/std/marker/trait.Send.html
2170 [`SliceConcatExt`]: http://doc.rust-lang.org/nightly/std/slice/trait.SliceConcatExt.html
2171 [`Stdin`]: http://doc.rust-lang.org/nightly/std/io/struct.Stdin.html
2172 [`ToOwned`]: http://doc.rust-lang.org/nightly/std/borrow/trait.ToOwned.html
2173 [`Wrapping`]: http://doc.rust-lang.org/nightly/std/num/struct.Wrapping.html
2174 [`connect`]: http://doc.rust-lang.org/nightly/std/slice/trait.SliceConcatExt.html#method.connect
2175 [`downcast_mut`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.downcast_mut
2176 [`downcast_ref`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.downcast_ref
2177 [`downcast`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.downcast
2178 [`hash_slice`]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html#method.hash_slice
2179 [`id`]: http://doc.rust-lang.org/nightly/std/process/struct.Child.html#method.id
2180 [`is`]: http://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.is
2181 [`join`]: http://doc.rust-lang.org/nightly/std/slice/trait.SliceConcatExt.html#method.join
2182 [`read_to_end`]: http://doc.rust-lang.org/nightly/std/io/trait.Read.html#method.read_to_end
2183 [ar]: https://github.com/rust-lang/rust/pull/26926
2184 [b14]: https://static.rust-lang.org/dist/rust-beta-x86_64-pc-windows-msvc.msi
2185 [dms]: https://github.com/rust-lang/rust/pull/26241
2186 [dropck]: https://github.com/rust-lang/rust/pull/27261
2187 [dropckrfc]: https://github.com/rust-lang/rfcs/blob/master/text/0769-sound-generic-drop.md
2188 [ds]: https://github.com/rust-lang/rust/pull/26818
2189 [dst1]: http://doc.rust-lang.org/nightly/std/mem/fn.size_of_val.html
2190 [dst2]: http://doc.rust-lang.org/nightly/std/mem/fn.align_of_val.html
2191 [dst3]: https://github.com/rust-lang/rust/pull/27351
2192 [e]: https://github.com/rust-lang/rust/pull/24793
2193 [f]: https://github.com/rust-lang/rust/pull/26588
2194 [fb]: https://github.com/rust-lang/rust/pull/26959
2195 [fl]: https://github.com/rust-lang/rust-installer/pull/41
2196 [hs]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html#method.hash_slice
2197 [ie]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html
2198 [iec]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.cause
2199 [iegm]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.get_mut
2200 [iegr]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.get_ref
2201 [ieii]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.into_inner
2202 [lic]: https://github.com/rust-lang/rust/pull/26583
2203 [lnu]: https://github.com/rust-lang/rust/pull/27026
2204 [lr]: https://github.com/rust-lang/rust/issues/27248
2205 [lum]: https://github.com/rust-lang/rust/pull/26378
2206 [lur]: https://github.com/rust-lang/rust/pull/26783
2207 [nlp]: https://github.com/rust-lang/rust/pull/27176
2208 [nold2]: https://github.com/rust-lang/rust/pull/27045
2209 [nold]: https://github.com/rust-lang/rfcs/blob/master/text/1156-adjust-default-object-bounds.md
2210 [nom]: http://doc.rust-lang.org/nightly/nomicon/
2211 [pc]: http://doc.rust-lang.org/nightly/std/process/struct.Child.html
2212 [pi]: https://github.com/rust-lang/rust/pull/26699
2213 [ps]: https://github.com/rust-lang/rust/pull/26884
2214 [rte]: https://github.com/rust-lang/rust/pull/26950
2215 [sc]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.contains
2216 [search]: https://github.com/rust-lang/rust/pull/26327
2217 [sew]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.ends_with
2218 [sf]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.find
2219 [sh]: https://github.com/rust-lang/rust/pull/27280
2220 [srf]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.rfind
2221 [ss]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split
2222 [ssw]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.starts_with
2223 [st]: https://github.com/rust-lang/rust/pull/26630
2224 [win1]: https://github.com/rust-lang/rust/pull/26569
2225 [win2]: https://github.com/rust-lang/rust/pull/26741
2226 [win3]: https://github.com/rust-lang/rust/pull/26741
2227 [win4]: https://github.com/rust-lang/rust/pull/27210
2228 [xp]: https://github.com/rust-lang/rust/pull/26569
2229
2230 Version 1.2.0 (2015-08-07)
2231 ==========================
2232
2233 * ~1200 changes, numerous bugfixes
2234
2235 Highlights
2236 ----------
2237
2238 * [Dynamically-sized-type coercions][dst] allow smart pointer types
2239   like `Rc` to contain types without a fixed size, arrays and trait
2240   objects, finally enabling use of `Rc<[T]>` and completing the
2241   implementation of DST.
2242 * [Parallel codegen][parcodegen] is now working again, which can
2243   substantially speed up large builds in debug mode; It also gets
2244   another ~33% speedup when bootstrapping on a 4 core machine (using 8
2245   jobs). It's not enabled by default, but will be "in the near
2246   future". It can be activated with the `-C codegen-units=N` flag to
2247   `rustc`.
2248 * This is the first release with [experimental support for linking
2249   with the MSVC linker and lib C on Windows (instead of using the GNU
2250   variants via MinGW)][win]. It is yet recommended only for the most
2251   intrepid Rusticians.
2252 * Benchmark compilations are showing a 30% improvement in
2253   bootstrapping over 1.1.
2254
2255 Breaking Changes
2256 ----------------
2257
2258 * The [`to_uppercase`] and [`to_lowercase`] methods on `char` now do
2259   unicode case mapping, which is a previously-planned change in
2260   behavior and considered a bugfix.
2261 * [`mem::align_of`] now specifies [the *minimum alignment* for
2262   T][align], which is usually the alignment programs are interested
2263   in, and the same value reported by clang's
2264   `alignof`. [`mem::min_align_of`] is deprecated. This is not known to
2265   break real code.
2266 * [The `#[packed]` attribute is no longer silently accepted by the
2267   compiler][packed]. This attribute did nothing and code that
2268   mentioned it likely did not work as intended.
2269 * Associated type defaults are [now behind the
2270   `associated_type_defaults` feature gate][ad]. In 1.1 associated type
2271   defaults *did not work*, but could be mentioned syntactically. As
2272   such this breakage has minimal impact.
2273
2274 Language
2275 --------
2276
2277 * Patterns with `ref mut` now correctly invoke [`DerefMut`] when
2278   matching against dereferencable values.
2279
2280 Libraries
2281 ---------
2282
2283 * The [`Extend`] trait, which grows a collection from an iterator, is
2284   implemented over iterators of references, for `String`, `Vec`,
2285   `LinkedList`, `VecDeque`, `EnumSet`, `BinaryHeap`, `VecMap`,
2286   `BTreeSet` and `BTreeMap`. [RFC][extend-rfc].
2287 * The [`iter::once`] function returns an iterator that yields a single
2288   element, and [`iter::empty`] returns an iterator that yields no
2289   elements.
2290 * The [`matches`] and [`rmatches`] methods on `str` return iterators
2291   over substring matches.
2292 * [`Cell`] and [`RefCell`] both implement `Eq`.
2293 * A number of methods for wrapping arithmetic are added to the
2294   integral types, [`wrapping_div`], [`wrapping_rem`],
2295   [`wrapping_neg`], [`wrapping_shl`], [`wrapping_shr`]. These are in
2296   addition to the existing [`wrapping_add`], [`wrapping_sub`], and
2297   [`wrapping_mul`] methods, and alternatives to the [`Wrapping`]
2298   type.. It is illegal for the default arithmetic operations in Rust
2299   to overflow; the desire to wrap must be explicit.
2300 * The `{:#?}` formatting specifier [displays the alternate,
2301   pretty-printed][debugfmt] form of the `Debug` formatter. This
2302   feature was actually introduced prior to 1.0 with little
2303   fanfare.
2304 * [`fmt::Formatter`] implements [`fmt::Write`], a `fmt`-specific trait
2305   for writing data to formatted strings, similar to [`io::Write`].
2306 * [`fmt::Formatter`] adds 'debug builder' methods, [`debug_struct`],
2307   [`debug_tuple`], [`debug_list`], [`debug_set`], [`debug_map`]. These
2308   are used by code generators to emit implementations of [`Debug`].
2309 * `str` has new [`to_uppercase`][strup] and [`to_lowercase`][strlow]
2310   methods that convert case, following Unicode case mapping.
2311 * It is now easier to handle poisoned locks. The [`PoisonError`]
2312   type, returned by failing lock operations, exposes `into_inner`,
2313   `get_ref`, and `get_mut`, which all give access to the inner lock
2314   guard, and allow the poisoned lock to continue to operate. The
2315   `is_poisoned` method of [`RwLock`] and [`Mutex`] can poll for a
2316   poisoned lock without attempting to take the lock.
2317 * On Unix the [`FromRawFd`] trait is implemented for [`Stdio`], and
2318   [`AsRawFd`] for [`ChildStdin`], [`ChildStdout`], [`ChildStderr`].
2319   On Windows the `FromRawHandle` trait is implemented for `Stdio`,
2320   and `AsRawHandle` for `ChildStdin`, `ChildStdout`,
2321   `ChildStderr`.
2322 * [`io::ErrorKind`] has a new variant, `InvalidData`, which indicates
2323   malformed input.
2324
2325 Misc
2326 ----
2327
2328 * `rustc` employs smarter heuristics for guessing at [typos].
2329 * `rustc` emits more efficient code for [no-op conversions between
2330   unsafe pointers][nop].
2331 * Fat pointers are now [passed in pairs of immediate arguments][fat],
2332   resulting in faster compile times and smaller code.
2333
2334 [`Extend`]: https://doc.rust-lang.org/nightly/std/iter/trait.Extend.html
2335 [extend-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0839-embrace-extend-extinguish.md
2336 [`iter::once`]: https://doc.rust-lang.org/nightly/std/iter/fn.once.html
2337 [`iter::empty`]: https://doc.rust-lang.org/nightly/std/iter/fn.empty.html
2338 [`matches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.matches
2339 [`rmatches`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.rmatches
2340 [`Cell`]: https://doc.rust-lang.org/nightly/std/cell/struct.Cell.html
2341 [`RefCell`]: https://doc.rust-lang.org/nightly/std/cell/struct.RefCell.html
2342 [`wrapping_add`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_add
2343 [`wrapping_sub`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_sub
2344 [`wrapping_mul`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_mul
2345 [`wrapping_div`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_div
2346 [`wrapping_rem`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_rem
2347 [`wrapping_neg`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_neg
2348 [`wrapping_shl`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_shl
2349 [`wrapping_shr`]: https://doc.rust-lang.org/nightly/std/primitive.i8.html#method.wrapping_shr
2350 [`Wrapping`]: https://doc.rust-lang.org/nightly/std/num/struct.Wrapping.html
2351 [`fmt::Formatter`]: https://doc.rust-lang.org/nightly/std/fmt/struct.Formatter.html
2352 [`fmt::Write`]: https://doc.rust-lang.org/nightly/std/fmt/trait.Write.html
2353 [`io::Write`]: https://doc.rust-lang.org/nightly/std/io/trait.Write.html
2354 [`debug_struct`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_struct
2355 [`debug_tuple`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_tuple
2356 [`debug_list`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_list
2357 [`debug_set`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_set
2358 [`debug_map`]: https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html#method.debug_map
2359 [`Debug`]: https://doc.rust-lang.org/nightly/std/fmt/trait.Debug.html
2360 [strup]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.to_uppercase
2361 [strlow]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.to_lowercase
2362 [`to_uppercase`]: https://doc.rust-lang.org/nightly/std/primitive.char.html#method.to_uppercase
2363 [`to_lowercase`]: https://doc.rust-lang.org/nightly/std/primitive.char.html#method.to_lowercase
2364 [`PoisonError`]: https://doc.rust-lang.org/nightly/std/sync/struct.PoisonError.html
2365 [`RwLock`]: https://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html
2366 [`Mutex`]: https://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html
2367 [`FromRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.FromRawFd.html
2368 [`AsRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.AsRawFd.html
2369 [`Stdio`]: https://doc.rust-lang.org/nightly/std/process/struct.Stdio.html
2370 [`ChildStdin`]: https://doc.rust-lang.org/nightly/std/process/struct.ChildStdin.html
2371 [`ChildStdout`]: https://doc.rust-lang.org/nightly/std/process/struct.ChildStdout.html
2372 [`ChildStderr`]: https://doc.rust-lang.org/nightly/std/process/struct.ChildStderr.html
2373 [`io::ErrorKind`]: https://doc.rust-lang.org/nightly/std/io/enum.ErrorKind.html
2374 [debugfmt]: https://www.reddit.com/r/rust/comments/3ceaui/psa_produces_prettyprinted_debug_output/
2375 [`DerefMut`]: https://doc.rust-lang.org/nightly/std/ops/trait.DerefMut.html
2376 [`mem::align_of`]: https://doc.rust-lang.org/nightly/std/mem/fn.align_of.html
2377 [align]: https://github.com/rust-lang/rust/pull/25646
2378 [`mem::min_align_of`]: https://doc.rust-lang.org/nightly/std/mem/fn.min_align_of.html
2379 [typos]: https://github.com/rust-lang/rust/pull/26087
2380 [nop]: https://github.com/rust-lang/rust/pull/26336
2381 [fat]: https://github.com/rust-lang/rust/pull/26411
2382 [dst]: https://github.com/rust-lang/rfcs/blob/master/text/0982-dst-coercion.md
2383 [parcodegen]: https://github.com/rust-lang/rust/pull/26018
2384 [packed]: https://github.com/rust-lang/rust/pull/25541
2385 [ad]: https://github.com/rust-lang/rust/pull/27382
2386 [win]: https://github.com/rust-lang/rust/pull/25350
2387
2388 Version 1.1.0 (2015-06-25)
2389 =========================
2390
2391 * ~850 changes, numerous bugfixes
2392
2393 Highlights
2394 ----------
2395
2396 * The [`std::fs` module has been expanded][fs] to expand the set of
2397   functionality exposed:
2398   * `DirEntry` now supports optimizations like `file_type` and `metadata` which
2399     don't incur a syscall on some platforms.
2400   * A `symlink_metadata` function has been added.
2401   * The `fs::Metadata` structure now lowers to its OS counterpart, providing
2402     access to all underlying information.
2403 * The compiler now contains extended explanations of many errors. When an error
2404   with an explanation occurs the compiler suggests using the `--explain` flag
2405   to read the explanation. Error explanations are also [available online][err-index].
2406 * Thanks to multiple [improvements][sk] to [type checking][pre], as
2407   well as other work, the time to bootstrap the compiler decreased by
2408   32%.
2409
2410 Libraries
2411 ---------
2412
2413 * The [`str::split_whitespace`] method splits a string on unicode
2414   whitespace boundaries.
2415 * On both Windows and Unix, new extension traits provide conversion of
2416   I/O types to and from the underlying system handles. On Unix, these
2417   traits are [`FromRawFd`] and [`AsRawFd`], on Windows `FromRawHandle`
2418   and `AsRawHandle`. These are implemented for `File`, `TcpStream`,
2419   `TcpListener`, and `UpdSocket`. Further implementations for
2420   `std::process` will be stabilized later.
2421 * On Unix, [`std::os::unix::symlink`] creates symlinks. On
2422   Windows, symlinks can be created with
2423   `std::os::windows::symlink_dir` and
2424   `std::os::windows::symlink_file`.
2425 * The `mpsc::Receiver` type can now be converted into an iterator with
2426   `into_iter` on the [`IntoIterator`] trait.
2427 * `Ipv4Addr` can be created from `u32` with the `From<u32>`
2428   implementation of the [`From`] trait.
2429 * The `Debug` implementation for `RangeFull` [creates output that is
2430   more consistent with other implementations][rf].
2431 * [`Debug` is implemented for `File`][file].
2432 * The `Default` implementation for `Arc` [no longer requires `Sync +
2433   Send`][arc].
2434 * [The `Iterator` methods `count`, `nth`, and `last` have been
2435   overridden for slices to have O(1) performance instead of O(n)][si].
2436 * Incorrect handling of paths on Windows has been improved in both the
2437   compiler and the standard library.
2438 * [`AtomicPtr` gained a `Default` implementation][ap].
2439 * In accordance with Rust's policy on arithmetic overflow `abs` now
2440   [panics on overflow when debug assertions are enabled][abs].
2441 * The [`Cloned`] iterator, which was accidentally left unstable for
2442   1.0 [has been stabilized][c].
2443 * The [`Incoming`] iterator, which iterates over incoming TCP
2444   connections, and which was accidentally unnamable in 1.0, [is now
2445   properly exported][inc].
2446 * [`BinaryHeap`] no longer corrupts itself [when functions called by
2447   `sift_up` or `sift_down` panic][bh].
2448 * The [`split_off`] method of `LinkedList` [no longer corrupts
2449   the list in certain scenarios][ll].
2450
2451 Misc
2452 ----
2453
2454 * Type checking performance [has improved notably][sk] with
2455   [multiple improvements][pre].
2456 * The compiler [suggests code changes][ch] for more errors.
2457 * rustc and it's build system have experimental support for [building
2458   toolchains against MUSL][m] instead of glibc on Linux.
2459 * The compiler defines the `target_env` cfg value, which is used for
2460   distinguishing toolchains that are otherwise for the same
2461   platform. Presently this is set to `gnu` for common GNU Linux
2462   targets and for MinGW targets, and `musl` for MUSL Linux targets.
2463 * The [`cargo rustc`][crc] command invokes a build with custom flags
2464   to rustc.
2465 * [Android executables are always position independent][pie].
2466 * [The `drop_with_repr_extern` lint warns about mixing `repr(C)`
2467   with `Drop`][drop].
2468
2469 [`str::split_whitespace`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_whitespace
2470 [`FromRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.FromRawFd.html
2471 [`AsRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.AsRawFd.html
2472 [`std::os::unix::symlink`]: https://doc.rust-lang.org/nightly/std/os/unix/fs/fn.symlink.html
2473 [`IntoIterator`]: https://doc.rust-lang.org/nightly/std/iter/trait.IntoIterator.html
2474 [`From`]: https://doc.rust-lang.org/nightly/std/convert/trait.From.html
2475 [rf]: https://github.com/rust-lang/rust/pull/24491
2476 [err-index]: https://doc.rust-lang.org/error-index.html
2477 [sk]: https://github.com/rust-lang/rust/pull/24615
2478 [pre]: https://github.com/rust-lang/rust/pull/25323
2479 [file]: https://github.com/rust-lang/rust/pull/24598
2480 [ch]: https://github.com/rust-lang/rust/pull/24683
2481 [arc]: https://github.com/rust-lang/rust/pull/24695
2482 [si]: https://github.com/rust-lang/rust/pull/24701
2483 [ap]: https://github.com/rust-lang/rust/pull/24834
2484 [m]: https://github.com/rust-lang/rust/pull/24777
2485 [fs]: https://github.com/rust-lang/rfcs/blob/master/text/1044-io-fs-2.1.md
2486 [crc]: https://github.com/rust-lang/cargo/pull/1568
2487 [pie]: https://github.com/rust-lang/rust/pull/24953
2488 [abs]: https://github.com/rust-lang/rust/pull/25441
2489 [c]: https://github.com/rust-lang/rust/pull/25496
2490 [`Cloned`]: https://doc.rust-lang.org/nightly/std/iter/struct.Cloned.html
2491 [`Incoming`]: https://doc.rust-lang.org/nightly/std/net/struct.Incoming.html
2492 [inc]: https://github.com/rust-lang/rust/pull/25522
2493 [bh]: https://github.com/rust-lang/rust/pull/25856
2494 [`BinaryHeap`]: https://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html
2495 [ll]: https://github.com/rust-lang/rust/pull/26022
2496 [`split_off`]: https://doc.rust-lang.org/nightly/collections/linked_list/struct.LinkedList.html#method.split_off
2497 [drop]: https://github.com/rust-lang/rust/pull/24935
2498
2499 Version 1.0.0 (2015-05-15)
2500 ========================
2501
2502 * ~1500 changes, numerous bugfixes
2503
2504 Highlights
2505 ----------
2506
2507 * The vast majority of the standard library is now `#[stable]`. It is
2508   no longer possible to use unstable features with a stable build of
2509   the compiler.
2510 * Many popular crates on [crates.io] now work on the stable release
2511   channel.
2512 * Arithmetic on basic integer types now [checks for overflow in debug
2513   builds][overflow].
2514
2515 Language
2516 --------
2517
2518 * Several [restrictions have been added to trait coherence][coh] in
2519   order to make it easier for upstream authors to change traits
2520   without breaking downstream code.
2521 * Digits of binary and octal literals are [lexed more eagerly][lex] to
2522   improve error messages and macro behavior. For example, `0b1234` is
2523   now lexed as `0b1234` instead of two tokens, `0b1` and `234`.
2524 * Trait bounds [are always invariant][inv], eliminating the need for
2525   the `PhantomFn` and `MarkerTrait` lang items, which have been
2526   removed.
2527 * ["-" is no longer a valid character in crate names][cr], the `extern crate
2528   "foo" as bar` syntax has been replaced with `extern crate foo as
2529   bar`, and Cargo now automatically translates "-" in *package* names
2530   to underscore for the crate name.
2531 * [Lifetime shadowing is an error][lt].
2532 * [`Send` no longer implies `'static`][send-rfc].
2533 * [UFCS now supports trait-less associated paths][moar-ufcs] like
2534   `MyType::default()`.
2535 * Primitive types [now have inherent methods][prim-inherent],
2536   obviating the need for extension traits like `SliceExt`.
2537 * Methods with `Self: Sized` in their `where` clause are [considered
2538   object-safe][self-sized], allowing many extension traits like
2539   `IteratorExt` to be merged into the traits they extended.
2540 * You can now [refer to associated types][assoc-where] whose
2541   corresponding trait bounds appear only in a `where` clause.
2542 * The final bits of [OIBIT landed][oibit-final], meaning that traits
2543   like `Send` and `Sync` are now library-defined.
2544 * A [Reflect trait][reflect] was introduced, which means that
2545   downcasting via the `Any` trait is effectively limited to concrete
2546   types. This helps retain the potentially-important "parametricity"
2547   property: generic code cannot behave differently for different type
2548   arguments except in minor ways.
2549 * The `unsafe_destructor` feature is now deprecated in favor of the
2550   [new `dropck`][dropck]. This change is a major reduction in unsafe
2551   code.
2552
2553 Libraries
2554 ---------
2555
2556 * The `thread_local` module [has been renamed to `std::thread`][th].
2557 * The methods of `IteratorExt` [have been moved to the `Iterator`
2558   trait itself][ie].
2559 * Several traits that implement Rust's conventions for type
2560   conversions, `AsMut`, `AsRef`, `From`, and `Into` have been
2561   [centralized in the `std::convert` module][con].
2562 * The `FromError` trait [was removed in favor of `From`][fe].
2563 * The basic sleep function [has moved to
2564   `std::thread::sleep_ms`][slp].
2565 * The `splitn` function now takes an `n` parameter that represents the
2566   number of items yielded by the returned iterator [instead of the
2567   number of 'splits'][spl].
2568 * [On Unix, all file descriptors are `CLOEXEC` by default][clo].
2569 * [Derived implementations of `PartialOrd` now order enums according
2570   to their explicitly-assigned discriminants][po].
2571 * [Methods for searching strings are generic over `Pattern`s][pat],
2572   implemented presently by `&char`, `&str`, `FnMut(char) -> bool` and
2573   some others.
2574 * [In method resolution, object methods are resolved before inherent
2575   methods][meth].
2576 * [`String::from_str` has been deprecated in favor of the `From` impl,
2577   `String::from`][sf].
2578 * [`io::Error` implements `Sync`][ios].
2579 * [The `words` method on `&str` has been replaced with
2580   `split_whitespace`][sw], to avoid answering the tricky question, 'what is
2581   a word?'
2582 * The new path and IO modules are complete and `#[stable]`. This
2583   was the major library focus for this cycle.
2584 * The path API was [revised][path-normalize] to normalize `.`,
2585   adjusting the tradeoffs in favor of the most common usage.
2586 * A large number of remaining APIs in `std` were also stabilized
2587   during this cycle; about 75% of the non-deprecated API surface
2588   is now stable.
2589 * The new [string pattern API][string-pattern] landed, which makes
2590   the string slice API much more internally consistent and flexible.
2591 * A new set of [generic conversion traits][conversion] replaced
2592   many existing ad hoc traits.
2593 * Generic numeric traits were [completely removed][num-traits]. This
2594   was made possible thanks to inherent methods for primitive types,
2595   and the removal gives maximal flexibility for designing a numeric
2596   hierarchy in the future.
2597 * The `Fn` traits are now related via [inheritance][fn-inherit]
2598   and provide ergonomic [blanket implementations][fn-blanket].
2599 * The `Index` and `IndexMut` traits were changed to
2600   [take the index by value][index-value], enabling code like
2601   `hash_map["string"]` to work.
2602 * `Copy` now [inherits][copy-clone] from `Clone`, meaning that all
2603   `Copy` data is known to be `Clone` as well.
2604
2605 Misc
2606 ----
2607
2608 * Many errors now have extended explanations that can be accessed with
2609   the `--explain` flag to `rustc`.
2610 * Many new examples have been added to the standard library
2611   documentation.
2612 * rustdoc has received a number of improvements focused on completion
2613   and polish.
2614 * Metadata was tuned, shrinking binaries [by 27%][metadata-shrink].
2615 * Much headway was made on ecosystem-wide CI, making it possible
2616   to [compare builds for breakage][ci-compare].
2617
2618
2619 [crates.io]: http://crates.io
2620 [clo]: https://github.com/rust-lang/rust/pull/24034
2621 [coh]: https://github.com/rust-lang/rfcs/blob/master/text/1023-rebalancing-coherence.md
2622 [con]: https://github.com/rust-lang/rust/pull/23875
2623 [cr]: https://github.com/rust-lang/rust/pull/23419
2624 [fe]: https://github.com/rust-lang/rust/pull/23879
2625 [ie]: https://github.com/rust-lang/rust/pull/23300
2626 [inv]: https://github.com/rust-lang/rust/pull/23938
2627 [ios]: https://github.com/rust-lang/rust/pull/24133
2628 [lex]: https://github.com/rust-lang/rfcs/blob/master/text/0879-small-base-lexing.md
2629 [lt]: https://github.com/rust-lang/rust/pull/24057
2630 [meth]: https://github.com/rust-lang/rust/pull/24056
2631 [pat]: https://github.com/rust-lang/rfcs/blob/master/text/0528-string-patterns.md
2632 [po]: https://github.com/rust-lang/rust/pull/24270
2633 [sf]: https://github.com/rust-lang/rust/pull/24517
2634 [slp]: https://github.com/rust-lang/rust/pull/23949
2635 [spl]: https://github.com/rust-lang/rfcs/blob/master/text/0979-align-splitn-with-other-languages.md
2636 [sw]: https://github.com/rust-lang/rfcs/blob/master/text/1054-str-words.md
2637 [th]: https://github.com/rust-lang/rfcs/blob/master/text/0909-move-thread-local-to-std-thread.md
2638 [send-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0458-send-improvements.md
2639 [moar-ufcs]: https://github.com/rust-lang/rust/pull/22172
2640 [prim-inherent]: https://github.com/rust-lang/rust/pull/23104
2641 [overflow]: https://github.com/rust-lang/rfcs/blob/master/text/0560-integer-overflow.md
2642 [metadata-shrink]: https://github.com/rust-lang/rust/pull/22971
2643 [self-sized]: https://github.com/rust-lang/rust/pull/22301
2644 [assoc-where]: https://github.com/rust-lang/rust/pull/22512
2645 [string-pattern]: https://github.com/rust-lang/rust/pull/22466
2646 [oibit-final]: https://github.com/rust-lang/rust/pull/21689
2647 [reflect]: https://github.com/rust-lang/rust/pull/23712
2648 [conversion]: https://github.com/rust-lang/rfcs/pull/529
2649 [num-traits]: https://github.com/rust-lang/rust/pull/23549
2650 [index-value]: https://github.com/rust-lang/rust/pull/23601
2651 [dropck]: https://github.com/rust-lang/rfcs/pull/769
2652 [ci-compare]: https://gist.github.com/brson/a30a77836fbec057cbee
2653 [fn-inherit]: https://github.com/rust-lang/rust/pull/23282
2654 [fn-blanket]: https://github.com/rust-lang/rust/pull/23895
2655 [copy-clone]: https://github.com/rust-lang/rust/pull/23860
2656 [path-normalize]: https://github.com/rust-lang/rust/pull/23229
2657
2658
2659 Version 1.0.0-alpha.2 (2015-02-20)
2660 =====================================
2661
2662 * ~1300 changes, numerous bugfixes
2663
2664 * Highlights
2665
2666     * The various I/O modules were [overhauled][io-rfc] to reduce
2667       unnecessary abstractions and provide better interoperation with
2668       the underlying platform. The old `io` module remains temporarily
2669       at `std::old_io`.
2670     * The standard library now [participates in feature gating][feat],
2671       so use of unstable libraries now requires a `#![feature(...)]`
2672       attribute. The impact of this change is [described on the
2673       forum][feat-forum]. [RFC][feat-rfc].
2674
2675 * Language
2676
2677     * `for` loops [now operate on the `IntoIterator` trait][into],
2678       which eliminates the need to call `.iter()`, etc. to iterate
2679       over collections. There are some new subtleties to remember
2680       though regarding what sort of iterators various types yield, in
2681       particular that `for foo in bar { }` yields values from a move
2682       iterator, destroying the original collection. [RFC][into-rfc].
2683     * Objects now have [default lifetime bounds][obj], so you don't
2684       have to write `Box<Trait+'static>` when you don't care about
2685       storing references. [RFC][obj-rfc].
2686     * In types that implement `Drop`, [lifetimes must outlive the
2687       value][drop]. This will soon make it possible to safely
2688       implement `Drop` for types where `#[unsafe_destructor]` is now
2689       required. Read the [gorgeous RFC][drop-rfc] for details.
2690     * The fully qualified <T as Trait>::X syntax lets you set the Self
2691       type for a trait method or associated type. [RFC][ufcs-rfc].
2692     * References to types that implement `Deref<U>` now [automatically
2693       coerce to references][deref] to the dereferenced type `U`,
2694       e.g. `&T where T: Deref<U>` automatically coerces to `&U`. This
2695       should eliminate many unsightly uses of `&*`, as when converting
2696       from references to vectors into references to
2697       slices. [RFC][deref-rfc].
2698     * The explicit [closure kind syntax][close] (`|&:|`, `|&mut:|`,
2699       `|:|`) is obsolete and closure kind is inferred from context.
2700     * [`Self` is a keyword][Self].
2701
2702 * Libraries
2703
2704     * The `Show` and `String` formatting traits [have been
2705       renamed][fmt] to `Debug` and `Display` to more clearly reflect
2706       their related purposes. Automatically getting a string
2707       conversion to use with `format!("{:?}", something_to_debug)` is
2708       now written `#[derive(Debug)]`.
2709     * Abstract [OS-specific string types][osstr], `std::ff::{OsString,
2710       OsStr}`, provide strings in platform-specific encodings for easier
2711       interop with system APIs. [RFC][osstr-rfc].
2712     * The `boxed::into_raw` and `Box::from_raw` functions [convert
2713       between `Box<T>` and `*mut T`][boxraw], a common pattern for
2714       creating raw pointers.
2715
2716 * Tooling
2717
2718     * Certain long error messages of the form 'expected foo found bar'
2719       are now [split neatly across multiple
2720       lines][multiline]. Examples in the PR.
2721     * On Unix Rust can be [uninstalled][un] by running
2722       `/usr/local/lib/rustlib/uninstall.sh`.
2723     * The `#[rustc_on_unimplemented]` attribute, requiring the
2724       'on_unimplemented' feature, lets rustc [display custom error
2725       messages when a trait is expected to be implemented for a type
2726       but is not][onun].
2727
2728 * Misc
2729
2730     * Rust is tested against a [LALR grammar][lalr], which parses
2731       almost all the Rust files that rustc does.
2732
2733 [boxraw]: https://github.com/rust-lang/rust/pull/21318
2734 [close]: https://github.com/rust-lang/rust/pull/21843
2735 [deref]: https://github.com/rust-lang/rust/pull/21351
2736 [deref-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0241-deref-conversions.md
2737 [drop]: https://github.com/rust-lang/rust/pull/21972
2738 [drop-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0769-sound-generic-drop.md
2739 [feat]: https://github.com/rust-lang/rust/pull/21248
2740 [feat-forum]: https://users.rust-lang.org/t/psa-important-info-about-rustcs-new-feature-staging/82/5
2741 [feat-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0507-release-channels.md
2742 [fmt]: https://github.com/rust-lang/rust/pull/21457
2743 [into]: https://github.com/rust-lang/rust/pull/20790
2744 [into-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0235-collections-conventions.md#intoiterator-and-iterable
2745 [io-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0517-io-os-reform.md
2746 [lalr]: https://github.com/rust-lang/rust/pull/21452
2747 [multiline]: https://github.com/rust-lang/rust/pull/19870
2748 [obj]: https://github.com/rust-lang/rust/pull/22230
2749 [obj-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0599-default-object-bound.md
2750 [onun]: https://github.com/rust-lang/rust/pull/20889
2751 [osstr]: https://github.com/rust-lang/rust/pull/21488
2752 [osstr-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0517-io-os-reform.md
2753 [Self]: https://github.com/rust-lang/rust/pull/22158
2754 [ufcs-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0132-ufcs.md
2755 [un]: https://github.com/rust-lang/rust/pull/22256
2756
2757
2758 Version 1.0.0-alpha (2015-01-09)
2759 ==================================
2760
2761   * ~2400 changes, numerous bugfixes
2762
2763   * Highlights
2764
2765     * The language itself is considered feature complete for 1.0,
2766       though there will be many usability improvements and bugfixes
2767       before the final release.
2768     * Nearly 50% of the public API surface of the standard library has
2769       been declared 'stable'. Those interfaces are unlikely to change
2770       before 1.0.
2771     * The long-running debate over integer types has been
2772       [settled][ints]: Rust will ship with types named `isize` and
2773       `usize`, rather than `int` and `uint`, for pointer-sized
2774       integers. Guidelines will be rolled out during the alpha cycle.
2775     * Most crates that are not `std` have been moved out of the Rust
2776       distribution into the Cargo ecosystem so they can evolve
2777       separately and don't need to be stabilized as quickly, including
2778       'time', 'getopts', 'num', 'regex', and 'term'.
2779     * Documentation continues to be expanded with more API coverage, more
2780       examples, and more in-depth explanations. The guides have been
2781       consolidated into [The Rust Programming Language][trpl].
2782     * "[Rust By Example][rbe]" is now maintained by the Rust team.
2783     * All official Rust binary installers now come with [Cargo], the
2784       Rust package manager.
2785
2786 * Language
2787
2788     * Closures have been [completely redesigned][unboxed] to be
2789       implemented in terms of traits, can now be used as generic type
2790       bounds and thus monomorphized and inlined, or via an opaque
2791       pointer (boxed) as in the old system. The new system is often
2792       referred to as 'unboxed' closures.
2793     * Traits now support [associated types][assoc], allowing families
2794       of related types to be defined together and used generically in
2795       powerful ways.
2796     * Enum variants are [namespaced by their type names][enum].
2797     * [`where` clauses][where] provide a more versatile and attractive
2798       syntax for specifying generic bounds, though the previous syntax
2799       remains valid.
2800     * Rust again picks a [fallback][fb] (either i32 or f64) for uninferred
2801       numeric types.
2802     * Rust [no longer has a runtime][rt] of any description, and only
2803       supports OS threads, not green threads.
2804     * At long last, Rust has been overhauled for 'dynamically-sized
2805       types' ([DST]), which integrates 'fat pointers' (object types,
2806       arrays, and `str`) more deeply into the type system, making it
2807       more consistent.
2808     * Rust now has a general [range syntax][range], `i..j`, `i..`, and
2809       `..j` that produce range types and which, when combined with the
2810       `Index` operator and multidispatch, leads to a convenient slice
2811       notation, `[i..j]`.
2812     * The new range syntax revealed an ambiguity in the fixed-length
2813       array syntax, so now fixed length arrays [are written `[T;
2814       N]`][arrays].
2815     * The `Copy` trait is no longer implemented automatically. Unsafe
2816       pointers no longer implement `Sync` and `Send` so types
2817       containing them don't automatically either. `Sync` and `Send`
2818       are now 'unsafe traits' so one can "forcibly" implement them via
2819       `unsafe impl` if a type confirms to the requirements for them
2820       even though the internals do not (e.g. structs containing unsafe
2821       pointers like `Arc`). These changes are intended to prevent some
2822       footguns and are collectively known as [opt-in built-in
2823       traits][oibit] (though `Sync` and `Send` will soon become pure
2824       library types unknown to the compiler).
2825     * Operator traits now take their operands [by value][ops], and
2826       comparison traits can use multidispatch to compare one type
2827       against multiple other types, allowing e.g. `String` to be
2828       compared with `&str`.
2829     * `if let` and `while let` are no longer feature-gated.
2830     * Rust has adopted a more [uniform syntax for escaping unicode
2831       characters][unicode].
2832     * `macro_rules!` [has been declared stable][mac]. Though it is a
2833       flawed system it is sufficiently popular that it must be usable
2834       for 1.0. Effort has gone into [future-proofing][mac-future] it
2835       in ways that will allow other macro systems to be developed in
2836       parallel, and won't otherwise impact the evolution of the
2837       language.
2838     * The prelude has been [pared back significantly][prelude] such
2839       that it is the minimum necessary to support the most pervasive
2840       code patterns, and through [generalized where clauses][where]
2841       many of the prelude extension traits have been consolidated.
2842     * Rust's rudimentary reflection [has been removed][refl], as it
2843       incurred too much code generation for little benefit.
2844     * [Struct variants][structvars] are no longer feature-gated.
2845     * Trait bounds can be [polymorphic over lifetimes][hrtb]. Also
2846       known as 'higher-ranked trait bounds', this crucially allows
2847       unboxed closures to work.
2848     * Macros invocations surrounded by parens or square brackets and
2849       not terminated by a semicolon are [parsed as
2850       expressions][macros], which makes expressions like `vec![1i32,
2851       2, 3].len()` work as expected.
2852     * Trait objects now implement their traits automatically, and
2853       traits that can be coerced to objects now must be [object
2854       safe][objsafe].
2855     * Automatically deriving traits is now done with `#[derive(...)]`
2856       not `#[deriving(...)]` for [consistency with other naming
2857       conventions][derive].
2858     * Importing the containing module or enum at the same time as
2859       items or variants they contain is [now done with `self` instead
2860       of `mod`][self], as in use `foo::{self, bar}`
2861     * Glob imports are no longer feature-gated.
2862     * The `box` operator and `box` patterns have been feature-gated
2863       pending a redesign. For now unique boxes should be allocated
2864       like other containers, with `Box::new`.
2865
2866 * Libraries
2867
2868     * A [series][coll1] of [efforts][coll2] to establish
2869       [conventions][coll3] for collections types has resulted in API
2870       improvements throughout the standard library.
2871     * New [APIs for error handling][err] provide ergonomic interop
2872       between error types, and [new conventions][err-conv] describe
2873       more clearly the recommended error handling strategies in Rust.
2874     * The `fail!` macro has been renamed to [`panic!`][panic] so that
2875       it is easier to discuss failure in the context of error handling
2876       without making clarifications as to whether you are referring to
2877       the 'fail' macro or failure more generally.
2878     * On Linux, `OsRng` prefers the new, more reliable `getrandom`
2879       syscall when available.
2880     * The 'serialize' crate has been renamed 'rustc-serialize' and
2881       moved out of the distribution to Cargo. Although it is widely
2882       used now, it is expected to be superseded in the near future.
2883     * The `Show` formatter, typically implemented with
2884       `#[derive(Show)]` is [now requested with the `{:?}`
2885       specifier][show] and is intended for use by all types, for uses
2886       such as `println!` debugging. The new `String` formatter must be
2887       implemented by hand, uses the `{}` specifier, and is intended
2888       for full-fidelity conversions of things that can logically be
2889       represented as strings.
2890
2891 * Tooling
2892
2893     * [Flexible target specification][flex] allows rustc's code
2894       generation to be configured to support otherwise-unsupported
2895       platforms.
2896     * Rust comes with rust-gdb and rust-lldb scripts that launch their
2897       respective debuggers with Rust-appropriate pretty-printing.
2898     * The Windows installation of Rust is distributed with the the
2899       MinGW components currently required to link binaries on that
2900       platform.
2901
2902 * Misc
2903
2904     * Nullable enum optimizations have been extended to more types so
2905       that e.g. `Option<Vec<T>>` and `Option<String>` take up no more
2906       space than the inner types themselves.
2907     * Work has begun on supporting AArch64.
2908
2909 [Cargo]: https://crates.io
2910 [unboxed]: http://smallcultfollowing.com/babysteps/blog/2014/11/26/purging-proc/
2911 [enum]: https://github.com/rust-lang/rfcs/blob/master/text/0390-enum-namespacing.md
2912 [flex]: https://github.com/rust-lang/rfcs/blob/master/text/0131-target-specification.md
2913 [err]: https://github.com/rust-lang/rfcs/blob/master/text/0201-error-chaining.md
2914 [err-conv]: https://github.com/rust-lang/rfcs/blob/master/text/0236-error-conventions.md
2915 [rt]: https://github.com/rust-lang/rfcs/blob/master/text/0230-remove-runtime.md
2916 [mac]: https://github.com/rust-lang/rfcs/blob/master/text/0453-macro-reform.md
2917 [mac-future]: https://github.com/rust-lang/rfcs/pull/550
2918 [DST]: http://smallcultfollowing.com/babysteps/blog/2014/01/05/dst-take-5/
2919 [coll1]: https://github.com/rust-lang/rfcs/blob/master/text/0235-collections-conventions.md
2920 [coll2]: https://github.com/rust-lang/rfcs/blob/master/text/0509-collections-reform-part-2.md
2921 [coll3]: https://github.com/rust-lang/rfcs/blob/master/text/0216-collection-views.md
2922 [ops]: https://github.com/rust-lang/rfcs/blob/master/text/0439-cmp-ops-reform.md
2923 [prelude]: https://github.com/rust-lang/rfcs/blob/master/text/0503-prelude-stabilization.md
2924 [where]: https://github.com/rust-lang/rfcs/blob/master/text/0135-where.md
2925 [refl]: https://github.com/rust-lang/rfcs/blob/master/text/0379-remove-reflection.md
2926 [panic]: https://github.com/rust-lang/rfcs/blob/master/text/0221-panic.md
2927 [structvars]: https://github.com/rust-lang/rfcs/blob/master/text/0418-struct-variants.md
2928 [hrtb]: https://github.com/rust-lang/rfcs/blob/master/text/0387-higher-ranked-trait-bounds.md
2929 [unicode]: https://github.com/rust-lang/rfcs/blob/master/text/0446-es6-unicode-escapes.md
2930 [oibit]: https://github.com/rust-lang/rfcs/blob/master/text/0019-opt-in-builtin-traits.md
2931 [macros]: https://github.com/rust-lang/rfcs/blob/master/text/0378-expr-macros.md
2932 [range]: https://github.com/rust-lang/rfcs/blob/master/text/0439-cmp-ops-reform.md#indexing-and-slicing
2933 [arrays]: https://github.com/rust-lang/rfcs/blob/master/text/0520-new-array-repeat-syntax.md
2934 [show]: https://github.com/rust-lang/rfcs/blob/master/text/0504-show-stabilization.md
2935 [derive]: https://github.com/rust-lang/rfcs/blob/master/text/0534-deriving2derive.md
2936 [self]: https://github.com/rust-lang/rfcs/blob/master/text/0532-self-in-use.md
2937 [fb]: https://github.com/rust-lang/rfcs/blob/master/text/0212-restore-int-fallback.md
2938 [objsafe]: https://github.com/rust-lang/rfcs/blob/master/text/0255-object-safety.md
2939 [assoc]: https://github.com/rust-lang/rfcs/blob/master/text/0195-associated-items.md
2940 [ints]: https://github.com/rust-lang/rfcs/pull/544#issuecomment-68760871
2941 [trpl]: https://doc.rust-lang.org/book/index.html
2942 [rbe]: http://rustbyexample.com/
2943
2944
2945 Version 0.12.0 (2014-10-09)
2946 =============================
2947
2948   * ~1900 changes, numerous bugfixes
2949
2950   * Highlights
2951
2952     * The introductory documentation (now called The Rust Guide) has
2953       been completely rewritten, as have a number of supplementary
2954       guides.
2955     * Rust's package manager, Cargo, continues to improve and is
2956       sometimes considered to be quite awesome.
2957     * Many API's in `std` have been reviewed and updated for
2958       consistency with the in-development Rust coding
2959       guidelines. The standard library documentation tracks
2960       stabilization progress.
2961     * Minor libraries have been moved out-of-tree to the rust-lang org
2962       on GitHub: uuid, semver, glob, num, hexfloat, fourcc. They can
2963       be installed with Cargo.
2964     * Lifetime elision allows lifetime annotations to be left off of
2965       function declarations in many common scenarios.
2966     * Rust now works on 64-bit Windows.
2967
2968   * Language
2969     * Indexing can be overloaded with the `Index` and `IndexMut`
2970       traits.
2971     * The `if let` construct takes a branch only if the `let` pattern
2972       matches, currently behind the 'if_let' feature gate.
2973     * 'where clauses', a more flexible syntax for specifying trait
2974       bounds that is more aesthetic, have been added for traits and
2975       free functions. Where clauses will in the future make it
2976       possible to constrain associated types, which would be
2977       impossible with the existing syntax.
2978     * A new slicing syntax (e.g. `[0..4]`) has been introduced behind
2979       the 'slicing_syntax' feature gate, and can be overloaded with
2980       the `Slice` or `SliceMut` traits.
2981     * The syntax for matching of sub-slices has been changed to use a
2982       postfix `..` instead of prefix (.e.g. `[a, b, c..]`), for
2983       consistency with other uses of `..` and to future-proof
2984       potential additional uses of the syntax.
2985     * The syntax for matching inclusive ranges in patterns has changed
2986       from `0..3` to `0...4` to be consistent with the exclusive range
2987       syntax for slicing.
2988     * Matching of sub-slices in non-tail positions (e.g.  `[a.., b,
2989       c]`) has been put behind the 'advanced_slice_patterns' feature
2990       gate and may be removed in the future.
2991     * Components of tuples and tuple structs can be extracted using
2992       the `value.0` syntax, currently behind the `tuple_indexing`
2993       feature gate.
2994     * The `#[crate_id]` attribute is no longer supported; versioning
2995       is handled by the package manager.
2996     * Renaming crate imports are now written `extern crate foo as bar`
2997       instead of `extern crate bar = foo`.
2998     * Renaming use statements are now written `use foo as bar` instead
2999       of `use bar = foo`.
3000     * `let` and `match` bindings and argument names in macros are now
3001       hygienic.
3002     * The new, more efficient, closure types ('unboxed closures') have
3003       been added under a feature gate, 'unboxed_closures'. These will
3004       soon replace the existing closure types, once higher-ranked
3005       trait lifetimes are added to the language.
3006     * `move` has been added as a keyword, for indicating closures
3007       that capture by value.
3008     * Mutation and assignment is no longer allowed in pattern guards.
3009     * Generic structs and enums can now have trait bounds.
3010     * The `Share` trait is now called `Sync` to free up the term
3011       'shared' to refer to 'shared reference' (the default reference
3012       type.
3013     * Dynamically-sized types have been mostly implemented,
3014       unifying the behavior of fat-pointer types with the rest of the
3015       type system.
3016     * As part of dynamically-sized types, the `Sized` trait has been
3017       introduced, which qualifying types implement by default, and
3018       which type parameters expect by default. To specify that a type
3019       parameter does not need to be sized, write `<Sized? T>`. Most
3020       types are `Sized`, notable exceptions being unsized arrays
3021       (`[T]`) and trait types.
3022     * Closures can return `!`, as in `|| -> !` or `proc() -> !`.
3023     * Lifetime bounds can now be applied to type parameters and object
3024       types.
3025     * The old, reference counted GC type, `Gc<T>` which was once
3026       denoted by the `@` sigil, has finally been removed. GC will be
3027       revisited in the future.
3028
3029   * Libraries
3030     * Library documentation has been improved for a number of modules.
3031     * Bit-vectors, collections::bitv has been modernized.
3032     * The url crate is deprecated in favor of
3033       http://github.com/servo/rust-url, which can be installed with
3034       Cargo.
3035     * Most I/O stream types can be cloned and subsequently closed from
3036       a different thread.
3037     * A `std::time::Duration` type has been added for use in I/O
3038       methods that rely on timers, as well as in the 'time' crate's
3039       `Timespec` arithmetic.
3040     * The runtime I/O abstraction layer that enabled the green thread
3041       scheduler to do non-thread-blocking I/O has been removed, along
3042       with the libuv-based implementation employed by the green thread
3043       scheduler. This will greatly simplify the future I/O work.
3044     * `collections::btree` has been rewritten to have a more
3045       idiomatic and efficient design.
3046
3047   * Tooling
3048     * rustdoc output now indicates the stability levels of API's.
3049     * The `--crate-name` flag can specify the name of the crate
3050       being compiled, like `#[crate_name]`.
3051     * The `-C metadata` specifies additional metadata to hash into
3052       symbol names, and `-C extra-filename` specifies additional
3053       information to put into the output filename, for use by the
3054       package manager for versioning.
3055     * debug info generation has continued to improve and should be
3056       more reliable under both gdb and lldb.
3057     * rustc has experimental support for compiling in parallel
3058       using the `-C codegen-units` flag.
3059     * rustc no longer encodes rpath information into binaries by
3060       default.
3061
3062   * Misc
3063     * Stack usage has been optimized with LLVM lifetime annotations.
3064     * Official Rust binaries on Linux are more compatible with older
3065       kernels and distributions, built on CentOS 5.10.
3066
3067
3068 Version 0.11.0 (2014-07-02)
3069 ==========================
3070
3071   * ~1700 changes, numerous bugfixes
3072
3073   * Language
3074     * ~[T] has been removed from the language. This type is superseded by
3075       the Vec<T> type.
3076     * ~str has been removed from the language. This type is superseded by
3077       the String type.
3078     * ~T has been removed from the language. This type is superseded by the
3079       Box<T> type.
3080     * @T has been removed from the language. This type is superseded by the
3081       standard library's std::gc::Gc<T> type.
3082     * Struct fields are now all private by default.
3083     * Vector indices and shift amounts are both required to be a `uint`
3084       instead of any integral type.
3085     * Byte character, byte string, and raw byte string literals are now all
3086       supported by prefixing the normal literal with a `b`.
3087     * Multiple ABIs are no longer allowed in an ABI string
3088     * The syntax for lifetimes on closures/procedures has been tweaked
3089       slightly: `<'a>|A, B|: 'b + K -> T`
3090     * Floating point modulus has been removed from the language; however it
3091       is still provided by a library implementation.
3092     * Private enum variants are now disallowed.
3093     * The `priv` keyword has been removed from the language.
3094     * A closure can no longer be invoked through a &-pointer.
3095     * The `use foo, bar, baz;` syntax has been removed from the language.
3096     * The transmute intrinsic no longer works on type parameters.
3097     * Statics now allow blocks/items in their definition.
3098     * Trait bounds are separated from objects with + instead of : now.
3099     * Objects can no longer be read while they are mutably borrowed.
3100     * The address of a static is now marked as insignificant unless the
3101       #[inline(never)] attribute is placed it.
3102     * The #[unsafe_destructor] attribute is now behind a feature gate.
3103     * Struct literals are no longer allowed in ambiguous positions such as
3104       if, while, match, and for..in.
3105     * Declaration of lang items and intrinsics are now feature-gated by
3106       default.
3107     * Integral literals no longer default to `int`, and floating point
3108       literals no longer default to `f64`. Literals must be suffixed with an
3109       appropriate type if inference cannot determine the type of the
3110       literal.
3111     * The Box<T> type is no longer implicitly borrowed to &mut T.
3112     * Procedures are now required to not capture borrowed references.
3113
3114   * Libraries
3115     * The standard library is now a "facade" over a number of underlying
3116       libraries. This means that development on the standard library should
3117       be speeder due to smaller crates, as well as a clearer line between
3118       all dependencies.
3119     * A new library, libcore, lives under the standard library's facade
3120       which is Rust's "0-assumption" library, suitable for embedded and
3121       kernel development for example.
3122     * A regex crate has been added to the standard distribution. This crate
3123       includes statically compiled regular expressions.
3124     * The unwrap/unwrap_err methods on Result require a Show bound for
3125       better error messages.
3126     * The return types of the std::comm primitives have been centralized
3127       around the Result type.
3128     * A number of I/O primitives have gained the ability to time out their
3129       operations.
3130     * A number of I/O primitives have gained the ability to close their
3131       reading/writing halves to cancel pending operations.
3132     * Reverse iterator methods have been removed in favor of `rev()` on
3133       their forward-iteration counterparts.
3134     * A bitflags! macro has been added to enable easy interop with C and
3135       management of bit flags.
3136     * A debug_assert! macro is now provided which is disabled when
3137       `--cfg ndebug` is passed to the compiler.
3138     * A graphviz crate has been added for creating .dot files.
3139     * The std::cast module has been migrated into std::mem.
3140     * The std::local_data api has been migrated from freestanding functions
3141       to being based on methods.
3142     * The Pod trait has been renamed to Copy.
3143     * jemalloc has been added as the default allocator for types.
3144     * The API for allocating memory has been changed to use proper alignment
3145       and sized deallocation
3146     * Connecting a TcpStream or binding a TcpListener is now based on a
3147       string address and a u16 port. This allows connecting to a hostname as
3148       opposed to an IP.
3149     * The Reader trait now contains a core method, read_at_least(), which
3150       correctly handles many repeated 0-length reads.
3151     * The process-spawning API is now centered around a builder-style
3152       Command struct.
3153     * The :? printing qualifier has been moved from the standard library to
3154       an external libdebug crate.
3155     * Eq/Ord have been renamed to PartialEq/PartialOrd. TotalEq/TotalOrd
3156       have been renamed to Eq/Ord.
3157     * The select/plural methods have been removed from format!. The escapes
3158       for { and } have also changed from \{ and \} to {{ and }},
3159       respectively.
3160     * The TaskBuilder API has been re-worked to be a true builder, and
3161       extension traits for spawning native/green tasks have been added.
3162
3163   * Tooling
3164     * All breaking changes to the language or libraries now have their
3165       commit message annotated with `[breaking-change]` to allow for easy
3166       discovery of breaking changes.
3167     * The compiler will now try to suggest how to annotate lifetimes if a
3168       lifetime-related error occurs.
3169     * Debug info continues to be improved greatly with general bug fixes and
3170       better support for situations like link time optimization (LTO).
3171     * Usage of syntax extensions when cross-compiling has been fixed.
3172     * Functionality equivalent to GCC & Clang's -ffunction-sections,
3173       -fdata-sections and --gc-sections has been enabled by default
3174     * The compiler is now stricter about where it will load module files
3175       from when a module is declared via `mod foo;`.
3176     * The #[phase(syntax)] attribute has been renamed to #[phase(plugin)].
3177       Syntax extensions are now discovered via a "plugin registrar" type
3178       which will be extended in the future to other various plugins.
3179     * Lints have been restructured to allow for dynamically loadable lints.
3180     * A number of rustdoc improvements:
3181       * The HTML output has been visually redesigned.
3182       * Markdown is now powered by hoedown instead of sundown.
3183       * Searching heuristics have been greatly improved.
3184       * The search index has been reduced in size by a great amount.
3185       * Cross-crate documentation via `pub use` has been greatly improved.
3186       * Primitive types are now hyperlinked and documented.
3187     * Documentation has been moved from static.rust-lang.org/doc to
3188       doc.rust-lang.org
3189     * A new sandbox, play.rust-lang.org, is available for running and
3190       sharing rust code examples on-line.
3191     * Unused attributes are now more robustly warned about.
3192     * The dead_code lint now warns about unused struct fields.
3193     * Cross-compiling to iOS is now supported.
3194     * Cross-compiling to mipsel is now supported.
3195     * Stability attributes are now inherited by default and no longer apply
3196       to intra-crate usage, only inter-crate usage.
3197     * Error message related to non-exhaustive match expressions have been
3198       greatly improved.
3199
3200
3201 Version 0.10 (2014-04-03)
3202 =========================
3203
3204   * ~1500 changes, numerous bugfixes
3205
3206   * Language
3207     * A new RFC process is now in place for modifying the language.
3208     * Patterns with `@`-pointers have been removed from the language.
3209     * Patterns with unique vectors (`~[T]`) have been removed from the
3210       language.
3211     * Patterns with unique strings (`~str`) have been removed from the
3212       language.
3213     * `@str` has been removed from the language.
3214     * `@[T]` has been removed from the language.
3215     * `@self` has been removed from the language.
3216     * `@Trait` has been removed from the language.
3217     * Headers on `~` allocations which contain `@` boxes inside the type for
3218       reference counting have been removed.
3219     * The semantics around the lifetimes of temporary expressions have changed,
3220       see #3511 and #11585 for more information.
3221     * Cross-crate syntax extensions are now possible, but feature gated. See
3222       #11151 for more information. This includes both `macro_rules!` macros as
3223       well as syntax extensions such as `format!`.
3224     * New lint modes have been added, and older ones have been turned on to be
3225       warn-by-default.
3226       * Unnecessary parentheses
3227       * Uppercase statics
3228       * Camel Case types
3229       * Uppercase variables
3230       * Publicly visible private types
3231       * `#[deriving]` with raw pointers
3232     * Unsafe functions can no longer be coerced to closures.
3233     * Various obscure macros such as `log_syntax!` are now behind feature gates.
3234     * The `#[simd]` attribute is now behind a feature gate.
3235     * Visibility is no longer allowed on `extern crate` statements, and
3236       unnecessary visibility (`priv`) is no longer allowed on `use` statements.
3237     * Trailing commas are now allowed in argument lists and tuple patterns.
3238     * The `do` keyword has been removed, it is now a reserved keyword.
3239     * Default type parameters have been implemented, but are feature gated.
3240     * Borrowed variables through captures in closures are now considered soundly.
3241     * `extern mod` is now `extern crate`
3242     * The `Freeze` trait has been removed.
3243     * The `Share` trait has been added for types that can be shared among
3244       threads.
3245     * Labels in macros are now hygienic.
3246     * Expression/statement macro invocations can be delimited with `{}` now.
3247     * Treatment of types allowed in `static mut` locations has been tweaked.
3248     * The `*` and `.` operators are now overloadable through the `Deref` and
3249       `DerefMut` traits.
3250     * `~Trait` and `proc` no longer have `Send` bounds by default.
3251     * Partial type hints are now supported with the `_` type marker.
3252     * An `Unsafe` type was introduced for interior mutability. It is now
3253       considered undefined to transmute from `&T` to `&mut T` without using the
3254       `Unsafe` type.
3255     * The #[linkage] attribute was implemented for extern statics/functions.
3256     * The inner attribute syntax has changed from `#[foo];` to `#![foo]`.
3257     * `Pod` was renamed to `Copy`.
3258
3259   * Libraries
3260     * The `libextra` library has been removed. It has now been decomposed into
3261       component libraries with smaller and more focused nuggets of
3262       functionality. The full list of libraries can be found on the
3263       documentation index page.
3264     * std: `std::condition` has been removed. All I/O errors are now propagated
3265       through the `Result` type. In order to assist with error handling, a
3266       `try!` macro for unwrapping errors with an early return and a lint for
3267       unused results has been added. See #12039 for more information.
3268     * std: The `vec` module has been renamed to `slice`.
3269     * std: A new vector type, `Vec<T>`, has been added in preparation for DST.
3270       This will become the only growable vector in the future.
3271     * std: `std::io` now has more public-reexports. Types such as `BufferedReader`
3272       are now found at `std::io::BufferedReader` instead of
3273       `std::io::buffered::BufferedReader`.
3274     * std: `print` and `println` are no longer in the prelude, the `print!` and
3275       `println!` macros are intended to be used instead.
3276     * std: `Rc` now has a `Weak` pointer for breaking cycles, and it no longer
3277       attempts to statically prevent cycles.
3278     * std: The standard distribution is adopting the policy of pushing failure
3279       to the user rather than failing in libraries. Many functions (such as
3280       `slice::last()`) now return `Option<T>` instead of `T` + failing.
3281     * std: `fmt::Default` has been renamed to `fmt::Show`, and it now has a new
3282       deriving mode: `#[deriving(Show)]`.
3283     * std: `ToStr` is now implemented for all types implementing `Show`.
3284     * std: The formatting trait methods now take `&self` instead of `&T`
3285     * std: The `invert()` method on iterators has been renamed to `rev()`
3286     * std: `std::num` has seen a reduction in the genericity of its traits,
3287       consolidating functionality into a few core traits.
3288     * std: Backtraces are now printed on task failure if the environment
3289       variable `RUST_BACKTRACE` is present.
3290     * std: Naming conventions for iterators have been standardized. More details
3291       can be found on the wiki's style guide.
3292     * std: `eof()` has been removed from the `Reader` trait. Specific types may
3293       still implement the function.
3294     * std: Networking types are now cloneable to allow simultaneous reads/writes.
3295     * std: `assert_approx_eq!` has been removed
3296     * std: The `e` and `E` formatting specifiers for floats have been added to
3297       print them in exponential notation.
3298     * std: The `Times` trait has been removed
3299     * std: Indications of variance and opting out of builtin bounds is done
3300       through marker types in `std::kinds::marker` now
3301     * std: `hash` has been rewritten, `IterBytes` has been removed, and
3302       `#[deriving(Hash)]` is now possible.
3303     * std: `SharedChan` has been removed, `Sender` is now cloneable.
3304     * std: `Chan` and `Port` were renamed to `Sender` and `Receiver`.
3305     * std: `Chan::new` is now `channel()`.
3306     * std: A new synchronous channel type has been implemented.
3307     * std: A `select!` macro is now provided for selecting over `Receiver`s.
3308     * std: `hashmap` and `trie` have been moved to `libcollections`
3309     * std: `run` has been rolled into `io::process`
3310     * std: `assert_eq!` now uses `{}` instead of `{:?}`
3311     * std: The equality and comparison traits have seen some reorganization.
3312     * std: `rand` has moved to `librand`.
3313     * std: `to_{lower,upper}case` has been implemented for `char`.
3314     * std: Logging has been moved to `liblog`.
3315     * collections: `HashMap` has been rewritten for higher performance and less
3316       memory usage.
3317     * native: The default runtime is now `libnative`. If `libgreen` is desired,
3318       it can be booted manually. The runtime guide has more information and
3319       examples.
3320     * native: All I/O functionality except signals has been implemented.
3321     * green: Task spawning with `libgreen` has been optimized with stack caching
3322       and various trimming of code.
3323     * green: Tasks spawned by `libgreen` now have an unmapped guard page.
3324     * sync: The `extra::sync` module has been updated to modern rust (and moved
3325       to the `sync` library), tweaking and improving various interfaces while
3326       dropping redundant functionality.
3327     * sync: A new `Barrier` type has been added to the `sync` library.
3328     * sync: An efficient mutex for native and green tasks has been implemented.
3329     * serialize: The `base64` module has seen some improvement. It treats
3330       newlines better, has non-string error values, and has seen general
3331       cleanup.
3332     * fourcc: A `fourcc!` macro was introduced
3333     * hexfloat: A `hexfloat!` macro was implemented for specifying floats via a
3334       hexadecimal literal.
3335
3336   * Tooling
3337     * `rustpkg` has been deprecated and removed from the main repository. Its
3338       replacement, `cargo`, is under development.
3339     * Nightly builds of rust are now available
3340     * The memory usage of rustc has been improved many times throughout this
3341       release cycle.
3342     * The build process supports disabling rpath support for the rustc binary
3343       itself.
3344     * Code generation has improved in some cases, giving more information to the
3345       LLVM optimization passes to enable more extensive optimizations.
3346     * Debuginfo compatibility with lldb on OSX has been restored.
3347     * The master branch is now gated on an android bot, making building for
3348       android much more reliable.
3349     * Output flags have been centralized into one `--emit` flag.
3350     * Crate type flags have been centralized into one `--crate-type` flag.
3351     * Codegen flags have been consolidated behind a `-C` flag.
3352     * Linking against outdated crates now has improved error messages.
3353     * Error messages with lifetimes will often suggest how to annotate the
3354       function to fix the error.
3355     * Many more types are documented in the standard library, and new guides
3356       were written.
3357     * Many `rustdoc` improvements:
3358       * code blocks are syntax highlighted.
3359       * render standalone markdown files.
3360       * the --test flag tests all code blocks by default.
3361       * exported macros are displayed.
3362       * reexported types have their documentation inlined at the location of the
3363         first reexport.
3364       * search works across crates that have been rendered to the same output
3365         directory.
3366
3367
3368 Version 0.9 (2014-01-09)
3369 ==========================
3370
3371    * ~1800 changes, numerous bugfixes
3372
3373    * Language
3374       * The `float` type has been removed. Use `f32` or `f64` instead.
3375       * A new facility for enabling experimental features (feature gating) has
3376         been added, using the crate-level `#[feature(foo)]` attribute.
3377       * Managed boxes (@) are now behind a feature gate
3378         (`#[feature(managed_boxes)]`) in preparation for future removal. Use the
3379         standard library's `Gc` or `Rc` types instead.
3380       * `@mut` has been removed. Use `std::cell::{Cell, RefCell}` instead.
3381       * Jumping back to the top of a loop is now done with `continue` instead of
3382         `loop`.
3383       * Strings can no longer be mutated through index assignment.
3384       * Raw strings can be created via the basic `r"foo"` syntax or with matched
3385         hash delimiters, as in `r###"foo"###`.
3386       * `~fn` is now written `proc (args) -> retval { ... }` and may only be
3387         called once.
3388       * The `&fn` type is now written `|args| -> ret` to match the literal form.
3389       * `@fn`s have been removed.
3390       * `do` only works with procs in order to make it obvious what the cost
3391         of `do` is.
3392       * Single-element tuple-like structs can no longer be dereferenced to
3393         obtain the inner value. A more comprehensive solution for overloading
3394         the dereference operator will be provided in the future.
3395       * The `#[link(...)]` attribute has been replaced with
3396         `#[crate_id = "name#vers"]`.
3397       * Empty `impl`s must be terminated with empty braces and may not be
3398         terminated with a semicolon.
3399       * Keywords are no longer allowed as lifetime names; the `self` lifetime
3400         no longer has any special meaning.
3401       * The old `fmt!` string formatting macro has been removed.
3402       * `printf!` and `printfln!` (old-style formatting) removed in favor of
3403         `print!` and `println!`.
3404       * `mut` works in patterns now, as in `let (mut x, y) = (1, 2);`.
3405       * The `extern mod foo (name = "bar")` syntax has been removed. Use
3406         `extern mod foo = "bar"` instead.
3407       * New reserved keywords: `alignof`, `offsetof`, `sizeof`.
3408       * Macros can have attributes.
3409       * Macros can expand to items with attributes.
3410       * Macros can expand to multiple items.
3411       * The `asm!` macro is feature-gated (`#[feature(asm)]`).
3412       * Comments may be nested.
3413       * Values automatically coerce to trait objects they implement, without
3414         an explicit `as`.
3415       * Enum discriminants are no longer an entire word but as small as needed to
3416         contain all the variants. The `repr` attribute can be used to override
3417         the discriminant size, as in `#[repr(int)]` for integer-sized, and
3418         `#[repr(C)]` to match C enums.
3419       * Non-string literals are not allowed in attributes (they never worked).
3420       * The FFI now supports variadic functions.
3421       * Octal numeric literals, as in `0o7777`.
3422       * The `concat!` syntax extension performs compile-time string concatenation.
3423       * The `#[fixed_stack_segment]` and `#[rust_stack]` attributes have been
3424         removed as Rust no longer uses segmented stacks.
3425       * Non-ascii identifiers are feature-gated (`#[feature(non_ascii_idents)]`).
3426       * Ignoring all fields of an enum variant or tuple-struct is done with `..`,
3427         not `*`; ignoring remaining fields of a struct is also done with `..`,
3428         not `_`; ignoring a slice of a vector is done with `..`, not `.._`.
3429       * `rustc` supports the "win64" calling convention via `extern "win64"`.
3430       * `rustc` supports the "system" calling convention, which defaults to the
3431         preferred convention for the target platform, "stdcall" on 32-bit Windows,
3432         "C" elsewhere.
3433       * The `type_overflow` lint (default: warn) checks literals for overflow.
3434       * The `unsafe_block` lint (default: allow) checks for usage of `unsafe`.
3435       * The `attribute_usage` lint (default: warn) warns about unknown
3436         attributes.
3437       * The `unknown_features` lint (default: warn) warns about unknown
3438         feature gates.
3439       * The `dead_code` lint (default: warn) checks for dead code.
3440       * Rust libraries can be linked statically to one another
3441       * `#[link_args]` is behind the `link_args` feature gate.
3442       * Native libraries are now linked with `#[link(name = "foo")]`
3443       * Native libraries can be statically linked to a rust crate
3444         (`#[link(name = "foo", kind = "static")]`).
3445       * Native OS X frameworks are now officially supported
3446         (`#[link(name = "foo", kind = "framework")]`).
3447       * The `#[thread_local]` attribute creates thread-local (not task-local)
3448         variables. Currently behind the `thread_local` feature gate.
3449       * The `return` keyword may be used in closures.
3450       * Types that can be copied via a memcpy implement the `Pod` kind.
3451       * The `cfg` attribute can now be used on struct fields and enum variants.
3452
3453    * Libraries
3454       * std: The `option` and `result` API's have been overhauled to make them
3455         simpler, more consistent, and more composable.
3456       * std: The entire `std::io` module has been replaced with one that is
3457         more comprehensive and that properly interfaces with the underlying
3458         scheduler. File, TCP, UDP, Unix sockets, pipes, and timers are all
3459         implemented.
3460       * std: `io::util` contains a number of useful implementations of
3461         `Reader` and `Writer`, including `NullReader`, `NullWriter`,
3462         `ZeroReader`, `TeeReader`.
3463       * std: The reference counted pointer type `extra::rc` moved into std.
3464       * std: The `Gc` type in the `gc` module will replace `@` (it is currently
3465         just a wrapper around it).
3466       * std: The `Either` type has been removed.
3467       * std: `fmt::Default` can be implemented for any type to provide default
3468         formatting to the `format!` macro, as in `format!("{}", myfoo)`.
3469       * std: The `rand` API continues to be tweaked.
3470       * std: The `rust_begin_unwind` function, useful for inserting breakpoints
3471         on failure in gdb, is now named `rust_fail`.
3472       * std: The `each_key` and `each_value` methods on `HashMap` have been
3473         replaced by the `keys` and `values` iterators.
3474       * std: Functions dealing with type size and alignment have moved from the
3475         `sys` module to the `mem` module.
3476       * std: The `path` module was written and API changed.
3477       * std: `str::from_utf8` has been changed to cast instead of allocate.
3478       * std: `starts_with` and `ends_with` methods added to vectors via the
3479         `ImmutableEqVector` trait, which is in the prelude.
3480       * std: Vectors can be indexed with the `get_opt` method, which returns `None`
3481         if the index is out of bounds.
3482       * std: Task failure no longer propagates between tasks, as the model was
3483         complex, expensive, and incompatible with thread-based tasks.
3484       * std: The `Any` type can be used for dynamic typing.
3485       * std: `~Any` can be passed to the `fail!` macro and retrieved via
3486         `task::try`.
3487       * std: Methods that produce iterators generally do not have an `_iter`
3488         suffix now.
3489       * std: `cell::Cell` and `cell::RefCell` can be used to introduce mutability
3490         roots (mutable fields, etc.). Use instead of e.g. `@mut`.
3491       * std: `util::ignore` renamed to `prelude::drop`.
3492       * std: Slices have `sort` and `sort_by` methods via the `MutableVector`
3493         trait.
3494       * std: `vec::raw` has seen a lot of cleanup and API changes.
3495       * std: The standard library no longer includes any C++ code, and very
3496         minimal C, eliminating the dependency on libstdc++.
3497       * std: Runtime scheduling and I/O functionality has been factored out into
3498         extensible interfaces and is now implemented by two different crates:
3499         libnative, for native threading and I/O; and libgreen, for green threading
3500         and I/O. This paves the way for using the standard library in more limited
3501         embedded environments.
3502       * std: The `comm` module has been rewritten to be much faster, have a
3503         simpler, more consistent API, and to work for both native and green
3504         threading.
3505       * std: All libuv dependencies have been moved into the rustuv crate.
3506       * native: New implementations of runtime scheduling on top of OS threads.
3507       * native: New native implementations of TCP, UDP, file I/O, process spawning,
3508         and other I/O.
3509       * green: The green thread scheduler and message passing types are almost
3510         entirely lock-free.
3511       * extra: The `flatpipes` module had bitrotted and was removed.
3512       * extra: All crypto functions have been removed and Rust now has a policy of
3513         not reimplementing crypto in the standard library. In the future crypto
3514         will be provided by external crates with bindings to established libraries.
3515       * extra: `c_vec` has been modernized.
3516       * extra: The `sort` module has been removed. Use the `sort` method on
3517         mutable slices.
3518
3519    * Tooling
3520       * The `rust` and `rusti` commands have been removed, due to lack of
3521         maintenance.
3522       * `rustdoc` was completely rewritten.
3523       * `rustdoc` can test code examples in documentation.
3524       * `rustpkg` can test packages with the argument, 'test'.
3525       * `rustpkg` supports arbitrary dependencies, including C libraries.
3526       * `rustc`'s support for generating debug info is improved again.
3527       * `rustc` has better error reporting for unbalanced delimiters.
3528       * `rustc`'s JIT support was removed due to bitrot.
3529       * Executables and static libraries can be built with LTO (-Z lto)
3530       * `rustc` adds a `--dep-info` flag for communicating dependencies to
3531         build tools.
3532
3533
3534 Version 0.8 (2013-09-26)
3535 ============================
3536
3537    * ~2200 changes, numerous bugfixes
3538
3539    * Language
3540       * The `for` loop syntax has changed to work with the `Iterator` trait.
3541       * At long last, unwinding works on Windows.
3542       * Default methods are ready for use.
3543       * Many trait inheritance bugs fixed.
3544       * Owned and borrowed trait objects work more reliably.
3545       * `copy` is no longer a keyword. It has been replaced by the `Clone` trait.
3546       * rustc can omit emission of code for the `debug!` macro if it is passed
3547         `--cfg ndebug`
3548       * mod.rs is now "blessed". When loading `mod foo;`, rustc will now look
3549         for foo.rs, then foo/mod.rs, and will generate an error when both are
3550         present.
3551       * Strings no longer contain trailing nulls. The new `std::c_str` module
3552         provides new mechanisms for converting to C strings.
3553       * The type of foreign functions is now `extern "C" fn` instead of `*u8'.
3554       * The FFI has been overhauled such that foreign functions are called directly,
3555         instead of through a stack-switching wrapper.
3556       * Calling a foreign function must be done through a Rust function with the
3557         `#[fixed_stack_segment]` attribute.
3558       * The `externfn!` macro can be used to declare both a foreign function and
3559         a `#[fixed_stack_segment]` wrapper at once.
3560       * `pub` and `priv` modifiers on `extern` blocks are no longer parsed.
3561       * `unsafe` is no longer allowed on extern fns - they are all unsafe.
3562       * `priv` is disallowed everywhere except for struct fields and enum variants.
3563       * `&T` (besides `&'static T`) is no longer allowed in `@T`.
3564       * `ref` bindings in irrefutable patterns work correctly now.
3565       * `char` is now prevented from containing invalid code points.
3566       * Casting to `bool` is no longer allowed.
3567       * `\0` is now accepted as an escape in chars and strings.
3568       * `yield` is a reserved keyword.
3569       * `typeof` is a reserved keyword.
3570       * Crates may be imported by URL with `extern mod foo = "url";`.
3571       * Explicit enum discriminants may be given as uints as in `enum E { V = 0u }`
3572       * Static vectors can be initialized with repeating elements,
3573         e.g. `static foo: [u8, .. 100]: [0, .. 100];`.
3574       * Static structs can be initialized with functional record update,
3575         e.g. `static foo: Foo = Foo { a: 5, .. bar };`.
3576       * `cfg!` can be used to conditionally execute code based on the crate
3577         configuration, similarly to `#[cfg(...)]`.
3578       * The `unnecessary_qualification` lint detects unneeded module
3579         prefixes (default: allow).
3580       * Arithmetic operations have been implemented on the SIMD types in
3581         `std::unstable::simd`.
3582       * Exchange allocation headers were removed, reducing memory usage.
3583       * `format!` implements a completely new, extensible, and higher-performance
3584         string formatting system. It will replace `fmt!`.
3585       * `print!` and `println!` write formatted strings (using the `format!`
3586         extension) to stdout.
3587       * `write!` and `writeln!` write formatted strings (using the `format!`
3588         extension) to the new Writers in `std::rt::io`.
3589       * The library section in which a function or static is placed may
3590         be specified with `#[link_section = "..."]`.
3591       * The `proto!` syntax extension for defining bounded message protocols
3592         was removed.
3593       * `macro_rules!` is hygienic for `let` declarations.
3594       * The `#[export_name]` attribute specifies the name of a symbol.
3595       * `unreachable!` can be used to indicate unreachable code, and fails
3596         if executed.
3597
3598    * Libraries
3599       * std: Transitioned to the new runtime, written in Rust.
3600       * std: Added an experimental I/O library, `rt::io`, based on the new
3601         runtime.
3602       * std: A new generic `range` function was added to the prelude, replacing
3603         `uint::range` and friends.
3604       * std: `range_rev` no longer exists. Since range is an iterator it can be
3605         reversed with `range(lo, hi).invert()`.
3606       * std: The `chain` method on option renamed to `and_then`; `unwrap_or_default`
3607         renamed to `unwrap_or`.
3608       * std: The `iterator` module was renamed to `iter`.
3609       * std: Integral types now support the `checked_add`, `checked_sub`, and
3610         `checked_mul` operations for detecting overflow.
3611       * std: Many methods in `str`, `vec`, `option, `result` were renamed for
3612         consistency.
3613       * std: Methods are standardizing on conventions for casting methods:
3614         `to_foo` for copying, `into_foo` for moving, `as_foo` for temporary
3615         and cheap casts.
3616       * std: The `CString` type in `c_str` provides new ways to convert to and
3617         from C strings.
3618       * std: `DoubleEndedIterator` can yield elements in two directions.
3619       * std: The `mut_split` method on vectors partitions an `&mut [T]` into
3620         two splices.
3621       * std: `str::from_bytes` renamed to `str::from_utf8`.
3622       * std: `pop_opt` and `shift_opt` methods added to vectors.
3623       * std: The task-local data interface no longer uses @, and keys are
3624         no longer function pointers.
3625       * std: The `swap_unwrap` method of `Option` renamed to `take_unwrap`.
3626       * std: Added `SharedPort` to `comm`.
3627       * std: `Eq` has a default method for `ne`; only `eq` is required
3628         in implementations.
3629       * std: `Ord` has default methods for `le`, `gt` and `ge`; only `lt`
3630         is required in implementations.
3631       * std: `is_utf8` performance is improved, impacting many string functions.
3632       * std: `os::MemoryMap` provides cross-platform mmap.
3633       * std: `ptr::offset` is now unsafe, but also more optimized. Offsets that
3634         are not 'in-bounds' are considered undefined.
3635       * std: Many freestanding functions in `vec` removed in favor of methods.
3636       * std: Many freestanding functions on scalar types removed in favor of
3637         methods.
3638       * std: Many options to task builders were removed since they don't make
3639         sense in the new scheduler design.
3640       * std: More containers implement `FromIterator` so can be created by the
3641         `collect` method.
3642       * std: More complete atomic types in `unstable::atomics`.
3643       * std: `comm::PortSet` removed.
3644       * std: Mutating methods in the `Set` and `Map` traits have been moved into
3645         the `MutableSet` and `MutableMap` traits. `Container::is_empty`,
3646         `Map::contains_key`, `MutableMap::insert`, and `MutableMap::remove` have
3647         default implementations.
3648       * std: Various `from_str` functions were removed in favor of a generic
3649         `from_str` which is available in the prelude.
3650       * std: `util::unreachable` removed in favor of the `unreachable!` macro.
3651       * extra: `dlist`, the doubly-linked list was modernized.
3652       * extra: Added a `hex` module with `ToHex` and `FromHex` traits.
3653       * extra: Added `glob` module, replacing `std::os::glob`.
3654       * extra: `rope` was removed.
3655       * extra: `deque` was renamed to `ringbuf`. `RingBuf` implements `Deque`.
3656       * extra: `net`, and `timer` were removed. The experimental replacements
3657         are `std::rt::io::net` and `std::rt::io::timer`.
3658       * extra: Iterators implemented for `SmallIntMap`.
3659       * extra: Iterators implemented for `Bitv` and `BitvSet`.
3660       * extra: `SmallIntSet` removed. Use `BitvSet`.
3661       * extra: Performance of JSON parsing greatly improved.
3662       * extra: `semver` updated to SemVer 2.0.0.
3663       * extra: `term` handles more terminals correctly.
3664       * extra: `dbg` module removed.
3665       * extra: `par` module removed.
3666       * extra: `future` was cleaned up, with some method renames.
3667       * extra: Most free functions in `getopts` were converted to methods.
3668
3669    * Other
3670       * rustc's debug info generation (`-Z debug-info`) is greatly improved.
3671       * rustc accepts `--target-cpu` to compile to a specific CPU architecture,
3672         similarly to gcc's `--march` flag.
3673       * rustc's performance compiling small crates is much better.
3674       * rustpkg has received many improvements.
3675       * rustpkg supports git tags as package IDs.
3676       * rustpkg builds into target-specific directories so it can be used for
3677         cross-compiling.
3678       * The number of concurrent test tasks is controlled by the environment
3679         variable RUST_TEST_TASKS.
3680       * The test harness can now report metrics for benchmarks.
3681       * All tools have man pages.
3682       * Programs compiled with `--test` now support the `-h` and `--help` flags.
3683       * The runtime uses jemalloc for allocations.
3684       * Segmented stacks are temporarily disabled as part of the transition to
3685         the new runtime. Stack overflows are possible!
3686       * A new documentation backend, rustdoc_ng, is available for use. It is
3687         still invoked through the normal `rustdoc` command.
3688
3689
3690 Version 0.7 (2013-07-03)
3691 =======================
3692
3693    * ~2000 changes, numerous bugfixes
3694
3695    * Language
3696       * `impl`s no longer accept a visibility qualifier. Put them on methods
3697         instead.
3698       * The borrow checker has been rewritten with flow-sensitivity, fixing
3699         many bugs and inconveniences.
3700       * The `self` parameter no longer implicitly means `&'self self`,
3701         and can be explicitly marked with a lifetime.
3702       * Overloadable compound operators (`+=`, etc.) have been temporarily
3703         removed due to bugs.
3704       * The `for` loop protocol now requires `for`-iterators to return `bool`
3705         so they compose better.
3706       * The `Durable` trait is replaced with the `'static` bounds.
3707       * Trait default methods work more often.
3708       * Structs with the `#[packed]` attribute have byte alignment and
3709         no padding between fields.
3710       * Type parameters bound by `Copy` must now be copied explicitly with
3711         the `copy` keyword.
3712       * It is now illegal to move out of a dereferenced unsafe pointer.
3713       * `Option<~T>` is now represented as a nullable pointer.
3714       * `@mut` does dynamic borrow checks correctly.
3715       * The `main` function is only detected at the topmost level of the crate.
3716         The `#[main]` attribute is still valid anywhere.
3717       * Struct fields may no longer be mutable. Use inherited mutability.
3718       * The `#[no_send]` attribute makes a type that would otherwise be
3719         `Send`, not.
3720       * The `#[no_freeze]` attribute makes a type that would otherwise be
3721         `Freeze`, not.
3722       * Unbounded recursion will abort the process after reaching the limit
3723         specified by the `RUST_MAX_STACK` environment variable (default: 1GB).
3724       * The `vecs_implicitly_copyable` lint mode has been removed. Vectors
3725         are never implicitly copyable.
3726       * `#[static_assert]` makes compile-time assertions about static bools.
3727       * At long last, 'argument modes' no longer exist.
3728       * The rarely used `use mod` statement no longer exists.
3729
3730    * Syntax extensions
3731       * `fail!` and `assert!` accept `~str`, `&'static str` or `fmt!`-style
3732         argument list.
3733       * `Encodable`, `Decodable`, `Ord`, `TotalOrd`, `TotalEq`, `DeepClone`,
3734         `Rand`, `Zero` and `ToStr` can all be automatically derived with
3735         `#[deriving(...)]`.
3736       * The `bytes!` macro returns a vector of bytes for string, u8, char,
3737         and unsuffixed integer literals.
3738
3739    * Libraries
3740       * The `core` crate was renamed to `std`.
3741       * The `std` crate was renamed to `extra`.
3742       * More and improved documentation.
3743       * std: `iterator` module for external iterator objects.
3744       * Many old-style (internal, higher-order function) iterators replaced by
3745         implementations of `Iterator`.
3746       * std: Many old internal vector and string iterators,
3747         incl. `any`, `all`. removed.
3748       * std: The `finalize` method of `Drop` renamed to `drop`.
3749       * std: The `drop` method now takes `&mut self` instead of `&self`.
3750       * std: The prelude no longer reexports any modules, only types and traits.
3751       * std: Prelude additions: `print`, `println`, `FromStr`, `ApproxEq`, `Equiv`,
3752         `Iterator`, `IteratorUtil`, many numeric traits, many tuple traits.
3753       * std: New numeric traits: `Fractional`, `Real`, `RealExt`, `Integer`, `Ratio`,
3754         `Algebraic`, `Trigonometric`, `Exponential`, `Primitive`.
3755       * std: Tuple traits and accessors defined for up to 12-tuples, e.g.
3756         `(0, 1, 2).n2()` or `(0, 1, 2).n2_ref()`.
3757       * std: Many types implement `Clone`.
3758       * std: `path` type renamed to `Path`.
3759       * std: `mut` module and `Mut` type removed.
3760       * std: Many standalone functions removed in favor of methods and iterators
3761         in `vec`, `str`. In the future methods will also work as functions.
3762       * std: `reinterpret_cast` removed. Use `transmute`.
3763       * std: ascii string handling in `std::ascii`.
3764       * std: `Rand` is implemented for ~/@.
3765       * std: `run` module for spawning processes overhauled.
3766       * std: Various atomic types added to `unstable::atomic`.
3767       * std: Various types implement `Zero`.
3768       * std: `LinearMap` and `LinearSet` renamed to `HashMap` and `HashSet`.
3769       * std: Borrowed pointer functions moved from `ptr` to `borrow`.
3770       * std: Added `os::mkdir_recursive`.
3771       * std: Added `os::glob` function performs filesystems globs.
3772       * std: `FuzzyEq` renamed to `ApproxEq`.
3773       * std: `Map` now defines `pop` and `swap` methods.
3774       * std: `Cell` constructors converted to static methods.
3775       * extra: `rc` module adds the reference counted pointers, `Rc` and `RcMut`.
3776       * extra: `flate` module moved from `std` to `extra`.
3777       * extra: `fileinput` module for iterating over a series of files.
3778       * extra: `Complex` number type and `complex` module.
3779       * extra: `Rational` number type and `rational` module.
3780       * extra: `BigInt`, `BigUint` implement numeric and comparison traits.
3781       * extra: `term` uses terminfo now, is more correct.
3782       * extra: `arc` functions converted to methods.
3783       * extra: Implementation of fixed output size variations of SHA-2.
3784
3785    * Tooling
3786       * `unused_variable`  lint mode for unused variables (default: warn).
3787       * `unused_unsafe` lint mode for detecting unnecessary `unsafe` blocks
3788         (default: warn).
3789       * `unused_mut` lint mode for identifying unused `mut` qualifiers
3790         (default: warn).
3791       * `dead_assignment` lint mode for unread variables (default: warn).
3792       * `unnecessary_allocation` lint mode detects some heap allocations that are
3793         immediately borrowed so could be written without allocating (default: warn).
3794       * `missing_doc` lint mode (default: allow).
3795       * `unreachable_code` lint mode (default: warn).
3796       * The `rusti` command has been rewritten and a number of bugs addressed.
3797       * rustc outputs in color on more terminals.
3798       * rustc accepts a `--link-args` flag to pass arguments to the linker.
3799       * rustc accepts a `-Z print-link-args` flag for debugging linkage.
3800       * Compiling with `-g` will make the binary record information about
3801         dynamic borrowcheck failures for debugging.
3802       * rustdoc has a nicer stylesheet.
3803       * Various improvements to rustdoc.
3804       * Improvements to rustpkg (see the detailed release notes).
3805
3806
3807 Version 0.6 (2013-04-03)
3808 ========================
3809
3810    * ~2100 changes, numerous bugfixes
3811
3812    * Syntax changes
3813       * The self type parameter in traits is now spelled `Self`
3814       * The `self` parameter in trait and impl methods must now be explicitly
3815         named (for example: `fn f(&self) { }`). Implicit self is deprecated.
3816       * Static methods no longer require the `static` keyword and instead
3817         are distinguished by the lack of a `self` parameter
3818       * Replaced the `Durable` trait with the `'static` lifetime
3819       * The old closure type syntax with the trailing sigil has been
3820         removed in favor of the more consistent leading sigil
3821       * `super` is a keyword, and may be prefixed to paths
3822       * Trait bounds are separated with `+` instead of whitespace
3823       * Traits are implemented with `impl Trait for Type`
3824         instead of `impl Type: Trait`
3825       * Lifetime syntax is now `&'l foo` instead of `&l/foo`
3826       * The `export` keyword has finally been removed
3827       * The `move` keyword has been removed (see "Semantic changes")
3828       * The interior mutability qualifier on vectors, `[mut T]`, has been
3829         removed. Use `&mut [T]`, etc.
3830       * `mut` is no longer valid in `~mut T`. Use inherited mutability
3831       * `fail` is no longer a keyword. Use `fail!()`
3832       * `assert` is no longer a keyword. Use `assert!()`
3833       * `log` is no longer a keyword. use `debug!`, etc.
3834       * 1-tuples may be represented as `(T,)`
3835       * Struct fields may no longer be `mut`. Use inherited mutability,
3836         `@mut T`, `core::mut` or `core::cell`
3837       * `extern mod { ... }` is no longer valid syntax for foreign
3838         function modules. Use extern blocks: `extern { ... }`
3839       * Newtype enums removed. Use tuple-structs.
3840       * Trait implementations no longer support visibility modifiers
3841       * Pattern matching over vectors improved and expanded
3842       * `const` renamed to `static` to correspond to lifetime name,
3843         and make room for future `static mut` unsafe mutable globals.
3844       * Replaced `#[deriving_eq]` with `#[deriving(Eq)]`, etc.
3845       * `Clone` implementations can be automatically generated with
3846         `#[deriving(Clone)]`
3847       * Casts to traits must use a pointer sigil, e.g. `@foo as @Bar`
3848         instead of `foo as Bar`.
3849       * Fixed length vector types are now written as `[int, .. 3]`
3850         instead of `[int * 3]`.
3851       * Fixed length vector types can express the length as a constant
3852         expression. (ex: `[int, .. GL_BUFFER_SIZE - 2]`)
3853
3854    * Semantic changes
3855       * Types with owned pointers or custom destructors move by default,
3856         eliminating the `move` keyword
3857       * All foreign functions are considered unsafe
3858       * &mut is now unaliasable
3859       * Writes to borrowed @mut pointers are prevented dynamically
3860       * () has size 0
3861       * The name of the main function can be customized using #[main]
3862       * The default type of an inferred closure is &fn instead of @fn
3863       * `use` statements may no longer be "chained" - they cannot import
3864         identifiers imported by previous `use` statements
3865       * `use` statements are crate relative, importing from the "top"
3866         of the crate by default. Paths may be prefixed with `super::`
3867         or `self::` to change the search behavior.
3868       * Method visibility is inherited from the implementation declaration
3869       * Structural records have been removed
3870       * Many more types can be used in static items, including enums
3871         'static-lifetime pointers and vectors
3872       * Pattern matching over vectors improved and expanded
3873       * Typechecking of closure types has been overhauled to
3874         improve inference and eliminate unsoundness
3875       * Macros leave scope at the end of modules, unless that module is
3876         tagged with #[macro_escape]
3877
3878    * Libraries
3879       * Added big integers to `std::bigint`
3880       * Removed `core::oldcomm` module
3881       * Added pipe-based `core::comm` module
3882       * Numeric traits have been reorganized under `core::num`
3883       * `vec::slice` finally returns a slice
3884       * `debug!` and friends don't require a format string, e.g. `debug!(Foo)`
3885       * Containers reorganized around traits in `core::container`
3886       * `core::dvec` removed, `~[T]` is a drop-in replacement
3887       * `core::send_map` renamed to `core::hashmap`
3888       * `std::map` removed; replaced with `core::hashmap`
3889       * `std::treemap` reimplemented as an owned balanced tree
3890       * `std::deque` and `std::smallintmap` reimplemented as owned containers
3891       * `core::trie` added as a fast ordered map for integer keys
3892       * Set types added to `core::hashmap`, `core::trie` and `std::treemap`
3893       * `Ord` split into `Ord` and `TotalOrd`. `Ord` is still used to
3894         overload the comparison operators, whereas `TotalOrd` is used
3895         by certain container types
3896
3897    * Other
3898       * Replaced the 'cargo' package manager with 'rustpkg'
3899       * Added all-purpose 'rust' tool
3900       * `rustc --test` now supports benchmarks with the `#[bench]` attribute
3901       * rustc now *attempts* to offer spelling suggestions
3902       * Improved support for ARM and Android
3903       * Preliminary MIPS backend
3904       * Improved foreign function ABI implementation for x86, x86_64
3905       * Various memory usage improvements
3906       * Rust code may be embedded in foreign code under limited circumstances
3907       * Inline assembler supported by new asm!() syntax extension.
3908
3909
3910 Version 0.5 (2012-12-21)
3911 ===========================
3912
3913    * ~900 changes, numerous bugfixes
3914
3915    * Syntax changes
3916       * Removed `<-` move operator
3917       * Completed the transition from the `#fmt` extension syntax to `fmt!`
3918       * Removed old fixed length vector syntax - `[T]/N`
3919       * New token-based quasi-quoters, `quote_tokens!`, `quote_expr!`, etc.
3920       * Macros may now expand to items and statements
3921       * `a.b()` is always parsed as a method call, never as a field projection
3922       * `Eq` and `IterBytes` implementations can be automatically generated
3923         with `#[deriving_eq]` and `#[deriving_iter_bytes]` respectively
3924       * Removed the special crate language for `.rc` files
3925       * Function arguments may consist of any irrefutable pattern
3926
3927    * Semantic changes
3928       * `&` and `~` pointers may point to objects
3929       * Tuple structs - `struct Foo(Bar, Baz)`. Will replace newtype enums.
3930       * Enum variants may be structs
3931       * Destructors can be added to all nominal types with the Drop trait
3932       * Structs and nullary enum variants may be constants
3933       * Values that cannot be implicitly copied are now automatically moved
3934         without writing `move` explicitly
3935       * `&T` may now be coerced to `*T`
3936       * Coercions happen in `let` statements as well as function calls
3937       * `use` statements now take crate-relative paths
3938       * The module and type namespaces have been merged so that static
3939         method names can be resolved under the trait in which they are
3940         declared
3941
3942    * Improved support for language features
3943       * Trait inheritance works in many scenarios
3944       * More support for explicit self arguments in methods - `self`, `&self`
3945         `@self`, and `~self` all generally work as expected
3946       * Static methods work in more situations
3947       * Experimental: Traits may declare default methods for the implementations
3948         to use
3949
3950    * Libraries
3951       * New condition handling system in `core::condition`
3952       * Timsort added to `std::sort`
3953       * New priority queue, `std::priority_queue`
3954       * Pipes for serializable types, `std::flatpipes'
3955       * Serialization overhauled to be trait-based
3956       * Expanded `getopts` definitions
3957       * Moved futures to `std`
3958       * More functions are pure now
3959       * `core::comm` renamed to `oldcomm`. Still deprecated
3960       * `rustdoc` and `cargo` are libraries now
3961
3962    * Misc
3963       * Added a preliminary REPL, `rusti`
3964       * License changed from MIT to dual MIT/APL2
3965
3966
3967 Version 0.4 (2012-10-15)
3968 ==========================
3969
3970    * ~2000 changes, numerous bugfixes
3971
3972    * Syntax
3973       * All keywords are now strict and may not be used as identifiers anywhere
3974       * Keyword removal: 'again', 'import', 'check', 'new', 'owned', 'send',
3975         'of', 'with', 'to', 'class'.
3976       * Classes are replaced with simpler structs
3977       * Explicit method self types
3978       * `ret` became `return` and `alt` became `match`
3979       * `import` is now `use`; `use is now `extern mod`
3980       * `extern mod { ... }` is now `extern { ... }`
3981       * `use mod` is the recommended way to import modules
3982       * `pub` and `priv` replace deprecated export lists
3983       * The syntax of `match` pattern arms now uses fat arrow (=>)
3984       * `main` no longer accepts an args vector; use `os::args` instead
3985
3986    * Semantics
3987       * Trait implementations are now coherent, ala Haskell typeclasses
3988       * Trait methods may be static
3989       * Argument modes are deprecated
3990       * Borrowed pointers are much more mature and recommended for use
3991       * Strings and vectors in the static region are stored in constant memory
3992       * Typestate was removed
3993       * Resolution rewritten to be more reliable
3994       * Support for 'dual-mode' data structures (freezing and thawing)
3995
3996    * Libraries
3997       * Most binary operators can now be overloaded via the traits in
3998         `core::ops'
3999       * `std::net::url` for representing URLs
4000       * Sendable hash maps in `core::send_map`
4001       * `core::task' gained a (currently unsafe) task-local storage API
4002
4003    * Concurrency
4004       * An efficient new intertask communication primitive called the pipe,
4005         along with a number of higher-level channel types, in `core::pipes`
4006       * `std::arc`, an atomically reference counted, immutable, shared memory
4007         type
4008       * `std::sync`, various exotic synchronization tools based on arcs and pipes
4009       * Futures are now based on pipes and sendable
4010       * More robust linked task failure
4011       * Improved task builder API
4012
4013    * Other
4014       * Improved error reporting
4015       * Preliminary JIT support
4016       * Preliminary work on precise GC
4017       * Extensive architectural improvements to rustc
4018       * Begun a transition away from buggy C++-based reflection (shape) code to
4019         Rust-based (visitor) code
4020       * All hash functions and tables converted to secure, randomized SipHash
4021
4022
4023 Version 0.3  (2012-07-12)
4024 ========================
4025
4026    * ~1900 changes, numerous bugfixes
4027
4028    * New coding conveniences
4029       * Integer-literal suffix inference
4030       * Per-item control over warnings, errors
4031       * #[cfg(windows)] and #[cfg(unix)] attributes
4032       * Documentation comments
4033       * More compact closure syntax
4034       * 'do' expressions for treating higher-order functions as
4035         control structures
4036       * *-patterns (wildcard extended to all constructor fields)
4037
4038    * Semantic cleanup
4039       * Name resolution pass and exhaustiveness checker rewritten
4040       * Region pointers and borrow checking supersede alias
4041         analysis
4042       * Init-ness checking is now provided by a region-based liveness
4043         pass instead of the typestate pass; same for last-use analysis
4044       * Extensive work on region pointers
4045
4046    * Experimental new language features
4047       * Slices and fixed-size, interior-allocated vectors
4048       * #!-comments for lang versioning, shell execution
4049       * Destructors and iface implementation for classes;
4050         type-parameterized classes and class methods
4051       * 'const' type kind for types that can be used to implement
4052         shared-memory concurrency patterns
4053
4054    * Type reflection
4055
4056    * Removal of various obsolete features
4057       * Keywords: 'be', 'prove', 'syntax', 'note', 'mutable', 'bind',
4058                  'crust', 'native' (now 'extern'), 'cont' (now 'again')
4059
4060       * Constructs: do-while loops ('do' repurposed), fn binding,
4061                     resources (replaced by destructors)
4062
4063    * Compiler reorganization
4064       * Syntax-layer of compiler split into separate crate
4065       * Clang (from LLVM project) integrated into build
4066       * Typechecker split into sub-modules
4067
4068    * New library code
4069       * New time functions
4070       * Extension methods for many built-in types
4071       * Arc: atomic-refcount read-only / exclusive-use shared cells
4072       * Par: parallel map and search routines
4073       * Extensive work on libuv interface
4074       * Much vector code moved to libraries
4075       * Syntax extensions: #line, #col, #file, #mod, #stringify,
4076         #include, #include_str, #include_bin
4077
4078    * Tool improvements
4079       * Cargo automatically resolves dependencies
4080
4081
4082 Version 0.2  (2012-03-29)
4083 =========================
4084
4085    * >1500 changes, numerous bugfixes
4086
4087    * New docs and doc tooling
4088
4089    * New port: FreeBSD x86_64
4090
4091    * Compilation model enhancements
4092       * Generics now specialized, multiply instantiated
4093       * Functions now inlined across separate crates
4094
4095    * Scheduling, stack and threading fixes
4096       * Noticeably improved message-passing performance
4097       * Explicit schedulers
4098       * Callbacks from C
4099       * Helgrind clean
4100
4101    * Experimental new language features
4102       * Operator overloading
4103       * Region pointers
4104       * Classes
4105
4106    * Various language extensions
4107       * C-callback function types: 'crust fn ...'
4108       * Infinite-loop construct: 'loop { ... }'
4109       * Shorten 'mutable' to 'mut'
4110       * Required mutable-local qualifier: 'let mut ...'
4111       * Basic glob-exporting: 'export foo::*;'
4112       * Alt now exhaustive, 'alt check' for runtime-checked
4113       * Block-function form of 'for' loop, with 'break' and 'ret'.
4114
4115    * New library code
4116       * AST quasi-quote syntax extension
4117       * Revived libuv interface
4118       * New modules: core::{future, iter}, std::arena
4119       * Merged per-platform std::{os*, fs*} to core::{libc, os}
4120       * Extensive cleanup, regularization in libstd, libcore
4121
4122
4123 Version 0.1  (2012-01-20)
4124 ===============================
4125
4126    * Most language features work, including:
4127       * Unique pointers, unique closures, move semantics
4128       * Interface-constrained generics
4129       * Static interface dispatch
4130       * Stack growth
4131       * Multithread task scheduling
4132       * Typestate predicates
4133       * Failure unwinding, destructors
4134       * Pattern matching and destructuring assignment
4135       * Lightweight block-lambda syntax
4136       * Preliminary macro-by-example
4137
4138    * Compiler works with the following configurations:
4139       * Linux: x86 and x86_64 hosts and targets
4140       * MacOS: x86 and x86_64 hosts and targets
4141       * Windows: x86 hosts and targets
4142
4143    * Cross compilation / multi-target configuration supported.
4144
4145    * Preliminary API-documentation and package-management tools included.
4146
4147 Known issues:
4148
4149    * Documentation is incomplete.
4150
4151    * Performance is below intended target.
4152
4153    * Standard library APIs are subject to extensive change, reorganization.
4154
4155    * Language-level versioning is not yet operational - future code will
4156      break unexpectedly.