Commit Graph

108613 Commits

Author SHA1 Message Date
Mazdak Farrokhzad 426a4cc930 Rollup merge of #69934 - andjo403:inlinecost, r=wesleywiser
Update the mir inline costs

handle that when mir is lowered to llvm-ir more code is generated.
Landingpads generates 10 llvm-ir instructions
and resume 9 llvm-ir instructions.

r? @wesleywiser
2020-03-21 08:51:12 +01:00
Mazdak Farrokhzad 9adfb18def Rollup merge of #67888 - Zoxc:metadata-prefetch, r=matthewjasper
Prefetch some queries used by the metadata encoder

This brings the time for `metadata encoding and writing` for `syntex_syntax` from 1.338s to 0.997s with 6 threads in non-incremental debug mode.

r? @Mark-Simulacrum
2020-03-21 08:51:10 +01:00
bors 5f13820478 Auto merge of #70205 - Centril:rollup-0jq9k4s, r=Centril
Rollup of 16 pull requests

Successful merges:

 - #65097 (Make std::sync::Arc compatible with ThreadSanitizer)
 - #69033 (Use generator resume arguments in the async/await lowering)
 - #69997 (add `Option::{zip,zip_with}` methods under "option_zip" gate)
 - #70038 (Remove the call that makes miri fail)
 - #70058 (can_begin_literal_maybe_minus: `true` on `"-"? lit` NTs.)
 - #70111 (BTreeMap: remove shared root)
 - #70139 (add delay_span_bug to TransmuteSizeDiff, just to be sure)
 - #70165 (Remove the erase regions MIR transform)
 - #70166 (Derive PartialEq, Eq and Hash for RangeInclusive)
 - #70176 (Add tests for #58319 and #65131)
 - #70177 (Fix oudated comment for NamedRegionMap)
 - #70184 (expand_include: set `.directory` to dir of included file.)
 - #70187 (more clippy fixes)
 - #70188 (Clean up E0439 explanation)
 - #70189 (Abi::is_signed: assert that we are a Scalar)
 - #70194 (#[must_use] on split_off())

Failed merges:

r? @ghost
2020-03-21 04:34:04 +00:00
Mazdak Farrokhzad 54285db640 Rollup merge of #70194 - kornelski:must_split, r=joshtriplett
#[must_use] on split_off()

I've noticed this function used for truncation in the wild. `must_use` will clear that up.
2020-03-21 05:33:36 +01:00
Mazdak Farrokhzad 937ca434b1 Rollup merge of #70189 - RalfJung:is_signed, r=eddyb
Abi::is_signed: assert that we are a Scalar

A bit more sanity checking, suggested by @eddyb. This makes this method actually "safer" than `TyS::is_signed`, so I made sure Miri consistently uses the `Abi` version.

Though I am not sure if this would have caught the mistake where the layout of a zero-sized enum was asked for its sign.

r? @eddyb
2020-03-21 05:33:35 +01:00
Mazdak Farrokhzad 832daf720a Rollup merge of #70188 - GuillaumeGomez:cleanup-e0439, r=Dylan-DPC
Clean up E0439 explanation

r? @Dylan-DPC
2020-03-21 05:33:33 +01:00
Mazdak Farrokhzad 3e6b1ac964 Rollup merge of #70187 - matthiaskrgr:cl2ppy, r=Mark-Simulacrum
more clippy fixes

    * remove redundant returns (clippy::needless_return)
    * remove redundant import (clippy::single_component_path_imports)
    * remove redundant format!() call (clippy::useless_format)
    * don't use ok() before calling expect() (clippy::ok_expect)
2020-03-21 05:33:31 +01:00
Mazdak Farrokhzad 621f2b7e90 Rollup merge of #70184 - Centril:include-mod-relativism, r=petrochenkov
expand_include: set `.directory` to dir of included file.

Resolves the regression noted in https://github.com/rust-lang/rust/pull/69838/#discussion_r395217057.

