Commit graph

2480 commits

Author SHA1 Message Date
Manish Goregaokar
55479de299
Rollup merge of #72709 - LeSeulArtichaut:unsafe-liballoc, r=nikomatsakis
`#[deny(unsafe_op_in_unsafe_fn)]` in liballoc

This PR proposes to make use of the new `unsafe_op_in_unsafe_fn` lint, i.e. no longer consider the body of an unsafe function as an unsafe block and require explicit unsafe block to perform unsafe operations.

This has been first (partly) suggested by @Mark-Simulacrum in https://github.com/rust-lang/rust/pull/69245#issuecomment-587817065

Tracking issue for the feature: #71668.
~~Blocked on #71862.~~
r? @Mark-Simulacrum cc @nikomatsakis can you confirm that those changes are desirable? Should I restrict it to only BTree for the moment?
2020-06-19 09:14:58 -07:00
LeSeulArtichaut
7b6398657c Apply suggestions from code review
Co-authored-by: nikomatsakis <niko@alum.mit.edu>
2020-06-19 13:47:04 +02:00
LeSeulArtichaut
39e29ce4d0 #[deny(unsafe_op_in_unsafe_fn)] in liballoc 2020-06-19 13:47:01 +02:00
Ralf Jung
028c908991
Rollup merge of #73479 - pickfire:liballoc-spell, r=dtolnay
Minor tweaks to liballoc
2020-06-19 08:56:19 +02:00
Ralf Jung
fc2ce7cfef
Rollup merge of #73459 - cuviper:into_boxed_slice-unicast, r=dtolnay
Reduce pointer casts in Box::into_boxed_slice

We only need to cast the pointer once to change `Box<T>` to an array
`Box<[T; 1]>`, then we can let unsized coercion return `Box<[T]>`.
2020-06-19 08:56:15 +02:00
Ivan Tham
111c2d27f5 Rearrange liballoc __impl_slice_eq1 2020-06-19 00:34:49 +08:00
Ivan Tham
ec8ff1cc24 Liballoc clean up macro_rules style 2020-06-19 00:34:20 +08:00
Ivan Tham
8aecafe8e8 Fix liballoc doc spelling 2020-06-19 00:33:24 +08:00
Eric Huss
abb5800dd5 Ensure std benchmarks get tested. 2020-06-18 09:11:15 -07:00
Josh Stone
a7c2cf8f51 Reduce pointer casts in Box::into_boxed_slice
We only need to cast the pointer once to change `Box<T>` to an array
`Box<[T; 1]>`, then we can let unsized coercion return `Box<[T]>`.
2020-06-17 16:30:27 -07:00
Ralf Jung
e6510babc7
Rollup merge of #72584 - CAD97:stabilize-58957, r=dtolnay
Stabilize vec::Drain::as_slice

and add `AsRef<[T]> for Drain<'_, T>`.

Tracking issue: #58957. Does not stabilize `slice::IterMut::as_slice` yet. cc @cuviper
This PR proposes stabilizing just the `vec::Drain::as_slice` part of that tracking issue.

My ultimate goal here: being able to use `for<T, I: Iterator<Item=T> + AsRef<[T]>> I` to refer to `vec::IntoIter`, `vec::Drain`, and eventually `array::IntoIter`, as an approximation of the set of by-value iterators that can be "previewed" as by-ref iterators. (Actually expressing that as a trait requires GAT.)
2020-06-15 09:57:26 +02:00
Dylan DPC
c06799e4c4
Rollup merge of #72906 - lzutao:migrate-numeric-assoc-consts, r=dtolnay
Migrate to numeric associated consts

The deprecation PR is #72885

cc #68490
cc rust-lang/rfcs#2700
2020-06-12 12:28:23 +02:00
Lzu Tao
fff822fead Migrate to numeric associated consts 2020-06-10 01:35:47 +00:00
Nicholas Nethercote
c9cbe7e7eb Rename some identifiers in RawVec and libarena.
- Use `len` more consistently for the number of elements in a vector,
  because that's the usual name.
- Use `additional` more consistently for the number of elements we want
  to add, because that's what `Vec::reserve()` uses.
- Use `cap` consistently rather than `capacity`.
- Plus a few other tweaks.

This increases consistency and conciseness.
2020-06-09 07:55:35 +10:00
Nicholas Nethercote
cb8bc8e05d Remove RawVec::reserve_in_place.
Also remove a now-unnecessary `placement` argument.
2020-06-09 07:55:34 +10:00
Ralf Jung
13815e4b35
Rollup merge of #72811 - pickfire:liballoc-impl, r=Amanieu
Liballoc impl

Mainly code rearrangements
2020-06-08 09:55:28 +02:00
Ralf Jung
b0559bebd8
Rollup merge of #72583 - CAD97:vec-iter-asref-slice, r=dtolnay
impl AsRef<[T]> for vec::IntoIter<T>

Adds `impl<T> AsRef<[T]> for vec::IntoIter<T>`. This mirrors the same trait impl for [`slice::Iter`](https://doc.rust-lang.org/nightly/std/slice/struct.Iter.html). Both types already offer `fn as_slice(&self) -> &[T]`, this just adds the trait impl for `vec::IntoIter`.

If/when `fn as_slice(&self) -> &[T]` stabilizes for `vec::Drain` and `slice::IterMut`, they should get `AsRef<[T]>` impls as well. As thus, tangentially related to #58957.

My ultimate goal here: being able to use `for<T, I: Iterator<Item=T> + AsRef<[T]>> I` to refer to `vec::IntoIter`, `vec::Drain`, and eventually `array::IntoIter`, as an approximation of the set of by-value iterators that can be "previewed" as by-ref iterators. (Actually expressing that as a trait requires GAT.)
2020-06-08 09:55:20 +02:00
Ivan Tham
758aa23e44 Elide type on liballoc vec 2020-06-06 23:07:02 +08:00
bors
e4124750c3 Auto merge of #73025 - Dylan-DPC:rollup-a1uzj5u, r=Dylan-DPC
Rollup of 5 pull requests

Successful merges:

 - #72260 (Spell out `Self` in async function return)
 - #72996 (Remove unsused `NodeId` related APIs in hir map)
 - #73010 (Update RELEASES.md)
 - #73017 (Use assert_eq for liballoc test)
 - #73019 (add test for #72960)

Failed merges:

r? @ghost
2020-06-05 15:21:01 +00:00
bors
84ec8238b1 Auto merge of #72957 - Mark-Simulacrum:bootstrap-bump, r=sfackler
Bump bootstrap compiler to 1.45

Pretty standard update.
2020-06-05 11:11:26 +00:00
Ivan Tham
b54a917b14 Use assert_eq for liballoc test 2020-06-05 16:56:51 +08:00
Ivan Tham
29ab6b73e1 Add more assert to Vec with_capacity docs
Show assertion on len too to show them how adding new items will affect both the
length and capacity, before and after.
2020-06-05 01:11:01 +08:00
Mark Rousskov
7139342249 Bump to 1.46 2020-06-03 15:27:51 -04:00
Ivan Tham
596b0c88cc Add assert to Vec with_capacity docs 2020-06-03 01:29:02 +08:00
Ivan Tham
71404633e8 Merge raw_vec into_box with previous impl<T, Global>
There are two separate `impl<T, Global>` which no special reason, it would be
better to merge both of them.
2020-05-31 17:19:06 +08:00
Ivan Tham
79449986b7 Rearrange impl blocks with Deref as first
The other blocks depends on Deref to make it easier for readers when
reimplementing or reading the implementations.
2020-05-31 17:16:47 +08:00
Ralf Jung
8d64fd80ad
Rollup merge of #72499 - mendess:master, r=dtolnay
Override Box::<[T]>::clone_from

Avoid dropping and reallocating when cloning to an existing box if the lengths are the same.

It would be nice if this could also be specialized for `Copy` but I don't know how that works since it's not on stable. Will gladly look into it if it's deemed as a good idea.

This is my first PR with code, hope I did everything right 😄
2020-05-30 13:45:06 +02:00
Yuki Okushi
3459eae96c
Rollup merge of #72162 - cuviper:extend_one, r=Mark-Simulacrum
Add Extend::{extend_one,extend_reserve}

This adds new optional methods on `Extend`: `extend_one` add a single
element to the collection, and `extend_reserve` pre-allocates space for
the predicted number of incoming elements. These are used in `Iterator`
for `partition` and `unzip` as they shuffle elements one-at-a-time into
their respective collections.
2020-05-30 12:39:10 +09:00
Josh Stone
6700e18688 Add Extend::{extend_one,extend_reserve}
This adds new optional methods on `Extend`: `extend_one` add a single
element to the collection, and `extend_reserve` pre-allocates space for
the predicted number of incoming elements. These are used in `Iterator`
for `partition` and `unzip` as they shuffle elements one-at-a-time into
their respective collections.
2020-05-29 17:05:17 -07:00
bors
0e9e408310 Auto merge of #72756 - RalfJung:rollup-tbjmtx2, r=RalfJung
Rollup of 9 pull requests

Successful merges:

 - #67460 (Tweak impl signature mismatch errors involving `RegionKind::ReVar` lifetimes)
 - #71095 (impl From<[T; N]> for Box<[T]>)
 - #71500 (Make pointer offset methods/intrinsics const)
 - #71804 (linker: Support `-static-pie` and `-static -shared`)
 - #71862 (Implement RFC 2585: unsafe blocks in unsafe fn)
 - #72103 (borrowck `DefId` -> `LocalDefId`)
 - #72407 (Various minor improvements to Ipv6Addr::Display)
 - #72413 (impl Step for char (make Range*<char> iterable))
 - #72439 (NVPTX support for new asm!)

Failed merges:

r? @ghost
2020-05-29 23:43:20 +00:00
Ralf Jung
b387a11636
Rollup merge of #71095 - pickfire:box-from-array, r=dtolnay
impl From<[T; N]> for Box<[T]>

Based on https://github.com/rust-lang/rust/pull/68692
2020-05-29 21:58:19 +02:00
Dylan DPC
510793bcb3
Rollup merge of #72701 - pickfire:patch-1, r=Mark-Simulacrum
Fix grammar in liballoc raw_vec
2020-05-29 20:21:24 +02:00
mendess
dbf32e2270 Remove flaky test and document the other's flakiness 2020-05-29 11:24:26 +01:00
Yuki Okushi
d472f8e462
Rollup merge of #72288 - vorner:stabilize-weak-into-raw, r=dtolnay
Stabilization of weak-into-raw

Closes #60728.

There are also two removals of `#![feature(weak_into_raw)]` in the `src/tools/miri` submodule. How should I synchronize the changes with there?

* I can ignore it for now and once this gets merged, update the tool, send a pull request to that one and then reference the changes to rustc.
* I could try submitting the changes to miri first, but then the build would fail there, because the attribute would still be needed.

I think the first one is the correct one, extrapolating from the contributing guidelines (even though they speak about breaking the tools and this should not break it, as extra feature should not hurt).
2020-05-29 15:06:55 +09:00
Ivan Tham
42a4f5ac50
Fix grammar in liballoc raw_vec 2020-05-29 00:40:41 +08:00
Dylan DPC
8f95dc8d4e
Rollup merge of #72533 - Diggsey:db-fix-arc-ub2, r=dtolnay
Resolve UB in Arc/Weak interaction (2)

Use raw pointers to avoid making any assertions about the data field.

Follow up from #72479, see that PR for more detail on the motivation.

@RalfJung I was able to avoid a lot of the changes to `Weak`, by making a helper type (`WeakInner`) - because of auto-deref and because the fields have the same name, the rest of the code continues to compile.
2020-05-27 03:09:12 +02:00
CAD97
738f8487fd stabilize vec_drain_as_slice 2020-05-25 15:35:59 -04:00
CAD97
91f52a51a2 impl AsRef<[T]> for vec::IntoIter<T> 2020-05-25 15:17:28 -04:00
Diggory Blake
ee6e705d91 Fix UB in Arc
Use raw pointers to avoid making any assertions about the data field.
2020-05-25 11:47:48 +01:00
mendess
32eedadee1 Add tests 2020-05-23 16:51:02 +01:00
mendess
a5734ca417 Override Box::<[T]>::clone_from 2020-05-23 14:08:53 +01:00
Ivan Tham
a8ed9aa9f0 impl From<[T; N]> for Box<[T]>
Based on https://github.com/rust-lang/rust/pull/68692
2020-05-20 17:00:21 +08:00
Nicholas Nethercote
9eb0399a9d Adjust the zero check in RawVec::grow.
This was supposed to land as part of #72227. (I wish `git push` would
abort when you have uncommited changes.)
2020-05-20 09:57:14 +10:00
bors
672b272077 Auto merge of #72227 - nnethercote:tiny-vecs-are-dumb, r=Amanieu
Tiny Vecs are dumb.

