Skip to content

Rollup of 9 pull requests #31873

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 20 commits into from
Feb 25, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
347a257
reference: vtable entries are resolved at runtime
ivan Feb 15, 2016
58f0d72
reference: vtable entries: copy @nikomatsakis's wording
ivan Feb 18, 2016
8c554e0
Clarify chunks() and chunks_mut() iterator content
urschrei Feb 20, 2016
41a63bd
Correct size of returned iterator
urschrei Feb 20, 2016
9d3bce3
Don't record self parameter for static methods
mitaa Feb 23, 2016
fbfe70e
#31820 - Utilize `if..let` instead of single `match` branch
dileepbapat Feb 23, 2016
eb97c26
Updated the primitive docs for bool
wafflespeanut Feb 23, 2016
397ab31
reference: clarify use declaration location
matklad Feb 24, 2016
145190b
Capitalize some occurences of Rust in documentation
fhahn Feb 24, 2016
7042c8e
book: Explain better why the filter closure gets a reference
ivan Feb 24, 2016
df33fc3
Add more explanation on vec type
GuillaumeGomez Feb 21, 2016
e928297
Rollup merge of #31677 - ivan:doc-vtable, r=steveklabnik
Manishearth Feb 24, 2016
27990ed
Rollup merge of #31784 - urschrei:chunks_doc, r=steveklabnik
Manishearth Feb 24, 2016
2e89dee
Rollup merge of #31839 - mitaa:rdoc-idx-self, r=alexcrichton
Manishearth Feb 24, 2016
ac02f9c
Rollup merge of #31842 - dileepbapat:master, r=alexcrichton
Manishearth Feb 24, 2016
b28debd
Rollup merge of #31843 - Wafflespeanut:bool_docs, r=steveklabnik
Manishearth Feb 24, 2016
901eca9
Rollup merge of #31850 - GuillaumeGomez:vec-doc, r=steveklabnik
Manishearth Feb 24, 2016
f286775
Rollup merge of #31863 - matklad:clarify-reference, r=steveklabnik
Manishearth Feb 24, 2016
a834cd1
Rollup merge of #31868 - fhahn:capitalize-Rust, r=steveklabnik
Manishearth Feb 24, 2016
b660ca5
Rollup merge of #31870 - ivan:filter-explain, r=steveklabnik
Manishearth Feb 24, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions src/doc/book/iterators.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion src/doc/book/ownership.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/doc/nomicon/other-reprs.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
11 changes: 6 additions & 5 deletions src/doc/reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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.

Expand Down Expand Up @@ -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.

Expand Down
4 changes: 2 additions & 2 deletions src/libcollections/slice.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
///
Expand All @@ -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`.
///
Expand Down
43 changes: 43 additions & 0 deletions src/libcollections/vec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 2 additions & 3 deletions src/libgetopts/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 4 additions & 6 deletions src/librustc_trans/back/link.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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.
Expand Down
20 changes: 8 additions & 12 deletions src/librustc_trans/trans/base.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand Down
5 changes: 2 additions & 3 deletions src/librustc_trans/trans/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down
10 changes: 4 additions & 6 deletions src/librustc_trans/trans/type_of.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
13 changes: 7 additions & 6 deletions src/librustdoc/html/render.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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| {
Expand Down
5 changes: 2 additions & 3 deletions src/librustdoc/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 2 additions & 3 deletions src/libstd/net/addr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
5 changes: 2 additions & 3 deletions src/libstd/net/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
45 changes: 44 additions & 1 deletion src/libstd/primitive_docs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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")]
Expand Down Expand Up @@ -533,4 +577,3 @@ mod prim_isize { }
/// *[See also the `std::usize` module](usize/index.html).*
///
mod prim_usize { }

5 changes: 2 additions & 3 deletions src/libstd/sys/windows/thread_local.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down