Commit Graph

85572 Commits

Author SHA1 Message Date
bors 3fc70e8d46 Auto merge of #54383 - mikeyhew:custom-receivers-object-safety, r=nikomatsakis
Take 2: Implement object-safety and dynamic dispatch for arbitrary_self_types

This replaces #50173. Over the months that that PR was open, we made a lot of changes to the way this was going to be implemented, and the long, meandering comment thread and commit history would have been confusing to people reading it in the future. So I decided to package everything up with new, straighforward commits and open a new PR.

Here are the main points. Please read the commit messages for details.

- To simplify codegen, we only support receivers that have the ABI of a pointer. That means they are builtin pointer types, or newtypes thereof.
- We introduce a new trait: `DispatchFromDyn<T>`, similar to `CoerceUnsized<T>`. `DispatchFromDyn` has extra requirements that `CoerceUnsized` does not: when you implement `DispatchFromDyn` for a struct, there cannot be any extra fields besides the field being coerced and `PhantomData` fields. This ensures that the struct's ABI is the same as a pointer.
- For a method's receiver (e.g. `self: Rc<Self>`) to be object-safe, it needs to have the following property:
    - let `DynReceiver` be the receiver when `Self = dyn Trait`
    - let `ConcreteReceiver` be the receiver when `Self = T`, where `T` is some unknown `Sized` type that implements `Trait`, and is the erased type of the trait object.
    - `ConcreteReceiver` must implement `DispatchFromDyn<DynReceiver>`

In the case of `Rc<Self>`, this requires `Rc<T>: DispatchFromDyn<Rc<dyn Trait>>`

These rules are explained more thoroughly in the doc comment on `receiver_is_dispatchable` in object_safety.rs.

r? @nikomatsakis and @eddyb

cc @arielb1 @cramertj @withoutboats

Special thanks to @nikomatsakis for getting me un-stuck when implementing the object-safety checks, and @eddyb for helping with the codegen parts.

EDIT 2018-11-01: updated because CoerceSized has been replaced with DispatchFromDyn
2018-11-03 02:37:29 +00:00
Guillaume Gomez ca65b4304e Don't show associated const items by default 2018-11-02 23:10:27 +01:00
QuietMisdreavus 014c8c4c38 implement existing parser fns in terms of fallible fns 2018-11-02 17:07:28 -05:00
bors 8b096314a6 Auto merge of #55087 - levex:e0669-improve-span, r=nagisa
rustc: improve E0669 span

E0669 refers to an operand that cannot be coerced into a single LLVM
value, unfortunately right now this uses the Span for the entire inline
assembly statement, which is less than ideal.

This commit preserves the Span from HIR, which lets us emit the error
using the Span for the operand itself in MIR.

r? @nagisa
cc/ @parched
2018-11-02 18:28:51 +00:00
bors e53a5ffd6b Auto merge of #54543 - GuillaumeGomez:top-level-index, r=QuietMisdreavus
Add index page argument

@Mark-Simulacrum: I might need some help from you: in bootstrap, I want to add an argument (a new flag added into `rustdoc`) in order to generate the current index directly when `rustdoc` is documenting the `std` lib. However, my change in `bootstrap` didn't do it and I assume it must be moved inside the `Std` struct. But there, I don't see how to pass it to `rustdoc` through `cargo`. Did I miss anything?

r? @QuietMisdreavus
2018-11-02 15:39:25 +00:00
Alex Crichton 14c6835e03 rustc: Wait for all codegen threads to exit
This commit updates rustc to wait for all codegen threads to exit before
allowing the main thread to exit. This is a stab in the dark to fix the
mysterious segfaults appearing on #55238, and hopefully we'll see
whether this actually fixes things in practice...
2018-11-02 06:53:25 -07:00
Alex Crichton 016eaf88f5 Use `jemalloc-sys` on Linux and OSX compilers
This commit adds opt-in support to the compiler to link to `jemalloc` in
the compiler. When activated the compiler will depend on `jemalloc-sys`,
instruct jemalloc to unprefix its symbols, and then link to it. The
feature is activated by default on Linux/OSX compilers for x86_64/i686
platforms, and it's not enabled anywhere else for now. We may be able to
opt-in other platforms in the future! Also note that the opt-in only
happens on CI, it's otherwise unconditionally turned off by default.

Closes #36963
2018-11-02 06:52:56 -07:00
Alex Crichton 61e89446ef Remove all jemalloc-related content
This commit removes all jemalloc related submodules, configuration, etc,
from the bootstrap, from the standard library, and from the compiler.
This will be followed up with a change to use jemalloc specifically as
part of rustc on blessed platforms.
2018-11-02 06:52:56 -07:00
bors 87a3c1ee70 Auto merge of #55316 - RalfJung:retagging, r=oli-obk
Add Retagging statements

This adds a `Retag` statement kind to MIR, used to perform the retagging operation from [Stacked Borrows](https://www.ralfj.de/blog/2018/08/07/stacked-borrows.html). It also kills the old `Validate` statements that I added last year.

NOTE: This includes https://github.com/rust-lang/rust/pull/55270. Only [these commits are new](https://github.com/RalfJung/rust/compare/stacked-borrows-ng...RalfJung:retagging).
2018-11-02 12:45:03 +00:00
bors d0c869c323 Auto merge of #54718 - froydnj:aarch64-ci, r=alexcrichton
add an appveyor config for aarch64-pc-windows-msvc

This is purely a cargo-cult of things to solicit feedback from humans and/or automation failures.  Not sure that the build artifacts would get packaged properly to start providing nightly tarballs for `libstd`, but this is at least a start.

Fixes #53864.
2018-11-02 09:46:11 +00:00
bors e800988579 Auto merge of #54043 - fintelia:raw_entry, r=alexcrichton
Add raw_entry API to HashMap

This is a continuation of #50821.
2018-11-02 07:04:07 +00:00
bors ad4c885225 Auto merge of #55359 - alex:command-exec-uaf, r=alexcrichton
Fixes #46775 -- don't mutate the process's environment in Command::exec

Instead, pass the environment to execvpe, so the kernel can apply it directly to the new process. This avoids a use-after-free in the case where exec'ing the new process fails for any reason, as well as a race condition if there are other threads alive during the exec.

Fixes #46775
2018-11-02 04:20:36 +00:00
Alex Burka 2279f6260c add test for deriving Debug on uninhabited enum 2018-11-02 02:26:50 +00:00
bors 5eda136f62 Auto merge of #55305 - nikomatsakis:universes-refactor-3, r=scalexm
universes refactor 3

Some more refactorings from my universe branch. These are getting a bit more "invasive" -- they start to plumb the universe information through the canonicalization process. As of yet though I don't **believe** this branch changes our behavior in any notable way, though I'm marking the branch as `WIP` to give myself a chance to verify this.

r? @scalexm
2018-11-02 01:19:17 +00:00
Guillaume Gomez 2b646059a1 Move doc_alias doc 2018-11-02 00:04:56 +01:00
Guillaume Gomez 7f7d8fbb2f Add test for index-page 2018-11-02 00:01:53 +01:00
Guillaume Gomez 1244a85729 Add documentation for index-page features 2018-11-02 00:01:53 +01:00
Michael Hewson 192e7c4b51 Add comments explaining how codegen works for `dyn Trait` methods 2018-11-01 18:28:52 -04:00
bors d06210f88f Auto merge of #55595 - Manishearth:clippyup, r=oli-obk
Update clippy

r? @kennytm @oli-obk
2018-11-01 22:18:16 +00:00
Michael Hewson a468da9cfb Add a check for reprs that could change the ABI
disallow `#[repr(C)] and `#[repr(packed)]` on structs implementing DispatchFromDyn because they will change the ABI from Scalar/ScalarPair to Aggregrate, resulting in an ICE during object-safety checks or codegen
2018-11-01 18:16:59 -04:00
Michael Hewson 3db22039dc Remove this check for object-safety during selection of trait object candidates
I don't really understand what it's for, but see the comment here:
https://github.com/rust-lang/rust/pull/50173#discussion_r204222336

where arielb1 said

> Does this check do anything these days? I think `$0: Trait` is always considered ambiguous

and nikomatsakis agreed we may be able to get rid of it
2018-11-01 18:16:59 -04:00
Michael Hewson eb997d76d5 add `U: Trait` to the param env during DispatchFromDyn check
also updated the doc on `receiver_is_dispatchable` to reflect current state of the implementation
2018-11-01 18:16:59 -04:00
Michael Hewson b5b25f8196 Put backticks around field names, types and paths in error messages
Added to `DispatchFromDyn` and `CoerceUnsized` error messages
2018-11-01 18:16:59 -04:00
Michael Hewson 6f2a161b1b Add layout sanity checks in object safety
If object-safety checks succeed for a receiver type, make sure the
receiver’s abi is
a) a Scalar, when Self = ()
b) a ScalarPair, when Self = dyn Trait
2018-11-01 18:16:59 -04:00
Michael Hewson 74ef46cfa2 Replace UncoeribleReceiver error message with UndispatchableReceiver 2018-11-01 18:16:59 -04:00
Michael Hewson 3c56d8d0c2 fix error-index test 2018-11-01 18:16:59 -04:00
Michael Hewson 48d7f8db3a update DispatchFromDyn doctest 2018-11-01 18:16:59 -04:00
Michael Hewson f12c250e40 Replace CoerceSized trait with DispatchFromDyn
Rename `CoerceSized` to `DispatchFromDyn`, and reverse the direction so that, for example, you write

```
impl<T: Unsize<U>, U> DispatchFromDyn<*const U> for *const T {}
```

instead of

```
impl<T: Unsize<U>, U> DispatchFromDyn<*const T> for *const U {}
```

this way the trait is really just a subset of `CoerceUnsized`.

The checks in object_safety.rs are updated for the new trait, and some documentation and method names in there are updated for the new trait name — e.g. `receiver_is_coercible` is now called `receiver_is_dispatchable`. Since the trait now works in the opposite direction, some code had to updated here for that too.

I did not update the error messages for invalid `CoerceSized` (now `DispatchFromDyn`) implementations, except to find/replace `CoerceSized` with `DispatchFromDyn`. Will ask for suggestions in the PR thread.
2018-11-01 18:16:59 -04:00
Michael Hewson c29641e067 fix docs on trait
tests were failing because I didn't wrap code snippets like  in backticks. fixed that now, so hopefully tests will pass on travis
2018-11-01 18:16:22 -04:00
Michael Hewson 82f1f9a5b4 Add new tests and update existing for object-safe custom receivers 2018-11-01 18:16:22 -04:00
Michael Hewson a0f23f8405 update tests that have changed output
I’m not sure why these tests have different output now, but they do.
In all cases, the error message that is missing looks like this: “the
trait bound `dyn Trait: Trait` is not satisfied”

My guess is that the error message is going away because object-safety
now involves trait solving, and these extra error messages are no
longer leaking out.
2018-11-01 18:16:22 -04:00
Michael Hewson 192900e7c2 Add CoerceSized impls throughout libstd
This will make receiver types like `Rc<Self>` and `Pin<&mut Self>`
object-safe.
2018-11-01 18:16:22 -04:00
Michael Hewson 9f59da2864 Implement object-safety for arbitrary_self_types: part 2
For now, all of the receivers that we care about are just a newtyped
pointer — i.e. `Box<Self>`, `Rc<Self>`, `Pin<Box<Self>>`, `Pin<&mut
Self>`. This is much simpler to implement in codeine than the more
general case, because the ABI is the same as a pointer. So we add some
checks in typeck/coherence/builtin.rs to make sure that implementors of
CoerceSized are just newtyped pointers. In this commit, we also
implement the codegen bits.
2018-11-01 18:15:20 -04:00
Michael Hewson d5c2c4a433 Implement the object-safety checks for arbitrary_self_types: part 1
For a trait method to be considered object-safe, the receiver type must
satisfy certain properties: first, we need to be able to get the vtable
to so we can look up the method, and second, we need to convert the
receiver from the version where `Self=dyn Trait`, to the version where
`Self=T`, `T` being some unknown, `Sized` type that implements `Trait`.

To check that the receiver satisfies those properties, we use the
following query:

forall (U) {
if (Self: Unsize<U>) {
Receiver[Self => U]: CoerceSized<Receiver>
}
}

where `Receiver` is the receiver type of the method (e.g. `Rc<Self>`),
and `Receiver[Self => U]` is the receiver type where `Self = U`, e.g.
`Rc<U>`.

forall queries like this aren’t implemented in the trait system yet, so
for now we are using a bit of a hack — see the code for explanation.
2018-11-01 18:15:19 -04:00
Michael Hewson be80a79a1e Add CoerceSized trait and lang item
This trait is more-or-less the reverse of CoerceUnsized, and will be
used for object-safety checks. Receiver types like `Rc` will have to
implement `CoerceSized` so that methods that use `Rc<Self>` as the
receiver will be considered object-safe.
2018-11-01 18:15:19 -04:00
Michael Hewson a920036f4f move some code around to avoid query cycles 2018-11-01 18:15:19 -04:00
Michael Hewson d14af130f6 Make all object-safety methods require a global TyCtxt 2018-11-01 18:15:19 -04:00
Nick Cameron d0778ac88e publish-toolstate: ping maintainers when a tool builds again
And add @Xanewok as an RLS maintainer
2018-11-02 10:38:05 +13:00
Manish Goregaokar ecf27d3018 Update clippy 2018-11-01 13:58:07 -07:00
QuietMisdreavus 0fe6aae49a buffer errors from initial tokenization when parsing 2018-11-01 11:57:29 -05:00
bors 451987d86c Auto merge of #55579 - pietroalbini:rollup, r=kennytm
Rollup of 13 pull requests

Successful merges:

 - #55280 (Add libproc_macro to rust-src distribution)
 - #55469 (Regression tests for issue #54477.)
 - #55504 (Use vec![x; n] instead of iter::repeat(x).take(n).collect())
 - #55522 (use String::from() instead of format!() macro to construct Strings.)
 - #55536 (Pass suggestions as impl Iterator instead of Vec)
 - #55542 (syntax: improve a few allocations)
 - #55558 (Tweak `MatcherPos::matches`)
 - #55561 (Fix double_check tests on big-endian targets)
 - #55573 (Make sure the `aws` executable is in $PATH on macOS)
 - #55574 (Use `SmallVec` within `MoveData`.)
 - #55575 (Fix invalid_const_promotion test on some archs)
 - #55578 (Made doc example of `impl Default for …` use `-> Self` instead of explicit self type)
 - #55582 (Remove unused import copy from publish_toolstate.py)
2018-11-01 16:06:15 +00:00
kennytm f76a8e3b86
Rollup merge of #55578 - regexident:fix/self, r=frewsxcv
Made doc example of `impl Default for …` use `-> Self` instead of explicit self type

There is no need to state the explicit type of `self`.
2018-11-01 22:56:36 +08:00
kennytm 1a25f22c80
Rollup merge of #55561 - smaeul:test-fixes, r=alexcrichton
Fix double_check tests on big-endian targets

Since the enums get optimized down to 1 byte long, the bits set in the `usize` member don't align with the `enum` values on big-endian machines. Avoid this issue by shrinking the integer member to the
same size as the enums.
2018-11-01 22:56:12 +08:00
kennytm 9550bc06dc
Rollup merge of #55582 - yamaguchi1024:publish_toolstate, r=alexcrichton
Remove unused import copy from publish_toolstate.py
2018-11-01 22:55:49 +08:00
kennytm aa525b3914
Rollup merge of #55573 - kennytm:macos-aws, r=alexcrichton
Make sure the `aws` executable is in $PATH on macOS

Fixes #55571
2018-11-01 22:54:16 +08:00
QuietMisdreavus 8a3b5e99ad silence errors found during doctest pre-parsing 2018-11-01 09:52:28 -05:00
QuietMisdreavus d6d8c6bd71 add a line between extracted crates and everything else 2018-11-01 09:52:28 -05:00
QuietMisdreavus f36ed5b58d add env-logger to error-index-generator 2018-11-01 09:52:28 -05:00
Wesley Norris cd407dfe74 Separates inner attributes from code during doctest parsing. 2018-11-01 09:52:28 -05:00
Wesley Norris 43b65b51e0 Tidy up source file and fix typo. 2018-11-01 09:52:27 -05:00