Commit graph

7875 commits

Author SHA1 Message Date
Mazdak Farrokhzad
b499a88dfc Unify assoc item visitors more. 2019-12-12 18:01:33 +01:00
Mazdak Farrokhzad
63a9030e7b Unify associated item parsing.
An exception is `fn` params.
2019-12-12 17:54:49 +01:00
Mazdak Farrokhzad
39073767a4 Unify {Trait,Impl}ItemKind::TyAlias structures. 2019-12-12 17:54:48 +01:00
Mazdak Farrokhzad
f6403c6c76 Use Option in ImplItemKind::Method. 2019-12-12 17:54:48 +01:00
Mazdak Farrokhzad
73557faed2 Use Option in ImplItemKind::Const. 2019-12-12 17:54:48 +01:00
Mazdak Farrokhzad
c4bbe9cbbe Alias TraitItem & ImplItem.
Allow defaultness on trait items syntactically.
2019-12-12 17:54:48 +01:00
bors
f284f8b4be Auto merge of #67246 - JohnTitor:rollup-nfa7skn, r=JohnTitor
Rollup of 8 pull requests

Successful merges:

 - #62514 (Clarify `Box<T>` representation and its use in FFI)
 - #66983 (Fix `unused_parens` triggers on macro by example code)
 - #67215 (Fix `-Z print-type-sizes`'s handling of zero-sized fields.)
 - #67230 (Remove irelevant comment on `register_dtor`)
 - #67236 (resolve: Always resolve visibilities on impl items)
 - #67237 (Some small readability improvements)
 - #67238 (Small std::borrow::Cow improvements)
 - #67239 (Make TinyList::remove iterate instead of recurse)

Failed merges:

r? @ghost
2019-12-12 02:11:31 +00:00
Yuki Okushi
0f286e855f
Rollup merge of #67236 - petrochenkov:docerr2, r=matthewjasper
resolve: Always resolve visibilities on impl items

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

Similarly to https://github.com/rust-lang/rust/pull/67106 this was an issue with visitor discipline.
Impl items were visited as a part of visiting `ast::ItemKind::Impl`, but they should be visit-able in isolation  from their parents as well, because that's how they are visited when they are expanded from macros.

I've checked that all the remaining `resolve_visibility` calls are used correctly.

r? @matthewjasper
2019-12-12 10:09:24 +09:00
Yuki Okushi
a82390407a
Rollup merge of #67215 - nnethercote:fix-Zprint-type-size-zero-sized-fields, r=pnkfelix
Fix `-Z print-type-sizes`'s handling of zero-sized fields.

Currently, the type `struct S { x: u32, y: u32, tag: () }` is
incorrectly described like this:
```
print-type-size type: `S`: 8 bytes, alignment: 4 bytes
print-type-size     field `.x`: 4 bytes
print-type-size     field `.tag`: 0 bytes, offset: 0 bytes, alignment: 1 bytes
print-type-size     padding: 4 bytes
print-type-size     field `.y`: 4 bytes, alignment: 4 bytes
```
Specifically:
- The `padding` line is wrong. (There is no padding.)
- The `offset` and `alignment` on the `.tag` line shouldn't be printed.

The problem is that multiple fields can end up with the same offset, and
the printing code doesn't handle this correctly.

This commit fixes it by adjusting the field sorting so that zero-sized fields
are dealt with before non-zero-sized fields. With that in place, the
printing code works correctly.

The commit also corrects the "something is very wrong" comment.

The new output looks like this:
```
print-type-size type: `S`: 8 bytes, alignment: 4 bytes
print-type-size     field `.tag`: 0 bytes
print-type-size     field `.x`: 4 bytes
print-type-size     field `.y`: 4 bytes
```
r? @pnkfelix
2019-12-12 10:09:21 +09:00
Yuki Okushi
f642dc4124
Rollup merge of #66983 - weiznich:bugfix/issue_66295, r=estebank
Fix `unused_parens` triggers on macro by example code

Fix #66295

Unfortunately this does also break [an existing test](4787e97475/src/test/ui/lint/issue-47775-nested-macro-unnecessary-parens-arg.rs (L22)). I'm not sure how to handle that, because that seems to be quite similar to the allowed cases

