Skip to content

Releases: rust-lang/rust

Rust 0.7

10 Sep 05:53
Compare
Choose a tag to compare
  • ~2000 changes, numerous bugfixes

  • Language

    • impls no longer accept a visibility qualifier. Put them on methods instead.
    • The borrow checker has been rewritten with flow-sensitivity, fixing many bugs and inconveniences.
    • The self parameter no longer implicitly means &'self self, and can be explicitly marked with a lifetime.
    • Overloadable compound operators ( =, etc.) have been temporarily removed due to bugs.
    • The for loop protocol now requires for-iterators to return bool so they compose better.
    • The Durable trait is replaced with the 'static bounds.
    • Trait default methods work more often.
    • Structs with the #[packed] attribute have byte alignment and no padding between fields.
    • Type parameters bound by Copy must now be copied explicitly with the copy keyword.
    • It is now illegal to move out of a dereferenced unsafe pointer.
    • Option<~T> is now represented as a nullable pointer.
    • @mut does dynamic borrow checks correctly.
    • The main function is only detected at the topmost level of the crate. The #[main] attribute is still valid anywhere.
    • Struct fields may no longer be mutable. Use inherited mutability.
    • The #[no_send] attribute makes a type that would otherwise be Send, not.
    • The #[no_freeze] attribute makes a type that would otherwise be Freeze, not.
    • Unbounded recursion will abort the process after reaching the limit specified by the RUST_MAX_STACK environment variable (default: 1GB).
    • The vecs_implicitly_copyable lint mode has been removed. Vectors are never implicitly copyable.
    • #[static_assert] makes compile-time assertions about static bools.
    • At long last, 'argument modes' no longer exist.
    • The rarely used use mod statement no longer exists.
  • Syntax extensions

    • fail! and assert! accept ~str, &'static str or fmt!-style argument list.
    • Encodable, Decodable, Ord, TotalOrd, TotalEq, DeepClone, Rand, Zero and ToStr can all be automatically derived with #[deriving(...)].
    • The bytes! macro returns a vector of bytes for string, u8, char, and unsuffixed integer literals.
  • Libraries

    • The core crate was renamed to std.
    • The std crate was renamed to extra.
    • More and improved documentation.
    • std: iterator module for external iterator objects.
    • Many old-style (internal, higher-order function) iterators replaced by implementations of Iterator.
    • std: Many old internal vector and string iterators, incl. any, all. removed.
    • std: The finalize method of Drop renamed to drop.
    • std: The drop method now takes &mut self instead of &self.
    • std: The prelude no longer re-exports any modules, only types and traits.
    • std: Prelude additions: print, println, FromStr, ApproxEq, Equiv, Iterator, IteratorUtil, many numeric traits, many tuple traits.
    • std: New numeric traits: Fractional, Real, RealExt, Integer, Ratio, Algebraic, Trigonometric, Exponential, Primitive.
    • std: Tuple traits and accessors defined for up to 12-tuples, e.g. (0, 1, 2).n2() or (0, 1, 2).n2_ref().
    • std: Many types implement Clone.
    • std: path type renamed to Path.
    • std: mut module and Mut type removed.
    • std: Many standalone functions removed in favor of methods and iterators in vec, str. In the future methods will also work as functions.
    • std: reinterpret_cast removed. Use transmute.
    • std: ascii string handling in std::ascii.
    • std: Rand is implemented for ~/@.
    • std: run module for spawning processes overhauled.
    • std: Various atomic types added to unstable::atomic.
    • std: Various types implement Zero.
    • std: LinearMap and LinearSet renamed to HashMap and HashSet.
    • std: Borrowed pointer functions moved from ptr to borrow.
    • std: Added os::mkdir_recursive.
    • std: Added os::glob function performs filesystems globs.
    • std: FuzzyEq renamed to ApproxEq.
    • std: Map now defines pop and swap methods.
    • std: Cell constructors converted to static methods.
    • extra: rc module adds the reference counted pointers, Rc and RcMut.
    • extra: flate module moved from std to extra.
    • extra: fileinput module for iterating over a series of files.
    • extra: Complex number type and complex module.
    • extra: Rational number type and rational module.
    • extra: BigInt, BigUint implement numeric and comparison traits.
    • extra: term uses terminfo now, is more correct.
    • extra: arc functions converted to methods.
    • extra: Implementation of fixed output size variations of SHA-2.
  • Tooling

    • unused_variables lint mode for unused variables (default: warn).
    • unused_unsafe lint mode for detecting unnecessary unsafe blocks (default: warn).
    • unused_mut lint mode for identifying unused mut qualifiers (default: warn).
    • dead_assignment lint mode for unread variables (default: warn).
    • unnecessary_allocation lint mode detects some heap allocations that are immediately borrowed so could be written without allocating (default: warn).
    • missing_doc lint mode (default: allow).
    • unreachable_code lint mode (default: warn).
    • The rusti command has been rewritten and a number of bugs addressed.
    • rustc outputs in color on more terminals.
    • rustc accepts a --link-args flag to pass arguments to the linker.
    • rustc accepts a -Z print-link-args flag for debugging linkage.
    • Compiling with -g will make the binary record information about dynamic borrowcheck failures for debugging.
    • rustdoc has a nicer stylesheet.
    • Various improvements to rustdoc.
    • Improvements to rustpkg (see the detailed release notes).

