Commit Graph

1757 Commits

Author SHA1 Message Date
Ralf Jung 9d82826e55 add test checking that Vec push/pop does not invalidate pointers 2019-05-25 10:11:00 +02:00
Mazdak Farrokhzad 3388028776 Rollup merge of #61086 - RalfJung:box, r=alexcrichton
Box::into_unique: do the reborrow-to-raw *after* destroying the Box

Currently we first "reborrow" the box to a raw pointer, and then `forget` it. When tracking raw pointers more strictly (something I am experimenting with locally in Miri), the "use" induced by passing the box to `forget` invalidates the previously created raw pointer.

So adjust my hack from https://github.com/rust-lang/rust/pull/58429 to reorder the two operations.
2019-05-24 01:30:24 +02:00
Ralf Jung 8d4e7fde47 adjust comment 2019-05-23 18:13:08 +02:00
Ralf Jung 6116f19f7b Box::into_unique: do the reborrow-to-raw *after* destroying the Box 2019-05-23 18:01:47 +02:00
Ralf Jung f44b264447 fix dangling reference in Vec::append 2019-05-23 16:30:54 +02:00
Steven Fackler 8a22bc3b30 Revert "Add implementations of last in terms of next_back on a bunch of DoubleEndedIterators."
This reverts commit 3e86cf36b5.
2019-05-22 14:09:34 -07:00
bors 37ff5d388f Auto merge of #59445 - alexreg:ban-multi-trait-objects-via-aliases, r=oli-obk
Ban multi-trait objects via trait aliases

Obviously, multi-trait objects are not normally supported, so they should not be supported via trait aliases.

This has been factored out from the previous PR https://github.com/rust-lang/rust/pull/55994 (see point 1).

r? @Centril

CC @nikomatsakis

------------------

### RELNOTES:

We now allow `dyn Send + fmt::Debug` with equivalent semantics to `dyn fmt::Debug + Send`.
That is, the order of the mentioned traits does not matter wrt. principal/not-principal traits.
This is a small change that might deserve a mention in the blog post because it is a language change but most likely not.

See https://github.com/rust-lang/rust/blob/ce2ee305f9165c037ecddddb5792588a15ff6c37/src/test/ui/traits/wf-trait-object-reverse-order.rs.

// @Centril
2019-05-22 08:22:17 +00:00
Mazdak Farrokhzad 40a18a1df5 Rollup merge of #60963 - blkerby:boxed_docs, r=alexcrichton
Update boxed::Box docs on memory layout

The existing docs for the `Box` type state that "the way `Box` allocates and releases memory is unspecified", and that therefore the only valid pointer to pass to `Box::from_raw` is one obtained from `Box::into_raw`. This is inconsistent with the module-level docs which specify,

> It is valid to convert both ways between a Box and a raw pointer allocated with the Global allocator, given that the Layout used with the allocator is correct for the type. More precisely, a value: *mut T that has been allocated with the Global allocator with Layout::for_value(&*value) may be converted into a box using Box::<T>::from_raw(value). Conversely, the memory backing a value: *mut T obtained from Box::<T>::into_raw may be deallocated using the Global allocator with Layout::for_value(&*value).

This pull request updates the docs for `Box` to make them consistent with the module-level docs and adds some examples of how to use the global allocator in conjunction with `Box::from_raw` and `Box::into_raw`.
2019-05-22 03:47:32 +02:00
Brent Kerby 4e37785c7d Create and reference Memory Layout section of boxed docs 2019-05-20 21:03:40 -06:00
Mazdak Farrokhzad 864e7a9251 Rollup merge of #60952 - dtolnay:heap, r=Amanieu
Document BinaryHeap time complexity

I went into some detail on the time complexity of `push` because it is relevant for using BinaryHeap efficiently -- specifically that you should avoid pushing many elements in ascending order when possible.

r? @Amanieu
Closes #47976. Closes #59698.
2019-05-20 23:03:06 +02:00
Mazdak Farrokhzad a34dae3587 Rollup merge of #60511 - taiki-e:libstd-intra-doc, r=Dylan-DPC
Fix intra-doc link resolution failure on re-exporting libstd

Currently, re-exporting libstd items as below will [occur a lot of failures](https://gist.github.com/taiki-e/e33e0e8631ef47f65a74a3b69f456366).
```rust
pub use std::*;
```

Until the underlying issue (#56922) fixed, we can fix that so they don't propagate to downstream crates.

Related: https://github.com/rust-lang/rust/pull/56941 (That PR fixed failures that occur when re-exporting from libcore to libstd.)

r? @QuietMisdreavus
2019-05-20 23:02:59 +02:00
Alexander Regueiro 9f800457dd Ban multi-trait objects via trait aliases. 2019-05-20 16:12:49 +01:00
Brent Kerby 178b753a4a Remove trailing whitespaces to satisfy tidy 2019-05-20 08:14:06 -06:00
Brent Kerby a7e1431941 Update boxed::Box docs on memory layout 2019-05-20 08:14:06 -06:00
Ralf Jung b7afe777f7 stabilize core parts of MaybeUninit and deprecate mem::uninitialized in the future
Also expand the documentation a bit
2019-05-20 10:44:02 +02:00
David Tolnay ea7aa76911 Document BinaryHeap time complexity
I went into some detail on the time complexity of `push` because it is
relevant for using BinaryHeap efficiently -- specifically that you
should avoid pushing many elements in ascending order when possible.
2019-05-18 20:25:24 -07:00
Mazdak Farrokhzad de39eb81ed Rollup merge of #60931 - cuviper:array-iter, r=KodrAus
Use iter() for iterating arrays by slice

These `into_iter()` calls will change from iterating references to
values if we ever get `IntoIterator` for arrays, which may break the
code using that iterator. Calling `iter()` is future proof.
2019-05-19 02:31:40 +02:00
Mazdak Farrokhzad dc7cbb697b Rollup merge of #60678 - DutchGhost:master, r=scottmcm
Stabilize vecdeque_rotate

This PR stabilizes the vecdeque_rotate feature.
r? @scottmcm

Closes https://github.com/rust-lang/rust/issues/56686
2019-05-19 02:31:35 +02:00
Josh Stone 90dd35918d Use iter() for iterating arrays by slice
These `into_iter()` calls will change from iterating references to
values if we ever get `IntoIterator` for arrays, which may break the
code using that iterator. Calling `iter()` is future proof.
2019-05-17 19:56:35 -07:00
Alex Crichton 3c9790e429 Update the compiler_builtins crate
This updates to 0.1.13 for `compiler_builtins`, published to fix a few
issues. The feature changes here are updated because `compiler_builtins`
no longer enables the `c` feature by default but we want to do so
through our build still.

Closes #60747
Closes #60782
2019-05-17 07:17:15 -07:00
Mazdak Farrokhzad f08c5bbc85 Rollup merge of #59825 - jsgf:from-ref-string, r=sfackler
string: implement From<&String> for String

Allow Strings to be created from borrowed Strings. This is mostly
to make things like passing `&String` to an `impl Into<String>`
parameter frictionless.

Fixes #59827.
2019-05-16 10:43:24 +02:00
Mazdak Farrokhzad bab03cecfe Rollup merge of #60130 - khuey:efficient_last, r=sfackler
Add implementations of last in terms of next_back on a bunch of DoubleEndedIterators

Provided a `DoubleEndedIterator` has finite length, `Iterator::last` is equivalent to `DoubleEndedIterator::next_back`. But searching forwards through the iterator when it's unnecessary is obviously not good for performance. I ran into this on one of the collection iterators.

I tried adding appropriate overloads for a bunch of the iterator adapters like filter, map, etc, but I ran into a lot of type inference failures after doing so.

The other interesting case is what to do with `Repeat`. Do we consider it part of the contract that `Iterator::last` will loop forever on it? The docs do say that the iterator will be evaluated until it returns None. This is also relevant for the adapters, it's trivially easy to observe whether a `Map` adapter invoked its closure a zillion times or just once for the last element.
2019-05-14 22:00:09 +02:00
bors 16e356ebdf Auto merge of #60396 - cuviper:ordered-retain, r=scottmcm
Document the order of {Vec,VecDeque,String}::retain

It's natural for `retain` to work in order from beginning to end, but
this wasn't actually documented to be the case. If we actually promise
this, then the caller can do useful things like track the index of each
element being tested, as [discussed in the forum][1]. This is now
documented for `Vec`, `VecDeque`, and `String`.

[1]: https://users.rust-lang.org/t/vec-retain-by-index/27697

`HashMap` and `HashSet` also have `retain`, and the `hashbrown`
implementation does happen to use a plain `iter()` order too, but it's
not certain that this should always be the case for these types.

r? @scottmcm
2019-05-12 06:24:10 +00:00
Thomas Heck 740a8dabb4 add comment to Rc/Arc's Eq specialization 2019-05-11 11:03:28 +02:00
Josh Stone 0545375ca6 Add examples of ordered retain 2019-05-10 18:01:50 -07:00
bors 407536e38d Auto merge of #60451 - rasendubi:binaryheap-min-heap, r=scottmcm
BinaryHeap: add min-heap example

Fixes #58174.
2019-05-10 04:10:36 +00:00
Dodo 4d033990fc supposed to be 1.36.0 2019-05-09 20:50:02 +02:00
Dodo 1acd37fde5 make vecdeque_rotate stable 2019-05-09 20:30:36 +02:00
Taiki Endo ccb9dac5ed Fix intra-doc link resolution failure on re-exporting libstd 2019-05-04 23:48:57 +09:00
Mazdak Farrokhzad 639e452c5f Remove unused feature(need_allocator). 2019-05-04 04:20:55 +02:00
Alexey Shmalko adbaf7a9cd BinaryHeap: add min-heap example 2019-05-01 23:26:06 +03:00
YOSHIOKA Takuma a0e112ba52 Implement BorrowMut<str> for String
Closes rust-lang/rfcs#1282.
2019-04-30 17:50:38 +09:00
Josh Stone 9b3583375d Document the order of {Vec,VecDeque,String}::retain
It's natural for `retain` to work in order from beginning to end, but
this wasn't actually documented to be the case. If we actually promise
this, then the caller can do useful things like track the index of each
element being tested, as [discussed in the forum][1]. This is now
documented for `Vec`, `VecDeque`, and `String`.

[1]: https://users.rust-lang.org/t/vec-retain-by-index/27697

`HashMap` and `HashSet` also have `retain`, and the `hashbrown`
implementation does happen to use a plain `iter()` order too, but it's
not certain that this should always be the case for these types.
2019-04-29 18:32:05 -07:00
Matthias Geier be12ab070d Use "capacity" as parameter name in with_capacity() methods
Closes #60271.
2019-04-26 18:43:24 +02:00
varkor aa388f1d11 ignore-tidy-filelength on all files with greater than 3000 lines 2019-04-25 21:39:09 +01:00
Taylor Cramer 3f966dcd53 Stabilize futures_api 2019-04-23 16:13:53 -07:00
varkor 7f0f0e31ec Remove double trailing newlines 2019-04-22 16:57:01 +01:00
Philipp Hansch 110a73d6c6 Deny rust_2018_idioms in liballoc tests 2019-04-20 16:05:25 +02:00
Kyle Huey 3e86cf36b5 Add implementations of last in terms of next_back on a bunch of DoubleEndedIterators.
r?Manishearth
2019-04-19 21:52:43 -07:00
bors 130dc3e7da Auto merge of #60072 - RalfJung:linked-list, r=shepmaster
fix LinkedList invalidating mutable references

The test `test_insert_prev` failed in Miri due to what I consider a bug in `LinkedList`: in various places, `NonNull::as_mut` got called to modify the `prev`/`next` pointers of existing nodes. In particular, the unstable `insert_next` has to modify the `next` pointer of the node that was last handed out by the iterator; to this end it creates a mutable reference to the *entire node* that overlaps with the mutable reference to the node's content that was handed out by the iterator! Thus, the next use if said mutable reference is UB.

In code:
```rust
            loop {
                match it.next() { // mutable reference handed to us
                    None => break,
                    Some(elt) => {
                        it.insert_next(*elt + 1); // this invalidates `elt` because it creates an overlapping mutable reference
                        match it.peek_next() {
                            Some(x) => assert_eq!(*x, *elt + 2), // this use of `elt` now is a use of an invalid pointer
                            None => assert_eq!(8, *elt),
                        }
                    }
                }
            }
```

This PR fixes that by using `as_ptr` instead of `as_mut`. This avoids invalidating the mutable reference that was handed to the user.  I did this in all methods called by iterators, just to be sure.

Cc @Gankro
2019-04-19 17:12:17 +00:00
Ralf Jung 8b09d046fe fix LinkedList invalidating mutable references 2019-04-19 18:33:08 +02:00
bors a2bbf7deba Auto merge of #60077 - RalfJung:miri-alloc-tests, r=joshtriplett
make liballoc internal test suite mostly pass in Miri

I discovered, to my surprise, that liballoc has two test suites: `liballoc/tests`, and a bunch of stuff embedded directly within liballoc.  The latter was not covered by [miri-test-libstd](https://github.com/RalfJung/miri-test-libstd) yet.  This disables in Miri the tests that Miri cannot support or runs too slowly.
2019-04-19 12:52:02 +00:00
Ralf Jung 2bc8c547cd move variable down to where it is used 2019-04-19 09:06:08 +02:00
Mazdak Farrokhzad 7f450bd3ca Rollup merge of #59933 - sourcefrog:doc-fmt, r=shepmaster
Make clear that format padding doesn't work for Debug

As mentioned in
https://github.com/rust-lang/rust/issues/46006#issuecomment-345260633
2019-04-19 06:03:10 +02:00
Ralf Jung 29eed6b931 make liballoc internal test suite mostly pass in Miri 2019-04-18 13:37:14 +02:00
Mazdak Farrokhzad a20438773b Rollup merge of #59908 - lzutao:str_escape, r=SimonSapin
Re-export core::str::{EscapeDebug, EscapeDefault, EscapeUnicode} in std

cc #59893
2019-04-18 00:23:36 +02:00
Ralf Jung d55e4b7a25 test sort_unstable in Miri 2019-04-17 09:47:36 +02:00
Ralf Jung 9b21324db2 Miri now supports entropy, but is still slow 2019-04-16 20:04:17 +02:00
Ralf Jung 50c615baa2 warn(missing_docs) in liballoc, and add missing docs 2019-04-15 16:35:50 +02:00
Ralf Jung 8ef7ca1302 make lint levels more consistent 2019-04-14 10:16:23 +02:00