← Back to all releases

Rust 1.4.0

Released on October 29, 2015

What's Changed

  • use statements that import multiple items [can now rename
  • [Binops work correctly on fat pointers][binfat].
  • pub extern crate, which does not behave as expected, [issues a

  • [Many APIs were stabilized][stab]: >::into_string,
  • [Some APIs were deprecated][dep]: BTreeMap::with_b,
  • [Reverse-searching strings is faster with the 'two-way'
  • [std::io::copy allows ?Sized arguments][cc].
  • The Windows, Chunks, and ChunksMut iterators over slices all
  • [Default is implemented for arrays up to [T; 32]][d].
  • [IntoRawFd has been added to the Unix-specific prelude,
  • [Extend and FromIterator are both implemented for
  • [IntoIterator is implemented for references to Option and
  • [HashMap and HashSet implement Extend<&T> where `T:
  • [BinaryHeap implements Debug][bh2].
  • [Borrow and BorrowMut are implemented for fixed-size
  • [extern fns with the "Rust" and "C" ABIs implement common
  • [String comparison is faster][faststr].
  • &mut T where T: std::fmt::Write [also implements
  • [A stable regression in VecDeque::push_back and other
  • [Function pointers implement traits for up to 12 parameters][fp2].

  • [Several changes have been made to fix type soundness and improve
  • [The str::lines and BufRead::lines iterators treat \r\n as
  • [Loans of 'static lifetime extend to the end of a function][stat].
  • [str::parse no longer introduces avoidable rounding error when

  • Windows builds targeting the 64-bit MSVC ABI and linker (instead of
  • The compiler [no longer uses the 'morestack' feature to prevent
  • [The compiler matches traits faster when projections are involved][p].
  • The 'improper_ctypes' lint [no longer warns about use of isize and
  • [Cargo now displays useful information about what its doing during
Full Changelog

* ~1200 changes, numerous bugfixes

Highlights

----------

* Windows builds targeting the 64-bit MSVC ABI and linker (instead of

GNU) are now supported and recommended for use.

Breaking Changes

----------------

* [Several changes have been made to fix type soundness and improve

the behavior of associated types][sound]. See [RFC 1214]. Although

we have mostly introduced these changes as warnings this release, to

become errors next release, there are still some scenarios that will

see immediate breakage.

* [The str::lines and BufRead::lines iterators treat \r\n as

line breaks in addition to \n][crlf].

* [Loans of 'static lifetime extend to the end of a function][stat].

* [str::parse no longer introduces avoidable rounding error when

parsing floating point numbers. Together with earlier changes to

float formatting/output, "round trips" like f.to_string().parse()

now preserve the value of f exactly. Additionally, leading plus

signs are now accepted][fp3].

Language

--------

* use statements that import multiple items [can now rename

them][i], as in use foo::{bar as kitten, baz as puppy}.

* [Binops work correctly on fat pointers][binfat].

* pub extern crate, which does not behave as expected, [issues a

warning][pec] until a better solution is found.

Libraries

---------

* [Many APIs were stabilized][stab]: >::into_string,

[Arc::downgrade], [Arc::get_mut], [Arc::make_mut],

[Arc::try_unwrap], [Box::from_raw], [Box::into_raw], [CStr::to_str],

[CStr::to_string_lossy], [CString::from_raw], [CString::into_raw],

[IntoRawFd::into_raw_fd], [IntoRawFd],

IntoRawHandle::into_raw_handle, IntoRawHandle, IntoRawSocket::into_raw_socket, IntoRawSocket, [Rc::downgrade],

[Rc::get_mut], [Rc::make_mut], [Rc::try_unwrap], [Result::expect],

[String::into_boxed_str], [TcpStream::read_timeout],

[TcpStream::set_read_timeout], [TcpStream::set_write_timeout],

[TcpStream::write_timeout], [UdpSocket::read_timeout],

[UdpSocket::set_read_timeout], [UdpSocket::set_write_timeout],

[UdpSocket::write_timeout], Vec::append, Vec::split_off,

[VecDeque::append], [VecDeque::retain], [VecDeque::split_off],

[rc::Weak::upgrade], [rc::Weak], [slice::Iter::as_slice],

[slice::IterMut::into_slice], [str::CharIndices::as_str],

[str::Chars::as_str], [str::split_at_mut], [str::split_at],

[sync::Weak::upgrade], [sync::Weak], [thread::park_timeout],

[thread::sleep].

* [Some APIs were deprecated][dep]: BTreeMap::with_b,

BTreeSet::with_b, Option::as_mut_slice, Option::as_slice, Result::as_mut_slice, Result::as_slice, f32::from_str_radix, f64::from_str_radix.

* [Reverse-searching strings is faster with the 'two-way'

algorithm][s].

* [std::io::copy allows ?Sized arguments][cc].

* The Windows, Chunks, and ChunksMut iterators over slices all

[override count, nth and last with an O(1)

implementation][it].

* [Default is implemented for arrays up to [T; 32]][d].

* [IntoRawFd has been added to the Unix-specific prelude,

IntoRawSocket and IntoRawHandle to the Windows-specific

prelude][pr].

* [Extend and FromIterator are both implemented for

String][es].

* [IntoIterator is implemented for references to Option and

Result][into2].

* [HashMap and HashSet implement Extend<&T> where T:

Copy][ext] as part of [RFC 839]. This will cause type inference

breakage in rare situations.

* [BinaryHeap implements Debug][bh2].

* [Borrow and BorrowMut are implemented for fixed-size

arrays][bm].

* [extern fns with the "Rust" and "C" ABIs implement common

traits including Eq, Ord, Debug, Hash][fp].

* [String comparison is faster][faststr].

* &mut T where T: std::fmt::Write [also implements

std::fmt::Write][mutw].

* [A stable regression in VecDeque::push_back and other

capacity-altering methods that caused panics for zero-sized types

was fixed][vd].

* [Function pointers implement traits for up to 12 parameters][fp2].

Miscellaneous

-------------

* The compiler [no longer uses the 'morestack' feature to prevent

stack overflow][mm]. Instead it uses guard pages and stack

probes (though stack probes are not yet implemented on any platform

but Windows).

* [The compiler matches traits faster when projections are involved][p].

* The 'improper_ctypes' lint [no longer warns about use of isize and

usize][ffi].

* [Cargo now displays useful information about what its doing during

cargo update][cu].

[Arc::downgrade]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.downgrade

[Arc::make_mut]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.make_mut

[Arc::get_mut]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.get_mut

[Arc::try_unwrap]: http://doc.rust-lang.org/nightly/alloc/arc/struct.Arc.html#method.try_unwrap

[Box::from_raw]: http://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html#method.from_raw

[Box::into_raw]: http://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html#method.into_raw

[CStr::to_str]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html#method.to_str

[CStr::to_string_lossy]: http://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html#method.to_string_lossy

[CString::from_raw]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.from_raw

[CString::into_raw]: http://doc.rust-lang.org/nightly/std/ffi/struct.CString.html#method.into_raw

[IntoRawFd::into_raw_fd]: http://doc.rust-lang.org/nightly/std/os/unix/io/trait.IntoRawFd.html#tymethod.into_raw_fd

[IntoRawFd]: http://doc.rust-lang.org/nightly/std/os/unix/io/trait.IntoRawFd.html

[Rc::downgrade]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.downgrade

[Rc::get_mut]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.get_mut

[Rc::make_mut]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.make_mut

[Rc::try_unwrap]: http://doc.rust-lang.org/nightly/alloc/rc/struct.Rc.html#method.try_unwrap

[Result::expect]: http://doc.rust-lang.org/nightly/core/result/enum.Result.html#method.expect

[String::into_boxed_str]: http://doc.rust-lang.org/nightly/collections/string/struct.String.html#method.into_boxed_str

[TcpStream::read_timeout]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.read_timeout

[TcpStream::set_read_timeout]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_read_timeout

[TcpStream::write_timeout]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.write_timeout

[TcpStream::set_write_timeout]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_write_timeout

[UdpSocket::read_timeout]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.read_timeout

[UdpSocket::set_read_timeout]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_read_timeout

[UdpSocket::write_timeout]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.write_timeout

[UdpSocket::set_write_timeout]: http://doc.rust-lang.org/nightly/std/net/struct.TcpStream.html#method.set_write_timeout

[VecDeque::append]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.append

[VecDeque::retain]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.retain

[VecDeque::split_off]: http://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html#method.split_off

[rc::Weak::upgrade]: http://doc.rust-lang.org/nightly/std/rc/struct.Weak.html#method.upgrade

[rc::Weak]: http://doc.rust-lang.org/nightly/std/rc/struct.Weak.html

[slice::Iter::as_slice]: http://doc.rust-lang.org/nightly/std/slice/struct.Iter.html#method.as_slice

[slice::IterMut::into_slice]: http://doc.rust-lang.org/nightly/std/slice/struct.IterMut.html#method.into_slice

[str::CharIndices::as_str]: http://doc.rust-lang.org/nightly/std/str/struct.CharIndices.html#method.as_str

[str::Chars::as_str]: http://doc.rust-lang.org/nightly/std/str/struct.Chars.html#method.as_str

[str::split_at_mut]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_at_mut

[str::split_at]: http://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_at

[sync::Weak::upgrade]: http://doc.rust-lang.org/nightly/std/sync/struct.Weak.html#method.upgrade

[sync::Weak]: http://doc.rust-lang.org/nightly/std/sync/struct.Weak.html

[thread::park_timeout]: http://doc.rust-lang.org/nightly/std/thread/fn.park_timeout.html

[thread::sleep]: http://doc.rust-lang.org/nightly/std/thread/fn.sleep.html

[bh2]: https://github.com/rust-lang/rust/pull/28156

[binfat]: https://github.com/rust-lang/rust/pull/28270

[bm]: https://github.com/rust-lang/rust/pull/28197

[cc]: https://github.com/rust-lang/rust/pull/27531

[crlf]: https://github.com/rust-lang/rust/pull/28034

[cu]: https://github.com/rust-lang/cargo/pull/1931

[d]: https://github.com/rust-lang/rust/pull/27825

[dep]: https://github.com/rust-lang/rust/pull/28339

[es]: https://github.com/rust-lang/rust/pull/27956

[ext]: https://github.com/rust-lang/rust/pull/28094

[faststr]: https://github.com/rust-lang/rust/pull/28338

[ffi]: https://github.com/rust-lang/rust/pull/28779

[fp]: https://github.com/rust-lang/rust/pull/28268

[fp2]: https://github.com/rust-lang/rust/pull/28560

[fp3]: https://github.com/rust-lang/rust/pull/27307

[i]: https://github.com/rust-lang/rust/pull/27451

[into2]: https://github.com/rust-lang/rust/pull/28039

[it]: https://github.com/rust-lang/rust/pull/27652

[mm]: https://github.com/rust-lang/rust/pull/27338

[mutw]: https://github.com/rust-lang/rust/pull/28368

[sound]: https://github.com/rust-lang/rust/pull/27641

[p]: https://github.com/rust-lang/rust/pull/27866

[pec]: https://github.com/rust-lang/rust/pull/28486

[pr]: https://github.com/rust-lang/rust/pull/27896

[RFC 839]: https://github.com/rust-lang/rfcs/blob/master/text/0839-embrace-extend-extinguish.md

[RFC 1214]: https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md

[s]: https://github.com/rust-lang/rust/pull/27474

[stab]: https://github.com/rust-lang/rust/pull/28339

[stat]: https://github.com/rust-lang/rust/pull/28321

[vd]: https://github.com/rust-lang/rust/pull/28494