If this gets accepted it would be great to backport this fix to beta.
2019-12-12 10:09:19 +09:00
bors
de0abf7599 Auto merge of #66650 - matthewjasper:nonuniform-array-move, r=pnkfelix
Remove uniform array move MIR passes

This PR fixes a number of bugs caused by limitations of this pass

* Projections from constant indexes weren't being canonicalized
* Constant indexes from the start weren't being canonicalized (they could have different min_lengths)
* It didn't apply to non-moves

This PR makes the following changes to support removing this pass:

* ConstantIndex of arrays are now generated in a canonical form (from the start, min_length is the actual length).
* Subslices are now split when generating move paths and when checking subslices have been moved.

Additionally

* The parent move path of a projection from an array element is now calculated correctly

closes #66502
2019-12-11 23:00:38 +00:00
bors
27d6f55f47 Auto merge of #65345 - davidtwco:issue-64130-async-send-sync-error-improvements, r=nikomatsakis
async/await: improve not-send errors, part 2

Part of #64130. Fixes #65667.

This PR improves the errors introduced in #64895 so that they have specialized messages for `Send` and `Sync`.

r? @nikomatsakis
2019-12-11 19:39:06 +00:00
Vadim Petrochenkov
914c9aa78d resolve: Always resolve visibilities on impl items 2019-12-11 22:10:09 +03:00
bors
90b957a17c Auto merge of #66821 - eddyb:global-trait-caching, r=nikomatsakis
rustc: allow non-empty ParamEnv's in global trait select/eval caches.

*Based on #66963*

This appears to alleviate the symptoms of #65510 locally (without fixing WF directly), and is potentially easier to validate as sound (since it's a more ad-hoc version of queries we already have).

I'm opening this PR primarily to test the effects on perf.

r? @nikomatsakis cc @rust-lang/wg-traits
2019-12-11 12:29:35 +00:00
Mazdak Farrokhzad
96b288f593
Rollup merge of #67164 - matthewjasper:never-remove-const, r=oli-obk
Ensure that panicking in constants eventually errors

based on #67134

closes #66975

r? @oli-obk
2019-12-11 10:10:46 +01:00
Mazdak Farrokhzad
4c3e95e84b
Rollup merge of #67074 - ehuss:extern-options, r=petrochenkov
Add options to --extern flag.

This changes the `--extern` flag so that it can take a series of options that changes its behavior. The general syntax is `[opts ':'] name ['=' path]` where `opts` is a comma separated list of options. Two options are supported, `priv` which replaces `--extern-private` and `noprelude` which avoids adding the crate to the extern prelude.

```text
--extern priv:mylib=/path/to/libmylib.rlib
--extern noprelude:alloc=/path/to/liballoc.rlib
```

`noprelude` is to be used by Cargo's build-std feature in order to use `--extern` to reference standard library crates.

This also includes a second commit which adds the `aux-crate` directive to compiletest. I can split this off into a separate PR if desired, but it helps with defining these kinds of tests. It is based on #54020, and can be used in the future to replace and simplify some of the Makefile tests.
2019-12-11 10:10:44 +01:00
Mazdak Farrokhzad
04e0512c7a
Rollup merge of #67015 - osa1:issue66971, r=wesleywiser
Fix constant propagation for scalar pairs

We now only propagate a scalar pair if the Rvalue is a tuple with two scalars. This for example avoids propagating a (u8, u8) value when Rvalue has type `((), u8, u8)` (see the regression test). While this is a correct thing to do, implementation is tricky and will be done later.

Fixes #66971
Fixes #66339
Fixes #67019
2019-12-11 10:10:42 +01:00
Nicholas Nethercote
c681841ca0 Fix -Z print-type-sizes's handling of zero-sized fields.
Currently, the type `struct S { x: u32, y: u32, tag: () }` is
incorrectly described like this:
```
print-type-size type: `S`: 8 bytes, alignment: 4 bytes
print-type-size     field `.x`: 4 bytes
print-type-size     field `.tag`: 0 bytes, offset: 0 bytes, alignment: 1 bytes
print-type-size     padding: 4 bytes
print-type-size     field `.y`: 4 bytes, alignment: 4 bytes
```
Specifically:
- The `padding` line is wrong. (There is no padding.)
- The `offset` and `alignment` on the `.tag` line shouldn't be printed.

The problem is that multiple fields can end up with the same offset, and
the printing code doesn't handle this correctly.

This commit fixes it by adjusting the field sorting so that zero-sized fields
are dealt with before non-zero-sized fields. With that in place, the
printing code works correctly.

The commit also corrects the "something is very wrong" comment.

The new output looks like this:
```
print-type-size type: `S`: 8 bytes, alignment: 4 bytes
print-type-size     field `.tag`: 0 bytes
print-type-size     field `.x`: 4 bytes
print-type-size     field `.y`: 4 bytes
```
2019-12-11 15:09:19 +11:00
Yuki Okushi
a7f930748c
Rollup merge of #67134 - oli-obk:const_prop_zst, r=wesleywiser
Ensure that we get a hard error on generic ZST constants if their bod…

…y causes an error during evaluation

cc #67083 (does not fix because we still need the beta backport)

r? @wesleywiser

cc @RalfJung
2019-12-11 04:32:57 +09:00
bors
883b6aacba Auto merge of #67039 - xfix:manually-implement-pin-traits, r=nikomatsakis
Use deref target in Pin trait implementations

Using deref target instead of pointer itself avoids providing access to `&Rc<T>` for malicious implementations, which would allow calling `Rc::get_mut`.

This is a breaking change necessary due to unsoundness, however the impact of it should be minimal.

This only fixes the issue with malicious `PartialEq` implementations, other `Pin` soundness issues are still here.

See <https://internals.rust-lang.org/t/unsoundness-in-pin/11311/73> for more details.
2019-12-10 06:52:45 +00:00
Tyler Mandry
c2702e38e4
Rollup merge of #67149 - JohnTitor:fix-ice-1, r=Dylan-DPC
Do not ICE #67123

Fixes #67123

r? @matthewjasper
2019-12-09 14:33:12 -08:00
Matthew Jasper
d96485d49e Add more tests for borrowck and dropck slice pattern handling 2019-12-09 20:43:24 +00:00
Matthew Jasper
d2ed209699 Ensure that unevaluated constants of type ! are present in the MIR 2019-12-09 20:38:51 +00:00
Vadim Petrochenkov
5f6267c8b3 resolve: Make visibility resolution more speculative
To avoid potential duplicate diagnostics and separate the error reporting logic
2019-12-09 22:41:47 +03:00
Vadim Petrochenkov
9e6725dcfe resolve: Resolve visibilities on fields with non-builtin attributes 2019-12-09 22:33:23 +03:00
Eric Huss
60d4e20ff0 compiletest: add aux-crate directive 2019-12-09 08:08:27 -08:00
Eric Huss
590dd7dfef Add options to --extern flag. 2019-12-09 08:08:13 -08:00
Oliver Scherer
c1434716c1 Show const_err lint in addition to the hard error 2019-12-09 13:05:41 +01:00
bors
3ff17e7c5f Auto merge of #67016 - lqd:placeholder_loans, r=matthewjasper
In which we implement illegal subset relations errors using Polonius

This PR is the rustc side of implementing subset errors using Polonius. That is, in
```rust
fn foo<'a, 'b>(x: &'a u32, y: &'b u32) -> &'a u32 {
    y
}
```
returning `y` requires that `'b: 'a` but we have no evidence of that, so this is an error. (Evidence that the relation holds could come from explicit bounds, or via implied bounds).

Polonius outputs one such error per CFG point where the free region's placeholder loan unexpectedly flowed into another free region. While all these CFG locations could be useful in diagnostics in the future, rustc does not do that (and the duplication is only partially handled in the rest of the errors/diagnostics infrastructure, e.g. duplicate suggestions will be shown by the "outlives suggestions" or some of the `#[rustc_*]` NLL/MIR debug dumps), so I deduplicated the errors.

(The ordering also matters, otherwise some of the elided lifetime naming would change behaviour).

I've blessed a couple of tests, where the output is currently suboptimal:
- the `hrtb-perfect-forwarding` tests mix subset errors with higher-ranked subtyping, however the plan is for chalk to eventually take care of some of this to generate polonius constraints (i.e. it's not polonius' job). Until that happens, polonius will not see the error that NLL sees.
- some other tests have errors and diagnostics specific to `'static`, I _believe_ this to be because of it being treated as more "special" than in polonius. I believe the output is not wrong, but could be better, and appears elsewhere (I feel we'll need to look at polonius' handling of `'static` at some point in the future, maybe to match a bit more what NLL does when it produces errors)

I'll create a tracking issue in the polonius repo to record these 2 points (and a general "we'll need to go over the blessed output" issue, much like we did for NLLs)

The last blessed test is because it's an improvement: in this case, more errors/suggestions were computed, instead of the existing code path where this case apparently stops at the first error.

The `Naive` variant in Polonius computes those errors, so this PR also switches the default variant to that, as we're also in the process of temporarily deactivating all other variants (which exist mostly for performance considerations) until we have completed more work on completeness and correctness, before focusing on efficiency once again.

While most of the correctness in this PR is hidden in the polonius compare-mode (which of course passes locally), I've added a couple of smoke-tests to the existing ones, so that we have some confidence that it works (and keeps working) until we're in a position where we can run them on CI.

As mentioned during yesterday's wg-polonius meeting, @nikomatsakis has already read through most of this PR (and which is matching  what they thought needed to be done [during the recent Polonius sprint](https://hackmd.io/CGMNjt1hR_qYtsR9hgdGmw#Compiler-notes-on-generating-the-placeholder-loans-support)), but Matthew was hopefully going to review (again, not urgent), so:

r? @matthewjasper

(This updates to the latest `polonius-engine` release, and I'm not sure whether `Cargo.lock` updates can easily be rolled up, but apart from that: this changes little that's tested on CI, so seems safe-ish to rollup ?)
2019-12-09 10:50:41 +00:00
Yuki Okushi
b879ecccd0 Do not ICE on closure 2019-12-09 18:55:38 +09:00
bors
dbbe4f10fa Auto merge of #67004 - estebank:issue-66958, r=eddyb
Do not ICE on async fn with non-Copy infered type arg

Fix #66958.
2019-12-09 05:16:48 +00:00
David Wood
f0b51145c5
async/await: correct diag note for async move
This commit corrects the diagnostic note for `async move {}` so that
`await` is mentioned, rather than `yield`.

Signed-off-by: David Wood <david@davidtw.co>
2019-12-08 16:29:11 +00:00
David Wood
438455d18b
async/await: more improvements to non-send errors
Signed-off-by: David Wood <david@davidtw.co>
2019-12-08 16:29:08 +00:00
Mazdak Farrokhzad
56f830e292
Rollup merge of #66325 - BartMassey:master, r=joshtriplett
Change unused_labels from allow to warn

Fixes #66324, making the unused_labels lint warn instead of allow by default. I'm told @rust-lang/lang will need to review this, and perhaps will want to do a crater run.
2019-12-08 03:39:43 +01:00
Oliver Scherer
df26968bb5 Ensure that we get a hard error on generic ZST constants if their body causes an error during evaluation 2019-12-08 01:55:14 +01:00
bors
de17464b14 Auto merge of #65881 - anp:implicit-caller-location, r=eddyb,oli-obk
Implement #[track_caller] attribute. (RFC 2091 4/N)

Implements the `#[track_caller]` attribute in both const and codegen contexts.

The const implementation walks up the stack to find the nearest untracked callsite.

The codegen implementation adds an implicit argument to tracked function calls, and populates it with either a call to the previously-landed intrinsic or if the caller has `#[track_caller]` with a copy of the location passed to the current function.

Also includes a little cleanup and a few comments in the other caller location areas.

