]> git.lizzy.rs Git - rust.git/log
rust.git
6 years agoMake use of thread-safe arenas
John Kåre Alsaker [Sun, 15 Apr 2018 14:01:38 +0000 (16:01 +0200)]
Make use of thread-safe arenas

6 years agoMake arenas thread safe
John Kåre Alsaker [Sun, 3 Dec 2017 12:49:46 +0000 (13:49 +0100)]
Make arenas thread safe

6 years agoAdd misc timings
John Kåre Alsaker [Thu, 15 Mar 2018 09:17:04 +0000 (10:17 +0100)]
Add misc timings

6 years agoMake layout_depth thread-safe
John Kåre Alsaker [Fri, 6 Apr 2018 12:53:11 +0000 (14:53 +0200)]
Make layout_depth thread-safe

6 years agoAuto merge of #49833 - oli-obk:incremental_miri_regression, r=michaelwoerister
bors [Sun, 15 Apr 2018 12:32:13 +0000 (12:32 +0000)]
Auto merge of #49833 - oli-obk:incremental_miri_regression, r=michaelwoerister

Don't recurse into allocations, use a global table instead

r? @michaelwoerister

fixes #49663

6 years agoAuto merge of #49885 - spastorino:fn_ref_unsound, r=nikomatsakis
bors [Sun, 15 Apr 2018 09:14:43 +0000 (09:14 +0000)]
Auto merge of #49885 - spastorino:fn_ref_unsound, r=nikomatsakis

Fix unsoundness bug in functions input references

Fixes #48803

r? @nikomatsakis

6 years agoAuto merge of #49884 - alexcrichton:less-unwrap, r=Mark-Simulacrum
bors [Sun, 15 Apr 2018 06:33:48 +0000 (06:33 +0000)]
Auto merge of #49884 - alexcrichton:less-unwrap, r=Mark-Simulacrum

core: Remove panics from some `Layout` methods

`Layout` is often used at the core of allocation APIs and is as a result pretty
sensitive to codegen in various circumstances. I was profiling `-C opt-level=z`
with a wasm project recently and noticed that the `unwrap()` wasn't removed
inside of `Layout`, causing the program to be much larger than it otherwise
would be. If inlining were more aggressive LLVM would have figured out that the
panic could be eliminated, but in general the methods here can't panic in the
first place!

As a result this commit makes the following tweaks:

* Removes `unwrap()` and replaces it with `unsafe` in `Layout::new` and
  `Layout::for_value`. For posterity though a debug assertion was left behind.
* Removes an `unwrap()` in favor of `?` in the `repeat` method. The comment
  indicating that the function call couldn't panic wasn't quite right in that if
  `alloc_size` becomes too large and if `align` is high enough it could indeed
  cause a panic.

This'll hopefully mean that panics never get introduced into code in the first
place, ensuring that `opt-level=z` is closer to `opt-level=s` in this regard.

6 years agoAuto merge of #49881 - varkor:partialord-opt, r=Manishearth
bors [Sun, 15 Apr 2018 03:54:15 +0000 (03:54 +0000)]
Auto merge of #49881 - varkor:partialord-opt, r=Manishearth

Fix derive(PartialOrd) and optimise final field operation

```rust
// Before (`lt` on 2-field struct)
self.f1 < other.f1 || (!(other.f1 < self.f1) &&
(self.f2 < other.f2 || (!(other.f2 < self.f2) &&
(false)
))
)

// After
self.f1 < other.f1 || (!(other.f1 < self.f1) &&
self.f2 < other.f2
)

// Before (`le` on 2-field struct)
self.f1 < other.f1 || (!(other.f1 < self.f1) &&
(self.f2 < other.f2 || (!(other.f2 < self.f2) &&
(true)
))
)

// After
self.f1 < other.f1 || (self.f1 == other.f1 &&
self.f2 <= other.f2
)
```

(The big diff is mainly because of a past faulty rustfmt application that I corrected 😒)

Fixes #49650 and fixes #49505.

6 years agoAuto merge of #48173 - GuillaumeGomez:error-codes-libsyntax_ext, r=estebank
bors [Sun, 15 Apr 2018 01:26:11 +0000 (01:26 +0000)]
Auto merge of #48173 - GuillaumeGomez:error-codes-libsyntax_ext, r=estebank

Add error codes for libsyntax_ext

I intend to add error codes for `libsyntax_ext` as well. However, they cannot be used at stage 0 directly so I thought it might be possible to enable them at the stage 1 only so we can have access to the macros. However, the error code registration seems to not work this way. Currently I get the following error:

```
error: used diagnostic code E0660 not registered
  --> libsyntax_ext/asm.rs:93:25
   |
93 |                         span_err!(cx, sp, E0660, "malformed inline assembly");
   |                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)

error: used diagnostic code E0661 not registered
   --> libsyntax_ext/asm.rs:151:33
    |
151 | /                                 span_err!(cx, sp, E0661,
152 | |                                           "output operand constraint lacks '=' or '+'");
    | |________________________________________________________________________________________^
    |
    = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)

error: aborting due to 2 previous errors

error: Could not compile `syntax_ext`.
```

If anyone has an idea, I'd gladly take it. I'm trying to figure this out on my side as well. I also opened this PR to know if it was worth it to continue (maybe we don't want this?).

Anyway, any answer for both questions is very welcome!

cc @rust-lang/compiler

6 years agoAuto merge of #49850 - alexcrichton:moreinline, r=sfackler
bors [Sat, 14 Apr 2018 20:22:19 +0000 (20:22 +0000)]
Auto merge of #49850 - alexcrichton:moreinline, r=sfackler

core: Inline `From<AllocErr> for CollectionAllocErr`

This shows up in allocations of vectors and such, so no need for it to not be
inlined!

6 years agoignore stage1 testing
Guillaume Gomez [Fri, 13 Apr 2018 21:22:01 +0000 (23:22 +0200)]
ignore stage1 testing

6 years agoAdd tests and longer error explanation
Guillaume Gomez [Mon, 26 Mar 2018 20:04:27 +0000 (22:04 +0200)]
Add tests and longer error explanation

6 years agoAdd error codes for libsyntax_ext
Guillaume Gomez [Mon, 12 Feb 2018 22:21:20 +0000 (23:21 +0100)]
Add error codes for libsyntax_ext

6 years agoAuto merge of #49939 - kennytm:rollup, r=kennytm
bors [Sat, 14 Apr 2018 13:11:24 +0000 (13:11 +0000)]
Auto merge of #49939 - kennytm:rollup, r=kennytm

Rollup of 14 pull requests

Successful merges: #49908, #49876, #49916, #49951, #49465, #49922, #49866, #49915, #49886, #49913, #49852, #49958, #49871, #49864

Failed merges:

6 years agoRollup merge of #49864 - QuietMisdreavus:doctest-target-features, r=GuillaumeGomez
kennytm [Sat, 14 Apr 2018 10:50:41 +0000 (18:50 +0800)]
Rollup merge of #49864 - QuietMisdreavus:doctest-target-features, r=GuillaumeGomez

add target features when extracting and running doctests

When rendering documentation, rustdoc will happily load target features into the cfg environment from the current target, but fails to do this when doing anything with doctests. This would lead to situations where, thanks to https://github.com/rust-lang/rust/pull/48759, functions tagged with `#[target_feature]` couldn't run doctests, thanks to the automatic `#[doc(cfg(target_feature = "..."))]`.

Currently, there's no way to pass codegen options to rustdoc that will affect its rustc sessions, but for now this will let you use target features that come default on the platform you're targeting.

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

6 years agoRollup merge of #49871 - SimonSapin:int-bytes, r=sfackler
kennytm [Sat, 14 Apr 2018 10:49:58 +0000 (18:49 +0800)]
Rollup merge of #49871 - SimonSapin:int-bytes, r=sfackler

Add to_bytes and from_bytes to primitive integers

Discussion issue turned tracking issue: https://github.com/rust-lang/rust/issues/49792

6 years agoRollup merge of #49958 - glandium:cleanup, r=SimonSapin
kennytm [Sat, 14 Apr 2018 10:48:09 +0000 (18:48 +0800)]
Rollup merge of #49958 - glandium:cleanup, r=SimonSapin

Cleanup liballoc use statements

Some modules were still using the deprecated `allocator` module, use the
`alloc` module instead.

Some modules were using `super` while it's not needed.

Some modules were more or less ordering them, and other not, so the
latter have been modified to match the others.

6 years agoAdd to_bytes and from_bytes to primitive integers
Simon Sapin [Tue, 10 Apr 2018 22:04:32 +0000 (00:04 +0200)]
Add to_bytes and from_bytes to primitive integers

6 years agoAuto merge of #49289 - varkor:emit-metadata-without-link, r=michaelwoerister
bors [Sat, 14 Apr 2018 10:27:03 +0000 (10:27 +0000)]
Auto merge of #49289 - varkor:emit-metadata-without-link, r=michaelwoerister

Make --emit=metadata output metadata regardless of link

Fixes #40109. I'm not sure whether this condition was important here or not, but I can't see why it is required (removing it doesn't cause the error the comment warns about, so I'm assuming it's safe). If this is too heavy-handed, I can special-case on `OutputType::Metadata`.

r? @nrc

6 years agoGet rid of redundant `HashSet`
Oliver Schneider [Fri, 13 Apr 2018 16:48:41 +0000 (18:48 +0200)]
Get rid of redundant `HashSet`

6 years agoReduce the number of calls to `cdata`
Oliver Schneider [Wed, 11 Apr 2018 11:31:51 +0000 (13:31 +0200)]
Reduce the number of calls to `cdata`

6 years agoEncode items before encoding the list of AllocIds
Oliver Schneider [Wed, 11 Apr 2018 11:31:37 +0000 (13:31 +0200)]
Encode items before encoding the list of AllocIds

6 years agoUse `LazySeq` instead of `Vec`
Oliver Schneider [Wed, 11 Apr 2018 08:47:52 +0000 (10:47 +0200)]
Use `LazySeq` instead of `Vec`

6 years agoStop referring to statics' AllocIds directly
Oliver Schneider [Tue, 10 Apr 2018 14:25:10 +0000 (16:25 +0200)]
Stop referring to statics' AllocIds directly

6 years agoDon't recurse into allocations, use a global table instead
Oliver Schneider [Tue, 10 Apr 2018 07:58:46 +0000 (09:58 +0200)]
Don't recurse into allocations, use a global table instead

6 years agoReplace remaining uses of deprecated Heap with Global
Mike Hommey [Sat, 14 Apr 2018 07:48:27 +0000 (16:48 +0900)]
Replace remaining uses of deprecated Heap with Global

6 years agoReplace remaining uses of deprecated std::heap with std::alloc
Mike Hommey [Sat, 14 Apr 2018 07:47:38 +0000 (16:47 +0900)]
Replace remaining uses of deprecated std::heap with std::alloc

6 years agoRollup merge of #49922 - f-bro:zmiri, r=oli-obk
kennytm [Sat, 14 Apr 2018 07:23:37 +0000 (15:23 +0800)]
Rollup merge of #49922 - f-bro:zmiri, r=oli-obk

Remove -Zmiri debugging option

6 years agoRollup merge of #49916 - llogiq:doc-atomic-fetch-update, r=kennytm
kennytm [Sat, 14 Apr 2018 07:23:21 +0000 (15:23 +0800)]
Rollup merge of #49916 - llogiq:doc-atomic-fetch-update, r=kennytm

improve Atomic*::fetch_update docs

This clarifies that fetch_update *always* returns the previous value, either as `Ok(_)` or `Err(_)`, depending on whether the supplied update function returned `Some(_)` or `None`.

6 years agoRollup merge of #49915 - llogiq:doc-shift-types, r=joshtriplett
kennytm [Sat, 14 Apr 2018 07:23:08 +0000 (15:23 +0800)]
Rollup merge of #49915 - llogiq:doc-shift-types, r=joshtriplett

[doc] note the special type inference handling for shift ops

This adds a note to the docs about the difference between the shift ops and the corresponding trait methods when it comes to type inference.

6 years agoRollup merge of #49913 - varkor:RegionParameterDef-InternedString, r=petrochenkov
kennytm [Sat, 14 Apr 2018 07:22:57 +0000 (15:22 +0800)]
Rollup merge of #49913 - varkor:RegionParameterDef-InternedString, r=petrochenkov

Use InternedString rather than Name for RegionParameterDef

This makes it consistent with `TypeParameterDef`.

6 years agoRollup merge of #49908 - chrisccoulson:fix-rustdoc-themes-test-without-rpath, r=Mark...
kennytm [Sat, 14 Apr 2018 07:22:39 +0000 (15:22 +0800)]
Rollup merge of #49908 - chrisccoulson:fix-rustdoc-themes-test-without-rpath, r=Mark-Simulacrum

Fix test failure in src/tools/rustdoc-themes when rust.rpath = false

See https://github.com/rust-lang/rust/issues/49907

6 years agoRollup merge of #49886 - varkor:generate-deriving-span-tests-usability, r=nikomatsakis
kennytm [Sat, 14 Apr 2018 07:22:27 +0000 (15:22 +0800)]
Rollup merge of #49886 - varkor:generate-deriving-span-tests-usability, r=nikomatsakis

Ignore copyright year when generating deriving span tests

Previously, generate-deriving-span-tests.py would regenerate all the tests anew, even if they hadn't changed. This creates unnecessary diffs that only change the copyright year. Now we check to see if any of the content of the test has changed before generating the new one.

6 years agoRollup merge of #49465 - ollie27:rustbuild_test_docs, r=steveklabnik,QuietMisdreavus...
kennytm [Sat, 14 Apr 2018 07:22:17 +0000 (15:22 +0800)]
Rollup merge of #49465 - ollie27:rustbuild_test_docs, r=steveklabnik,QuietMisdreavus,frewsxcv,GuillaumeGomez

Add docs for the test crate with the std docs

If the compiler docs aren't going to include the test crate then it may as well be included with std.

Fixes #49388

6 years agoRollup merge of #49876 - oli-obk:no_secret_clippy_on_stable_☹, r=nrc
kennytm [Sat, 14 Apr 2018 07:22:06 +0000 (15:22 +0800)]
Rollup merge of #49876 - oli-obk:no_secret_clippy_on_stable_☹, r=nrc

Don't inject clippy into rls on stable/beta

as discussed at the all-hands

6 years agoRollup merge of #49866 - Mark-Simulacrum:pr-travis-windows, r=alexcrichton
kennytm [Sat, 14 Apr 2018 07:21:39 +0000 (15:21 +0800)]
Rollup merge of #49866 - Mark-Simulacrum:pr-travis-windows, r=alexcrichton

Cross-compile builder to Windows for PRs on Travis

I chose a completely arbitrary windows target here (I have no idea what's best, we could do multiple -- they are relatively fast).

6 years agoRollup merge of #49852 - alexcrichton:fix-more-proc-macros, r=nrc
kennytm [Sat, 14 Apr 2018 07:21:19 +0000 (15:21 +0800)]
Rollup merge of #49852 - alexcrichton:fix-more-proc-macros, r=nrc

proc_macro: Avoid cached TokenStream more often

This commit adds even more pessimization to use the cached `TokenStream` inside
of an AST node. As a reminder the `proc_macro` API requires taking an arbitrary
AST node and transforming it back into a `TokenStream` to hand off to a
procedural macro. Such functionality isn't actually implemented in rustc today,
so the way `proc_macro` works today is that it stringifies an AST node and then
reparses for a list of tokens.

This strategy unfortunately loses all span information, so we try to avoid it
whenever possible. Implemented in #43230 some AST nodes have a `TokenStream`
cache representing the tokens they were originally parsed from. This
`TokenStream` cache, however, has turned out to not always reflect the current
state of the item when it's being tokenized. For example `#[cfg]` processing or
macro expansion could modify the state of an item. Consequently we've seen a
number of bugs (#48644 and #49846) related to using this stale cache.

This commit tweaks the usage of the cached `TokenStream` to compare it to our
lossy stringification of the token stream. If the tokens that make up the cache
and the stringified token stream are the same then we return the cached version
(which has correct span information). If they differ, however, then we will
return the stringified version as the cache has been invalidated and we just
haven't figured that out.

Closes #48644
Closes #49846

6 years agoRollup merge of #49951 - matklad:update-cargo, r=nrc
kennytm [Sat, 14 Apr 2018 07:21:10 +0000 (15:21 +0800)]
Rollup merge of #49951 - matklad:update-cargo, r=nrc

Update Cargo

This includes https://github.com/rust-lang/cargo/pull/5353, which we  want to test via opt-in in the wild.

This'll break RLS, the fix is https://github.com/rust-lang-nursery/rls/pull/822

6 years agoAuto merge of #49396 - Zoxc:sync-on-disk-cache, r=michaelwoerister
bors [Sat, 14 Apr 2018 06:32:20 +0000 (06:32 +0000)]
Auto merge of #49396 - Zoxc:sync-on-disk-cache, r=michaelwoerister

Make OnDiskCache thread-safer

I'm not sure if `synthetic_expansion_infos` is handled correctly.

`interpret_alloc_cache` and `interpret_alloc_size` seems to be wrong though, since the code may now decode two `AllocId`s in parallel. I'd like some input on how to fix that.

cc @oli-obk

r? @michaelwoerister

6 years agoAuto merge of #49957 - nrc:update, r=simulacrum
bors [Sat, 14 Apr 2018 03:51:44 +0000 (03:51 +0000)]
Auto merge of #49957 - nrc:update, r=simulacrum

Update Rustfmt

Should fix broken RLS/nightlies

r? @alexcrichton

6 years agoUpdate Rustfmt
Nick Cameron [Fri, 13 Apr 2018 21:48:18 +0000 (09:48 +1200)]
Update Rustfmt

6 years agoAuto merge of #49326 - petrochenkov:nteq, r=eddyb
bors [Sat, 14 Apr 2018 01:28:13 +0000 (01:28 +0000)]
Auto merge of #49326 - petrochenkov:nteq, r=eddyb

macros: Remove matching on "complex" nonterminals requiring AST comparisons

So, you can actually use nonterminals from outer macros in left hand side of nested macros and invocations of nested macros will try to match passed arguments to them.

```rust
macro outer($nt_item: item) {
    macro inner($nt_item) {
        struct S;
    }

    inner!($nt_item); // OK, `$nt_item` matches `$nt_item`
}
```

Why this is bad:
- We can't do this matching correctly. When two nonterminals are compared, the original tokens are lost and we have to compare AST fragments instead. Right now the comparison is done by `PartialEq` impls derived on AST structures.
    - On one hand, AST loses information compared to original tokens (e.g. trailing separators and other simplifications done during parsing to AST), so we can produce matches that are not actually correct.
    - On another hand derived `PartialEq` impls for AST structures don't make much sense in general and compare various auxiliary garbage like spans. For the argument nonterminal to match we should use literally the same token (possibly cloned) as was used in the macro LHS (as in the example above). So we can reject matches that are actually correct.
    - Support for nonterminal matching is the only thing that forces us to derive `PartialEq` for all (!) AST structures. As I mentioned these impls are also mostly nonsensical.

This PR removes support for matching on all nonterminals except for "simple" ones like `ident`, `lifetime` and `tt` for which we have original tokens that can be compared.
After this is done I'll submit another PR removing huge number of `PartialEq` impls from AST and HIR structures.

This is an arcane feature and I don't personally know why would anyone use it, but the change should ideally go through crater.
We'll be able to support this feature again in the future when all nonterminals have original token streams attached to them in addition to (or instead of) AST fragments.

6 years agoCleanup liballoc use statements
Mike Hommey [Fri, 13 Apr 2018 23:13:28 +0000 (08:13 +0900)]
Cleanup liballoc use statements

Some modules were still using the deprecated `allocator` module, use the
`alloc` module instead.

Some modules were using `super` while it's not needed.

Some modules were more or less ordering them, and other not, so the
latter have been modified to match the others.

6 years agomacros: Do not match on "complex" nonterminals requiring AST comparisons
Vadim Petrochenkov [Sat, 24 Mar 2018 13:00:44 +0000 (16:00 +0300)]
macros: Do not match on "complex" nonterminals requiring AST comparisons

6 years agoAuto merge of #49585 - GuillaumeGomez:rename-to-compile-pass, r=Mark-Simulacrum
bors [Fri, 13 Apr 2018 22:11:06 +0000 (22:11 +0000)]
Auto merge of #49585 - GuillaumeGomez:rename-to-compile-pass, r=Mark-Simulacrum

Rename must-compile-successfully into compile-pass

Fixes #49568.

r? @Mark-Simulacrum

6 years agoRename must-compile-successfully into compile-pass
Guillaume Gomez [Mon, 2 Apr 2018 11:20:06 +0000 (13:20 +0200)]
Rename must-compile-successfully into compile-pass

6 years agoUpdate RLS
Aleksey Kladov [Fri, 13 Apr 2018 20:20:18 +0000 (23:20 +0300)]
Update RLS

6 years agoAuto merge of #49830 - sinkuu:fix_ice_47715, r=cramertj
bors [Fri, 13 Apr 2018 19:22:14 +0000 (19:22 +0000)]
Auto merge of #49830 - sinkuu:fix_ice_47715, r=cramertj

Fix ICE by disallowing `impl Trait` in unsupported position

Fixes #47715.

6 years agoUse InternedString rather than Name for RegionParameterDef
varkor [Thu, 12 Apr 2018 20:16:26 +0000 (21:16 +0100)]
Use InternedString rather than Name for RegionParameterDef

This makes it consistent with TypeParameterDef.

6 years agoUpdate Cargo
Aleksey Kladov [Fri, 13 Apr 2018 17:21:51 +0000 (20:21 +0300)]
Update Cargo

This includes https://github.com/rust-lang/cargo/pull/5353,
which we might want to test via opt-in in the wild

6 years ago[doc] note the special type inference handling for shifts
Andre Bogus [Thu, 12 Apr 2018 20:07:53 +0000 (22:07 +0200)]
[doc] note the special type inference handling for shifts

6 years agoAuto merge of #49808 - spastorino:dump_cause_ice, r=nikomatsakis
bors [Fri, 13 Apr 2018 16:06:14 +0000 (16:06 +0000)]
Auto merge of #49808 - spastorino:dump_cause_ice, r=nikomatsakis

[NLL] Fix ICE when a borrow wrapped in a temporary is used after dropped

Fixes #47646

r? @nikomatsakis

6 years agocore: Remove panics from some `Layout` methods
Alex Crichton [Wed, 11 Apr 2018 17:47:16 +0000 (10:47 -0700)]
core: Remove panics from some `Layout` methods

`Layout` is often used at the core of allocation APIs and is as a result pretty
sensitive to codegen in various circumstances. I was profiling `-C opt-level=z`
with a wasm project recently and noticed that the `unwrap()` wasn't removed
inside of `Layout`, causing the program to be much larger than it otherwise
would be. If inlining were more aggressive LLVM would have figured out that the
panic could be eliminated, but in general the methods here can't panic in the
first place!

As a result this commit makes the following tweaks:

* Removes `unwrap()` and replaces it with `unsafe` in `Layout::new` and
  `Layout::for_value`. For posterity though a debug assertion was left behind.
* Removes an `unwrap()` in favor of `?` in the `repeat` method. The comment
  indicating that the function call couldn't panic wasn't quite right in that if
  `alloc_size` becomes too large and if `align` is high enough it could indeed
  cause a panic.

This'll hopefully mean that panics never get introduced into code in the first
place, ensuring that `opt-level=z` is closer to `opt-level=s` in this regard.

6 years agocore: Inline `From<AllocErr> for CollectionAllocErr`
Alex Crichton [Tue, 10 Apr 2018 18:25:23 +0000 (11:25 -0700)]
core: Inline `From<AllocErr> for CollectionAllocErr`

This shows up in allocations of vectors and such, so no need for it to not be
inlined!

6 years agoAuto merge of #49800 - ishitatsuyuki:intern-goal, r=nikomatsakis
bors [Fri, 13 Apr 2018 13:09:40 +0000 (13:09 +0000)]
Auto merge of #49800 - ishitatsuyuki:intern-goal, r=nikomatsakis

traits: Implement interning for Goal and Clause

r? @nikomatsakis

Close #49054

Contains some refactoring for the interning mechanism, mainly aimed at reducing pain when changing types of interning map.

This should be mostly good, although I'm not sure with the naming of `Goal::from_poly_domain_goal`.

6 years agoAuto merge of #49669 - SimonSapin:global-alloc, r=alexcrichton
bors [Fri, 13 Apr 2018 10:33:51 +0000 (10:33 +0000)]
Auto merge of #49669 - SimonSapin:global-alloc, r=alexcrichton

Add GlobalAlloc trait + tweaks for initial stabilization

This is the outcome of discussion at the Rust All Hands in Berlin. The high-level goal is stabilizing sooner rather than later the ability to [change the global allocator](https://github.com/rust-lang/rust/issues/27389), as well as allocating memory without abusing `Vec::with_capacity` + `mem::forget`.

Since we’re not ready to settle every detail of the `Alloc` trait for the purpose of collections that are generic over the allocator type (for example the possibility of a separate trait for deallocation only, and what that would look like exactly), we propose introducing separately **a new `GlobalAlloc` trait**, for use with the `#[global_allocator]` attribute.

We also propose a number of changes to existing APIs. They are batched in this one PR in order to minimize disruption to Nightly users.

The plan for initial stabilization is detailed in the tracking issue https://github.com/rust-lang/rust/issues/49668.

CC @rust-lang/libs, @glandium

## Immediate breaking changes to unstable features

* For pointers to allocated memory, change the pointed type from `u8` to `Opaque`, a new public [extern type](https://github.com/rust-lang/rust/issues/43467). Since extern types are not `Sized`, `<*mut _>::offset` cannot be used without first casting to another pointer type. (We hope that extern types can also be stabilized soon.)
* In the `Alloc` trait, change these pointers to `ptr::NonNull` and change the `AllocErr` type to a zero-size struct. This makes return types `Result<ptr::NonNull<Opaque>, AllocErr>` be pointer-sized.
* Instead of a new `Layout`, `realloc` takes only a new size (in addition to the pointer and old `Layout`). Changing the alignment is not supported with `realloc`.
* Change the return type of `Layout::from_size_align` from `Option<Self>` to `Result<Self, LayoutErr>`, with `LayoutErr` a new opaque struct.
* A `static` item registered as the global allocator with the `#[global_allocator]` **must now implement the new `GlobalAlloc` trait** instead of `Alloc`.

## Eventually-breaking changes to unstable features, with a deprecation period

* Rename the respective `heap` modules to `alloc` in the `core`, `alloc`, and `std` crates. (Yes, this does mean that `::alloc::alloc::Alloc::alloc` is a valid path to a trait method if you have `exetrn crate alloc;`)
* Rename the the `Heap` type to `Global`, since it is the entry point for what’s registered with `#[global_allocator]`.

Old names remain available for now, as deprecated `pub use` reexports.

## Backward-compatible changes

* Add a new [extern type](https://github.com/rust-lang/rust/issues/43467) `Opaque`, for use in pointers to allocated memory.
* Add a new `GlobalAlloc` trait shown below. Unlike `Alloc`, it uses bare `*mut Opaque` without `NonNull` or `Result`. NULL in return values indicates an error (of unspecified nature). This is easier to implement on top of `malloc`-like APIs.
* Add impls of `GlobalAlloc` for both the `Global` and `System` types, in addition to existing impls of `Alloc`. This enables calling `GlobalAlloc` methods on the stable channel before `Alloc` is stable. Implementing two traits with identical method names can make some calls ambiguous, but most code is expected to have no more than one of the two traits in scope. Erroneous code like `use std::alloc::Global; #[global_allocator] static A: Global = Global;` (where `Global` is defined to call itself, causing infinite recursion) is not statically prevented by the type system, but we count on it being hard enough to do accidentally and easy enough to diagnose.

```rust
extern {
    pub type Opaque;
}

pub unsafe trait GlobalAlloc {
    unsafe fn alloc(&self, layout: Layout) -> *mut Opaque;
    unsafe fn dealloc(&self, ptr: *mut Opaque, layout: Layout);

    unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut Opaque {
        // Default impl: self.alloc() and ptr::write_bytes()
    }
    unsafe fn realloc(&self, ptr: *mut Opaque, old_layout: Layout, new_size: usize) -> *mut Opaque {
        // Default impl: self.alloc() and ptr::copy_nonoverlapping() and self.dealloc()
    }

    fn oom(&self) -> ! {
        // intrinsics::abort
    }

    // More methods with default impls may be added in the future
}
```

## Bikeshed

The tracking issue https://github.com/rust-lang/rust/issues/49668 lists some open questions. If consensus is reached before this PR is merged, changes can be integrated.

6 years agoRemove -Z miri debugging option
Fabio B [Fri, 13 Apr 2018 07:43:10 +0000 (09:43 +0200)]
Remove -Z miri debugging option

6 years agoAuto merge of #49389 - fanzier:euclidean-division, r=KodrAus
bors [Fri, 13 Apr 2018 07:34:37 +0000 (07:34 +0000)]
Auto merge of #49389 - fanzier:euclidean-division, r=KodrAus

Implement RFC #2169 (Euclidean modulo).

Tracking issue: #49048

6 years agoAuto merge of #49360 - topecongiro:run-rustfmt/build_helper, r=nrc
bors [Fri, 13 Apr 2018 04:42:10 +0000 (04:42 +0000)]
Auto merge of #49360 - topecongiro:run-rustfmt/build_helper, r=nrc

Run rustfmt on build_helper

Using rustfmt 0.4.1-nightly (e784712f 2018-04-09).

6 years agoAuto merge of #49718 - petrochenkov:fieldcmp, r=eddyb
bors [Fri, 13 Apr 2018 01:43:09 +0000 (01:43 +0000)]
Auto merge of #49718 - petrochenkov:fieldcmp, r=eddyb

Hygiene 2.0: Avoid comparing fields by name

There are two separate commits here (not counting tests):
- The first one unifies named (`obj.name`) and numeric (`obj.0`) field access expressions in AST and HIR. Before field references in these expressions are resolved it doesn't matter whether the field is named or numeric (it's just a symbol) and 99% of code is common. After field references are resolved we work with
them by index for all fields (see the second commit), so it's again not important whether the field was named or numeric (this includes MIR where all fields were already by index).
(This refactoring actually fixed some bugs in HIR-based borrow checker where borrows through names (`S {
0: ref x }`) and indices (`&s.0`) weren't considered overlapping.)
- The second commit removes all by-name field comparison and instead resolves field references to their indices  once, and then uses those resolutions. (There are still a few name comparisons in save-analysis, because save-analysis is weird, but they are made correctly hygienic).
Thus we are fixing a bunch of "secondary" field hygiene bugs (in borrow checker, lints).

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

6 years agoAuto merge of #45298 - toidiu:ak-44493-infer-predicate, r=nikomatsakis
bors [Thu, 12 Apr 2018 23:07:07 +0000 (23:07 +0000)]
Auto merge of #45298 - toidiu:ak-44493-infer-predicate, r=nikomatsakis

Ak 44493 infer predicate

 **WIP**  Implements #44493

Things to do:

- [x] add feature gate and appropriate tests (see [forge](https://forge.rust-lang.org/feature-guide.html) for some details)
- [x] add a unit testing system similar to `#[rustc_variance]`
  - [x] to see how, maybe `rg rustc_variance` and take some notes
- [ ] add more tests:
- [x] we need to decide how to handle `struct Foo<'a, T> { x: &'a T::Item }`
- [x] handle explicit predicates on types
- [ ] handle explicit predicates on `dyn Trait` (this could be put off to a follow-up PR)
- [ ] handle explicit predicates on projections (this could be put off to a follow-up PR)

6 years agoAddress more nits.
Fabian Zaiser [Thu, 12 Apr 2018 21:12:11 +0000 (23:12 +0200)]
Address more nits.

6 years agoInitial docs for the GlobalAlloc trait
Simon Sapin [Wed, 11 Apr 2018 18:16:45 +0000 (20:16 +0200)]
Initial docs for the GlobalAlloc trait

6 years agoRename alloc::Void to alloc::Opaque
Simon Sapin [Wed, 11 Apr 2018 15:19:48 +0000 (17:19 +0200)]
Rename alloc::Void to alloc::Opaque

6 years agoRemove conversions for allocated pointers
Simon Sapin [Wed, 11 Apr 2018 14:28:37 +0000 (16:28 +0200)]
Remove conversions for allocated pointers

One was now unused, and `NonNull::new(…).ok_or(AllocErr)` feels short enough
for the few cases that need the other conversion.

6 years agoUse NonNull<Void> instead of *mut u8 in the Alloc trait
Mike Hommey [Mon, 2 Apr 2018 23:51:02 +0000 (08:51 +0900)]
Use NonNull<Void> instead of *mut u8 in the Alloc trait

Fixes #49608

6 years agoimpl GlobalAlloc for Global
Simon Sapin [Wed, 4 Apr 2018 17:15:22 +0000 (19:15 +0200)]
impl GlobalAlloc for Global

6 years agoRestore Global.oom() functionality
Simon Sapin [Wed, 4 Apr 2018 16:57:48 +0000 (18:57 +0200)]
Restore Global.oom() functionality

… now that #[global_allocator] does not define a symbol for it

6 years agoRemove `impl Alloc for &'a System`
Simon Sapin [Wed, 4 Apr 2018 16:50:25 +0000 (18:50 +0200)]
Remove `impl Alloc for &'a System`

This was relevant to `#[global_allocator]`,
which is now based on `GlobalAlloc` trait instead.

6 years agoMove platform-specific OOM handling to functions
Simon Sapin [Wed, 4 Apr 2018 16:43:28 +0000 (18:43 +0200)]
Move platform-specific OOM handling to functions

6 years agoConversions between Result<*mut u8, AllocErr>> and *mut Void
Simon Sapin [Wed, 4 Apr 2018 16:09:39 +0000 (18:09 +0200)]
Conversions between Result<*mut u8, AllocErr>> and *mut Void

6 years agorealloc with a new size only, not a full new layout.
Simon Sapin [Wed, 4 Apr 2018 15:19:16 +0000 (17:19 +0200)]
realloc with a new size only, not a full new layout.

Changing the alignment with realloc is not supported.

6 years agoReturn Result instead of Option in alloc::Layout constructors
Simon Sapin [Wed, 4 Apr 2018 14:03:46 +0000 (16:03 +0200)]
Return Result instead of Option in alloc::Layout constructors

6 years agoAdd FIXME comments for Void::null_mut usage
Simon Sapin [Wed, 4 Apr 2018 10:10:34 +0000 (12:10 +0200)]
Add FIXME comments for Void::null_mut usage

6 years agoRemove the now-unit-struct AllocErr field inside CollectionAllocErr
Simon Sapin [Tue, 3 Apr 2018 14:01:29 +0000 (16:01 +0200)]
Remove the now-unit-struct AllocErr field inside CollectionAllocErr

6 years agoRemove the now-unit-struct AllocErr parameter of oom()
Simon Sapin [Tue, 3 Apr 2018 14:00:04 +0000 (16:00 +0200)]
Remove the now-unit-struct AllocErr parameter of oom()

6 years agoUse the GlobalAlloc trait for #[global_allocator]
Simon Sapin [Tue, 3 Apr 2018 15:12:57 +0000 (17:12 +0200)]
Use the GlobalAlloc trait for #[global_allocator]

6 years agoImplement GlobalAlloc for System
Simon Sapin [Tue, 3 Apr 2018 15:51:03 +0000 (17:51 +0200)]
Implement GlobalAlloc for System

6 years agoMake AllocErr a zero-size unit struct
Simon Sapin [Tue, 3 Apr 2018 13:41:09 +0000 (15:41 +0200)]
Make AllocErr a zero-size unit struct

6 years agoUpdate to most recent version of dlmalloc
Alex Crichton [Mon, 9 Apr 2018 18:51:57 +0000 (11:51 -0700)]
Update to most recent version of dlmalloc

Inline the definition of `GlobalAlloc` for `dlmalloc` on wasm and don't rely on
usage of unstable features in `dlmalloc` itself.

6 years agoSeparate alloc::heap::Alloc trait for stage0 #[global_allocator]
Simon Sapin [Tue, 3 Apr 2018 18:58:50 +0000 (20:58 +0200)]
Separate alloc::heap::Alloc trait for stage0 #[global_allocator]

6 years agoActually deprecate the Heap type
Simon Sapin [Tue, 3 Apr 2018 19:15:06 +0000 (21:15 +0200)]
Actually deprecate the Heap type

6 years agoRename the Heap type to Global
Simon Sapin [Tue, 3 Apr 2018 12:43:34 +0000 (14:43 +0200)]
Rename the Heap type to Global

… since it is the entry point for what’s registered with `#[global_allocator]`

6 years agoActually deprecate heap modules.
Simon Sapin [Tue, 3 Apr 2018 19:05:10 +0000 (21:05 +0200)]
Actually deprecate heap modules.

6 years agoRename `heap` modules in the core, alloc, and std crates to `alloc`
Simon Sapin [Tue, 3 Apr 2018 12:41:15 +0000 (14:41 +0200)]
Rename `heap` modules in the core, alloc, and std crates to `alloc`

6 years agoImport the `alloc` crate as `alloc_crate` in std
Simon Sapin [Tue, 3 Apr 2018 12:36:57 +0000 (14:36 +0200)]
Import the `alloc` crate as `alloc_crate` in std

… to make the name `alloc` available.

6 years agoAdd a GlobalAlloc trait
Simon Sapin [Tue, 3 Apr 2018 12:07:06 +0000 (14:07 +0200)]
Add a GlobalAlloc trait

6 years agoAdd a core::heap::Void extern type.
Simon Sapin [Mon, 2 Apr 2018 09:26:16 +0000 (11:26 +0200)]
Add a core::heap::Void extern type.

6 years agoInline docs for the heap module’s reexports
Simon Sapin [Mon, 2 Apr 2018 08:38:07 +0000 (10:38 +0200)]
Inline docs for the heap module’s reexports

6 years agoadd test for using target features in doctests
QuietMisdreavus [Wed, 11 Apr 2018 01:51:34 +0000 (20:51 -0500)]
add test for using target features in doctests

6 years agoimprove Atomic*::fetch_update docs
Andre Bogus [Thu, 12 Apr 2018 20:48:48 +0000 (22:48 +0200)]
improve Atomic*::fetch_update docs

6 years agoAdd some new tests + Fix failing tests
Vadim Petrochenkov [Sat, 7 Apr 2018 16:18:44 +0000 (19:18 +0300)]
Add some new tests + Fix failing tests

6 years agoMove hygiene tests to UI
Vadim Petrochenkov [Sat, 7 Apr 2018 14:28:31 +0000 (17:28 +0300)]
Move hygiene tests to UI

6 years agoAvoid comparing fields by name when possible
Vadim Petrochenkov [Thu, 5 Apr 2018 00:20:21 +0000 (03:20 +0300)]
Avoid comparing fields by name when possible

Resolve them into field indices once and then use those resolutions

+ Fix rebase

6 years agoAST/HIR: Merge field access expressions for named and numeric fields
Vadim Petrochenkov [Sun, 1 Apr 2018 18:48:39 +0000 (21:48 +0300)]
AST/HIR: Merge field access expressions for named and numeric fields

6 years agoMake OnDiskCache thread-safer
John Kåre Alsaker [Thu, 15 Feb 2018 09:52:26 +0000 (10:52 +0100)]
Make OnDiskCache thread-safer

6 years agoImplement inferring outlives requirements for references, structs, enum, union, and...
toidiu [Sun, 15 Oct 2017 05:13:56 +0000 (01:13 -0400)]
Implement inferring outlives requirements for references, structs, enum, union, and projection types. added a feature gate and tests for these scenarios.

6 years agoAdd check builder for Windows to Travis
Mark Simulacrum [Wed, 11 Apr 2018 15:46:58 +0000 (09:46 -0600)]
Add check builder for Windows to Travis

6 years agoAuto merge of #49558 - Zoxc:sync-misc, r=michaelwoerister
bors [Thu, 12 Apr 2018 16:22:36 +0000 (16:22 +0000)]
Auto merge of #49558 - Zoxc:sync-misc, r=michaelwoerister

Even more thread-safety changes

r? @michaelwoerister

6 years agoFix test failure in src/tools/rustdoc-themes when rust.rpath = false
Chris Coulson [Thu, 12 Apr 2018 14:01:49 +0000 (15:01 +0100)]
Fix test failure in src/tools/rustdoc-themes when rust.rpath = false