← Back to all releases

Rust 0.8.0

Released on September 26, 2013

What's Changed

  • ~2200 changes, numerous bugfixes
  • Language
  • The for loop syntax has changed to work with the Iterator trait.
  • At long last, unwinding works on Windows.
  • Default methods are ready for use.
  • Many trait inheritance bugs fixed.
  • Owned and borrowed trait objects work more reliably.
  • copy is no longer a keyword. It has been replaced by the Clone trait.
  • rustc can omit emission of code for the debug! macro if it is passed
  • mod.rs is now "blessed". When loading mod foo;, rustc will now look
  • Strings no longer contain trailing nulls. The new std::c_str module
  • The type of foreign functions is now extern "C" fn instead of `*u8'.
  • The FFI has been overhauled such that foreign functions are called directly,
  • Calling a foreign function must be done through a Rust function with the
  • The externfn! macro can be used to declare both a foreign function and
  • pub and priv modifiers on extern blocks are no longer parsed.
  • unsafe is no longer allowed on extern fns - they are all unsafe.
  • priv is disallowed everywhere except for struct fields and enum variants.
  • &T (besides &'static T) is no longer allowed in @T.
  • ref bindings in irrefutable patterns work correctly now.
  • char is now prevented from containing invalid code points.
  • Casting to bool is no longer allowed.
  • \0 is now accepted as an escape in chars and strings.
  • yield is a reserved keyword.
  • typeof is a reserved keyword.
  • Crates may be imported by URL with extern mod foo = "url";.
  • Explicit enum discriminants may be given as uints as in enum E { V = 0u }
  • Static vectors can be initialized with repeating elements,
  • Static structs can be initialized with functional record update,
  • cfg! can be used to conditionally execute code based on the crate
  • The unnecessary_qualification lint detects unneeded module
  • Arithmetic operations have been implemented on the SIMD types in
  • Exchange allocation headers were removed, reducing memory usage.
  • format! implements a completely new, extensible, and higher-performance
  • print! and println! write formatted strings (using the format!
  • write! and writeln! write formatted strings (using the format!
  • The library section in which a function or static is placed may
  • The proto! syntax extension for defining bounded message protocols
  • macro_rules! is hygienic for let declarations.
  • The #[export_name] attribute specifies the name of a symbol.
  • unreachable! can be used to indicate unreachable code, and fails
  • Libraries
  • std: Transitioned to the new runtime, written in Rust.
  • std: Added an experimental I/O library, rt::io, based on the new
  • std: A new generic range function was added to the prelude, replacing
  • std: range_rev no longer exists. Since range is an iterator it can be
  • std: The chain method on option renamed to and_then; unwrap_or_default
  • std: The iterator module was renamed to iter.
  • std: Integral types now support the checked_add, checked_sub, and
  • std: Many methods in str, vec, option, result` were renamed for
  • std: Methods are standardizing on conventions for casting methods:
  • std: The CString type in c_str provides new ways to convert to and
  • std: DoubleEndedIterator can yield elements in two directions.
  • std: The mut_split method on vectors partitions an &mut [T] into
  • std: str::from_bytes renamed to str::from_utf8.
  • std: pop_opt and shift_opt methods added to vectors.
  • std: The task-local data interface no longer uses @, and keys are
  • std: The swap_unwrap method of Option renamed to take_unwrap.
  • std: Added SharedPort to comm.
  • std: Eq has a default method for ne; only eq is required
  • std: Ord has default methods for le, gt and ge; only lt
  • std: is_utf8 performance is improved, impacting many string functions.
  • std: os::MemoryMap provides cross-platform mmap.
  • std: ptr::offset is now unsafe, but also more optimized. Offsets that
  • std: Many freestanding functions in vec removed in favor of methods.
  • std: Many freestanding functions on scalar types removed in favor of
  • std: Many options to task builders were removed since they don't make
  • std: More containers implement FromIterator so can be created by the
  • std: More complete atomic types in unstable::atomics.
  • std: comm::PortSet removed.
  • std: Mutating methods in the Set and Map traits have been moved into
  • std: Various from_str functions were removed in favor of a generic
  • std: util::unreachable removed in favor of the unreachable! macro.
  • extra: dlist, the doubly-linked list was modernized.
  • extra: Added a hex module with ToHex and FromHex traits.
  • extra: Added glob module, replacing std::os::glob.
  • extra: rope was removed.
  • extra: deque was renamed to ringbuf. RingBuf implements Deque.
  • extra: net, and timer were removed. The experimental replacements
  • extra: Iterators implemented for SmallIntMap.
  • extra: Iterators implemented for Bitv and BitvSet.
  • extra: SmallIntSet removed. Use BitvSet.
  • extra: Performance of JSON parsing greatly improved.
  • extra: semver updated to SemVer 2.0.0.
  • extra: term handles more terminals correctly.
  • extra: dbg module removed.
  • extra: par module removed.
  • extra: future was cleaned up, with some method renames.
  • extra: Most free functions in getopts were converted to methods.
  • Other
  • rustc's debug info generation (-Z debug-info) is greatly improved.
  • rustc accepts --target-cpu to compile to a specific CPU architecture,
  • rustc's performance compiling small crates is much better.
  • rustpkg has received many improvements.
  • rustpkg supports git tags as package IDs.
  • rustpkg builds into target-specific directories so it can be used for
  • The number of concurrent test tasks is controlled by the environment
  • The test harness can now report metrics for benchmarks.
  • All tools have man pages.
  • Programs compiled with --test now support the -h and --help flags.
  • The runtime uses jemalloc for allocations.
  • Segmented stacks are temporarily disabled as part of the transition to
  • A new documentation backend, rustdoc_ng, is available for use. It is