r? @petrochenkov
cc @eddyb @Mark-Simulacrum
2020-03-21 05:33:30 +01:00
Mazdak Farrokhzad a3771e4a98 Rollup merge of #70177 - bjorn3:patch-2, r=Dylan-DPC
Fix oudated comment for NamedRegionMap

`ResolveLifetimes` uses a `LocalDefId` since #66131.
2020-03-21 05:33:28 +01:00
Mazdak Farrokhzad 855eac345a Rollup merge of #70176 - rylev:ice-tests, r=Centril
Add tests for #58319 and #65131

Fixes #58319 and fixes #65131
2020-03-21 05:33:27 +01:00
Mazdak Farrokhzad 7b420aee35 Rollup merge of #70166 - CDirkx:range-inclusive-derives, r=cramertj
Derive PartialEq, Eq and Hash for RangeInclusive

The manual implementation of `PartialEq`, `Eq` and `Hash` for `RangeInclusive` was functionally equivalent to a derived implementation.

This change removes the manual implementation and adds the respective derives.
A side effect of this change is that the derives also add implementations for `StructuralPartialEq` and `StructuralEq`, which enables `RangeInclusive` to be used in const generics, closing #70155.

This change is enabled by #68835, which changed the field `is_empty: Option<bool>` to `exhausted: bool` removing the need for *semantic* equality instead of *structural* equality.

