Auto merge of #26844 - steveklabnik:rollup, r=steveklabnik

- Successful merges: #26599, #26761, #26807, #26809, #26825, #26827, #26828, #26832, #26834, #26835
- Failed merges: #26796
This commit is contained in:
bors 2015-07-07 02:26:31 +00:00
commit 26f0cd5de7
9 changed files with 377 additions and 33 deletions

View file

@ -83,6 +83,21 @@ feature. We use the 'fork and pull' model described there.
Please make pull requests against the `master` branch. Please make pull requests against the `master` branch.
Compiling all of `make check` can take a while. When testing your pull request,
consider using one of the more specialized `make` targets to cut down on the
amount of time you have to wait. You need to have built the compiler at least
once before running these will work, but thats only one full build rather than
one each time.
$ make -j8 rustc-stage1 && make check-stage1
is one such example, which builds just `rustc`, and then runs the tests. If
youre adding something to the standard library, try
$ make -j8 check-stage1-std NO_REBUILD=1
This will not rebuild the compiler, but will run the tests.
All pull requests are reviewed by another person. We have a bot, All pull requests are reviewed by another person. We have a bot,
@rust-highfive, that will automatically assign a random person to review your @rust-highfive, that will automatically assign a random person to review your
request. request.
@ -108,6 +123,10 @@ will run all the tests on every platform we support. If it all works out,
[merge-queue]: http://buildbot.rust-lang.org/homu/queue/rust [merge-queue]: http://buildbot.rust-lang.org/homu/queue/rust
Speaking of tests, Rust has a comprehensive test suite. More information about
it can be found
[here](https://github.com/rust-lang/rust-wiki-backup/blob/master/Note-testsuite.md).
## Writing Documentation ## Writing Documentation
Documentation improvements are very welcome. The source of `doc.rust-lang.org` Documentation improvements are very welcome. The source of `doc.rust-lang.org`

View file

@ -2515,9 +2515,8 @@ Here are some examples:
#### Moved and copied types #### Moved and copied types
When a [local variable](#variables) is used as an When a [local variable](#variables) is used as an
[rvalue](#lvalues,-rvalues-and-temporaries) the variable will either be moved [rvalue](#lvalues,-rvalues-and-temporaries), the variable will be copied
or copied, depending on its type. All values whose type implements `Copy` are if its type implements `Copy`. All others are moved.
copied, all others are moved.
### Literal expressions ### Literal expressions
@ -2882,7 +2881,6 @@ operand.
``` ```
# let mut x = 0; # let mut x = 0;
# let y = 0; # let y = 0;
x = y; x = y;
``` ```

View file

@ -533,19 +533,10 @@ attribute turns off Rust's name mangling, so that it is easier to link to.
# FFI and panics # FFI and panics
Its important to be mindful of `panic!`s when working with FFI. This code, Its important to be mindful of `panic!`s when working with FFI. A `panic!`
when called from C, will `abort`: across an FFI boundary is undefined behavior. If youre writing code that may
panic, you should run it in another thread, so that the panic doesnt bubble up
```rust to C:
#[no_mangle]
pub extern fn oh_no() -> ! {
panic!("Oops!");
}
# fn main() {}
```
If youre writing code that may panic, you should run it in another thread,
so that the panic doesnt bubble up to C:
```rust ```rust
use std::thread; use std::thread;

View file

@ -282,6 +282,38 @@ This destructuring behavior works on any compound data type, like
[tuples]: primitive-types.html#tuples [tuples]: primitive-types.html#tuples
[enums]: enums.html [enums]: enums.html
# Ignoring bindings
You can use `_` in a pattern to disregard the value. For example, heres a
`match` against a `Result<T, E>`:
```rust
# let some_value: Result<i32, &'static str> = Err("There was an error");
match some_value {
Ok(value) => println!("got a value: {}", value),
Err(_) => println!("an error occurred"),
}
```
In the first arm, we bind the value inside the `Ok` variant to `value`. But
in the `Err` arm, we use `_` to disregard the specific error, and just print
a general error message.
`_` is valid in any pattern that creates a binding. This can be useful to
ignore parts of a larger structure:
```rust
fn coordinate() -> (i32, i32, i32) {
// generate and return some sort of triple tuple
# (1, 2, 3)
}
let (x, _, z) = coordinate();
```
Here, we bind the first and last element of the tuple to `x` and `z`, but
ignore the middle element.
# Mix and Match # Mix and Match
Whew! Thats a lot of different ways to match things, and they can all be Whew! Thats a lot of different ways to match things, and they can all be

View file

@ -267,11 +267,16 @@ impl<'a> Display for Arguments<'a> {
} }
} }
/// Format trait for the `?` character. Useful for debugging, all types /// Format trait for the `?` character.
/// should implement this. ///
/// `Debug` should format the output in a programmer-facing, debugging context.
/// ///
/// Generally speaking, you should just `derive` a `Debug` implementation. /// Generally speaking, you should just `derive` a `Debug` implementation.
/// ///
/// For more information on formatters, see [the module-level documentation][module].
///
/// [module]: ../index.html
///
/// # Examples /// # Examples
/// ///
/// Deriving an implementation: /// Deriving an implementation:
@ -327,8 +332,39 @@ pub trait Debug {
fn fmt(&self, &mut Formatter) -> Result; fn fmt(&self, &mut Formatter) -> Result;
} }
/// When a value can be semantically expressed as a String, this trait may be /// Format trait for an empty format, `{}`.
/// used. It corresponds to the default format, `{}`. ///
/// `Display` is similar to [`Debug`][debug], but `Display` is for user-facing
/// output, and so cannot be derived.
///
/// [debug]: trait.Debug.html
///
/// For more information on formatters, see [the module-level documentation][module].
///
/// [module]: ../index.html
///
/// # Examples
///
/// Implementing `Display` on a type:
///
/// ```
/// use std::fmt;
///
/// struct Point {
/// x: i32,
/// y: i32,
/// }
///
/// impl fmt::Display for Point {
/// fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
/// write!(f, "({}, {})", self.x, self.y)
/// }
/// }
///
/// let origin = Point { x: 0, y: 0 };
///
/// println!("The origin is: {}", origin);
/// ```
#[rustc_on_unimplemented = "`{Self}` cannot be formatted with the default \ #[rustc_on_unimplemented = "`{Self}` cannot be formatted with the default \
formatter; try using `:?` instead if you are using \ formatter; try using `:?` instead if you are using \
a format string"] a format string"]
@ -339,7 +375,43 @@ pub trait Display {
fn fmt(&self, &mut Formatter) -> Result; fn fmt(&self, &mut Formatter) -> Result;
} }
/// Format trait for the `o` character /// Format trait for the `o` character.
///
/// The `Octal` trait should format its output as a number in base-8.
///
/// For more information on formatters, see [the module-level documentation][module].
///
/// [module]: ../index.html
///
/// # Examples
///
/// Basic usage with `i32`:
///
/// ```
/// let x = 42; // 42 is '52' in octal
///
/// assert_eq!(format!("{:o}", x), "52");
/// ```
///
/// Implementing `Octal` on a type:
///
/// ```
/// use std::fmt;
///
/// struct Length(i32);
///
/// impl fmt::Octal for Length {
/// fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
/// let val = self.0;
///
/// write!(f, "{:o}", val) // delegate to i32's implementation
/// }
/// }
///
/// let l = Length(9);
///
/// println!("l as octal is: {:o}", l);
/// ```
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub trait Octal { pub trait Octal {
/// Formats the value using the given formatter. /// Formats the value using the given formatter.
@ -347,7 +419,43 @@ pub trait Octal {
fn fmt(&self, &mut Formatter) -> Result; fn fmt(&self, &mut Formatter) -> Result;
} }
/// Format trait for the `b` character /// Format trait for the `b` character.
///
/// The `Binary` trait should format its output as a number in binary.
///
/// For more information on formatters, see [the module-level documentation][module].
///
/// [module]: ../index.html
///
/// # Examples
///
/// Basic usage with `i32`:
///
/// ```
/// let x = 42; // 42 is '101010' in binary
///
/// assert_eq!(format!("{:b}", x), "101010");
/// ```
///
/// Implementing `Binary` on a type:
///
/// ```
/// use std::fmt;
///
/// struct Length(i32);
///
/// impl fmt::Binary for Length {
/// fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
/// let val = self.0;
///
/// write!(f, "{:b}", val) // delegate to i32's implementation
/// }
/// }
///
/// let l = Length(107);
///
/// println!("l as binary is: {:b}", l);
/// ```
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub trait Binary { pub trait Binary {
/// Formats the value using the given formatter. /// Formats the value using the given formatter.
@ -355,7 +463,44 @@ pub trait Binary {
fn fmt(&self, &mut Formatter) -> Result; fn fmt(&self, &mut Formatter) -> Result;
} }
/// Format trait for the `x` character /// Format trait for the `x` character.
///
/// The `LowerHex` trait should format its output as a number in hexidecimal, with `a` through `f`
/// in lower case.
///
/// For more information on formatters, see [the module-level documentation][module].
///
/// [module]: ../index.html
///
/// # Examples
///
/// Basic usage with `i32`:
///
/// ```
/// let x = 42; // 42 is '2a' in hex
///
/// assert_eq!(format!("{:x}", x), "2a");
/// ```
///
/// Implementing `LowerHex` on a type:
///
/// ```
/// use std::fmt;
///
/// struct Length(i32);
///
/// impl fmt::LowerHex for Length {
/// fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
/// let val = self.0;
///
/// write!(f, "{:x}", val) // delegate to i32's implementation
/// }
/// }
///
/// let l = Length(9);
///
/// println!("l as hex is: {:x}", l);
/// ```
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub trait LowerHex { pub trait LowerHex {
/// Formats the value using the given formatter. /// Formats the value using the given formatter.
@ -363,7 +508,44 @@ pub trait LowerHex {
fn fmt(&self, &mut Formatter) -> Result; fn fmt(&self, &mut Formatter) -> Result;
} }
/// Format trait for the `X` character /// Format trait for the `X` character.
///
/// The `UpperHex` trait should format its output as a number in hexidecimal, with `A` through `F`
/// in upper case.
///
/// For more information on formatters, see [the module-level documentation][module].
///
/// [module]: ../index.html
///
/// # Examples
///
/// Basic usage with `i32`:
///
/// ```
/// let x = 42; // 42 is '2A' in hex
///
/// assert_eq!(format!("{:X}", x), "2A");
/// ```
///
/// Implementing `UpperHex` on a type:
///
/// ```
/// use std::fmt;
///
/// struct Length(i32);
///
/// impl fmt::UpperHex for Length {
/// fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
/// let val = self.0;
///
/// write!(f, "{:X}", val) // delegate to i32's implementation
/// }
/// }
///
/// let l = Length(9);
///
/// println!("l as hex is: {:X}", l);
/// ```
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub trait UpperHex { pub trait UpperHex {
/// Formats the value using the given formatter. /// Formats the value using the given formatter.
@ -371,7 +553,44 @@ pub trait UpperHex {
fn fmt(&self, &mut Formatter) -> Result; fn fmt(&self, &mut Formatter) -> Result;
} }
/// Format trait for the `p` character /// Format trait for the `p` character.
///
/// The `Pointer` trait should format its output as a memory location. This is commonly presented
/// as hexidecimal.
///
/// For more information on formatters, see [the module-level documentation][module].
///
/// [module]: ../index.html
///
/// # Examples
///
/// Basic usage with `&i32`:
///
/// ```
/// let x = &42;
///
/// let address = format!("{:p}", x); // this produces something like '0x7f06092ac6d0'
/// ```
///
/// Implementing `Pointer` on a type:
///
/// ```
/// use std::fmt;
///
/// struct Length(i32);
///
/// impl fmt::Pointer for Length {
/// fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
/// // use `as` to convert to a `*const T`, which implements Pointer, which we can use
///
/// write!(f, "{:p}", self as *const Length)
/// }
/// }
///
/// let l = Length(42);
///
/// println!("l is in memory here: {:p}", l);
/// ```
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub trait Pointer { pub trait Pointer {
/// Formats the value using the given formatter. /// Formats the value using the given formatter.
@ -379,7 +598,42 @@ pub trait Pointer {
fn fmt(&self, &mut Formatter) -> Result; fn fmt(&self, &mut Formatter) -> Result;
} }
/// Format trait for the `e` character /// Format trait for the `e` character.
///
/// The `LowerExp` trait should format its output in scientific notation with a lower-case `e`.
///
/// For more information on formatters, see [the module-level documentation][module].
///
/// [module]: ../index.html
///
/// # Examples
///
/// Basic usage with `i32`:
///
/// ```
/// let x = 42.0; // 42.0 is '4.2e1' in scientific notation
///
/// assert_eq!(format!("{:e}", x), "4.2e1");
/// ```
///
/// Implementing `LowerExp` on a type:
///
/// ```
/// use std::fmt;
///
/// struct Length(i32);
///
/// impl fmt::LowerExp for Length {
/// fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
/// let val = self.0;
/// write!(f, "{}e1", val / 10)
/// }
/// }
///
/// let l = Length(100);
///
/// println!("l in scientific notation is: {:e}", l);
/// ```
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub trait LowerExp { pub trait LowerExp {
/// Formats the value using the given formatter. /// Formats the value using the given formatter.
@ -387,7 +641,42 @@ pub trait LowerExp {
fn fmt(&self, &mut Formatter) -> Result; fn fmt(&self, &mut Formatter) -> Result;
} }
/// Format trait for the `E` character /// Format trait for the `E` character.
///
/// The `UpperExp` trait should format its output in scientific notation with an upper-case `E`.
///
/// For more information on formatters, see [the module-level documentation][module].
///
/// [module]: ../index.html
///
/// # Examples
///
/// Basic usage with `f32`:
///
/// ```
/// let x = 42.0; // 42.0 is '4.2E1' in scientific notation
///
/// assert_eq!(format!("{:E}", x), "4.2E1");
/// ```
///
/// Implementing `UpperExp` on a type:
///
/// ```
/// use std::fmt;
///
/// struct Length(i32);
///
/// impl fmt::UpperExp for Length {
/// fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
/// let val = self.0;
/// write!(f, "{}E1", val / 10)
/// }
/// }
///
/// let l = Length(100);
///
/// println!("l in scientific notation is: {:E}", l);
/// ```
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub trait UpperExp { pub trait UpperExp {
/// Formats the value using the given formatter. /// Formats the value using the given formatter.

View file

@ -6128,7 +6128,7 @@ pub mod funcs {
use types::os::arch::c95::{c_char, c_uchar, c_int, c_uint, c_ulong, size_t}; use types::os::arch::c95::{c_char, c_uchar, c_int, c_uint, c_ulong, size_t};
extern { extern {
pub fn ioctl(d: c_int, request: c_ulong, ...) -> c_int; pub fn ioctl(fd: c_int, request: c_ulong, ...) -> c_int;
pub fn sysctl(name: *mut c_int, pub fn sysctl(name: *mut c_int,
namelen: c_uint, namelen: c_uint,
oldp: *mut c_void, oldp: *mut c_void,
@ -6160,12 +6160,12 @@ pub mod funcs {
#[cfg(any(target_os = "linux", target_os = "android"))] #[cfg(any(target_os = "linux", target_os = "android"))]
pub mod bsd44 { pub mod bsd44 {
use types::common::c95::{c_void}; use types::common::c95::{c_void};
use types::os::arch::c95::{c_uchar, c_int, size_t}; use types::os::arch::c95::{c_uchar, c_int, c_ulong, size_t};
extern { extern {
#[cfg(not(all(target_os = "android", target_arch = "aarch64")))] #[cfg(not(all(target_os = "android", target_arch = "aarch64")))]
pub fn getdtablesize() -> c_int; pub fn getdtablesize() -> c_int;
pub fn ioctl(d: c_int, request: c_int, ...) -> c_int; pub fn ioctl(fd: c_int, request: c_ulong, ...) -> c_int;
pub fn madvise(addr: *mut c_void, len: size_t, advice: c_int) pub fn madvise(addr: *mut c_void, len: size_t, advice: c_int)
-> c_int; -> c_int;
pub fn mincore(addr: *mut c_void, len: size_t, vec: *mut c_uchar) pub fn mincore(addr: *mut c_void, len: size_t, vec: *mut c_uchar)

View file

@ -1351,7 +1351,7 @@ fn is_discr_reassigned(bcx: Block, discr: &ast::Expr, body: &ast::Expr) -> bool
reassigned: false reassigned: false
}; };
{ {
let infcx = infer::new_infer_ctxt(bcx.tcx(), &bcx.tcx().tables, None, false); let infcx = infer::normalizing_infer_ctxt(bcx.tcx(), &bcx.tcx().tables);
let mut visitor = euv::ExprUseVisitor::new(&mut rc, &infcx); let mut visitor = euv::ExprUseVisitor::new(&mut rc, &infcx);
visitor.walk_expr(body); visitor.walk_expr(body);
} }

View file

@ -936,7 +936,7 @@ pub fn normalize_and_test_predicates<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>,
predicates); predicates);
let tcx = ccx.tcx(); let tcx = ccx.tcx();
let infcx = infer::new_infer_ctxt(tcx, &tcx.tables, None, true); let infcx = infer::normalizing_infer_ctxt(tcx, &tcx.tables);
let mut selcx = traits::SelectionContext::new(&infcx); let mut selcx = traits::SelectionContext::new(&infcx);
let mut fulfill_cx = infcx.fulfillment_cx.borrow_mut(); let mut fulfill_cx = infcx.fulfillment_cx.borrow_mut();
let cause = traits::ObligationCause::dummy(); let cause = traits::ObligationCause::dummy();

View file

@ -0,0 +1,15 @@
// Copyright 2015 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 NonOrd;
fn main() {
let _: Box<Iterator<Item = _>> = Box::new(vec![NonOrd].into_iter());
}