Rust 0.6

10 Sep 08:08
Compare
Choose a tag to compare
  • ~2100 changes, numerous bugfixes

  • Syntax changes

    • The self type parameter in traits is now spelled Self
    • The self parameter in trait and impl methods must now be explicitly named (for example: fn f(&self) { }). Implicit self is deprecated.
    • Static methods no longer require the static keyword and instead are distinguished by the lack of a self parameter
    • Replaced the Durable trait with the 'static lifetime
    • The old closure type syntax with the trailing sigil has been removed in favor of the more consistent leading sigil
    • super is a keyword, and may be prefixed to paths
    • Trait bounds are separated with instead of whitespace
    • Traits are implemented with impl Trait for Type instead of impl Type: Trait
    • Lifetime syntax is now &'l foo instead of &l/foo
    • The export keyword has finally been removed
    • The move keyword has been removed (see "Semantic changes")
    • The interior mutability qualifier on vectors, [mut T], has been removed. Use &mut [T], etc.
    • mut is no longer valid in ~mut T. Use inherited mutability
    • fail is no longer a keyword. Use fail!()
    • assert is no longer a keyword. Use assert!()
    • log is no longer a keyword. use debug!, etc.
    • 1-tuples may be represented as (T,)
    • Struct fields may no longer be mut. Use inherited mutability, @mut T, core::mut or core::cell
    • extern mod { ... } is no longer valid syntax for foreign function modules. Use extern blocks: extern { ... }
    • Newtype enums removed. Use tuple-structs.
    • Trait implementations no longer support visibility modifiers
    • Pattern matching over vectors improved and expanded
    • const renamed to static to correspond to lifetime name, and make room for future static mut unsafe mutable globals.
    • Replaced #[deriving_eq] with #[deriving(Eq)], etc.
    • Clone implementations can be automatically generated with #[deriving(Clone)]
    • Casts to traits must use a pointer sigil, e.g. @foo as @Bar instead of foo as Bar.
    • Fixed length vector types are now written as [int, .. 3] instead of [int * 3].
    • Fixed length vector types can express the length as a constant expression. (ex: [int, .. GL_BUFFER_SIZE - 2])
  • Semantic changes

    • Types with owned pointers or custom destructors move by default, eliminating the move keyword
    • All foreign functions are considered unsafe
    • &mut is now unaliasable
    • Writes to borrowed @mut pointers are prevented dynamically
    • () has size 0
    • The name of the main function can be customized using #[main]
    • The default type of an inferred closure is &fn instead of @fn
    • use statements may no longer be "chained" - they cannot import identifiers imported by previous use statements
    • use statements are crate relative, importing from the "top" of the crate by default. Paths may be prefixed with super:: or self:: to change the search behavior.
    • Method visibility is inherited from the implementation declaration
    • Structural records have been removed
    • Many more types can be used in static items, including enums 'static-lifetime pointers and vectors
    • Pattern matching over vectors improved and expanded
    • Typechecking of closure types has been overhauled to improve inference and eliminate unsoundness
    • Macros leave scope at the end of modules, unless that module is tagged with #[macro_escape]
  • Libraries

    • Added big integers to std::bigint
    • Removed core::oldcomm module
    • Added pipe-based core::comm module
    • Numeric traits have been reorganized under core::num
    • vec::slice finally returns a slice
    • debug! and friends don't require a format string, e.g. debug!(Foo)
    • Containers reorganized around traits in core::container
    • core::dvec removed, ~[T] is a drop-in replacement
    • core::send_map renamed to core::hashmap
    • std::map removed; replaced with core::hashmap
    • std::treemap reimplemented as an owned balanced tree
    • std::deque and std::smallintmap reimplemented as owned containers
    • core::trie added as a fast ordered map for integer keys
    • Set types added to core::hashmap, core::trie and std::treemap
    • Ord split into Ord and TotalOrd. Ord is still used to overload the comparison operators, whereas TotalOrd is used by certain container types
  • Other

    • Replaced the 'cargo' package manager with 'rustpkg'
    • Added all-purpose 'rust' tool
    • rustc --test now supports benchmarks with the #[bench] attribute
    • rustc now attempts to offer spelling suggestions
    • Improved support for ARM and Android
    • Preliminary MIPS backend
    • Improved foreign function ABI implementation for x86, x86_64
    • Various memory usage improvements
    • Rust code may be embedded in foreign code under limited circumstances
    • Inline assembler supported by new asm!() syntax extension.

Rust 0.5

10 Sep 05:53
Compare
Choose a tag to compare
  • ~900 changes, numerous bugfixes

  • Syntax changes

    • Removed <- move operator
    • Completed the transition from the #fmt extension syntax to fmt!
    • Removed old fixed length vector syntax - [T]/N
    • New token-based quasi-quoters, quote_tokens!, quote_expr!, etc.
    • Macros may now expand to items and statements
    • a.b() is always parsed as a method call, never as a field projection
    • Eq and IterBytes implementations can be automatically generated with #[deriving_eq] and #[deriving_iter_bytes] respectively
    • Removed the special crate language for .rc files
    • Function arguments may consist of any irrefutable pattern
  • Semantic changes

    • & and ~ pointers may point to objects
    • Tuple structs - struct Foo(Bar, Baz). Will replace newtype enums.
    • Enum variants may be structs
    • Destructors can be added to all nominal types with the Drop trait
    • Structs and nullary enum variants may be constants
    • Values that cannot be implicitly copied are now automatically moved without writing move explicitly
    • &T may now be coerced to *T
    • Coercions happen in let statements as well as function calls
    • use statements now take crate-relative paths
    • The module and type namespaces have been merged so that static method names can be resolved under the trait in which they are declared
  • Improved support for language features

    • Trait inheritance works in many scenarios
    • More support for explicit self arguments in methods - self, &self @self, and ~self all generally work as expected
    • Static methods work in more situations
    • Experimental: Traits may declare default methods for the implementations to use
  • Libraries

    • New condition handling system in core::condition
    • Timsort added to std::sort
    • New priority queue, std::priority_queue
    • Pipes for serializable types, `std::flatpipes'
    • Serialization overhauled to be trait-based
    • Expanded getopts definitions
    • Moved futures to std
    • More functions are pure now
    • core::comm renamed to oldcomm. Still deprecated
    • rustdoc and cargo are libraries now
  • Misc

    • Added a preliminary REPL, rusti
    • License changed from MIT to dual MIT/APL2

Rust 0.4

10 Sep 08:08
Compare
Choose a tag to compare
  • ~2000 changes, numerous bugfixes

  • Syntax

    • All keywords are now strict and may not be used as identifiers anywhere
    • Keyword removal: 'again', 'import', 'check', 'new', 'owned', 'send', 'of', 'with', 'to', 'class'.
    • Classes are replaced with simpler structs
    • Explicit method self types
    • ret became return and alt became match
    • import is now use; use is now extern mod`
    • extern mod { ... } is now extern { ... }
    • use mod is the recommended way to import modules
    • pub and priv replace deprecated export lists
    • The syntax of match pattern arms now uses fat arrow (=>)
    • main no longer accepts an args vector; use os::args instead
  • Semantics

    • Trait implementations are now coherent, ala Haskell typeclasses
    • Trait methods may be static
    • Argument modes are deprecated
    • Borrowed pointers are much more mature and recommended for use
    • Strings and vectors in the static region are stored in constant memory
    • Typestate was removed
    • Resolution rewritten to be more reliable
    • Support for 'dual-mode' data structures (freezing and thawing)
  • Libraries

    • Most binary operators can now be overloaded via the traits in `core::ops'
    • std::net::url for representing URLs
    • Sendable hash maps in core::send_map
    • `core::task' gained a (currently unsafe) task-local storage API
  • Concurrency

    • An efficient new intertask communication primitive called the pipe, along with a number of higher-level channel types, in core::pipes
    • std::arc, an atomically reference counted, immutable, shared memory type
    • std::sync, various exotic synchronization tools based on arcs and pipes
    • Futures are now based on pipes and sendable
    • More robust linked task failure
    • Improved task builder API
  • Other

    • Improved error reporting
    • Preliminary JIT support
    • Preliminary work on precise GC
    • Extensive architectural improvements to rustc
    • Begun a transition away from buggy C -based reflection (shape) code to Rust-based (visitor) code
    • All hash functions and tables converted to secure, randomized SipHash

Rust 0.3

10 Sep 08:08
Compare
Choose a tag to compare
  • ~1900 changes, numerous bugfixes

  • New coding conveniences

    • Integer-literal suffix inference
    • Per-item control over warnings, errors
    • #[cfg(windows)] and #[cfg(unix)] attributes
    • Documentation comments
    • More compact closure syntax
    • 'do' expressions for treating higher-order functions as control structures
    • *-patterns (wildcard extended to all constructor fields)
  • Semantic cleanup

    • Name resolution pass and exhaustiveness checker rewritten
    • Region pointers and borrow checking supersede alias analysis
    • Init-ness checking is now provided by a region-based liveness pass instead of the typestate pass; same for last-use analysis
    • Extensive work on region pointers
  • Experimental new language features

    • Slices and fixed-size, interior-allocated vectors
    • #!-comments for lang versioning, shell execution
    • Destructors and iface implementation for classes; type-parameterized classes and class methods
    • 'const' type kind for types that can be used to implement shared-memory concurrency patterns
  • Type reflection

  • Removal of various obsolete features

    • Keywords: 'be', 'prove', 'syntax', 'note', 'mutable', 'bind', 'crust', 'native' (now 'extern'), 'cont' (now 'again')

    • Constructs: do-while loops ('do' repurposed), fn binding, resources (replaced by destructors)

  • Compiler reorganization

    • Syntax-layer of compiler split into separate crate
    • Clang (from LLVM project) integrated into build
    • Typechecker split into sub-modules
  • New library code

    • New time functions
    • Extension methods for many built-in types
    • Arc: atomic-refcount read-only / exclusive-use shared cells
    • Par: parallel map and search routines
    • Extensive work on libuv interface
    • Much vector code moved to libraries
    • Syntax extensions: #line, #col, #file, #mod, #stringify, #include, #include_str, #include_bin
  • Tool improvements

    • Cargo automatically resolves dependencies

Rust 0.2

10 Sep 05:53
Compare
Choose a tag to compare
  • 1500 changes, numerous bugfixes

  • New docs and doc tooling

  • New port: FreeBSD x86_64

  • Compilation model enhancements

    • Generics now specialized, multiply instantiated
    • Functions now inlined across separate crates
  • Scheduling, stack and threading fixes

    • Noticeably improved message-passing performance
    • Explicit schedulers
    • Callbacks from C
    • Helgrind clean
  • Experimental new language features

    • Operator overloading
    • Region pointers
    • Classes
  • Various language extensions

    • C-callback function types: 'crust fn ...'
    • Infinite-loop construct: 'loop { ... }'
    • Shorten 'mutable' to 'mut'
    • Required mutable-local qualifier: 'let mut ...'
    • Basic glob-exporting: 'export foo::*;'
    • Alt now exhaustive, 'alt check' for runtime-checked
    • Block-function form of 'for' loop, with 'break' and 'ret'.
  • New library code

    • AST quasi-quote syntax extension
    • Revived libuv interface
    • New modules: core::{future, iter}, std::arena
    • Merged per-platform std::{os*, fs*} to core::{libc, os}
    • Extensive cleanup, regularization in libstd, libcore

Rust 0.1

10 Sep 08:08
Compare
Choose a tag to compare
  • Most language features work, including:

    • Unique pointers, unique closures, move semantics
    • Interface-constrained generics
    • Static interface dispatch
    • Stack growth
    • Multithread task scheduling
    • Typestate predicates
    • Failure unwinding, destructors
    • Pattern matching and destructuring assignment
    • Lightweight block-lambda syntax
    • Preliminary macro-by-example
  • Compiler works with the following configurations:

    • Linux: x86 and x86_64 hosts and targets
    • macOS: x86 and x86_64 hosts and targets
    • Windows: x86 hosts and targets
  • Cross compilation / multi-target configuration supported.

  • Preliminary API-documentation and package-management tools included.

Known issues:

  • Documentation is incomplete.

  • Performance is below intended target.

  • Standard library APIs are subject to extensive change, reorganization.

  • Language-level versioning is not yet operational - future code will break unexpectedly.