Full Changelog

* ~2200 changes, numerous bugfixes

* Language

* The for loop syntax has changed to work with the Iterator trait.

* At long last, unwinding works on Windows.

* Default methods are ready for use.

* Many trait inheritance bugs fixed.

* Owned and borrowed trait objects work more reliably.

* copy is no longer a keyword. It has been replaced by the Clone trait.

* rustc can omit emission of code for the debug! macro if it is passed

--cfg ndebug

* mod.rs is now "blessed". When loading mod foo;, rustc will now look

for foo.rs, then foo/mod.rs, and will generate an error when both are

present.

* Strings no longer contain trailing nulls. The new std::c_str module

provides new mechanisms for converting to C strings.

The type of foreign functions is now extern "C" fn instead of u8'.

* The FFI has been overhauled such that foreign functions are called directly,

instead of through a stack-switching wrapper.

* Calling a foreign function must be done through a Rust function with the

#[fixed_stack_segment] attribute.

* The externfn! macro can be used to declare both a foreign function and

a #[fixed_stack_segment] wrapper at once.

* pub and priv modifiers on extern blocks are no longer parsed.

* unsafe is no longer allowed on extern fns - they are all unsafe.

* priv is disallowed everywhere except for struct fields and enum variants.

* &T (besides &'static T) is no longer allowed in @T.

* ref bindings in irrefutable patterns work correctly now.

* char is now prevented from containing invalid code points.

* Casting to bool is no longer allowed.

* \0 is now accepted as an escape in chars and strings.

* yield is a reserved keyword.

* typeof is a reserved keyword.

* Crates may be imported by URL with extern mod foo = "url";.

* Explicit enum discriminants may be given as uints as in enum E { V = 0u }

* Static vectors can be initialized with repeating elements,

e.g. static foo: [u8, .. 100]: [0, .. 100];.

* Static structs can be initialized with functional record update,

e.g. static foo: Foo = Foo { a: 5, .. bar };.

* cfg! can be used to conditionally execute code based on the crate

configuration, similarly to #[cfg(...)].

* The unnecessary_qualification lint detects unneeded module

prefixes (default: allow).

* Arithmetic operations have been implemented on the SIMD types in

std::unstable::simd.

* Exchange allocation headers were removed, reducing memory usage.

* format! implements a completely new, extensible, and higher-performance

string formatting system. It will replace fmt!.

* print! and println! write formatted strings (using the format!

extension) to stdout.

* write! and writeln! write formatted strings (using the format!

extension) to the new Writers in std::rt::io.

* The library section in which a function or static is placed may

be specified with #[link_section = "..."].

* The proto! syntax extension for defining bounded message protocols

was removed.

* macro_rules! is hygienic for let declarations.

* The #[export_name] attribute specifies the name of a symbol.

* unreachable! can be used to indicate unreachable code, and fails

if executed.

* Libraries

* std: Transitioned to the new runtime, written in Rust.

* std: Added an experimental I/O library, rt::io, based on the new

runtime.

* std: A new generic range function was added to the prelude, replacing

uint::range and friends.

* std: range_rev no longer exists. Since range is an iterator it can be

reversed with range(lo, hi).invert().

* std: The chain method on option renamed to and_then; unwrap_or_default

renamed to unwrap_or.

* std: The iterator module was renamed to iter.

* std: Integral types now support the checked_add, checked_sub, and

checked_mul operations for detecting overflow.

* std: Many methods in str, vec, option, result were renamed for

consistency.

* std: Methods are standardizing on conventions for casting methods:

to_foo for copying, into_foo for moving, as_foo for temporary

and cheap casts.

* std: The CString type in c_str provides new ways to convert to and

from C strings.

* std: DoubleEndedIterator can yield elements in two directions.

* std: The mut_split method on vectors partitions an &mut [T] into

two splices.

* std: str::from_bytes renamed to str::from_utf8.

* std: pop_opt and shift_opt methods added to vectors.

* std: The task-local data interface no longer uses @, and keys are

no longer function pointers.

* std: The swap_unwrap method of Option renamed to take_unwrap.

* std: Added SharedPort to comm.

* std: Eq has a default method for ne; only eq is required

in implementations.

* std: Ord has default methods for le, gt and ge; only lt

is required in implementations.

* std: is_utf8 performance is improved, impacting many string functions.

* std: os::MemoryMap provides cross-platform mmap.

* std: ptr::offset is now unsafe, but also more optimized. Offsets that

are not 'in-bounds' are considered undefined.

* std: Many freestanding functions in vec removed in favor of methods.

* std: Many freestanding functions on scalar types removed in favor of

methods.

* std: Many options to task builders were removed since they don't make

sense in the new scheduler design.

* std: More containers implement FromIterator so can be created by the

collect method.

* std: More complete atomic types in unstable::atomics.

* std: comm::PortSet removed.

* std: Mutating methods in the Set and Map traits have been moved into

the MutableSet and MutableMap traits. Container::is_empty,

Map::contains_key, MutableMap::insert, and MutableMap::remove have

default implementations.

* std: Various from_str functions were removed in favor of a generic

from_str which is available in the prelude.

* std: util::unreachable removed in favor of the unreachable! macro.

* extra: dlist, the doubly-linked list was modernized.

* extra: Added a hex module with ToHex and FromHex traits.

* extra: Added glob module, replacing std::os::glob.

* extra: rope was removed.

* extra: deque was renamed to ringbuf. RingBuf implements Deque.

* extra: net, and timer were removed. The experimental replacements

are std::rt::io::net and std::rt::io::timer.

* extra: Iterators implemented for SmallIntMap.

* extra: Iterators implemented for Bitv and BitvSet.

* extra: SmallIntSet removed. Use BitvSet.

* extra: Performance of JSON parsing greatly improved.

* extra: semver updated to SemVer 2.0.0.

* extra: term handles more terminals correctly.

* extra: dbg module removed.

* extra: par module removed.

* extra: future was cleaned up, with some method renames.

* extra: Most free functions in getopts were converted to methods.

* Other

* rustc's debug info generation (-Z debug-info) is greatly improved.

* rustc accepts --target-cpu to compile to a specific CPU architecture,

similarly to gcc's --march flag.

* rustc's performance compiling small crates is much better.

* rustpkg has received many improvements.

* rustpkg supports git tags as package IDs.

* rustpkg builds into target-specific directories so it can be used for

cross-compiling.

* The number of concurrent test tasks is controlled by the environment

variable RUST_TEST_TASKS.

* The test harness can now report metrics for benchmarks.

* All tools have man pages.

* Programs compiled with --test now support the -h and --help flags.

* The runtime uses jemalloc for allocations.

* Segmented stacks are temporarily disabled as part of the transition to

the new runtime. Stack overflows are possible!

* A new documentation backend, rustdoc_ng, is available for use. It is

still invoked through the normal rustdoc command.