Currently, if you repeatedly push to an empty vector, the capacity
growth sequence is 0, 1, 2, 4, 8, 16, etc. This commit changes the
relevant code (the "amortized" growth strategy) to skip 1 and 2, instead
using 0, 4, 8, 16, etc. (You can still get a capacity of 1 or 2 using
the "exact" growth strategy, e.g. via `reserve_exact()`.)

This idea (along with the phrase "tiny Vecs are dumb") comes from the
"doubling" growth strategy that was removed from `RawVec` in #72013.
That strategy was barely ever used -- only when a `VecDeque` was grown,
oddly enough -- which is why it was removed in #72013.

(Fun fact: until just a few days ago, I thought the "doubling" strategy
was used for repeated push case. In other words, this commit makes
`Vec`s behave the way I always thought they behaved.)

This change reduces the number of allocations done by rustc itself by
10% or more. It speeds up rustc, and will also speed up any other Rust
program that uses `Vec`s a lot.

In theory, the change could increase memory usage, but in practice it
doesn't. It would be an unusual program where very small `Vec`s having a
capacity of 4 rather than 1 or 2 would make a difference. You'd need a
*lot* of very small `Vec`s, and/or some very small `Vec`s with very
large elements.

r? @Amanieu
2020-05-19 15:12:12 +00:00
bors
914adf04af Auto merge of #71447 - cuviper:unsized_cow, r=dtolnay
impl From<Cow> for Box, Rc, and Arc