[Depends on: 65664](https://github.com/rust-lang/rust/pull/65664)
[RFC 2091 text](https://github.com/rust-lang/rfcs/blob/master/text/2091-inline-semantic.md)
[Tracking issue](https://github.com/rust-lang/rust/issues/47809)
[Tracking doc](https://paper.dropbox.com/doc/track_rfc_2091_impl-notes--Anf1NwnIb0xcRv31YLIadyj0Ag-rwCdRc2fi2yvRZ7syGZ9q#:uid=863513134494965680023183&h2=TODO-actually-pass-location-to)
2019-12-07 21:14:39 +00:00
bors
5c5c8eb864 Auto merge of #66927 - RalfJung:engines-dont-panic, r=oli-obk
Miri core engine: use throw_ub instead of throw_panic

See https://github.com/rust-lang/rust/issues/66902 for context: panicking is not really an "interpreter error", but just part of a normal Rust execution. This is a first step towards removing the `InterpError::Panic` variant: the core Miri engine does not use it any more.

ConstProp and ConstEval still use it, though. This will be addressed in future PRs.

From what I can tell, all the error messages this removes are actually duplicates.

r? @oli-obk @wesleywiser
2019-12-07 14:46:30 +00:00
Adam Perry
15d1f7cffd Add additional layer of #[track_caller] to test, avoid const prop. 2019-12-06 18:37:54 -08:00
Mazdak Farrokhzad
18a79e0e16
Rollup merge of #67078 - kamleshbhalui:master, r=Centril
accept union inside enum if not followed by identifier

Fixes #66943
2019-12-06 23:27:02 +01:00
Mazdak Farrokhzad
941c4cd56b
Rollup merge of #67052 - Centril:config-1, r=petrochenkov
Ditch `parse_in_attr`

Fixes #66940

r? @petrochenkov
2019-12-06 23:26:59 +01:00
Mazdak Farrokhzad
99fee7896b
Rollup merge of #67009 - Aaron1011:fix/coerce-suggestion, r=Centril
Emit coercion suggestions in more places

Fixes #66910

We have several different kinds of suggestions we can try to make when
type coercion fails. However, we were previously only emitting these
suggestions from `demand_coerce_diag`. This resulted in the compiler
failing to emit applicable suggestions in several different cases, such
as when the implicit return value of a function had the wrong type.

This commit adds a new `emit_coerce_suggestions` method, which tries to
emit a number of related suggestions. This method is called from both
`demand_coerce_diag` and `CoerceMany::coerce_inner`, which covers a much
wider range of cases than before.

We now suggest using `.await` in more cases where it is applicable,
among other improvements.

I'm not happy about disabling the `issue-59756`, but from what I can tell, the suggestion infrastructure in rustc lacks any way of indicating mutually exclusive suggestions (and compiletest lacks a way to only apply a subset of available suggestions).
2019-12-06 23:26:57 +01:00
Mazdak Farrokhzad
2bd35c065c
Rollup merge of #66606 - christianpoveda:mut-refs-in-const-fn, r=oli-obk
Add feature gate for mut refs in const fn

r? @oli-obk
2019-12-06 23:26:54 +01:00
Mazdak Farrokhzad
99191c2e71 parse_meta: ditch parse_in_attr 2019-12-06 21:17:18 +01:00
Mazdak Farrokhzad
cbc9f68312 derive: avoid parse_in_attr 2019-12-06 20:37:59 +01:00
Mazdak Farrokhzad
bbcda98d41 cfg_attr: avoid .outer_tokens 2019-12-06 20:37:59 +01:00
Esteban Küber
7ed9066766 review comments 2019-12-06 10:06:10 -08:00
Esteban Küber
0f306a7db4 Do not ICE on async fn with non-Copy infered type arg
Fix #66958.
2019-12-06 10:06:10 -08:00
Ömer Sinan Ağacan
2404a067ee const-prop: Restrict scalar pair propagation
We now only propagate a scalar pair if the Rvalue is a tuple with two
scalars. This for example avoids propagating a (u8, u8) value when
Rvalue has type `((), u8, u8)` (see the regression test). While this is
a correct thing to do, implementation is tricky and will be done later.

Fixes #66971
Fixes #66339
Fixes #67019
2019-12-06 19:36:34 +03:00
Georg Semmler
9598cf416d
Remove failing test case 2019-12-06 15:09:01 +01:00
Remy Rakic
1314ba323b add subset relations test using polonius
It's a relatively simple smoke-test for subset errors, executed outside
of the polonius compare-mode.
2019-12-06 11:50:02 +01:00