Auto merge of #31873 - Manishearth:rollup, r=Manishearth
- Successful merges: #31677, #31784, #31839, #31842, #31843, #31850, #31863, #31868, #31870 - Failed merges:
This commit is contained in:
commit
f6f050d090
17 changed files with 138 additions and 62 deletions
|
|
@ -311,10 +311,12 @@ for i in (1..100).filter(|&x| x % 2 == 0) {
|
|||
```
|
||||
|
||||
This will print all of the even numbers between one and a hundred.
|
||||
(Note that because `filter` doesn't consume the elements that are
|
||||
being iterated over, it is passed a reference to each element, and
|
||||
thus the filter predicate uses the `&x` pattern to extract the integer
|
||||
itself.)
|
||||
(Note that, unlike `map`, the closure passed to `filter` is passed a reference
|
||||
to the element instead of the element itself. The filter predicate here uses
|
||||
the `&x` pattern to extract the integer. The filter closure is passed a
|
||||
reference because it returns `true` or `false` instead of the element,
|
||||
so the `filter` implementation must retain ownership to put the elements
|
||||
into the newly constructed iterator.)
|
||||
|
||||
You can chain all three things together: start with an iterator, adapt it
|
||||
a few times, and then consume the result. Check it out:
|
||||
|
|
|
|||
|
|
@ -157,7 +157,7 @@ this point of time). These two parts of the vector (the one on the stack and
|
|||
one on the heap) must agree with each other at all times with regards to
|
||||
things like the length, capacity etc.
|
||||
|
||||
When we move `v` to `v2`, rust actually does a bitwise copy of the vector
|
||||
When we move `v` to `v2`, Rust actually does a bitwise copy of the vector
|
||||
object `v` into the stack allocation represented by `v2`. This shallow copy
|
||||
does not create a copy of the heap allocation containing the actual data.
|
||||
Which means that there would be two pointers to the contents of the vector
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ These reprs have no effect on a struct.
|
|||
|
||||
# repr(packed)
|
||||
|
||||
`repr(packed)` forces rust to strip any padding, and only align the type to a
|
||||
`repr(packed)` forces Rust to strip any padding, and only align the type to a
|
||||
byte. This may improve the memory footprint, but will likely have other negative
|
||||
side-effects.
|
||||
|
||||
|
|
|
|||
|
|
@ -841,8 +841,8 @@ extern crate std as ruststd; // linking to 'std' under another name
|
|||
|
||||
A _use declaration_ creates one or more local name bindings synonymous with
|
||||
some other [path](#paths). Usually a `use` declaration is used to shorten the
|
||||
path required to refer to a module item. These declarations may appear at the
|
||||
top of [modules](#modules) and [blocks](grammar.html#block-expressions).
|
||||
path required to refer to a module item. These declarations may appear in
|
||||
[modules](#modules) and [blocks](grammar.html#block-expressions), usually at the top.
|
||||
|
||||
> **Note**: Unlike in many languages,
|
||||
> `use` declarations in Rust do *not* declare linkage dependency with external crates.
|
||||
|
|
@ -1764,7 +1764,7 @@ pub mod submodule {
|
|||
# fn main() {}
|
||||
```
|
||||
|
||||
For a rust program to pass the privacy checking pass, all paths must be valid
|
||||
For a Rust program to pass the privacy checking pass, all paths must be valid
|
||||
accesses given the two rules above. This includes all use statements,
|
||||
expressions, types, etc.
|
||||
|
||||
|
|
@ -3564,8 +3564,9 @@ Each instance of a trait object includes:
|
|||
each method of `SomeTrait` that `T` implements, a pointer to `T`'s
|
||||
implementation (i.e. a function pointer).
|
||||
|
||||
The purpose of trait objects is to permit "late binding" of methods. A call to
|
||||
a method on a trait object is only resolved to a vtable entry at compile time.
|
||||
The purpose of trait objects is to permit "late binding" of methods. Calling a
|
||||
method on a trait object results in virtual dispatch at runtime: that is, a
|
||||
function pointer is loaded from the trait object vtable and invoked indirectly.
|
||||
The actual implementation for each vtable entry can vary on an object-by-object
|
||||
basis.
|
||||
|
||||
|
|
|
|||
|
|
@ -407,7 +407,7 @@ impl<T> [T] {
|
|||
}
|
||||
|
||||
/// Returns an iterator over `size` elements of the slice at a
|
||||
/// time. The chunks do not overlap. If `size` does not divide the
|
||||
/// time. The chunks are slices and do not overlap. If `size` does not divide the
|
||||
/// length of the slice, then the last chunk will not have length
|
||||
/// `size`.
|
||||
///
|
||||
|
|
@ -433,7 +433,7 @@ impl<T> [T] {
|
|||
}
|
||||
|
||||
/// Returns an iterator over `chunk_size` elements of the slice at a time.
|
||||
/// The chunks are mutable and do not overlap. If `chunk_size` does
|
||||
/// The chunks are mutable slices, and do not overlap. If `chunk_size` does
|
||||
/// not divide the length of the slice, then the last chunk will not
|
||||
/// have length `chunk_size`.
|
||||
///
|
||||
|
|
|
|||
|
|
@ -135,6 +135,49 @@ use super::range::RangeArgument;
|
|||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// # Indexing
|
||||
///
|
||||
/// The Vec type allows to access values by index, because it implements the
|
||||
/// `Index` trait. An example will be more explicit:
|
||||
///
|
||||
/// ```
|
||||
/// let v = vec!(0, 2, 4, 6);
|
||||
/// println!("{}", v[1]); // it will display '2'
|
||||
/// ```
|
||||
///
|
||||
/// However be careful: if you try to access an index which isn't in the Vec,
|
||||
/// your software will panic! You cannot do this:
|
||||
///
|
||||
/// ```ignore
|
||||
/// let v = vec!(0, 2, 4, 6);
|
||||
/// println!("{}", v[6]); // it will panic!
|
||||
/// ```
|
||||
///
|
||||
/// In conclusion: always check if the index you want to get really exists
|
||||
/// before doing it.
|
||||
///
|
||||
/// # Slicing
|
||||
///
|
||||
/// A Vec can be mutable. Slices, on the other hand, are read-only objects.
|
||||
/// To get a slice, use "&". Example:
|
||||
///
|
||||
/// ```
|
||||
/// fn read_slice(slice: &[usize]) {
|
||||
/// // ...
|
||||
/// }
|
||||
///
|
||||
/// let v = vec!(0, 1);
|
||||
/// read_slice(&v);
|
||||
///
|
||||
/// // ... and that's all!
|
||||
/// // you can also do it like this:
|
||||
/// let x : &[usize] = &v;
|
||||
/// ```
|
||||
///
|
||||
/// In Rust, it's more common to pass slices as arguments rather than vectors
|
||||
/// when you just want to provide a read access. The same goes for String and
|
||||
/// &str.
|
||||
///
|
||||
/// # Capacity and reallocation
|
||||
///
|
||||
/// The capacity of a vector is the amount of space allocated for any future
|
||||
|
|
|
|||
|
|
@ -331,9 +331,8 @@ impl Matches {
|
|||
/// Returns the string argument supplied to one of several matching options or `None`.
|
||||
pub fn opts_str(&self, names: &[String]) -> Option<String> {
|
||||
for nm in names {
|
||||
match self.opt_val(&nm[..]) {
|
||||
Some(Val(ref s)) => return Some(s.clone()),
|
||||
_ => (),
|
||||
if let Some(Val(ref s)) = self.opt_val(&nm[..]) {
|
||||
return Some(s.clone())
|
||||
}
|
||||
}
|
||||
None
|
||||
|
|
|
|||
|
|
@ -226,9 +226,8 @@ fn symbol_hash<'tcx>(tcx: &ty::ctxt<'tcx>,
|
|||
}
|
||||
|
||||
fn get_symbol_hash<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>, t: Ty<'tcx>) -> String {
|
||||
match ccx.type_hashcodes().borrow().get(&t) {
|
||||
Some(h) => return h.to_string(),
|
||||
None => {}
|
||||
if let Some(h) = ccx.type_hashcodes().borrow().get(&t) {
|
||||
return h.to_string()
|
||||
}
|
||||
|
||||
let mut symbol_hasher = ccx.symbol_hasher().borrow_mut();
|
||||
|
|
@ -315,9 +314,8 @@ pub fn mangle<PI: Iterator<Item=InternedString>>(path: PI, hash: Option<&str>) -
|
|||
push(&mut n, &data);
|
||||
}
|
||||
|
||||
match hash {
|
||||
Some(s) => push(&mut n, s),
|
||||
None => {}
|
||||
if let Some(s) = hash {
|
||||
push(&mut n, s)
|
||||
}
|
||||
|
||||
n.push('E'); // End name-sequence.
|
||||
|
|
|
|||
|
|
@ -150,9 +150,8 @@ impl Drop for _InsnCtxt {
|
|||
pub fn push_ctxt(s: &'static str) -> _InsnCtxt {
|
||||
debug!("new InsnCtxt: {}", s);
|
||||
TASK_LOCAL_INSN_KEY.with(|slot| {
|
||||
match slot.borrow_mut().as_mut() {
|
||||
Some(ctx) => ctx.push(s),
|
||||
None => {}
|
||||
if let Some(ctx) = slot.borrow_mut().as_mut() {
|
||||
ctx.push(s)
|
||||
}
|
||||
});
|
||||
_InsnCtxt {
|
||||
|
|
@ -198,9 +197,8 @@ fn get_extern_rust_fn<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>,
|
|||
name: &str,
|
||||
did: DefId)
|
||||
-> ValueRef {
|
||||
match ccx.externs().borrow().get(name) {
|
||||
Some(n) => return *n,
|
||||
None => (),
|
||||
if let Some(n) = ccx.externs().borrow().get(name) {
|
||||
return *n;
|
||||
}
|
||||
|
||||
let f = declare::declare_rust_fn(ccx, name, fn_ty);
|
||||
|
|
@ -238,9 +236,8 @@ pub fn get_extern_const<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>,
|
|||
-> ValueRef {
|
||||
let name = ccx.sess().cstore.item_symbol(did);
|
||||
let ty = type_of(ccx, t);
|
||||
match ccx.externs().borrow_mut().get(&name) {
|
||||
Some(n) => return *n,
|
||||
None => (),
|
||||
if let Some(n) = ccx.externs().borrow_mut().get(&name) {
|
||||
return *n;
|
||||
}
|
||||
// FIXME(nagisa): perhaps the map of externs could be offloaded to llvm somehow?
|
||||
// FIXME(nagisa): investigate whether it can be changed into define_global
|
||||
|
|
@ -2755,9 +2752,8 @@ fn contains_null(s: &str) -> bool {
|
|||
pub fn get_item_val(ccx: &CrateContext, id: ast::NodeId) -> ValueRef {
|
||||
debug!("get_item_val(id=`{}`)", id);
|
||||
|
||||
match ccx.item_vals().borrow().get(&id).cloned() {
|
||||
Some(v) => return v,
|
||||
None => {}
|
||||
if let Some(v) = ccx.item_vals().borrow().get(&id).cloned() {
|
||||
return v;
|
||||
}
|
||||
|
||||
let item = ccx.tcx().map.get(id);
|
||||
|
|
|
|||
|
|
@ -947,9 +947,8 @@ pub fn C_u8(ccx: &CrateContext, i: u8) -> ValueRef {
|
|||
// our boxed-and-length-annotated strings.
|
||||
pub fn C_cstr(cx: &CrateContext, s: InternedString, null_terminated: bool) -> ValueRef {
|
||||
unsafe {
|
||||
match cx.const_cstr_cache().borrow().get(&s) {
|
||||
Some(&llval) => return llval,
|
||||
None => ()
|
||||
if let Some(&llval) = cx.const_cstr_cache().borrow().get(&s) {
|
||||
return llval;
|
||||
}
|
||||
|
||||
let sc = llvm::LLVMConstStringInContext(cx.llcx(),
|
||||
|
|
|
|||
|
|
@ -182,9 +182,8 @@ pub fn type_of_fn_from_ty<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>, fty: Ty<'tcx>)
|
|||
// recursive types. For example, enum types rely on this behavior.
|
||||
|
||||
pub fn sizing_type_of<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>, t: Ty<'tcx>) -> Type {
|
||||
match cx.llsizingtypes().borrow().get(&t).cloned() {
|
||||
Some(t) => return t,
|
||||
None => ()
|
||||
if let Some(t) = cx.llsizingtypes().borrow().get(&t).cloned() {
|
||||
return t;
|
||||
}
|
||||
|
||||
debug!("sizing_type_of {:?}", t);
|
||||
|
|
@ -317,9 +316,8 @@ pub fn type_of<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>, ty: Ty<'tcx>) -> Type {
|
|||
/// NB: If you update this, be sure to update `sizing_type_of()` as well.
|
||||
pub fn in_memory_type_of<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>, t: Ty<'tcx>) -> Type {
|
||||
// Check the cache.
|
||||
match cx.lltypes().borrow().get(&t) {
|
||||
Some(&llty) => return llty,
|
||||
None => ()
|
||||
if let Some(&llty) = cx.lltypes().borrow().get(&t) {
|
||||
return llty;
|
||||
}
|
||||
|
||||
debug!("type_of {:?}", t);
|
||||
|
|
|
|||
|
|
@ -2734,18 +2734,19 @@ fn make_item_keywords(it: &clean::Item) -> String {
|
|||
|
||||
fn get_index_search_type(item: &clean::Item,
|
||||
parent: Option<String>) -> Option<IndexItemFunctionType> {
|
||||
let decl = match item.inner {
|
||||
clean::FunctionItem(ref f) => &f.decl,
|
||||
clean::MethodItem(ref m) => &m.decl,
|
||||
clean::TyMethodItem(ref m) => &m.decl,
|
||||
let (decl, selfty) = match item.inner {
|
||||
clean::FunctionItem(ref f) => (&f.decl, None),
|
||||
clean::MethodItem(ref m) => (&m.decl, Some(&m.self_)),
|
||||
clean::TyMethodItem(ref m) => (&m.decl, Some(&m.self_)),
|
||||
_ => return None
|
||||
};
|
||||
|
||||
let mut inputs = Vec::new();
|
||||
|
||||
// Consider `self` an argument as well.
|
||||
if let Some(name) = parent {
|
||||
inputs.push(Type { name: Some(name.to_ascii_lowercase()) });
|
||||
match parent.and_then(|p| selfty.map(|s| (p, s)) ) {
|
||||
Some((_, &clean::SelfStatic)) | None => (),
|
||||
Some((name, _)) => inputs.push(Type { name: Some(name.to_ascii_lowercase()) }),
|
||||
}
|
||||
|
||||
inputs.extend(&mut decl.inputs.values.iter().map(|arg| {
|
||||
|
|
|
|||
|
|
@ -385,9 +385,8 @@ fn rust_input(cratefile: &str, externs: core::Externs, matches: &getopts::Matche
|
|||
*s.borrow_mut() = analysis.take();
|
||||
});
|
||||
|
||||
match matches.opt_str("crate-name") {
|
||||
Some(name) => krate.name = name,
|
||||
None => {}
|
||||
if let Some(name) = matches.opt_str("crate-name") {
|
||||
krate.name = name
|
||||
}
|
||||
|
||||
// Process all of the crate attributes, extracting plugin metadata along
|
||||
|
|
|
|||
|
|
@ -467,9 +467,8 @@ impl ToSocketAddrs for str {
|
|||
type Iter = vec::IntoIter<SocketAddr>;
|
||||
fn to_socket_addrs(&self) -> io::Result<vec::IntoIter<SocketAddr>> {
|
||||
// try to parse as a regular SocketAddr first
|
||||
match self.parse().ok() {
|
||||
Some(addr) => return Ok(vec![addr].into_iter()),
|
||||
None => {}
|
||||
if let Some(addr) = self.parse().ok() {
|
||||
return Ok(vec![addr].into_iter());
|
||||
}
|
||||
|
||||
macro_rules! try_opt {
|
||||
|
|
|
|||
|
|
@ -66,9 +66,8 @@ impl<'a> Parser<'a> {
|
|||
fn read_or<T>(&mut self, parsers: &mut [Box<FnMut(&mut Parser) -> Option<T> + 'static>])
|
||||
-> Option<T> {
|
||||
for pf in parsers {
|
||||
match self.read_atomically(|p: &mut Parser| pf(p)) {
|
||||
Some(r) => return Some(r),
|
||||
None => {}
|
||||
if let Some(r) = self.read_atomically(|p: &mut Parser| pf(p)) {
|
||||
return Some(r);
|
||||
}
|
||||
}
|
||||
None
|
||||
|
|
|
|||
|
|
@ -12,6 +12,50 @@
|
|||
//
|
||||
/// The boolean type.
|
||||
///
|
||||
/// The `bool` represents a value, which could only be either `true` or `false`.
|
||||
///
|
||||
/// # Basic usage
|
||||
///
|
||||
/// `bool` implements various traits, such as [`BitAnd`], [`BitOr`], [`Not`], etc.,
|
||||
/// which allow us to perform boolean operations using `&`, `|` and `!`.
|
||||
///
|
||||
/// [`if`] always demands a `bool` value. [`assert!`], being an important macro in testing,
|
||||
/// checks whether an expression returns `true`.
|
||||
///
|
||||
/// ```
|
||||
/// let bool_val = true & false | false;
|
||||
/// assert!(!bool_val);
|
||||
/// ```
|
||||
///
|
||||
/// [`assert!`]: std/macro.assert!.html
|
||||
/// [`if` conditionals]: ../../book/if.html
|
||||
/// [`BitAnd`]: ../ops/trait.BitAnd.html
|
||||
/// [`BitOr`]: ../ops/trait.BitOr.html
|
||||
/// [`Not`]: ../ops/trait.Not.html
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// A trivial example of the usage of `bool`,
|
||||
///
|
||||
/// ```
|
||||
/// let praise_the_borrow_checker = true;
|
||||
///
|
||||
/// // using the `if` conditional
|
||||
/// if praise_the_borrow_checker {
|
||||
/// println!("oh, yeah!");
|
||||
/// } else {
|
||||
/// println!("what?!!");
|
||||
/// }
|
||||
///
|
||||
/// // ... or, a match pattern
|
||||
/// match praise_the_borrow_checker {
|
||||
/// true => println!("keep praising!"),
|
||||
/// false => println!("you should praise!"),
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// Also, since `bool` implements the [`Copy`](../marker/trait.Copy.html) trait, we don't
|
||||
/// have to worry about the move semantics (just like the integer and float primitives).
|
||||
mod prim_bool { }
|
||||
|
||||
#[doc(primitive = "char")]
|
||||
|
|
@ -533,4 +577,3 @@ mod prim_isize { }
|
|||
/// *[See also the `std::usize` module](usize/index.html).*
|
||||
///
|
||||
mod prim_usize { }
|
||||
|
||||
|
|
|
|||
|
|
@ -69,9 +69,8 @@ static mut DTORS: *mut Vec<(Key, Dtor)> = ptr::null_mut();
|
|||
pub unsafe fn create(dtor: Option<Dtor>) -> Key {
|
||||
let key = c::TlsAlloc();
|
||||
assert!(key != c::TLS_OUT_OF_INDEXES);
|
||||
match dtor {
|
||||
Some(f) => register_dtor(key, f),
|
||||
None => {}
|
||||
if let Some(f) = dtor {
|
||||
register_dtor(key, f);
|
||||
}
|
||||
return key;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue