Commit Graph

1825 Commits

Author SHA1 Message Date
Mazdak Farrokhzad bc18981f21 Rollup merge of #62403 - SimonSapin:concat, r=alexcrichton
Replace SliceConcatExt trait with inherent methods and SliceConcat helper trait

Before this change `SliceConcatExt` was an unstable extension trait with stable methods. It was in the libstd prelude, so that its methods could be used on the stable channel.

This replaces it with inherent methods, which can be used without any addition to the prelude. Since the methods are stable and very generic (with for example a return type that depends on the types of parameters), an helper trait is still needed. But now that trait does not need to be in scope for the methods to be used.

Removing this depedency on the libstd prelude allows the methods to be used in `#![no_std]` crate that use liballoc, which does not have its own implicitly-imported prelude.
2019-07-09 04:52:38 +02:00
bors 09ab31bc64 Auto merge of #61224 - aloucks:drain_filter, r=Gankro
Prevent Vec::drain_filter from double dropping on panic

Fixes: #60977

The changes in this PR prevent leaking and double-panicking in addition to double-drop.

Tracking issue: #43244
2019-07-08 22:03:26 +00:00
Aaron Loucks df5b32ee9b Clarify double-drop comment 2019-07-07 16:36:19 -04:00
Aaron Loucks a4a6a67a01 Remove while loop in DrainFilter::drop and add additional docs 2019-07-07 13:44:21 -04:00
Mazdak Farrokhzad 296e825afa Rollup merge of #61862 - vorner:weak-into-raw-methods, r=sfackler
Make the Weak::{into,as}_raw methods

Because Weak doesn't Deref, so there's no reason for them to be only
associated methods.

As kindly pointed out here https://github.com/rust-lang/rust/pull/60766#issuecomment-501706422 by @chpio.
2019-07-06 22:14:35 +02:00
Mazdak Farrokhzad 3c4a6c8606 Rollup merge of #62296 - RalfJung:memalign, r=alexcrichton
request at least ptr-size alignment from posix_memalign

Fixes https://github.com/rust-lang/rust/issues/62251
2019-07-06 02:37:59 +02:00
Mazdak Farrokhzad ccd925bc7d Rollup merge of #62371 - Nemo157:fix-62288, r=Centril
Add tracking issue for Box::into_pin

Fixes #62288
2019-07-05 13:53:10 +02:00
Mazdak Farrokhzad 0f92eb8a4a Rollup merge of #62123 - jeremystucki:needless_lifetimes_std, r=alexcrichton
Remove needless lifetimes (std)

Split from #62039
2019-07-05 13:52:58 +02:00
Simon Sapin e808d921dd Replace SliceConcatExt trait with inherent methods and SliceConcat helper trait
Before this change `SliceConcatExt` was an unstable extension trait
with stable methods. It was in the libstd prelude, so that its methods
could be used on the stable channel.

This replaces it with inherent methods,
which can be used without any addition to the prelude.
Since the methods are stable and very generic
(with for example a return type that depends on the types of parameters),
an helper trait is still needed.
But now that trait does not need to be in scope for the methods to be used.

Removing this depedency on the libstd prelude allows the methods to be used
in `#![no_std]` crate that use liballoc, which does not have its own
implicitly-imported prelude.
2019-07-05 11:49:30 +02:00
Mark Rousskov 8a7dded1a2 Switch master to 1.38 2019-07-04 11:26:57 -04:00
Wim Looman 55bd2140a2 Add tracking issue for Box::into_pin 2019-07-04 12:57:34 +02:00
Mazdak Farrokhzad 144ed029c5 Rollup merge of #62346 - RalfJung:miri-tests, r=Centril
enable a few more tests in Miri and update the comment for others
2019-07-04 01:39:02 +02:00
Mazdak Farrokhzad 4049a3cf1b Rollup merge of #62316 - khuey:efficient_last, r=sfackler
When possible without changing semantics, implement Iterator::last in terms of DoubleEndedIterator::next_back for types in liballoc and libcore.

Provided that the iterator has finite length and does not trigger user-provided code, this is safe.

What follows is a full list of the DoubleEndedIterators in liballoc/libcore and whether this optimization is safe, and if not, why not.

src/liballoc/boxed.rs
Box: Pass through to avoid defeating optimization of the underlying DoubleIterator implementation. This has no correctness impact.

src/liballoc/collections/binary_heap.rs
Iter: Pass through to avoid defeating optimizations on slice::Iter
IntoIter: Not safe, changes Drop order
Drain: Not safe, changes Drop order

src/liballoc/collections/btree/map.rs
Iter: Safe to call next_back, invokes no user defined code.
IterMut: ditto
IntoIter: Not safe, changes Drop order
Keys: Safe to call next_back, invokes no user defined code.
Values: ditto
ValuesMut: ditto
Range: ditto
RangeMut: ditto

src/liballoc/collections/btree/set.rs
Iter: Safe to call next_back, invokes no user defined code.
IntoIter: Not safe, changes Drop order
Range: Safe to call next_back, invokes no user defined code.

src/liballoc/collections/linked_list.rs
Iter: Safe to call next_back, invokes no user defined code.
IterMut: ditto
IntoIter: Not safe, changes Drop order

src/liballoc/collections/vec_deque.rs
Iter: Safe to call next_back, invokes no user defined code.
IterMut: ditto
IntoIter: Not safe, changes Drop order
Drain: ditto

src/liballoc/string.rs
Drain: Safe because return type is a primitive (char)

src/liballoc/vec.rs
IntoIter: Not safe, changes Drop order
Drain: ditto
Splice: ditto

src/libcore/ascii.rs
EscapeDefault: Safe because return type is a primitive (u8)

src/libcore/iter/adapters/chain.rs
Chain: Not safe, invokes user defined code (Iterator impl)

src/libcore/iter/adapters/flatten.rs
FlatMap: Not safe, invokes user defined code (Iterator impl)
Flatten: ditto
FlattenCompat: ditto

src/libcore/iter/adapters/mod.rs
Rev: Not safe, invokes user defined code (Iterator impl)
Copied: ditto
Cloned: Not safe, invokes user defined code (Iterator impl and T::clone)
Map: Not safe, invokes user defined code (Iterator impl + closure)
Filter: ditto
FilterMap: ditto
Enumerate: Not safe, invokes user defined code (Iterator impl)
Skip: ditto
Fuse: ditto
Inspect: ditto

src/libcore/iter/adapters/zip.rs
Zip: Not safe, invokes user defined code (Iterator impl)

src/libcore/iter/range.rs
ops::Range: Not safe, changes Drop order, but ALREADY HAS SPECIALIZATION
ops::RangeInclusive: ditto

src/libcore/iter/sources.rs
Repeat: Not safe, calling last should iloop.
Empty: No point, iterator is at most one item long.
Once: ditto
OnceWith: ditto

src/libcore/option.rs
Item: No point, iterator is at most one item long.
Iter: ditto
IterMut: ditto
IntoIter: ditto

src/libcore/result.rs
Iter: No point, iterator is at most one item long
IterMut: ditto
IntoIter: ditto

src/libcore/slice/mod.rs
Split: Not safe, invokes user defined closure
SplitMut: ditto
RSplit: ditto
RSplitMut: ditto
Windows: Safe, already has specialization
Chunks: ditto
ChunksMut: ditto
ChunksExact: ditto
ChunksExactMut: ditto
RChunks: ditto
RChunksMut: ditto
RChunksExact: ditto
RChunksExactMut: ditto

src/libcore/str/mod.rs
Chars: Safe, already has specialization
CharIndices: ditto
Bytes: ditto
Lines: Safe to call next_back, invokes no user defined code.
LinesAny: Deprecated
Everything that is generic over P: Pattern: Not safe because Pattern invokes user defined code.
SplitWhitespace: Safe to call next_back, invokes no user defined code.
SplitAsciiWhitespace: ditto

This is attempt 2 of #60130.

r? @sfackler
2019-07-04 01:38:56 +02:00
Mazdak Farrokhzad 88c007cd04 Rollup merge of #62249 - czipperz:use-mem-take-instead-of-replace-default, r=dtolnay,Centril
Use mem::take instead of mem::replace with default
2019-07-04 01:38:46 +02:00
Ralf Jung 4dd5edc76d enable a few more tests in Miri and update the comment for others 2019-07-03 19:58:59 +02:00
Mark Rousskov 8ca4a6a486 Rollup merge of #62250 - czipperz:improve-box-clone-doctests, r=GuillaumeGomez
Improve box clone doctests to ensure the documentation is valid
2019-07-03 09:59:24 -04:00
Mark Rousskov aa7999aaee Rollup merge of #62196 - cramertj:vec-leak, r=centril,withoutboats
Add Vec::leak
2019-07-03 09:59:20 -04:00
Kyle Huey db16e17212 When possible without changing semantics, implement Iterator::last in terms of DoubleEndedIterator::next_back for types in liballoc and libcore.
Provided that the iterator has finite length and does not trigger user-provided code, this is safe.

What follows is a full list of the DoubleEndedIterators in liballoc/libcore and whether this optimization is safe, and if not, why not.

src/liballoc/boxed.rs
Box: Pass through to avoid defeating optimization of the underlying DoubleIterator implementation. This has no correctness impact.

src/liballoc/collections/binary_heap.rs
Iter: Pass through to avoid defeating optimizations on slice::Iter
IntoIter: Not safe, changes Drop order
Drain: Not safe, changes Drop order

src/liballoc/collections/btree/map.rs
Iter: Safe to call next_back, invokes no user defined code.
IterMut: ditto
IntoIter: Not safe, changes Drop order
Keys: Safe to call next_back, invokes no user defined code.
Values: ditto
ValuesMut: ditto
Range: ditto
RangeMut: ditto

src/liballoc/collections/btree/set.rs
Iter: Safe to call next_back, invokes no user defined code.
IntoIter: Not safe, changes Drop order
Range: Safe to call next_back, invokes no user defined code.

src/liballoc/collections/linked_list.rs
Iter: Safe to call next_back, invokes no user defined code.
IterMut: ditto
IntoIter: Not safe, changes Drop order

src/liballoc/collections/vec_deque.rs
Iter: Safe to call next_back, invokes no user defined code.
IterMut: ditto
IntoIter: Not safe, changes Drop order
Drain: ditto

src/liballoc/string.rs
Drain: Safe because return type is a primitive (char)

src/liballoc/vec.rs
IntoIter: Not safe, changes Drop order
Drain: ditto
Splice: ditto

src/libcore/ascii.rs
EscapeDefault: Safe because return type is a primitive (u8)

src/libcore/iter/adapters/chain.rs
Chain: Not safe, invokes user defined code (Iterator impl)

src/libcore/iter/adapters/flatten.rs
FlatMap: Not safe, invokes user defined code (Iterator impl)
Flatten: ditto
FlattenCompat: ditto

src/libcore/iter/adapters/mod.rs
Rev: Not safe, invokes user defined code (Iterator impl)
Copied: ditto
Cloned: Not safe, invokes user defined code (Iterator impl and T::clone)
Map: Not safe, invokes user defined code (Iterator impl + closure)
Filter: ditto
FilterMap: ditto
Enumerate: Not safe, invokes user defined code (Iterator impl)
Skip: ditto
Fuse: ditto
Inspect: ditto

src/libcore/iter/adapters/zip.rs
Zip: Not safe, invokes user defined code (Iterator impl)

src/libcore/iter/range.rs
ops::Range: Not safe, changes Drop order, but ALREADY HAS SPECIALIZATION
ops::RangeInclusive: ditto

src/libcore/iter/sources.rs
Repeat: Not safe, calling last should iloop.
Empty: No point, iterator is at most one item long.
Once: ditto
OnceWith: ditto

src/libcore/option.rs
Item: No point, iterator is at most one item long.
Iter: ditto
IterMut: ditto
IntoIter: ditto

src/libcore/result.rs
Iter: No point, iterator is at most one item long
IterMut: ditto
IntoIter: ditto

src/libcore/slice/mod.rs
Split: Not safe, invokes user defined closure
SplitMut: ditto
RSplit: ditto
RSplitMut: ditto
Windows: Safe, already has specialization
Chunks: ditto
ChunksMut: ditto
ChunksExact: ditto
ChunksExactMut: ditto
RChunks: ditto
RChunksMut: ditto
RChunksExact: ditto
RChunksExactMut: ditto

src/libcore/str/mod.rs
Chars: Safe, already has specialization
CharIndices: ditto
Bytes: ditto
Lines: Safe to call next_back, invokes no user defined code.
LinesAny: Deprecated
Everything that is generic over P: Pattern: Not safe because Pattern invokes user defined code.
SplitWhitespace: Safe to call next_back, invokes no user defined code.
SplitAsciiWhitespace: ditto
2019-07-02 13:45:29 -07:00
Ralf Jung 45e7ba96cb test more possible overaligned requests 2019-07-02 13:07:51 +02:00
Chris Gregory b0c199a969 Enable mem_take feature in relevant crates 2019-07-01 20:21:53 -07:00
Chris Gregory 636f5e6d11 Convert more usages over 2019-07-01 20:21:12 -07:00
Jeremy Stucki 47ea8ae022 Remove needless lifetimes 2019-07-01 12:15:27 +02:00
Chris Gregory fc70c37d16 Improve box clone doctests to ensure the documentation is valid 2019-06-30 11:56:21 -07:00
Taylor Cramer 95275658f2 Add Vec::leak 2019-06-28 13:24:58 -07:00
Mazdak Farrokhzad 2f6cf36b32 Rollup merge of #62043 - Centril:remove-fnbox, r=cramertj
Remove `FnBox`

Remove `FnBox` since we now have `Box<dyn FnOnce>`.

Closes https://github.com/rust-lang/rust/issues/28796.

r? @cramertj
2019-06-27 23:01:00 +02:00
Mazdak Farrokhzad a99a7b7f35 Remove FnBox. 2019-06-22 06:59:27 +02:00
Mazdak Farrokhzad 3a8536edef Rollup merge of #61146 - czipperz:SliceConcatExt-connect-default-to-join, r=sfackler
SliceConcatExt::connect defaults to calling join

It makes sense to default a deprecated method to the new one.  Precedence example is `Error::cause` defaults to calling `Error::source`.
2019-06-22 01:42:30 +02:00
Mazdak Farrokhzad 04d6539025 Rollup merge of #61893 - chpio:weak_ptr_eq_methods, r=rkruppe
make `Weak::ptr_eq`s into methods

This makes the `Weak::ptr_eq`s associated function into methods. There's no reason for methods on `Weak`s to be associated functions, as there is no `Dered` thus no possibility of a collision. Also: methods can be called using the associated function syntax.

follow up on https://github.com/rust-lang/rust/pull/55987
[Tracking issue for weak_ptr_eq](https://github.com/rust-lang/rust/issues/55981)
2019-06-17 20:56:00 +02:00
Thomas Heck 387ac060d2 make Weak::ptr_eqs into methods 2019-06-16 14:05:44 +02:00
chansuke 89292beedb Separate liballoc module 2019-06-16 13:08:09 +03:00
Mazdak Farrokhzad 006440a7fe Rollup merge of #61447 - scottmcm:vec-vecdeque, r=sfackler
Add some Vec <-> VecDeque documentation

These are more than just `.into_iter().collect()`, so talk about some of their nuances.

For VecDeque -> Vec I'm trying to intentionally not write a guarantee for people making their own `Vec`s, since the rules are more complicated than I think we want to commit to forever.

The "Vec -> VecDeque doesn't reallocate" guarantee seems reasonable, though.  (And I'm intentionally ambiguous about when it's O(1) instead of O(n).)
2019-06-16 06:05:12 +02:00
Michal 'vorner' Vaner 49fbd76a76 Make the Weak::{into,as}_raw methods
Because Weak doesn't Deref, so there's no reason for them to be only
associated methods.
2019-06-15 08:47:19 +02:00
bors fc550d4295 Auto merge of #61421 - vorner:string-in-rc-into-raw-docs, r=RalfJung
docs: Use String in Rc::into_raw examples

It is unclear if accessing an integer after `drop_in_place` has been
called on it is undefined behaviour or not, as demonstrated by the
discussion in
https://github.com/rust-lang/rust/pull/60766#pullrequestreview-243414222.

Avoid these uncertainties by using String which frees memory in its
`drop_in_place` to make sure this is undefined behaviour. The message in
the docs should be to watch out and not access the data after that, not
discussing when one maybe could get away with it O:-).
2019-06-14 12:37:28 +00:00
Michal 'vorner' Vaner 79e5839992 docs: Use String in Rc::into_raw examples
It is unclear if accessing an integer after `drop_in_place` has been
called on it is undefined behaviour or not, as demonstrated by the
discussion in
https://github.com/rust-lang/rust/pull/60766#pullrequestreview-243414222.

Avoid these uncertainties by using String which frees memory in its
`drop_in_place` to make sure this is undefined behaviour. The message in
the docs should be to watch out and not access the data after that, not
discussing when one maybe could get away with it O:-).
2019-06-13 13:18:59 +02:00
Vadim Petrochenkov eb09daa762 Hygienize macros in the standard library 2019-06-12 20:27:29 +03:00
Scott McMurray 0150448f1b Remove the questionably-useful example 2019-06-11 21:13:48 -07:00
Scott McMurray 5168f5d220 Add hyperlinks to Vec and VecDeque
Let's try the auto-linking instead, since the relative ones don't work.
2019-06-08 22:39:33 -07:00
scottmcm 8da94ef849 Apply suggestions from code review
Co-Authored-By: Joe ST <joe@fbstj.net>
2019-06-08 22:38:18 -07:00
Scott McMurray 1f4a262d85 Put the docs on the methods instead of the impls
Since simulacrum suggested (on Discord) they're better there.
2019-06-08 22:38:18 -07:00
scottmcm 2da4f9ad5e Apply suggestions from code review
Co-Authored-By: Mazdak Farrokhzad <twingoow@gmail.com>
2019-06-08 22:38:18 -07:00
Scott McMurray cc2a2808d0 Add some Vec <-> VecDeque documentation
These are more than just `.into_iter().collect()`, so talk about some of their nuances.
2019-06-08 22:38:18 -07:00
Vadim Petrochenkov 74a6d1c821 Turn #[allocator] into a built-in attribute and rename it to #[rustc_allocator] 2019-06-08 23:55:25 +03:00
Mazdak Farrokhzad 1ae4727f3f Rollup merge of #61420 - felixrabe:patch-2, r=dtolnay
Succinctify splice docs
2019-06-04 04:48:16 +02:00
Mazdak Farrokhzad 5d1d2992ef Rollup merge of #61419 - scottmcm:casing-is-on-strings, r=cramertj
Add an unusual-conversion example to to_uppercase

Like how to_lowercase has ὈΔΥΣΣΕΎΣ.
2019-06-04 04:48:13 +02:00
Mazdak Farrokhzad 45cdc6d578 Rollup merge of #61135 - czipperz:rc-make_mut-weak-doc, r=Mark-Simulacrum
Fix documentation of `Rc::make_mut` regarding `rc::Weak`.

Closes #60961
2019-06-04 04:48:03 +02:00
Felix Rabe 7bdc38d3a4 Succinctify splice docs 2019-06-01 11:26:08 +02:00
Scott McMurray dfd9d0429c Add an unusual-conversion example to to_uppercase
Like how to_lowercase has ὈΔΥΣΣΕΎΣ.
2019-06-01 00:23:26 -07:00
Lzu Tao 0c35c699d4 Stabilize iter_nth_back feature 2019-05-30 18:00:17 +00:00
Mazdak Farrokhzad 1b66a13540 Rollup merge of #61244 - RalfJung:box, r=rkruppe
Box::into_vec: use Box::into_raw instead of mem::forget

`Box::into_raw` does, in one step, turn the `Box` into a raw ptr and avoid deallocation.  Seems cleaner than separating the two.

Also, `mem::forget` gets the `Box` with a `noalias` argument, but it is not actually correct that this is an exclusive pointer. So a stricter version of Stacked Borrows would complain here. (I can't actually make Stacked Borrows that strict yet though due to other issues.)
2019-05-30 10:52:55 +02:00
Mazdak Farrokhzad cb012a0430 Rollup merge of #60766 - vorner:weak-into-raw, r=sfackler
Weak::into_raw

Hello

This is my first shot at #60728. I'd like to consult it a bit before moving further.

The biggest question I have is if this API makes sense. My motivation for it is to be able to store the `Weak` in `AtomicPtr`. For that I don't actually need for the pointer to point to the `T`, any pointer (maybe casted to `usize`) would be good enough, but this mirrors what `Arc` does and could be useful for other things too (like comparing if Arc and Weak point to the same thing without playing with the counts), while some opaque pointer wouldn't.

Some secondary questions, if this is deemed desirable are:
* The weak pointer may be dangling if it is created by `Weak::new()`. It would make sense to treat this as NULL, but that is incompatible with `T: ?Sized` ‒ both `new()` and `ptr::null()` are available only for sized types. The current implementation is therefore also available only for sized `T`s. It would be possible to allow `?Sized` if the API would be `fn into_raw(self) -> Option<NonNull<T>>` and `fn from_raw(NonNull<T>)`, but that's different API than `Arc` has. What would be preferred?
* There's a FIXME in my code about what I suspect could be UB. Is it really UB & how to get the pointer correctly? Is manual offsetting of the pointer the only way?
* Am I missing some other necessary thing around the feature gates and such?
* Is the documentation understandable? I know writing docs is not my strongest skill :-|.

Thinks I'd like to do as part of the PR, but are not yet done:
* Turn the referenced issue into tracking issue for the feature flag.
* Once the `sync::Weak` is considered reasonable, I'd do the equivalent for `rc::Weak`.
* This might call for few more tests than what is currently part of the documentation.
2019-05-29 08:15:53 +02:00