## PartialEq
original [`PartialEq`](https://github.com/rust-lang/rust/blob/f4c675c476c18b1a11041193f2f59d695b126bc8/src/libcore/ops/range.rs#L353-L359) implementation:
```rust
#[stable(feature = "inclusive_range", since = "1.26.0")]
impl<Idx: PartialEq> PartialEq for RangeInclusive<Idx> {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        self.start == other.start && self.end == other.end && self.exhausted == other.exhausted
    }
}
```
expanded derive implementation (using `cargo expand ops::range`):
```rust
#[stable(feature = "inclusive_range", since = "1.26.0")]
impl<Idx> crate::marker::StructuralPartialEq for RangeInclusive<Idx> {}

#[automatically_derived]
#[allow(unused_qualifications)]
#[stable(feature = "inclusive_range", since = "1.26.0")]
impl<Idx: crate::cmp::PartialEq> crate::cmp::PartialEq for RangeInclusive<Idx> {
    #[inline]
    fn eq(&self, other: &RangeInclusive<Idx>) -> bool {
        match *other {
            RangeInclusive { start: ref __self_1_0,end: ref __self_1_1, exhausted: ref __self_1_2 } => match *self {
                RangeInclusive { start: ref __self_0_0, end: ref __self_0_1, exhausted: ref __self_0_2 } => {
                    (*__self_0_0) == (*__self_1_0) && (*__self_0_1) == (*__self_1_1) && (*__self_0_2) == (*__self_1_2)
                }
            },
        }
    }
    #[inline]
    fn ne(&self, other: &RangeInclusive<Idx>) -> bool {
        match *other {
            RangeInclusive { start: ref __self_1_0, end: ref __self_1_1, exhausted: ref __self_1_2 } => match *self {
                RangeInclusive { start: ref __self_0_0, end: ref __self_0_1exhausted: ref __self_0_2 } => {
                    (*__self_0_0) != (*__self_1_0) || (*__self_0_1) != (*__self_1_1) || (*__self_0_2) != (*__self_1_2)
                }
            },
        }
    }
}
```

These implementations both test for *structural* equality, with the same order of field comparisons, and the bound `Idx: PartialEq` is the same.
## Eq
original [`Eq`](https://github.com/rust-lang/rust/blob/f4c675c476c18b1a11041193f2f59d695b126bc8/src/libcore/ops/range.rs#L361-L362) implementation:
```rust
#[stable(feature = "inclusive_range", since = "1.26.0")]
impl<Idx: Eq> Eq for RangeInclusive<Idx> {}
```
expanded derive implementation (using `cargo expand ops::range`):
```rust
#[stable(feature = "inclusive_range", since = "1.26.0")]
impl<Idx> crate::marker::StructuralEq for RangeInclusive<Idx> {}

#[automatically_derived]
#[allow(unused_qualifications)]
#[stable(feature = "inclusive_range", since = "1.26.0")]
impl<Idx: crate::cmp::Eq> crate::cmp::Eq for RangeInclusive<Idx> {
    #[inline]
    #[doc(hidden)]
    fn assert_receiver_is_total_eq(&self) -> () {
        {
            let _: crate::cmp::AssertParamIsEq<Idx>;
            let _: crate::cmp::AssertParamIsEq<Idx>;
            let _: crate::cmp::AssertParamIsEq<bool>;
        }
    }
}
```
These implementations are equivalent since `Eq` is just a marker trait and the bound `Idx: Eq` is the same.

## Hash
original [`Hash`](https://github.com/rust-lang/rust/blob/f4c675c476c18b1a11041193f2f59d695b126bc8/src/libcore/ops/range.rs#L364-L371) implementation:
```rust
#[stable(feature = "inclusive_range", since = "1.26.0")]
impl<Idx: Hash> Hash for RangeInclusive<Idx> {
    fn hash<H: Hasher>(&self, state: &mut H) {
        self.start.hash(state);
        self.end.hash(state);
        self.exhausted.hash(state);
    }
}
```
expanded derive implementation (using `cargo expand ops::range`):
```rust
#[automatically_derived]
#[allow(unused_qualifications)]
#[stable(feature = "inclusive_range", since = "1.26.0")]
impl<Idx: crate::hash::Hash> crate::hash::Hash for RangeInclusive<Idx> {
    fn hash<__H: crate::hash::Hasher>(&self, state: &mut __H) -> () {
        match *self { RangeInclusive { start: ref __self_0_0, end: ref __self_0_1, exhausted: ref __self_0_2 } => {
                crate::hash::Hash::hash(&(*__self_0_0), state);
                crate::hash::Hash::hash(&(*__self_0_1), state);
                crate::hash::Hash::hash(&(*__self_0_2), state)
            }
        }
    }
}
```
These implementations are functionally equivalent, with the same order of field hashing, and the bound `Idx: Hash` is the same.
2020-03-21 05:33:26 +01:00
Mazdak Farrokhzad b24d168e10 Rollup merge of #70165 - matthewjasper:erase-more, r=nikomatsakis
Remove the erase regions MIR transform

We now ensure that MIR never contains unerased regions in the first place.
2020-03-21 05:33:24 +01:00
Mazdak Farrokhzad c4a5cc1671 Rollup merge of #70139 - RalfJung:delay, r=eddyb
add delay_span_bug to TransmuteSizeDiff, just to be sure

See https://github.com/rust-lang/rust/pull/69839#discussion_r394858464.

r? @eddyb
2020-03-21 05:33:23 +01:00
Mazdak Farrokhzad 9d9e3813b2 Rollup merge of #70111 - Mark-Simulacrum:btree-no-shared, r=cuviper
BTreeMap: remove shared root

This replaces the shared root with `Option`s in the BTreeMap code, and then slightly cleans up the node manipulation code taking advantage of the removal of the shared root. I expect that further simplification is possible, but wanted to get this posted for initial review.

Note that `BTreeMap::new()` continues to not allocate.

Benchmarks seem within the margin of error/unaffected, as expected for an entirely predictable branch.

```
 name                                 alloc-bench-a ns/iter  alloc-bench-b ns/iter  diff ns/iter  diff %  speedup
 btree::map::iter_mut_20              20                     21                                1   5.00%   x 0.95
 btree::set::clone_100                1,360                  1,439                            79   5.81%   x 0.95
 btree::set::clone_100_and_into_iter  1,319                  1,434                           115   8.72%   x 0.92
 btree::set::clone_10k                143,515                150,991                       7,476   5.21%   x 0.95
 btree::set::clone_10k_and_clear      142,792                152,916                      10,124   7.09%   x 0.93
 btree::set::clone_10k_and_into_iter  146,019                154,561                       8,542   5.85%   x 0.94
```
2020-03-21 05:33:21 +01:00
Mazdak Farrokhzad 67e418ce75 Rollup merge of #70058 - Centril:fix-70050, r=petrochenkov
can_begin_literal_maybe_minus: `true` on `"-"? lit` NTs.

Make `can_begin_literal_or_bool` (renamed to `can_begin_literal_maybe_minus`) accept `NtLiteral(e) | NtExpr(e)` where `e` is either a literal or a negated literal.

Fixes https://github.com/rust-lang/rust/issues/70050.

r? @petrochenkov
2020-03-21 05:33:20 +01:00
Mazdak Farrokhzad 45b10f6f98 Rollup merge of #70038 - DutchGhost:const-forget-tests, r=RalfJung
Remove the call that makes miri fail

Fixes the concern raised in https://github.com/rust-lang/rust/pull/69645/files#r392884274

cc @RalfJung
2020-03-21 05:33:18 +01:00
Mazdak Farrokhzad 801a25abc1 Rollup merge of #69997 - WaffleLapkin:option_zip, r=LukasKalbertodt
add `Option::{zip,zip_with}` methods under "option_zip" gate

This PR introduces 2 methods - `Option::zip` and `Option::zip_with` with
respective signatures:
- zip: `(Option<T>, Option<U>) -> Option<(T, U)>`
- zip_with: `(Option<T>, Option<U>, (T, U) -> R) -> Option<R>`
Both are under the feature gate "option_zip".

I'm not sure about the name "zip", maybe we can find a better name for this.
(I would prefer `union` for example, but this is a keyword :( )

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

Recently in a russian rust begginers telegram chat a newbie asked (translated):
> Are there any methods for these conversions:
>
> 1. `(Option<A>, Option<B>) -> Option<(A, B)>`
> 2. `Vec<Option<T>> -> Option<Vec<T>>`
>
> ?

While second (2.) is clearly `vec.into_iter().collect::<Option<Vec<_>>()`, the
first one isn't that clear.

I couldn't find anything similar in the `core` and I've come to this solution:
```rust
let tuple: (Option<A>, Option<B>) = ...;
let res: Option<(A, B)> = tuple.0.and_then(|a| tuple.1.map(|b| (a, b)));
```

However this solution isn't "nice" (same for just `match`/`if let`), so I thought
that this functionality should be in `core`.
2020-03-21 05:33:16 +01:00
Mazdak Farrokhzad ef7c8a158f Rollup merge of #69033 - jonas-schievink:resume-with-context, r=tmandry
Use generator resume arguments in the async/await lowering

This removes the TLS requirement from async/await and enables it in `#![no_std]` crates.

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

I'm not confident the HIR lowering is completely correct, there seem to be quite a few undocumented invariants in there. The `async-std` and tokio test suites are passing with these changes though.
2020-03-21 05:33:15 +01:00
Mazdak Farrokhzad 4b91729df2 Rollup merge of #65097 - tmiasko:arc, r=Amanieu
Make std::sync::Arc compatible with ThreadSanitizer

The memory fences used previously in Arc implementation are not properly
understood by thread sanitizer as synchronization primitives. This had
unfortunate effect where running any non-trivial program compiled with
`-Z sanitizer=thread` would result in numerous false positives.

Replace acquire fences with acquire loads to address the issue.

Fixes #39608.
2020-03-21 05:33:13 +01:00
Matthias Krüger ad00e91887 remove redundant returns (clippy::needless_return) 2020-03-20 20:23:03 +01:00
Matthias Krüger 951a3661ad remove redundant import (clippy::single_component_path_imports)
remove redundant format!() call (clippy::useless_format)
don't use ok() before calling expect() (clippy::ok_expect)
2020-03-20 20:23:03 +01:00
bors 1057dc97af Auto merge of #69509 - RalfJung:debug-assert-write, r=eddyb
debug-assert ptr sanity in ptr::write

This is a re-submission of the parts that we removed from https://github.com/rust-lang/rust/pull/69208 due to ["interesting" test failures](https://github.com/rust-lang/rust/pull/69208#issuecomment-591310437).

Fixes https://github.com/rust-lang/rust/issues/53871
r? @Mark-Simulacrum @eddyb
2020-03-20 19:02:32 +00:00
Mazdak Farrokhzad 0d018a5755 expand_include: set .directory to dir of included file. 2020-03-20 17:39:29 +01:00
Ralf Jung 5930da4465 Abi::is_signed: assert that we are a Scalar 2020-03-20 17:05:00 +01:00
Guillaume Gomez 32670ddd28 Clean up E0439 explanation 2020-03-20 17:03:04 +01:00
Mark Rousskov bce7f6f3a0 Fix debugger pretty printing of BTrees 2020-03-20 12:02:07 -04:00
bors 2835ca6584 Auto merge of #70174 - JohnTitor:rollup-0lum0jh, r=JohnTitor
Rollup of 9 pull requests

Successful merges:

 - #69618 (Clarify the relationship between `forget()` and `ManuallyDrop`.)
 - #69768 (Compute the correct layout for variants of uninhabited enums)
 - #69935 (codegen/mir: support polymorphic `InstanceDef`s)
 - #70103 (Clean up E0437 explanation)
 - #70131 (Add regression test for TAIT lifetime inference (issue #55099))
 - #70133 (remove unused imports)
 - #70145 (doc: Add quote to .init_array)
 - #70146 (Clean up e0438 explanation)
 - #70150 (triagebot.toml: accept cleanup-crew)

Failed merges:

r? @ghost
2020-03-20 15:58:34 +00:00
Mazdak Farrokhzad 9b9a22cd2e can_begin_literal_maybe_minus: true on "-"? lit NTs. 2020-03-20 16:42:53 +01:00
Kornel 2f7d7c0333 must_use on split_off 2020-03-20 14:40:35 +00:00
Mark Rousskov 4d85314a00 Update test commentary for shared root removal 2020-03-20 09:43:41 -04:00
Mark Rousskov 13f6d771bb Simplify ensure_root_is_owned callers
This makes ensure_root_is_owned return a reference to the (now guaranteed to
exist) root, allowing callers to operate on it without going through another
unwrap.

Unfortunately this is only rarely useful as it's frequently the case that both
the length and the root need to be accessed and field-level borrows in methods
don't yet exist.
2020-03-20 09:43:41 -04:00
Mark Rousskov 54b7c38889 Drop NodeHeader type from BTree code
We no longer have a separate header because the shared root is gone; all code
can work solely with leafs now.
2020-03-20 09:43:41 -04:00
Mark Rousskov 3c04fda751 Make functions dependent only on shared root avoidance safe 2020-03-20 09:43:40 -04:00
Mark Rousskov 1c44f852df Remove shared root code and assertions from BTree nodes 2020-03-20 09:43:19 -04:00
Mark Rousskov e61f126fb4 Replace shared root with optional root
This simplifies the node manipulation, as we can (in later commits) always know
when traversing nodes that we are not in a shared root.
2020-03-20 09:42:10 -04:00
Ryan Levick 5444aded02 Add tests for #58319 and #65131 2020-03-20 13:24:35 +01:00
bjorn3 3f6236ea5a Fix oudated comment for NamedRegionMap 2020-03-20 13:23:24 +01:00
DutchGhost d6f3a433d9 Update const_forget.rs 2020-03-20 10:36:40 +01:00
Yuki Okushi 43c7a503fe Rollup merge of #70150 - rust-lang:accept-felixes-typo, r=Mark-Simulacrum
triagebot.toml: accept cleanup-crew

r? @Mark-Simulacrum
2020-03-20 17:02:14 +09:00
Yuki Okushi 8965f63f84 Rollup merge of #70146 - GuillaumeGomez:cleanup-e0438, r=Dylan-DPC
Clean up e0438 explanation

r? @Dylan-DPC
2020-03-20 17:02:12 +09:00
Yuki Okushi d6ebf215b1 Rollup merge of #70145 - lzutao:patch-1, r=Dylan-DPC
doc: Add quote to .init_array

The current formatting is not good without quotes:
![without-quote](https://i.imgur.com/RkIm4cr.png)
2020-03-20 17:02:11 +09:00
Yuki Okushi 8615a365b6 Rollup merge of #70133 - hermitcore:libpanic_unwind, r=nikomatsakis
remove unused imports

patch is required to avoid compiler errors by building src/libpanic_unwind/hermit.rs
2020-03-20 17:02:09 +09:00
Yuki Okushi 2f77d5fe39 Rollup merge of #70131 - Aaron1011:fix/issue-55099-test, r=nikomatsakis
Add regression test for TAIT lifetime inference (issue #55099)

Fixes #55099

The minimized reproducer in issue #55099 now compiles successfully.
This commit adds a regression test for it.
2020-03-20 17:02:08 +09:00
Yuki Okushi 532133b71d Rollup merge of #70103 - GuillaumeGomez:cleanup-e0437, r=Dylan-DPC
Clean up E0437 explanation

r? @Dylan-DPC
2020-03-20 17:02:06 +09:00
Yuki Okushi 9dc699430f Rollup merge of #69935 - davidtwco:issue-69925, r=eddyb
codegen/mir: support polymorphic `InstanceDef`s

cc #69925

This PR modifies the use of `subst_and_normalize_erasing_regions` on parts of the MIR bodies returned from `instance_mir`, so that `InstanceDef::CloneShim` and `InstanceDef::DropGlue` (where there is a type) do not perform substitutions. This avoids double substitutions and enables polymorphic `InstanceDef`s.

r? @eddyb
cc @nikomatsakis
2020-03-20 17:02:05 +09:00
Yuki Okushi 3554f2d941 Rollup merge of #69768 - oli-obk:union_field_ice, r=eddyb,RalfJung
Compute the correct layout for variants of uninhabited enums

r? @eddyb
cc @RalfJung

fixes #69191
cc #69763
2020-03-20 17:02:03 +09:00
Yuki Okushi 5d39517680 Rollup merge of #69618 - hniksic:mem-forget-doc-fix, r=RalfJung
Clarify the relationship between `forget()` and `ManuallyDrop`.

As discussed on reddit, this commit addresses two issues with the
documentation of `mem::forget()`:

* The documentation of `mem::forget()` can confuse the reader because of the
  discrepancy between usage examples that show correct usage and the
  accompanying text which speaks of the possibility of double-free.  The
  text that says "if the panic occurs before `mem::forget` was called"
  refers to a variant of the second example that was never shown, modified
  to use `mem::forget` instead of `ManuallyDrop`.  Ideally the documentation
  should show both variants, so it's clear what it's talking about.

  Also, the double free could be fixed just by placing `mem::forget(v)`
  before the construction of `s`.  Since the lifetimes of `s` and `v`
  wouldn't overlap, there would be no point where panic could cause a double
  free.  This could be mentioned, and contrasted against the more robust fix
  of using `ManuallyDrop`.

* This sentence seems unjustified: "For some types, operations such as
  passing ownership (to a funcion like `mem::forget`) requires them to
  actually be fully owned right now [...]".  Unlike C++, Rust has no move
  constructors, its moves are (possibly elided) bitwise copies.  Even if you
  pass an invalid object to `mem::forget`, no harm should come to pass
  because `mem::forget` consumes the object and exists solely to prevent
  drop, so there no one left to observe the invalid state state.
2020-03-20 17:02:01 +09:00
Tomasz Miąsko fd0e15bbcd Make std::sync::Arc compatible with ThreadSanitizer
The memory fences used previously in Arc implementation are not properly
understood by ThreadSanitizer as synchronization primitives. This had
unfortunate effect where running any non-trivial program compiled with
`-Z sanitizer=thread` would result in numerous false positives.

Replace acquire fences with acquire loads when using ThreadSanitizer to
address the issue.
2020-03-20 00:18:44 +01:00
CDirkx 6570e275b9 Removed unused Hasher import. 2020-03-19 21:58:11 +01:00
Matthew Jasper 0f0f254a9c Use erased regions in MIR 2020-03-19 19:59:13 +00:00