These forward `Borrowed`/`Owned` values to existing `From` impls.

- `Box<T>` is a fundamental type, so it would be a breaking change to add a blanket impl. Therefore, `From<Cow>` is only implemented for `[T]`, `str`, `CStr`, `OsStr`, and `Path`.
- For `Rc<T>` and `Arc<T>`, `From<Cow>` is implemented for everything that implements `From` the borrowed and owned types separately.
2020-05-19 08:08:48 +00:00
Nicholas Nethercote
f4b9dc31f6 Tiny Vecs are dumb.
Currently, if you repeatedly push to an empty vector, the capacity
growth sequence is 0, 1, 2, 4, 8, 16, etc. This commit changes the
relevant code (the "amortized" growth strategy) to skip 1 and 2 in most
cases, instead using 0, 4, 8, 16, etc. (You can still get a capacity of
1 or 2 using the "exact" growth strategy, e.g. via `reserve_exact()`.)

This idea (along with the phrase "tiny Vecs are dumb") comes from the
"doubling" growth strategy that was removed from `RawVec` in #72013.
That strategy was barely ever used -- only when a `VecDeque` was grown,
oddly enough -- which is why it was removed in #72013.

(Fun fact: until just a few days ago, I thought the "doubling" strategy
was used for repeated push case. In other words, this commit makes
`Vec`s behave the way I always thought they behaved.)

This change reduces the number of allocations done by rustc itself by
10% or more. It speeds up rustc, and will also speed up any other Rust
program that uses `Vec`s a lot.
2020-05-18 15:26:59 +10:00
bors
34cce58d81 Auto merge of #72204 - RalfJung:abort, r=Mark-Simulacrum
make abort intrinsic safe, and correct its documentation

Turns out `std::process::abort` is not the same as the intrinsic, the comment was just wrong. Quoting from the unix implementation:
```
// On Unix-like platforms, libc::abort will unregister signal handlers
// including the SIGABRT handler, preventing the abort from being blocked, and
// fclose streams, with the side effect of flushing them so libc buffered
// output will be printed.  Additionally the shell will generally print a more
// understandable error message like "Abort trap" rather than "Illegal
// instruction" that intrinsics::abort would cause, as intrinsics::abort is
// implemented as an illegal instruction.
```
2020-05-17 12:49:01 +00:00
Ralf Jung
5980d972d1 make abort intrinsic safe, and correct its documentation 2020-05-17 11:23:42 +02:00
Michal 'vorner' Vaner
ba0d0c27df
Stabilization of weak-into-raw
Stabilizes #60728.
2020-05-17 08:21:24 +02:00
bors
85f0da67ff Auto merge of #71321 - matthewjasper:alloc-min-spec, r=sfackler
Use min_specialization in liballoc

- Remove a type parameter from `[A]RcFromIter`.
- Remove an implementation of `[A]RcFromIter` that didn't actually
  specialize anything.
- Remove unused implementation of `IsZero` for `Option<&mut T>`.
- Change specializations of `[A]RcEqIdent` to use a marker trait version
of `Eq`.
- Remove `BTreeClone`. I couldn't find a way to make this work with
  `min_specialization`.
- Add `rustc_unsafe_specialization_marker` to `Copy` and `TrustedLen`.

After this only libcore is the only standard library crate using `feature(specialization)`.
cc #31844
2020-05-14 23:22:47 +00:00