Auto merge of #33768 - Manishearth:rollup, r=Manishearth
Rollup of 7 pull requests - Successful merges: #33578, #33679, #33743, #33746, #33747, #33750, #33757 - Failed merges:
This commit is contained in:
commit
da41920919
@ -155,7 +155,7 @@ vector object and its data live in separate memory regions instead of being a
|
||||
single contiguous memory allocation (due to reasons we will not go into at
|
||||
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.
|
||||
things like the length, capacity, etc.
|
||||
|
||||
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
|
||||
|
@ -175,6 +175,7 @@ And then `bold()` calls `italic()`:
|
||||
| **2** | **b**|**100**|
|
||||
| **1** | **a**| **5** |
|
||||
| 0 | x | 42 |
|
||||
|
||||
Whew! Our stack is growing tall.
|
||||
|
||||
After `italic()` is over, its frame is deallocated, leaving only `bold()` and
|
||||
@ -260,8 +261,7 @@ layout of a program which has been running for a while now:
|
||||
| (2<sup>30</sup>) - 3 | | |
|
||||
| (2<sup>30</sup>) - 4 | | 42 |
|
||||
| ... | ... | ... |
|
||||
| 3 | y | → (2<sup>30</sup>) - 4 |
|
||||
| 2 | y | 42 |
|
||||
| 2 | z | → (2<sup>30</sup>) - 4 |
|
||||
| 1 | y | 42 |
|
||||
| 0 | x | → (2<sup>30</sup>) - 1 |
|
||||
|
||||
|
@ -47,7 +47,7 @@ pointers, can use this `impl`.
|
||||
# ?Sized
|
||||
|
||||
If you want to write a function that accepts a dynamically sized type, you
|
||||
can use the special bound, `?Sized`:
|
||||
can use the special bound syntax, `?Sized`:
|
||||
|
||||
```rust
|
||||
struct Foo<T: ?Sized> {
|
||||
@ -55,6 +55,7 @@ struct Foo<T: ?Sized> {
|
||||
}
|
||||
```
|
||||
|
||||
This `?`, read as “T may be `Sized`”, means that this bound is special: it
|
||||
lets us match more kinds, not less. It’s almost like every `T` implicitly has
|
||||
`T: Sized`, and the `?` undoes this default.
|
||||
This `?Sized`, read as “T may or may not be `Sized`”, which allows us to match
|
||||
both sized and unsized types. All generic type parameters implicitly
|
||||
have the `Sized` bound, so the `?Sized` can be used to opt-out of the implicit
|
||||
bound.
|
||||
|
@ -779,11 +779,10 @@ pub fn binary_search_by_key<B, F>(&self, b: &B, f: F) -> Result<usize, usize>
|
||||
core_slice::SliceExt::binary_search_by_key(self, b, f)
|
||||
}
|
||||
|
||||
/// Sorts the slice, in place.
|
||||
///
|
||||
/// This is equivalent to `self.sort_by(|a, b| a.cmp(b))`.
|
||||
///
|
||||
/// This is a stable sort.
|
||||
/// This sort is stable and `O(n log n)` worst-case but allocates
|
||||
/// approximately `2 * n` where `n` is the length of `self`.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@ -804,11 +803,9 @@ pub fn sort(&mut self)
|
||||
/// Sorts the slice, in place, using `key` to extract a key by which to
|
||||
/// order the sort by.
|
||||
///
|
||||
/// This sort is `O(n log n)` worst-case and stable, but allocates
|
||||
/// This sort is stable and `O(n log n)` worst-case but allocates
|
||||
/// approximately `2 * n`, where `n` is the length of `self`.
|
||||
///
|
||||
/// This is a stable sort.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```rust
|
||||
@ -828,7 +825,7 @@ pub fn sort_by_key<B, F>(&mut self, mut f: F)
|
||||
/// Sorts the slice, in place, using `compare` to compare
|
||||
/// elements.
|
||||
///
|
||||
/// This sort is `O(n log n)` worst-case and stable, but allocates
|
||||
/// This sort is stable and `O(n log n)` worst-case but allocates
|
||||
/// approximately `2 * n`, where `n` is the length of `self`.
|
||||
///
|
||||
/// # Examples
|
||||
|
@ -1002,18 +1002,18 @@ struct Foo { x: Option<Box<Foo>> }
|
||||
This will cause an error:
|
||||
|
||||
```compile_fail
|
||||
#![feature(simd)]
|
||||
#![feature(repr_simd)]
|
||||
|
||||
#[simd]
|
||||
#[repr(simd)]
|
||||
struct Bad;
|
||||
```
|
||||
|
||||
This will not:
|
||||
|
||||
```
|
||||
#![feature(simd)]
|
||||
#![feature(repr_simd)]
|
||||
|
||||
#[simd]
|
||||
#[repr(simd)]
|
||||
struct Good(u32);
|
||||
```
|
||||
"##,
|
||||
|
@ -1658,6 +1658,19 @@ fn document(w: &mut fmt::Formatter, cx: &Context, item: &clean::Item) -> fmt::Re
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn document_short(w: &mut fmt::Formatter, item: &clean::Item, link: AssocItemLink) -> fmt::Result {
|
||||
if let Some(s) = item.doc_value() {
|
||||
let markdown = if s.contains('\n') {
|
||||
format!("{} [Read more]({})",
|
||||
&plain_summary_line(Some(s)), naive_assoc_href(item, link))
|
||||
} else {
|
||||
format!("{}", &plain_summary_line(Some(s)))
|
||||
};
|
||||
write!(w, "<div class='docblock'>{}</div>", Markdown(&markdown))?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn item_module(w: &mut fmt::Formatter, cx: &Context,
|
||||
item: &clean::Item, items: &[clean::Item]) -> fmt::Result {
|
||||
document(w, cx, item)?;
|
||||
@ -2555,8 +2568,9 @@ fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLi
|
||||
}
|
||||
|
||||
fn doctraititem(w: &mut fmt::Formatter, cx: &Context, item: &clean::Item,
|
||||
link: AssocItemLink, render_static: bool, is_default_item: bool,
|
||||
outer_version: Option<&str>) -> fmt::Result {
|
||||
link: AssocItemLink, render_static: bool,
|
||||
is_default_item: bool, outer_version: Option<&str>,
|
||||
trait_: Option<&clean::Trait>) -> fmt::Result {
|
||||
let shortty = shortty(item);
|
||||
let name = item.name.as_ref().unwrap();
|
||||
|
||||
@ -2607,16 +2621,35 @@ fn doctraititem(w: &mut fmt::Formatter, cx: &Context, item: &clean::Item,
|
||||
_ => panic!("can't make docs for trait item with name {:?}", item.name)
|
||||
}
|
||||
|
||||
if !is_default_item && (!is_static || render_static) {
|
||||
document(w, cx, item)
|
||||
} else {
|
||||
Ok(())
|
||||
if !is_static || render_static {
|
||||
if !is_default_item {
|
||||
|
||||
if item.doc_value().is_some() {
|
||||
document(w, cx, item)?;
|
||||
} else {
|
||||
// In case the item isn't documented,
|
||||
// provide short documentation from the trait
|
||||
if let Some(t) = trait_ {
|
||||
if let Some(it) = t.items.iter()
|
||||
.find(|i| i.name == item.name) {
|
||||
document_short(w, it, link)?;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
document_short(w, item, link)?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
let traits = &cache().traits;
|
||||
let trait_ = i.trait_did().and_then(|did| traits.get(&did));
|
||||
|
||||
write!(w, "<div class='impl-items'>")?;
|
||||
for trait_item in &i.inner_impl().items {
|
||||
doctraititem(w, cx, trait_item, link, render_header, false, outer_version)?;
|
||||
doctraititem(w, cx, trait_item, link, render_header,
|
||||
false, outer_version, trait_)?;
|
||||
}
|
||||
|
||||
fn render_default_items(w: &mut fmt::Formatter,
|
||||
@ -2634,17 +2667,15 @@ fn render_default_items(w: &mut fmt::Formatter,
|
||||
let assoc_link = AssocItemLink::GotoSource(did, &i.provided_trait_methods);
|
||||
|
||||
doctraititem(w, cx, trait_item, assoc_link, render_static, true,
|
||||
outer_version)?;
|
||||
outer_version, None)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// If we've implemented a trait, then also emit documentation for all
|
||||
// default items which weren't overridden in the implementation block.
|
||||
if let Some(did) = i.trait_did() {
|
||||
if let Some(t) = cache().traits.get(&did) {
|
||||
render_default_items(w, cx, t, &i.inner_impl(), render_header, outer_version)?;
|
||||
}
|
||||
if let Some(t) = trait_ {
|
||||
render_default_items(w, cx, t, &i.inner_impl(), render_header, outer_version)?;
|
||||
}
|
||||
write!(w, "</div>")?;
|
||||
Ok(())
|
||||
|
@ -101,7 +101,7 @@ unsafe impl Send for Once {}
|
||||
|
||||
/// State yielded to the `call_once_force` method which can be used to query
|
||||
/// whether the `Once` was previously poisoned or not.
|
||||
#[unstable(feature = "once_poison", issue = "31688")]
|
||||
#[unstable(feature = "once_poison", issue = "33577")]
|
||||
pub struct OnceState {
|
||||
poisoned: bool,
|
||||
}
|
||||
@ -218,7 +218,7 @@ pub fn call_once<F>(&'static self, f: F) where F: FnOnce() {
|
||||
/// The closure `f` is yielded a structure which can be used to query the
|
||||
/// state of this `Once` (whether initialization has previously panicked or
|
||||
/// not).
|
||||
#[unstable(feature = "once_poison", issue = "31688")]
|
||||
#[unstable(feature = "once_poison", issue = "33577")]
|
||||
pub fn call_once_force<F>(&'static self, f: F) where F: FnOnce(&OnceState) {
|
||||
// same as above, just with a different parameter to `call_inner`.
|
||||
if self.state.load(Ordering::SeqCst) == COMPLETE {
|
||||
@ -360,7 +360,7 @@ impl OnceState {
|
||||
///
|
||||
/// Once an initalization routine for a `Once` has panicked it will forever
|
||||
/// indicate to future forced initialization routines that it is poisoned.
|
||||
#[unstable(feature = "once_poison", issue = "31688")]
|
||||
#[unstable(feature = "once_poison", issue = "33577")]
|
||||
pub fn poisoned(&self) -> bool {
|
||||
self.poisoned
|
||||
}
|
||||
|
@ -21,13 +21,24 @@ pub trait T {
|
||||
fn b_method(&self) -> usize {
|
||||
self.a_method()
|
||||
}
|
||||
|
||||
/// Docs associated with the trait c_method definition.
|
||||
///
|
||||
/// There is another line
|
||||
fn c_method(&self) -> usize {
|
||||
self.a_method()
|
||||
}
|
||||
}
|
||||
|
||||
// @has manual_impl/struct.S1.html '//*[@class="trait"]' 'T'
|
||||
// @has - '//*[@class="docblock"]' 'Docs associated with the S1 trait implementation.'
|
||||
// @has - '//*[@class="docblock"]' 'Docs associated with the S1 trait a_method implementation.'
|
||||
// @!has - '//*[@class="docblock"]' 'Docs associated with the trait a_method definition.'
|
||||
// @!has - '//*[@class="docblock"]' 'Docs associated with the trait b_method definition.'
|
||||
// @has - '//*[@class="docblock"]' 'Docs associated with the trait b_method definition.'
|
||||
// @has - '//*[@class="docblock"]' 'Docs associated with the trait b_method definition.'
|
||||
// @has - '//*[@class="docblock"]' 'Docs associated with the trait c_method definition.'
|
||||
// @!has - '//*[@class="docblock"]' 'There is another line'
|
||||
// @has - '//*[@class="docblock"]' 'Read more'
|
||||
pub struct S1(usize);
|
||||
|
||||
/// Docs associated with the S1 trait implementation.
|
||||
@ -41,9 +52,11 @@ fn a_method(&self) -> usize {
|
||||
// @has manual_impl/struct.S2.html '//*[@class="trait"]' 'T'
|
||||
// @has - '//*[@class="docblock"]' 'Docs associated with the S2 trait implementation.'
|
||||
// @has - '//*[@class="docblock"]' 'Docs associated with the S2 trait a_method implementation.'
|
||||
// @has - '//*[@class="docblock"]' 'Docs associated with the S2 trait b_method implementation.'
|
||||
// @has - '//*[@class="docblock"]' 'Docs associated with the S2 trait c_method implementation.'
|
||||
// @!has - '//*[@class="docblock"]' 'Docs associated with the trait a_method definition.'
|
||||
// @!has - '//*[@class="docblock"]' 'Docs associated with the trait b_method definition.'
|
||||
// @!has - '//*[@class="docblock"]' 'Docs associated with the trait c_method definition.'
|
||||
// @has - '//*[@class="docblock"]' 'Docs associated with the trait b_method definition.'
|
||||
// @!has - '//*[@class="docblock"]' 'Read more'
|
||||
pub struct S2(usize);
|
||||
|
||||
/// Docs associated with the S2 trait implementation.
|
||||
@ -53,8 +66,8 @@ fn a_method(&self) -> usize {
|
||||
self.0
|
||||
}
|
||||
|
||||
/// Docs associated with the S2 trait b_method implementation.
|
||||
fn b_method(&self) -> usize {
|
||||
/// Docs associated with the S2 trait c_method implementation.
|
||||
fn c_method(&self) -> usize {
|
||||
5
|
||||
}
|
||||
}
|
||||
@ -62,7 +75,7 @@ fn b_method(&self) -> usize {
|
||||
// @has manual_impl/struct.S3.html '//*[@class="trait"]' 'T'
|
||||
// @has - '//*[@class="docblock"]' 'Docs associated with the S3 trait implementation.'
|
||||
// @has - '//*[@class="docblock"]' 'Docs associated with the S3 trait b_method implementation.'
|
||||
// @!has - '//*[@class="docblock"]' 'Docs associated with the trait a_method definition.'
|
||||
// @has - '//*[@class="docblock"]' 'Docs associated with the trait a_method definition.'
|
||||
pub struct S3(usize);
|
||||
|
||||
/// Docs associated with the S3 trait implementation.
|
||||
|
Loading…
Reference in New Issue
Block a user