Auto merge of #33900 - GuillaumeGomez:rollup, r=GuillaumeGomez
Rollup of 10 pull requests - Successful merges: #33753, #33815, #33829, #33858, #33865, #33866, #33870, #33874, #33891, #33898 - Failed merges:
This commit is contained in:
commit
ab7c35fa0f
30 changed files with 615 additions and 115 deletions
|
@ -122,6 +122,8 @@ To see a full list of options, run `./configure --help`.
|
||||||
|
|
||||||
Some common make targets are:
|
Some common make targets are:
|
||||||
|
|
||||||
|
- `make tips` - show useful targets, variables and other tips for working with
|
||||||
|
the build system.
|
||||||
- `make rustc-stage1` - build up to (and including) the first stage. For most
|
- `make rustc-stage1` - build up to (and including) the first stage. For most
|
||||||
cases we don't need to build the stage2 compiler, so we can save time by not
|
cases we don't need to build the stage2 compiler, so we can save time by not
|
||||||
building it. The stage1 compiler is a fully functioning compiler and
|
building it. The stage1 compiler is a fully functioning compiler and
|
||||||
|
|
|
@ -966,7 +966,7 @@ impl<T: Clone> Vec<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Appends all elements in a slice to the `Vec`.
|
/// Clones and appends all elements in a slice to the `Vec`.
|
||||||
///
|
///
|
||||||
/// Iterates over the slice `other`, clones each element, and then appends
|
/// Iterates over the slice `other`, clones each element, and then appends
|
||||||
/// it to this `Vec`. The `other` vector is traversed in-order.
|
/// it to this `Vec`. The `other` vector is traversed in-order.
|
||||||
|
|
|
@ -46,14 +46,42 @@
|
||||||
|
|
||||||
use marker::Sized;
|
use marker::Sized;
|
||||||
|
|
||||||
/// A common trait for cloning an object.
|
/// A common trait for the ability to explicitly duplicate an object.
|
||||||
///
|
///
|
||||||
/// This trait can be used with `#[derive]`.
|
/// Differs from `Copy` in that `Copy` is implicit and extremely inexpensive, while
|
||||||
|
/// `Clone` is always explicit and may or may not be expensive. In order to enforce
|
||||||
|
/// these characteristics, Rust does not allow you to reimplement `Copy`, but you
|
||||||
|
/// may reimplement `Clone` and run arbitrary code.
|
||||||
|
///
|
||||||
|
/// Since `Clone` is more general than `Copy`, you can automatically make anything
|
||||||
|
/// `Copy` be `Clone` as well.
|
||||||
|
///
|
||||||
|
/// ## Derivable
|
||||||
|
///
|
||||||
|
/// This trait can be used with `#[derive]` if all fields are `Clone`. The `derive`d
|
||||||
|
/// implementation of `clone()` calls `clone()` on each field.
|
||||||
|
///
|
||||||
|
/// ## How can I implement `Clone`?
|
||||||
///
|
///
|
||||||
/// Types that are `Copy` should have a trivial implementation of `Clone`. More formally:
|
/// Types that are `Copy` should have a trivial implementation of `Clone`. More formally:
|
||||||
/// if `T: Copy`, `x: T`, and `y: &T`, then `let x = y.clone();` is equivalent to `let x = *y;`.
|
/// if `T: Copy`, `x: T`, and `y: &T`, then `let x = y.clone();` is equivalent to `let x = *y;`.
|
||||||
/// Manual implementations should be careful to uphold this invariant; however, unsafe code
|
/// Manual implementations should be careful to uphold this invariant; however, unsafe code
|
||||||
/// must not rely on it to ensure memory safety.
|
/// must not rely on it to ensure memory safety.
|
||||||
|
///
|
||||||
|
/// An example is an array holding more than 32 elements of a type that is `Clone`; the standard
|
||||||
|
/// library only implements `Clone` up until arrays of size 32. In this case, the implementation of
|
||||||
|
/// `Clone` cannot be `derive`d, but can be implemented as:
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// #[derive(Copy)]
|
||||||
|
/// struct Stats {
|
||||||
|
/// frequencies: [i32; 100],
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// impl Clone for Stats {
|
||||||
|
/// fn clone(&self) -> Stats { *self }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
pub trait Clone : Sized {
|
pub trait Clone : Sized {
|
||||||
/// Returns a copy of the value.
|
/// Returns a copy of the value.
|
||||||
|
|
|
@ -53,12 +53,43 @@ use option::Option::{self, Some};
|
||||||
/// symmetrically and transitively: if `T: PartialEq<U>` and `U: PartialEq<V>`
|
/// symmetrically and transitively: if `T: PartialEq<U>` and `U: PartialEq<V>`
|
||||||
/// then `U: PartialEq<T>` and `T: PartialEq<V>`.
|
/// then `U: PartialEq<T>` and `T: PartialEq<V>`.
|
||||||
///
|
///
|
||||||
|
/// ## Derivable
|
||||||
|
///
|
||||||
|
/// This trait can be used with `#[derive]`. When `derive`d on structs, two
|
||||||
|
/// instances are equal if all fields are equal, and not equal if any fields
|
||||||
|
/// are not equal. When `derive`d on enums, each variant is equal to itself
|
||||||
|
/// and not equal to the other variants.
|
||||||
|
///
|
||||||
|
/// ## How can I implement `PartialEq`?
|
||||||
|
///
|
||||||
/// PartialEq only requires the `eq` method to be implemented; `ne` is defined
|
/// PartialEq only requires the `eq` method to be implemented; `ne` is defined
|
||||||
/// in terms of it by default. Any manual implementation of `ne` *must* respect
|
/// in terms of it by default. Any manual implementation of `ne` *must* respect
|
||||||
/// the rule that `eq` is a strict inverse of `ne`; that is, `!(a == b)` if and
|
/// the rule that `eq` is a strict inverse of `ne`; that is, `!(a == b)` if and
|
||||||
/// only if `a != b`.
|
/// only if `a != b`.
|
||||||
///
|
///
|
||||||
/// This trait can be used with `#[derive]`.
|
/// An example implementation for a domain in which two books are considered
|
||||||
|
/// the same book if their ISBN matches, even if the formats differ:
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// enum BookFormat { Paperback, Hardback, Ebook }
|
||||||
|
/// struct Book {
|
||||||
|
/// isbn: i32,
|
||||||
|
/// format: BookFormat,
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// impl PartialEq for Book {
|
||||||
|
/// fn eq(&self, other: &Book) -> bool {
|
||||||
|
/// self.isbn == other.isbn
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// let b1 = Book { isbn: 3, format: BookFormat::Paperback };
|
||||||
|
/// let b2 = Book { isbn: 3, format: BookFormat::Ebook };
|
||||||
|
/// let b3 = Book { isbn: 10, format: BookFormat::Paperback };
|
||||||
|
///
|
||||||
|
/// assert!(b1 == b2);
|
||||||
|
/// assert!(b1 != b3);
|
||||||
|
/// ```
|
||||||
///
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
|
@ -96,7 +127,32 @@ pub trait PartialEq<Rhs: ?Sized = Self> {
|
||||||
/// This property cannot be checked by the compiler, and therefore `Eq` implies
|
/// This property cannot be checked by the compiler, and therefore `Eq` implies
|
||||||
/// `PartialEq`, and has no extra methods.
|
/// `PartialEq`, and has no extra methods.
|
||||||
///
|
///
|
||||||
/// This trait can be used with `#[derive]`.
|
/// ## Derivable
|
||||||
|
///
|
||||||
|
/// This trait can be used with `#[derive]`. When `derive`d, because `Eq` has
|
||||||
|
/// no extra methods, it is only informing the compiler that this is an
|
||||||
|
/// equivalence relation rather than a partial equivalence relation. Note that
|
||||||
|
/// the `derive` strategy requires all fields are `PartialEq`, which isn't
|
||||||
|
/// always desired.
|
||||||
|
///
|
||||||
|
/// ## How can I implement `Eq`?
|
||||||
|
///
|
||||||
|
/// If you cannot use the `derive` strategy, specify that your type implements
|
||||||
|
/// `Eq`, which has no methods:
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// enum BookFormat { Paperback, Hardback, Ebook }
|
||||||
|
/// struct Book {
|
||||||
|
/// isbn: i32,
|
||||||
|
/// format: BookFormat,
|
||||||
|
/// }
|
||||||
|
/// impl PartialEq for Book {
|
||||||
|
/// fn eq(&self, other: &Book) -> bool {
|
||||||
|
/// self.isbn == other.isbn
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// impl Eq for Book {}
|
||||||
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
pub trait Eq: PartialEq<Self> {
|
pub trait Eq: PartialEq<Self> {
|
||||||
// FIXME #13101: this method is used solely by #[deriving] to
|
// FIXME #13101: this method is used solely by #[deriving] to
|
||||||
|
@ -190,8 +246,49 @@ impl Ordering {
|
||||||
/// - total and antisymmetric: exactly one of `a < b`, `a == b` or `a > b` is true; and
|
/// - total and antisymmetric: exactly one of `a < b`, `a == b` or `a > b` is true; and
|
||||||
/// - transitive, `a < b` and `b < c` implies `a < c`. The same must hold for both `==` and `>`.
|
/// - transitive, `a < b` and `b < c` implies `a < c`. The same must hold for both `==` and `>`.
|
||||||
///
|
///
|
||||||
|
/// ## Derivable
|
||||||
|
///
|
||||||
/// This trait can be used with `#[derive]`. When `derive`d, it will produce a lexicographic
|
/// This trait can be used with `#[derive]`. When `derive`d, it will produce a lexicographic
|
||||||
/// ordering based on the top-to-bottom declaration order of the struct's members.
|
/// ordering based on the top-to-bottom declaration order of the struct's members.
|
||||||
|
///
|
||||||
|
/// ## How can I implement `Ord`?
|
||||||
|
///
|
||||||
|
/// `Ord` requires that the type also be `PartialOrd` and `Eq` (which requires `PartialEq`).
|
||||||
|
///
|
||||||
|
/// Then you must define an implementation for `cmp()`. You may find it useful to use
|
||||||
|
/// `cmp()` on your type's fields.
|
||||||
|
///
|
||||||
|
/// Here's an example where you want to sort people by height only, disregarding `id`
|
||||||
|
/// and `name`:
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use std::cmp::Ordering;
|
||||||
|
///
|
||||||
|
/// #[derive(Eq)]
|
||||||
|
/// struct Person {
|
||||||
|
/// id: u32,
|
||||||
|
/// name: String,
|
||||||
|
/// height: u32,
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// impl Ord for Person {
|
||||||
|
/// fn cmp(&self, other: &Person) -> Ordering {
|
||||||
|
/// self.height.cmp(&other.height)
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// impl PartialOrd for Person {
|
||||||
|
/// fn partial_cmp(&self, other: &Person) -> Option<Ordering> {
|
||||||
|
/// Some(self.cmp(other))
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// impl PartialEq for Person {
|
||||||
|
/// fn eq(&self, other: &Person) -> bool {
|
||||||
|
/// self.height == other.height
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
pub trait Ord: Eq + PartialOrd<Self> {
|
pub trait Ord: Eq + PartialOrd<Self> {
|
||||||
/// This method returns an `Ordering` between `self` and `other`.
|
/// This method returns an `Ordering` between `self` and `other`.
|
||||||
|
@ -242,6 +339,13 @@ impl PartialOrd for Ordering {
|
||||||
/// transitively: if `T: PartialOrd<U>` and `U: PartialOrd<V>` then `U: PartialOrd<T>` and `T:
|
/// transitively: if `T: PartialOrd<U>` and `U: PartialOrd<V>` then `U: PartialOrd<T>` and `T:
|
||||||
/// PartialOrd<V>`.
|
/// PartialOrd<V>`.
|
||||||
///
|
///
|
||||||
|
/// ## Derivable
|
||||||
|
///
|
||||||
|
/// This trait can be used with `#[derive]`. When `derive`d, it will produce a lexicographic
|
||||||
|
/// ordering based on the top-to-bottom declaration order of the struct's members.
|
||||||
|
///
|
||||||
|
/// ## How can I implement `Ord`?
|
||||||
|
///
|
||||||
/// PartialOrd only requires implementation of the `partial_cmp` method, with the others generated
|
/// PartialOrd only requires implementation of the `partial_cmp` method, with the others generated
|
||||||
/// from default implementations.
|
/// from default implementations.
|
||||||
///
|
///
|
||||||
|
@ -249,8 +353,64 @@ impl PartialOrd for Ordering {
|
||||||
/// total order. For example, for floating point numbers, `NaN < 0 == false` and `NaN >= 0 ==
|
/// total order. For example, for floating point numbers, `NaN < 0 == false` and `NaN >= 0 ==
|
||||||
/// false` (cf. IEEE 754-2008 section 5.11).
|
/// false` (cf. IEEE 754-2008 section 5.11).
|
||||||
///
|
///
|
||||||
/// This trait can be used with `#[derive]`. When `derive`d, it will produce an ordering
|
/// `PartialOrd` requires your type to be `PartialEq`.
|
||||||
/// based on the top-to-bottom declaration order of the struct's members.
|
///
|
||||||
|
/// If your type is `Ord`, you can implement `partial_cmp()` by using `cmp()`:
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use std::cmp::Ordering;
|
||||||
|
///
|
||||||
|
/// #[derive(Eq)]
|
||||||
|
/// struct Person {
|
||||||
|
/// id: u32,
|
||||||
|
/// name: String,
|
||||||
|
/// height: u32,
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// impl PartialOrd for Person {
|
||||||
|
/// fn partial_cmp(&self, other: &Person) -> Option<Ordering> {
|
||||||
|
/// Some(self.cmp(other))
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// impl Ord for Person {
|
||||||
|
/// fn cmp(&self, other: &Person) -> Ordering {
|
||||||
|
/// self.height.cmp(&other.height)
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// impl PartialEq for Person {
|
||||||
|
/// fn eq(&self, other: &Person) -> bool {
|
||||||
|
/// self.height == other.height
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// You may also find it useful to use `partial_cmp()` on your type`s fields. Here
|
||||||
|
/// is an example of `Person` types who have a floating-point `height` field that
|
||||||
|
/// is the only field to be used for sorting:
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use std::cmp::Ordering;
|
||||||
|
///
|
||||||
|
/// struct Person {
|
||||||
|
/// id: u32,
|
||||||
|
/// name: String,
|
||||||
|
/// height: f64,
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// impl PartialOrd for Person {
|
||||||
|
/// fn partial_cmp(&self, other: &Person) -> Option<Ordering> {
|
||||||
|
/// self.height.partial_cmp(&other.height)
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// impl PartialEq for Person {
|
||||||
|
/// fn eq(&self, other: &Person) -> bool {
|
||||||
|
/// self.height == other.height
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
///
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
|
|
|
@ -9,76 +9,6 @@
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
//! The `Default` trait for types which may have meaningful default values.
|
//! The `Default` trait for types which may have meaningful default values.
|
||||||
//!
|
|
||||||
//! Sometimes, you want to fall back to some kind of default value, and
|
|
||||||
//! don't particularly care what it is. This comes up often with `struct`s
|
|
||||||
//! that define a set of options:
|
|
||||||
//!
|
|
||||||
//! ```
|
|
||||||
//! # #[allow(dead_code)]
|
|
||||||
//! struct SomeOptions {
|
|
||||||
//! foo: i32,
|
|
||||||
//! bar: f32,
|
|
||||||
//! }
|
|
||||||
//! ```
|
|
||||||
//!
|
|
||||||
//! How can we define some default values? You can use `Default`:
|
|
||||||
//!
|
|
||||||
//! ```
|
|
||||||
//! # #[allow(dead_code)]
|
|
||||||
//! #[derive(Default)]
|
|
||||||
//! struct SomeOptions {
|
|
||||||
//! foo: i32,
|
|
||||||
//! bar: f32,
|
|
||||||
//! }
|
|
||||||
//!
|
|
||||||
//!
|
|
||||||
//! fn main() {
|
|
||||||
//! let options: SomeOptions = Default::default();
|
|
||||||
//! }
|
|
||||||
//! ```
|
|
||||||
//!
|
|
||||||
//! Now, you get all of the default values. Rust implements `Default` for various primitives types.
|
|
||||||
//! If you have your own type, you need to implement `Default` yourself:
|
|
||||||
//!
|
|
||||||
//! ```
|
|
||||||
//! # #![allow(dead_code)]
|
|
||||||
//! enum Kind {
|
|
||||||
//! A,
|
|
||||||
//! B,
|
|
||||||
//! C,
|
|
||||||
//! }
|
|
||||||
//!
|
|
||||||
//! impl Default for Kind {
|
|
||||||
//! fn default() -> Kind { Kind::A }
|
|
||||||
//! }
|
|
||||||
//!
|
|
||||||
//! #[derive(Default)]
|
|
||||||
//! struct SomeOptions {
|
|
||||||
//! foo: i32,
|
|
||||||
//! bar: f32,
|
|
||||||
//! baz: Kind,
|
|
||||||
//! }
|
|
||||||
//!
|
|
||||||
//!
|
|
||||||
//! fn main() {
|
|
||||||
//! let options: SomeOptions = Default::default();
|
|
||||||
//! }
|
|
||||||
//! ```
|
|
||||||
//!
|
|
||||||
//! If you want to override a particular option, but still retain the other defaults:
|
|
||||||
//!
|
|
||||||
//! ```
|
|
||||||
//! # #[allow(dead_code)]
|
|
||||||
//! # #[derive(Default)]
|
|
||||||
//! # struct SomeOptions {
|
|
||||||
//! # foo: i32,
|
|
||||||
//! # bar: f32,
|
|
||||||
//! # }
|
|
||||||
//! fn main() {
|
|
||||||
//! let options = SomeOptions { foo: 42, ..Default::default() };
|
|
||||||
//! }
|
|
||||||
//! ```
|
|
||||||
|
|
||||||
#![stable(feature = "rust1", since = "1.0.0")]
|
#![stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
|
||||||
|
@ -86,8 +16,72 @@ use marker::Sized;
|
||||||
|
|
||||||
/// A trait for giving a type a useful default value.
|
/// A trait for giving a type a useful default value.
|
||||||
///
|
///
|
||||||
/// A struct can derive default implementations of `Default` for basic types using
|
/// Sometimes, you want to fall back to some kind of default value, and
|
||||||
/// `#[derive(Default)]`.
|
/// don't particularly care what it is. This comes up often with `struct`s
|
||||||
|
/// that define a set of options:
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// # #[allow(dead_code)]
|
||||||
|
/// struct SomeOptions {
|
||||||
|
/// foo: i32,
|
||||||
|
/// bar: f32,
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// How can we define some default values? You can use `Default`:
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// # #[allow(dead_code)]
|
||||||
|
/// #[derive(Default)]
|
||||||
|
/// struct SomeOptions {
|
||||||
|
/// foo: i32,
|
||||||
|
/// bar: f32,
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
///
|
||||||
|
/// fn main() {
|
||||||
|
/// let options: SomeOptions = Default::default();
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// Now, you get all of the default values. Rust implements `Default` for various primitives types.
|
||||||
|
///
|
||||||
|
/// If you want to override a particular option, but still retain the other defaults:
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// # #[allow(dead_code)]
|
||||||
|
/// # #[derive(Default)]
|
||||||
|
/// # struct SomeOptions {
|
||||||
|
/// # foo: i32,
|
||||||
|
/// # bar: f32,
|
||||||
|
/// # }
|
||||||
|
/// fn main() {
|
||||||
|
/// let options = SomeOptions { foo: 42, ..Default::default() };
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// ## Derivable
|
||||||
|
///
|
||||||
|
/// This trait can be used with `#[derive]` if all of the type's fields implement
|
||||||
|
/// `Default`. When `derive`d, it will use the default value for each field's type.
|
||||||
|
///
|
||||||
|
/// ## How can I implement `Default`?
|
||||||
|
///
|
||||||
|
/// Provide an implementation for the `default()` method that returns the value of
|
||||||
|
/// your type that should be the default:
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// # #![allow(dead_code)]
|
||||||
|
/// enum Kind {
|
||||||
|
/// A,
|
||||||
|
/// B,
|
||||||
|
/// C,
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// impl Default for Kind {
|
||||||
|
/// fn default() -> Kind { Kind::A }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
///
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
|
|
|
@ -318,7 +318,11 @@ impl<'a> Display for Arguments<'a> {
|
||||||
///
|
///
|
||||||
/// [module]: ../../std/fmt/index.html
|
/// [module]: ../../std/fmt/index.html
|
||||||
///
|
///
|
||||||
/// This trait can be used with `#[derive]`.
|
/// This trait can be used with `#[derive]` if all fields implement `Debug`. When
|
||||||
|
/// `derive`d for structs, it will use the name of the `struct`, then `{`, then a
|
||||||
|
/// comma-separated list of each field's name and `Debug` value, then `}`. For
|
||||||
|
/// `enum`s, it will use the name of the variant and, if applicable, `(`, then the
|
||||||
|
/// `Debug` values of the fields, then `)`.
|
||||||
///
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
//! ```
|
//! ```
|
||||||
//!
|
//!
|
||||||
//! If you need more control over how a value is hashed, you need to implement
|
//! If you need more control over how a value is hashed, you need to implement
|
||||||
//! the trait `Hash`:
|
//! the `Hash` trait:
|
||||||
//!
|
//!
|
||||||
//! ```rust
|
//! ```rust
|
||||||
//! use std::hash::{Hash, Hasher, SipHasher};
|
//! use std::hash::{Hash, Hasher, SipHasher};
|
||||||
|
@ -97,7 +97,33 @@ mod sip;
|
||||||
/// In other words, if two keys are equal, their hashes should also be equal.
|
/// In other words, if two keys are equal, their hashes should also be equal.
|
||||||
/// `HashMap` and `HashSet` both rely on this behavior.
|
/// `HashMap` and `HashSet` both rely on this behavior.
|
||||||
///
|
///
|
||||||
/// This trait can be used with `#[derive]`.
|
/// ## Derivable
|
||||||
|
///
|
||||||
|
/// This trait can be used with `#[derive]` if all fields implement `Hash`.
|
||||||
|
/// When `derive`d, the resulting hash will be the combination of the values
|
||||||
|
/// from calling `.hash()` on each field.
|
||||||
|
///
|
||||||
|
/// ## How can I implement `Hash`?
|
||||||
|
///
|
||||||
|
/// If you need more control over how a value is hashed, you need to implement
|
||||||
|
/// the `Hash` trait:
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use std::hash::{Hash, Hasher};
|
||||||
|
///
|
||||||
|
/// struct Person {
|
||||||
|
/// id: u32,
|
||||||
|
/// name: String,
|
||||||
|
/// phone: u64,
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// impl Hash for Person {
|
||||||
|
/// fn hash<H: Hasher>(&self, state: &mut H) {
|
||||||
|
/// self.id.hash(state);
|
||||||
|
/// self.phone.hash(state);
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
pub trait Hash {
|
pub trait Hash {
|
||||||
/// Feeds this value into the state given, updating the hasher as necessary.
|
/// Feeds this value into the state given, updating the hasher as necessary.
|
||||||
|
|
|
@ -136,6 +136,26 @@ pub trait Unsize<T: ?Sized> {
|
||||||
/// the trait `Copy` may not be implemented for this type; field `points` does not implement `Copy`
|
/// the trait `Copy` may not be implemented for this type; field `points` does not implement `Copy`
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
|
/// ## When can my type _not_ be `Copy`?
|
||||||
|
///
|
||||||
|
/// Some types can't be copied safely. For example, copying `&mut T` would create an aliased
|
||||||
|
/// mutable reference, and copying `String` would result in two attempts to free the same buffer.
|
||||||
|
///
|
||||||
|
/// Generalizing the latter case, any type implementing `Drop` can't be `Copy`, because it's
|
||||||
|
/// managing some resource besides its own `size_of::<T>()` bytes.
|
||||||
|
///
|
||||||
|
/// ## When should my type be `Copy`?
|
||||||
|
///
|
||||||
|
/// Generally speaking, if your type _can_ implement `Copy`, it should. There's one important thing
|
||||||
|
/// to consider though: if you think your type may _not_ be able to implement `Copy` in the future,
|
||||||
|
/// then it might be prudent to not implement `Copy`. This is because removing `Copy` is a breaking
|
||||||
|
/// change: that second example would fail to compile if we made `Foo` non-`Copy`.
|
||||||
|
///
|
||||||
|
/// ## Derivable
|
||||||
|
///
|
||||||
|
/// This trait can be used with `#[derive]` if all of its components implement `Copy` and the type
|
||||||
|
/// implements `Clone`. The implementation will copy the bytes of each field using `memcpy`.
|
||||||
|
///
|
||||||
/// ## How can I implement `Copy`?
|
/// ## How can I implement `Copy`?
|
||||||
///
|
///
|
||||||
/// There are two ways to implement `Copy` on your type:
|
/// There are two ways to implement `Copy` on your type:
|
||||||
|
@ -155,25 +175,6 @@ pub trait Unsize<T: ?Sized> {
|
||||||
///
|
///
|
||||||
/// There is a small difference between the two: the `derive` strategy will also place a `Copy`
|
/// There is a small difference between the two: the `derive` strategy will also place a `Copy`
|
||||||
/// bound on type parameters, which isn't always desired.
|
/// bound on type parameters, which isn't always desired.
|
||||||
///
|
|
||||||
/// ## When can my type _not_ be `Copy`?
|
|
||||||
///
|
|
||||||
/// Some types can't be copied safely. For example, copying `&mut T` would create an aliased
|
|
||||||
/// mutable reference, and copying `String` would result in two attempts to free the same buffer.
|
|
||||||
///
|
|
||||||
/// Generalizing the latter case, any type implementing `Drop` can't be `Copy`, because it's
|
|
||||||
/// managing some resource besides its own `size_of::<T>()` bytes.
|
|
||||||
///
|
|
||||||
/// ## When should my type be `Copy`?
|
|
||||||
///
|
|
||||||
/// Generally speaking, if your type _can_ implement `Copy`, it should. There's one important thing
|
|
||||||
/// to consider though: if you think your type may _not_ be able to implement `Copy` in the future,
|
|
||||||
/// then it might be prudent to not implement `Copy`. This is because removing `Copy` is a breaking
|
|
||||||
/// change: that second example would fail to compile if we made `Foo` non-`Copy`.
|
|
||||||
///
|
|
||||||
/// # Derivable
|
|
||||||
///
|
|
||||||
/// This trait can be used with `#[derive]`.
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
#[lang = "copy"]
|
#[lang = "copy"]
|
||||||
pub trait Copy : Clone {
|
pub trait Copy : Clone {
|
||||||
|
|
|
@ -179,7 +179,7 @@ use std::io::prelude::*;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::slice;
|
use std::slice;
|
||||||
use std::sync::{Once, Mutex, ONCE_INIT};
|
use std::sync::{Mutex, ONCE_INIT, Once};
|
||||||
|
|
||||||
use directive::LOG_LEVEL_NAMES;
|
use directive::LOG_LEVEL_NAMES;
|
||||||
|
|
||||||
|
@ -290,9 +290,7 @@ pub fn log(level: u32, loc: &'static LogLocation, args: fmt::Arguments) {
|
||||||
// frob the slot while we're doing the logging. This will destroy any logger
|
// frob the slot while we're doing the logging. This will destroy any logger
|
||||||
// set during logging.
|
// set during logging.
|
||||||
let logger = LOCAL_LOGGER.with(|s| s.borrow_mut().take());
|
let logger = LOCAL_LOGGER.with(|s| s.borrow_mut().take());
|
||||||
let mut logger = logger.unwrap_or_else(|| {
|
let mut logger = logger.unwrap_or_else(|| Box::new(DefaultLogger { handle: io::stderr() }));
|
||||||
Box::new(DefaultLogger { handle: io::stderr() })
|
|
||||||
});
|
|
||||||
logger.log(&LogRecord {
|
logger.log(&LogRecord {
|
||||||
level: LogLevel(level),
|
level: LogLevel(level),
|
||||||
args: args,
|
args: args,
|
||||||
|
|
|
@ -1168,12 +1168,32 @@ discriminant values so that they fit within the existing type.
|
||||||
"##,
|
"##,
|
||||||
|
|
||||||
E0084: r##"
|
E0084: r##"
|
||||||
|
An unsupported representation was attempted on a zero-variant enum.
|
||||||
|
|
||||||
|
Erroneous code example:
|
||||||
|
|
||||||
|
```compile_fail
|
||||||
|
#[repr(i32)]
|
||||||
|
enum NightWatch {} // error: unsupported representation for zero-variant enum
|
||||||
|
```
|
||||||
|
|
||||||
It is impossible to define an integer type to be used to represent zero-variant
|
It is impossible to define an integer type to be used to represent zero-variant
|
||||||
enum values because there are no zero-variant enum values. There is no way to
|
enum values because there are no zero-variant enum values. There is no way to
|
||||||
construct an instance of the following type using only safe code:
|
construct an instance of the following type using only safe code. So you have
|
||||||
|
two solutions. Either you add variants in your enum:
|
||||||
|
|
||||||
```
|
```
|
||||||
enum Empty {}
|
#[repr(i32)]
|
||||||
|
enum NightWatch {
|
||||||
|
JohnSnow,
|
||||||
|
Commander,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
or you remove the integer represention of your enum:
|
||||||
|
|
||||||
|
```
|
||||||
|
enum NightWatch {}
|
||||||
```
|
```
|
||||||
"##,
|
"##,
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,10 @@ h2, h3:not(.impl):not(.method):not(.type):not(.tymethod), h4:not(.method):not(.t
|
||||||
background-color: white;
|
background-color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div.stability > em > code {
|
||||||
|
background-color: initial;
|
||||||
|
}
|
||||||
|
|
||||||
.docblock code {
|
.docblock code {
|
||||||
background-color: #F5F5F5;
|
background-color: #F5F5F5;
|
||||||
}
|
}
|
||||||
|
|
|
@ -251,7 +251,7 @@ impl PartialOrd for Ipv4Addr {
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl Ord for Ipv4Addr {
|
impl Ord for Ipv4Addr {
|
||||||
fn cmp(&self, other: &Ipv4Addr) -> Ordering {
|
fn cmp(&self, other: &Ipv4Addr) -> Ordering {
|
||||||
self.octets().cmp(&other.octets())
|
ntoh(self.inner.s_addr).cmp(&ntoh(other.inner.s_addr))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2683,7 +2683,10 @@ impl<'a> Parser<'a> {
|
||||||
return Ok(TokenTree::Token(sp, SpecialVarNt(SpecialMacroVar::CrateMacroVar)));
|
return Ok(TokenTree::Token(sp, SpecialVarNt(SpecialMacroVar::CrateMacroVar)));
|
||||||
} else {
|
} else {
|
||||||
sp = mk_sp(sp.lo, self.span.hi);
|
sp = mk_sp(sp.lo, self.span.hi);
|
||||||
self.parse_ident()?
|
self.parse_ident().unwrap_or_else(|mut e| {
|
||||||
|
e.emit();
|
||||||
|
keywords::Invalid.ident()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
token::SubstNt(name) => {
|
token::SubstNt(name) => {
|
||||||
|
@ -2788,14 +2791,14 @@ impl<'a> Parser<'a> {
|
||||||
let span = Span { hi: close_span.hi, ..pre_span };
|
let span = Span { hi: close_span.hi, ..pre_span };
|
||||||
|
|
||||||
match self.token {
|
match self.token {
|
||||||
// Correct delmiter.
|
// Correct delimiter.
|
||||||
token::CloseDelim(d) if d == delim => {
|
token::CloseDelim(d) if d == delim => {
|
||||||
self.open_braces.pop().unwrap();
|
self.open_braces.pop().unwrap();
|
||||||
|
|
||||||
// Parse the close delimiter.
|
// Parse the close delimiter.
|
||||||
self.bump();
|
self.bump();
|
||||||
}
|
}
|
||||||
// Incorect delimiter.
|
// Incorrect delimiter.
|
||||||
token::CloseDelim(other) => {
|
token::CloseDelim(other) => {
|
||||||
let token_str = self.this_token_to_string();
|
let token_str = self.this_token_to_string();
|
||||||
let mut err = self.diagnostic().struct_span_err(self.span,
|
let mut err = self.diagnostic().struct_span_err(self.span,
|
||||||
|
@ -2810,9 +2813,9 @@ impl<'a> Parser<'a> {
|
||||||
|
|
||||||
self.open_braces.pop().unwrap();
|
self.open_braces.pop().unwrap();
|
||||||
|
|
||||||
// If the incorrect delimter matches an earlier opening
|
// If the incorrect delimiter matches an earlier opening
|
||||||
// delimiter, then don't consume it (it can be used to
|
// delimiter, then don't consume it (it can be used to
|
||||||
// close the earlier one)Otherwise, consume it.
|
// close the earlier one). Otherwise, consume it.
|
||||||
// E.g., we try to recover from:
|
// E.g., we try to recover from:
|
||||||
// fn foo() {
|
// fn foo() {
|
||||||
// bar(baz(
|
// bar(baz(
|
||||||
|
@ -2826,7 +2829,7 @@ impl<'a> Parser<'a> {
|
||||||
// and an error emitted then. Thus we don't pop from
|
// and an error emitted then. Thus we don't pop from
|
||||||
// self.open_braces here.
|
// self.open_braces here.
|
||||||
},
|
},
|
||||||
_ => unreachable!(),
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(TokenTree::Delimited(span, Rc::new(Delimited {
|
Ok(TokenTree::Delimited(span, Rc::new(Delimited {
|
||||||
|
@ -2840,7 +2843,7 @@ impl<'a> Parser<'a> {
|
||||||
// invariants: the current token is not a left-delimiter,
|
// invariants: the current token is not a left-delimiter,
|
||||||
// not an EOF, and not the desired right-delimiter (if
|
// not an EOF, and not the desired right-delimiter (if
|
||||||
// it were, parse_seq_to_before_end would have prevented
|
// it were, parse_seq_to_before_end would have prevented
|
||||||
// reaching this point.
|
// reaching this point).
|
||||||
maybe_whole!(deref self, NtTT);
|
maybe_whole!(deref self, NtTT);
|
||||||
match self.token {
|
match self.token {
|
||||||
token::CloseDelim(_) => {
|
token::CloseDelim(_) => {
|
||||||
|
|
15
src/test/compile-fail/E0084.rs
Normal file
15
src/test/compile-fail/E0084.rs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
#[repr(i32)]
|
||||||
|
enum Foo {} //~ ERROR E0084
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
}
|
15
src/test/compile-fail/E0087.rs
Normal file
15
src/test/compile-fail/E0087.rs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
fn foo<T>() {}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
foo::<f64, bool>(); //~ ERROR E0087
|
||||||
|
}
|
15
src/test/compile-fail/E0088.rs
Normal file
15
src/test/compile-fail/E0088.rs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
fn f() {}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
f::<'static>(); //~ ERROR E0088
|
||||||
|
}
|
15
src/test/compile-fail/E0089.rs
Normal file
15
src/test/compile-fail/E0089.rs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
fn foo<T, U>() {}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
foo::<f64>(); //~ ERROR E0089
|
||||||
|
}
|
15
src/test/compile-fail/E0091.rs
Normal file
15
src/test/compile-fail/E0091.rs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
type Foo<T> = u32; //~ ERROR E0091
|
||||||
|
type Foo2<A, B> = Box<A>; //~ ERROR E0091
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
}
|
17
src/test/compile-fail/E0092.rs
Normal file
17
src/test/compile-fail/E0092.rs
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
#![feature(intrinsics)]
|
||||||
|
extern "rust-intrinsic" {
|
||||||
|
fn atomic_foo(); //~ ERROR E0092
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
}
|
17
src/test/compile-fail/E0093.rs
Normal file
17
src/test/compile-fail/E0093.rs
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
#![feature(intrinsics)]
|
||||||
|
extern "rust-intrinsic" {
|
||||||
|
fn foo(); //~ ERROR E0093
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
}
|
17
src/test/compile-fail/E0094.rs
Normal file
17
src/test/compile-fail/E0094.rs
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
#![feature(intrinsics)]
|
||||||
|
extern "rust-intrinsic" {
|
||||||
|
fn size_of<T, U>() -> usize; //~ ERROR E0094
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
}
|
13
src/test/compile-fail/E0101.rs
Normal file
13
src/test/compile-fail/E0101.rs
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let x = |_| {}; //~ ERROR E0101
|
||||||
|
}
|
13
src/test/compile-fail/E0102.rs
Normal file
13
src/test/compile-fail/E0102.rs
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let x = []; //~ ERROR E0102
|
||||||
|
}
|
21
src/test/compile-fail/E0106.rs
Normal file
21
src/test/compile-fail/E0106.rs
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
struct Foo {
|
||||||
|
x: &bool, //~ ERROR E0106
|
||||||
|
}
|
||||||
|
enum Bar {
|
||||||
|
A(u8),
|
||||||
|
B(&bool), //~ ERROR E0106
|
||||||
|
}
|
||||||
|
type MyStr = &str; //~ ERROR E0106
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
}
|
25
src/test/compile-fail/E0107.rs
Normal file
25
src/test/compile-fail/E0107.rs
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
struct Foo<'a>(&'a str);
|
||||||
|
|
||||||
|
enum Bar {
|
||||||
|
A,
|
||||||
|
B,
|
||||||
|
C,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Baz<'a> {
|
||||||
|
foo: Foo, //~ ERROR E0107
|
||||||
|
bar: Bar<'a>, //~ ERROR E0107
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
}
|
14
src/test/compile-fail/E0109.rs
Normal file
14
src/test/compile-fail/E0109.rs
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
type X = u32<i32>; //~ ERROR E0109
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
}
|
14
src/test/compile-fail/E0110.rs
Normal file
14
src/test/compile-fail/E0110.rs
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
type X = u32<'static>; //~ ERROR E0110
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
}
|
14
src/test/compile-fail/E0116.rs
Normal file
14
src/test/compile-fail/E0116.rs
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
impl Vec<u8> {} //~ ERROR E0116
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
}
|
|
@ -9,6 +9,8 @@
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
// ignore-android
|
// ignore-android
|
||||||
|
// ignore-arm
|
||||||
|
// ignore-aarch64
|
||||||
|
|
||||||
#![feature(asm, rustc_attrs)]
|
#![feature(asm, rustc_attrs)]
|
||||||
|
|
||||||
|
|
18
src/test/parse-fail/issue-33569.rs
Normal file
18
src/test/parse-fail/issue-33569.rs
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
// compile-flags: -Z no-analysis
|
||||||
|
|
||||||
|
macro_rules! foo {
|
||||||
|
{ $+ } => { //~ ERROR expected identifier, found `+`
|
||||||
|
$(x)(y) //~ ERROR expected `*` or `+`
|
||||||
|
//~^ ERROR no rules expected the token `y`
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue