Commit Graph

97868 Commits

Author SHA1 Message Date
Niko Matsakis
7ee1af51cc adjust test to be check-pass 2019-08-19 13:53:06 -04:00
Niko Matsakis
832199ee76 use static as object-lifetime default for type XX in Foo<Item=XX>
Currently the default is "inherited" from context, so e.g.  `&impl
Foo<Item = dyn Bar>` would default to `&'x impl Foo<Item = dyn Bar +
'x>`, but this triggers an ICE and is not very consistent.

This patch doesn't implement what I expect would be the correct
semantics, because those are likely too complex. Instead, it handles
what I'd expect to be the common case -- where the trait has no
lifetime parameters.
2019-08-19 13:50:44 -04:00
Niko Matsakis
af86fb1959 distinguish object-lifetime-default elision from other elision
Object-lifetime-default elision is distinct from other forms of
elision; it always refers to some enclosing lifetime *present in the
surrounding type* (e.g., `&dyn Bar` expands to `&'a (dyn Bar + 'a)`.
If there is no enclosing lifetime, then it expands to `'static`.

Therefore, in an `impl Trait<Item = dyn Bar>` setting, we don't expand
to create a lifetime parameter for the `dyn Bar + 'X` bound.  It will
just be resolved to `'static`.

Annoyingly, the responsibility for this resolution is spread across
multiple bits of code right now (`middle::resolve_lifetimes`,
`lowering`). The lowering code knows that the default is for an object
lifetime, but it doesn't know what the correct result would be.
Probably this should be fixed, but what we do now is a surgical fix:
we have it generate a different result for elided lifetimes in a
object context, and then we can ignore those results when figuring out
the lifetimes that are captured in the opaque type.
2019-08-19 13:50:42 -04:00
Niko Matsakis
b51df1def0 add debug logs 2019-08-19 13:48:45 -04:00
bors
f86521e0a3 Auto merge of #63700 - alexcrichton:update-backtrace, r=sfackler
std: Update `backtrace` crate dependency

This commit updates the `backtrace` crate from 0.3.34 to 0.3.35. The
[included set of changes][changes] for this update mostly includes some
gimli-related improvements (not relevant for the standard library) but
critically includes a fix for rust-lang/backtrace-rs#230. The standard
library will not aqcuire a session-local lock whenever a backtrace is
generated on Windows to allow external synchronization with the
`backtrace` crate itself, allowing `backtrace` to be safely used while
other threads may be panicking.

[changes]: https://github.com/rust-lang/backtrace-rs/compare/0.3.34...0.3.35
2019-08-19 13:17:34 +00:00
Alex Crichton
1301b100ca std: Update backtrace crate dependency
This commit updates the `backtrace` crate from 0.3.34 to 0.3.35. The
[included set of changes][changes] for this update mostly includes some
gimli-related improvements (not relevant for the standard library) but
critically includes a fix for rust-lang/backtrace-rs#230. The standard
library will not aqcuire a session-local lock whenever a backtrace is
generated on Windows to allow external synchronization with the
`backtrace` crate itself, allowing `backtrace` to be safely used while
other threads may be panicking.

[changes]: https://github.com/rust-lang/backtrace-rs/compare/0.3.34...0.3.35
2019-08-19 06:13:18 -07:00
bors
cdff918955 Auto merge of #63670 - Dante-Broggi:patch-2, r=Centril
Size has a ::zero
2019-08-19 05:12:58 +00:00
bors
a807902dd6 Auto merge of #63463 - matthewjasper:ty_param_cleanup, r=petrochenkov
Don't special case the `Self` parameter by name

This results in a couple of small diagnostic regressions. They could be avoided by keeping the special case just for diagnostics, but that seems worse.

closes #50125
cc #60869
2019-08-19 01:31:35 +00:00
bors
0ccbae2f18 Auto merge of #63045 - Rosto75:master, r=jonas-schievink
Change the placement of two functions.

Right now, the order is as follows:
`pop_front()`
`push_front()`
`push_back()`
`pop_back()`

`swap_remove_back()`
`swap_remove_front()`

I believe it would be more natural, and easier to follow, if we place `pop_back()` right after the `pop_front()`, and `swap_remove_back()` after the `swap_remove_front()` like this:
`pop_front()`
`pop_back()`
`push_front()`
`push_back()`

`swap_remove_front()`
`swap_remove_back()`

The rest of the documentation (at least in this module) adheres to the same logic, where the 'front' function always precedes its 'back' equivalent.
2019-08-18 22:01:21 +00:00
Matthew Jasper
24587d20df Pre intern the Self parameter type
Use this to simplify the object safety code a bit.
2019-08-18 19:25:12 +01:00
bors
4cf7673076 Auto merge of #63659 - gilescope:async-in-closure, r=Centril
Improved error message for break in async block

Fixes #63391
2019-08-18 18:23:28 +00:00
bors
ea52be482a Auto merge of #63635 - oli-obk:default-slice-dangles, r=eddyb
Do not generate allocations for zero sized allocations

Alternative to https://github.com/rust-lang/rust/issues/62487

r? @eddyb

There are other places where we could do this, too, but that would cause `static FOO: () = ();` to not have a unique address
2019-08-18 13:22:38 +00:00
Giles Cope
1e02bc62bc Better error message for break in async blocks. 2019-08-18 10:39:15 +01:00
bors
71e2882973 Auto merge of #63269 - Aaron1011:feature/proc-macro-data, r=eddyb,petrochenkov
Serialize additional data for procedural macros

Split off from #62855

This PR serializes the declaration `Span` and attributes for all
procedural macros. This allows Rustdoc to properly render doc comments
and source links when performing inlinig procedural macros across crates
2019-08-18 08:15:38 +00:00
bors
ef1ecbefb8 Auto merge of #62948 - matklad:failable-file-loading, r=petrochenkov
Normalize newlines when loading files

Fixes #62865
2019-08-18 04:37:01 +00:00
bors
fc8765d6d8 Auto merge of #61708 - dlrobertson:or-patterns-0, r=centril
Initial implementation of or-patterns

An incomplete implementation of or-patterns (e.g. `Some(0 | 1)` as a pattern). This patch set aims to implement initial parsing of `or-patterns`.

Related to: #54883

CC @alexreg @varkor
r? @Centril
2019-08-18 01:02:20 +00:00
bors
bd1da18b04 Auto merge of #63671 - Centril:rollup-zufavt5, r=Centril
Rollup of 5 pull requests

Successful merges:

 - #62451 (Add APIs for uninitialized Box, Rc, and Arc. (Plus get_mut_unchecked))
 - #63487 (Remove meaningless comments in src/test)
 - #63657 (Crank up invalid value lint)
 - #63667 (resolve: Properly integrate derives and `macro_rules` scopes)
 - #63669 (fix typos in mir/interpret)

Failed merges:

r? @ghost
2019-08-17 21:30:10 +00:00
Mazdak Farrokhzad
4ec9703467
Rollup merge of #63669 - Dante-Broggi:patch-1, r=jonas-schievink
fix typos in mir/interpret
2019-08-17 22:57:35 +02:00
Mazdak Farrokhzad
b60f245b95
Rollup merge of #63667 - petrochenkov:deriveholders, r=matthewjasper
resolve: Properly integrate derives and `macro_rules` scopes

So,
```rust
#[derive(A, B)]
struct S;

m!();
```
turns into something like
```rust
struct S;

A_placeholder!( struct S; );

B_placeholder!( struct S; );

m!();
```
during expansion.

And for `m!()` its "`macro_rules` scope" (aka "legacy scope") should point to the `B_placeholder` call rather than to the derive container `#[derive(A, B)]`.

`fn build_reduced_graph` now makes sure the legacy scope points to the right thing.
(It's still a mystery for me why this worked before https://github.com/rust-lang/rust/pull/63535.)

Unfortunately, placeholders from derives are currently treated separately from placeholders from other macros and need to be passed as `extra_placeholders` rather than a part of the AST fragment.
That's fixable, but I wanted to keep this PR more minimal to close the regression faster.

Fixes https://github.com/rust-lang/rust/issues/63651
r? @matthewjasper
2019-08-17 22:57:34 +02:00
Mazdak Farrokhzad
a00b4f1401
Rollup merge of #63657 - RalfJung:invalid_value, r=Centril
Crank up invalid value lint

* Warn against uninit `bool` and `char`.
* Warn against 0-init `NonNull` and friends
* Detect transmute-from-0 as zero-initialization ([seen in the wild](https://github.com/glium/glium/issues/1775#issuecomment-522144636))
2019-08-17 22:57:32 +02:00
Mazdak Farrokhzad
a396434136
Rollup merge of #63487 - sd234678:remove-meaningless-comments-in-src/test-2, r=Centril
Remove meaningless comments in src/test

Moved from #63411
2019-08-17 22:57:30 +02:00
Mazdak Farrokhzad
a3b6e8ef99
Rollup merge of #62451 - SimonSapin:new_uninit, r=RalfJung
Add APIs for uninitialized Box, Rc, and Arc. (Plus get_mut_unchecked)

Assigning `MaybeUninit::<Foo>::uninit()` to a local variable is usually free, even when `size_of::<Foo>()` is large. However, passing it for example to `Arc::new` [causes at least one copy](https://youtu.be/F1AquroPfcI?t=4116) (from the stack to the newly allocated heap memory) even though there is no meaningful data. It is theoretically possible that a Sufficiently Advanced Compiler could optimize this copy away, but this is [reportedly unlikely to happen soon in LLVM](https://youtu.be/F1AquroPfcI?t=5431).

This PR proposes two sets of features:

* Constructors for containers (`Box`, `Rc`, `Arc`) of `MaybeUninit<T>` or `[MaybeUninit<T>]` that do not initialized the data, and unsafe conversions to the known-initialized types (without `MaybeUninit`). The constructors are guaranteed not to make unnecessary copies.

* On `Rc` and `Arc`, an unsafe `get_mut_unchecked` method that provides `&mut T` access without checking the reference count. `Arc::get_mut` involves multiple atomic operations whose cost can be non-trivial. `Rc::get_mut` is less costly, but we add `Rc::get_mut_unchecked` anyway for symmetry with `Arc`.

  These can be useful independently, but they will presumably be typical when the new constructors of `Rc` and `Arc` are used.

  An alternative with a safe API would be to introduce `UniqueRc` and `UniqueArc` types that have the same memory layout as `Rc` and `Arc` (and so zero-cost conversion to them) but are guaranteed to have only one reference. But introducing entire new types feels “heavier” than new constructors on existing types, and initialization of `MaybeUninit<T>` typically requires unsafe code anyway.

Summary of new APIs (all unstable in this PR):

```rust
impl<T> Box<T> { pub fn new_uninit() -> Box<MaybeUninit<T>> {…} }
impl<T> Box<MaybeUninit<T>> { pub unsafe fn assume_init(self) -> Box<T> {…} }
impl<T> Box<[T]> { pub fn new_uninit_slice(len: usize) -> Box<[MaybeUninit<T>]> {…} }
impl<T> Box<[MaybeUninit<T>]> { pub unsafe fn assume_init(self) -> Box<[T]> {…} }

impl<T> Rc<T> { pub fn new_uninit() -> Rc<MaybeUninit<T>> {…} }
impl<T> Rc<MaybeUninit<T>> { pub unsafe fn assume_init(self) -> Rc<T> {…} }
impl<T> Rc<[T]> { pub fn new_uninit_slice(len: usize) -> Rc<[MaybeUninit<T>]> {…} }
impl<T> Rc<[MaybeUninit<T>]> { pub unsafe fn assume_init(self) -> Rc<[T]> {…} }

impl<T> Arc<T> { pub fn new_uninit() -> Arc<MaybeUninit<T>> {…} }
impl<T> Arc<MaybeUninit<T>> { pub unsafe fn assume_init(self) -> Arc<T> {…} }
impl<T> Arc<[T]> { pub fn new_uninit_slice(len: usize) -> Arc<[MaybeUninit<T>]> {…} }
impl<T> Arc<[MaybeUninit<T>]> { pub unsafe fn assume_init(self) -> Arc<[T]> {…} }

impl<T: ?Sized> Rc<T> { pub unsafe fn get_mut_unchecked(this: &mut Self) -> &mut T {…} }
impl<T: ?Sized> Arc<T> { pub unsafe fn get_mut_unchecked(this: &mut Self) -> &mut T {…} }
```
2019-08-17 22:57:29 +02:00
Ralf Jung
3288be515f test in a way that works even with musl 2019-08-17 22:11:43 +02:00
Dante-Broggi
d64f06ce31 size has a zero 2019-08-17 16:09:49 -04:00
Simon Sapin
9bd70834b0
Doc nit
Co-Authored-By: Ralf Jung <post@ralfj.de>
2019-08-17 21:40:35 +02:00
Dante-Broggi
a7c34f1ce9 fix typos 2019-08-17 15:36:28 -04:00
Vadim Petrochenkov
1064d41c96 resolve/expand: Rename some things for clarity 2019-08-17 21:04:48 +03:00
bors
2111aed0a3 Auto merge of #63658 - RalfJung:miri-op, r=oli-obk
Refactor Miri ops (unary, binary) to have more types

This is the part of https://github.com/rust-lang/rust/pull/63448 that is just a refactoring. It helps that PR by making it easier to perform machine arithmetic.

r? @oli-obk @eddyb
2019-08-17 17:53:31 +00:00
Vadim Petrochenkov
d479ff2ffe resolve: Properly integrate derives and macro_rules scopes 2019-08-17 20:15:06 +03:00
Aaron Hill
64f867ae3e
Serialize additional data for procedural macros
Split off from #62855

This PR deerializes the declaration `Span` and attributes for all
procedural macros from their underlying function definitions.
This allows Rustdoc to properly render doc comments
and source links when inlining procedural macros across crates
2019-08-17 13:14:05 -04:00
Dan Robertson
1870537f27
initial implementation of or-pattern parsing
Initial implementation of parsing or-patterns e.g., `Some(Foo | Bar)`.
This is a partial implementation of RFC 2535.
2019-08-17 15:55:40 +00:00
varkor
1713ac4bf5
Initial implementation of or patterns 2019-08-17 15:05:36 +00:00
Simon Sapin
b79ce1b1b1 Rename private helper method allocate_for_unsized to allocate_for_layout 2019-08-17 17:01:04 +02:00
Ralf Jung
72d9fe8b0e less & 2019-08-17 16:48:08 +02:00
Simon Sapin
ba0328327c Doc nits
Co-Authored-By: Ralf Jung <post@ralfj.de>
2019-08-17 15:42:05 +02:00
bors
d65e272a9f Auto merge of #63462 - matthewjasper:hygienic-builtin-derives, r=petrochenkov
Opaque builtin derive macros

* Buiilt-in derives are now opaque macros
    * This required limiting the visibility of some previously unexposed functions in `core`.
    * This also required the change to `Ident` serialization.
* All gensyms are replaced with hygienic identifiers
* Use hygiene to avoid most other name-resolution issues with buiilt-in derives.
    *  As far as I know the only remaining case that breaks is an ADT that has the same name as one of its parameters. Fixing this completely seemed to be more effort than it's worth.
* Remove gensym in `Ident::decode`, which lead to linker errors due to `inline` being gensymmed.
    * `Ident`now panics if incremental compilation tries to serialize it (it currently doesn't).
    * `Ident` no longer uses `gensym` to emulate cross-crate hygiene. It only applied to reexports.
    * `SyntaxContext` is no longer serializable.
    * The long-term fix for this is to properly implement cross-crate hygiene, but this seemed to be acceptable for now.
* Move type/const parameter shadowing checks to `resolve`
    * This was previously split between resolve and type checking. The type checking pass compared `InternedString`s, not Identifiers.
* Removed the `SyntaxContext` from `{ast, hir}::{InlineAsm, GlobalAsm}`

cc #60869
r? @petrochenkov
2019-08-17 12:53:53 +00:00
Ralf Jung
f19087dd7c drift leftward 2019-08-17 13:50:04 +02:00
Ralf Jung
689c210b47 fix tests 2019-08-17 13:50:04 +02:00
Ralf Jung
4821663a2b
Full stop
Co-Authored-By: Mazdak Farrokhzad <twingoow@gmail.com>
2019-08-17 13:42:03 +02:00
Ralf Jung
5ac2045d1e use ImmTy::from_uint in a few more spots 2019-08-17 12:56:46 +02:00
Ralf Jung
3edf099266 make both unary_op and binary_op fully typed, including a return type 2019-08-17 12:56:44 +02:00
Ralf Jung
0a2a517fe6 Add ImmTy::from_uint 2019-08-17 12:37:02 +02:00
Ralf Jung
a9efa738ab invalid_value: also detect transmute-from-0 (seen in the wild) 2019-08-17 11:57:01 +02:00
Ralf Jung
9ab1d5c73a multi-variant enums are tricky 2019-08-17 11:57:01 +02:00
Ralf Jung
0d242b3f90 invalid_value: warn for types with custom valid range 2019-08-17 11:56:58 +02:00
Ralf Jung
25d8a0a351 warn about uninit bools and chars 2019-08-17 11:56:57 +02:00
Ralf Jung
5f7716d11b invalid_value: factor finding dangerous inits into separate function 2019-08-17 11:56:54 +02:00
Oliver Scherer
1ea88a8689 Add tests 2019-08-17 11:31:09 +02:00
Oliver Scherer
ab949fdd64 Cast only where necessary 2019-08-17 11:29:17 +02:00
bors
ac60ca0643 Auto merge of #63655 - Centril:rollup-ty1ot40, r=Centril
Rollup of 4 pull requests

Successful merges:

 - #62737 (Override Cycle::try_fold)
 - #63505 (Hash the remapped sysroot instead of the original.)
 - #63559 (rustc_codegen_utils: account for 1-indexed anonymous lifetimes in v0 mangling.)
 - #63621 (Modify librustc_llvm to pass -DNDEBUG while compiling.)

Failed merges:

r? @ghost
2019-08-17 09:14:37 +00:00