Commit Graph

104400 Commits

Author SHA1 Message Date
Mazdak Farrokhzad
690815b70e inline parse_stmt_ into parse_stmt 2019-12-20 22:41:28 +01:00
Mazdak Farrokhzad
b75a93afac extract parse_sttmt_mac 2019-12-20 22:41:28 +01:00
Mazdak Farrokhzad
666ff8fd00 reduce repetition in stmt parsing 2019-12-20 22:41:28 +01:00
Mazdak Farrokhzad
6d7c6d7384 into: simplify AddressOf logic after rebase 2019-12-20 22:39:20 +01:00
Mazdak Farrokhzad
a7641f1fcc address review comments 2019-12-20 22:22:44 +01:00
Mazdak Farrokhzad
a7aec3f207 1. ast::Mutability::{Mutable -> Mut, Immutable -> Not}.
2. mir::Mutability -> ast::Mutability.
2019-12-20 22:22:44 +01:00
Mazdak Farrokhzad
f465f95b4b
Rollup merge of #67428 - Centril:ibp-explicit-match, r=matthewjasper
`is_binding_pat`: use explicit match & include or-pats in grammar

r? @matthewjasper @nikomatsakis
2019-12-20 22:05:36 +01:00
Mazdak Farrokhzad
eaee9d11ee
Rollup merge of #67404 - mark-i-m:split-1, r=matthewjasper
Separate region inference logic from error handling better

Split out from #67241

r? @matthewjasper
2019-12-20 22:05:35 +01:00
Mazdak Farrokhzad
d7dc3502f9
Rollup merge of #67392 - csmoe:async-typeinfo, r=estebank
Fix unresolved type span inside async object

Closes #65180
r? @estebank
It's hard to create a minimal repro for that issue, [decided](https://rust-lang.zulipchat.com/#narrow/stream/187312-wg-async-foundations/topic/meeting.202019.2E12.2E17/near/183675659) to give up finding mcve.
cc [previous take](https://github.com/rust-lang/rust/pull/65668)
2019-12-20 22:05:33 +01:00
Mazdak Farrokhzad
86282d0b0f
Rollup merge of #67314 - matthewjasper:union-move-errors, r=nikomatsakis
Don't suppress move errors for union fields

closes #66500
2019-12-20 22:05:31 +01:00
Mazdak Farrokhzad
e613f9238f
Rollup merge of #67163 - TheSamsa:split-up-ptr-mod, r=Mark-Simulacrum
Split up ptr/mod.rs in libcore...

...one with implementation detail for const ptr and the other with mut ptr

I am not sure if the "stable since 1.0.0" flags are the correct choice for the two additional mods.
Also, is it necessary for them to be "pub"? If so, there should be a good description for them.

Closes #66891
2019-12-20 22:05:30 +01:00
Mazdak Farrokhzad
364ecf50cb
Rollup merge of #67130 - wesleywiser:const_prop_into_locals, r=oli-obk
Const prop should finish propagation into user defined variables

Fixes #66638

~~Temporarily rebased on top of #67015 to get those fixes.~~

r? @oli-obk
2019-12-20 22:05:28 +01:00
bors
ccd238309f Auto merge of #67020 - pnkfelix:issue-59535-accumulate-past-lto-imports, r=mw
save LTO import info and check it when trying to reuse build products

Fix #59535

Previous runs of LTO optimization on the previous incremental build can import larger portions of the dependence graph into a codegen unit than the current compilation run is choosing to import. We need to take that into account when we choose to reuse PostLTO-optimization object files from previous compiler invocations.

This PR accomplishes that by serializing the LTO import information on each incremental build. We load up the previous LTO import data as well as the current LTO import data. Then as we decide whether to reuse previous PostLTO objects or redo LTO optimization, we check whether the LTO import data matches. After we finish with this decision process for every object, we write the LTO import data back to disk.

----

What is the scenario where comparing against past LTO import information is necessary?

I've tried to capture it in the comments in the regression test, but here's yet another attempt from me to summarize the situation:

 1. Consider a call-graph like `[A] -> [B -> D] <- [C]` (where the letters are functions and the modules are enclosed in `[]`)
 2. In our specific instance, the earlier compilations were inlining the call to`B` into `A`; thus `A` ended up with a external reference to the symbol `D` in its object code, to be resolved at subsequent link time. The LTO import information provided by LLVM for those runs reflected that information: it explicitly says during those runs, `B` definition and `D` declaration were imported into `[A]`.
 3. The change between incremental builds was that the call `D <- C` was removed.
 4. That change, coupled with other decisions within `rustc`, made the compiler decide to make `D` an internal symbol (since it was no longer accessed from other codegen units, this makes sense locally). And then the definition of `D` was inlined into `B` and `D` itself was eliminated entirely.
  5. The current LTO import information reported that `B` alone is imported into `[A]` for the *current compilation*. So when the Rust compiler surveyed the dependence graph, it determined that nothing `[A]` imports changed since the last build (and `[A]` itself has not changed either), so it chooses to reuse the object code generated during the previous compilation.
  6. But that previous object code has an unresolved reference to `D`, and that causes a link time failure!

----

The interesting thing is that its quite hard to actually observe the above scenario arising, which is probably why no one has noticed this bug in the year or so since incremental LTO support landed (PR #53673).

I've literally spent days trying to observe the bug on my local machine, but haven't managed to find the magic combination of factors to get LLVM and `rustc` to do just the right set of the inlining and `internal`-reclassification choices that cause this particular problem to arise.

----

Also, I have tried to be careful about injecting new bugs with this PR. Specifically, I was/am worried that we could get into a scenario where overwriting the current LTO import data with past LTO import data would cause us to "forget" a current import. ~~To guard against this, the PR as currently written always asserts, at overwrite time, that the past LTO import-set is a *superset* of the current LTO import-set. This way, the overwriting process should always be safe to run.~~
 * The previous note was written based on the first version of this PR. It has since been revised to use a simpler strategy, where we never attempt to merge the past LTO import information into the current one. We just *compare* them, and act accordingly.
 * Also, as you can see from the comments on the PR itself, I was quite right to be worried about forgetting past imports; that scenario was observable via a trivial transformation of the regression test I had devised.
2019-12-20 20:56:09 +00:00
Who? Me?!
90ef197a6e
Better comment
Co-Authored-By: matthewjasper <mjjasper1@gmail.com>
2019-12-20 14:49:32 -06:00
Dodo
382d370c4f Make ptr::slice_from_raw_parts a const fn available under a feature flag 2019-12-20 21:42:03 +01:00
Matthew Jasper
0a5c91c129 Generate correct Deref predicate 2019-12-20 20:14:11 +00:00
Matthew Jasper
cd3ead19dd Use delay_span_bug less often 2019-12-20 20:14:11 +00:00
Matthew Jasper
6394032279 Correctly lower bounds on GATs 2019-12-20 20:14:11 +00:00
Matthew Jasper
4b164f681d Correctly lower paths to generic associated types 2019-12-20 20:14:11 +00:00
Matthew Jasper
c5028f686d Resolve names in the generics of impl associated types 2019-12-20 20:14:11 +00:00
Matthew Jasper
db6d0b1638 Check associated type implementations for generic mismatches 2019-12-20 20:10:07 +00:00
bors
01a46509a4 Auto merge of #67455 - Centril:rollup-mf0yc81, r=Centril
Rollup of 5 pull requests

Successful merges:

 - #64588 (Add a raw "address of" operator)
 - #67031 (Update tokio crates to latest versions)
 - #67131 (Merge `TraitItem` & `ImplItem into `AssocItem`)
 - #67354 (Fix pointing at arg when cause is outside of call)
 - #67363 (Fix handling of wasm import modules and names)

Failed merges:

r? @ghost
2019-12-20 16:24:12 +00:00
Mazdak Farrokhzad
43d1532cd7
Rollup merge of #67363 - alexcrichton:wasm-import-modules, r=eddyb
Fix handling of wasm import modules and names

The WebAssembly targets of rustc have weird issues around name mangling
and import the same name from different modules. This all largely stems
from the fact that we're using literal symbol names in LLVM IR to
represent what a function is called when it's imported, and we're not
using the wasm-specific `wasm-import-name` attribute. This in turn leads
to two issues:

* If, in the same codegen unit, the same FFI symbol is referenced twice
  then rustc, when translating to LLVM IR, will only reference one
  symbol from the first wasm module referenced.

* There's also a bug in LLD [1] where even if two codegen units
  reference different modules, having the same symbol names means that
  LLD coalesces the symbols and only refers to one wasm module.

Put another way, all our imported wasm symbols from the environment are
keyed off their LLVM IR symbol name, which has lots of collisions today.
This commit fixes the issue by implementing two changes:

1. All wasm symbols with `#[link(wasm_import_module = "...")]` are
   mangled by default in LLVM IR. This means they're all given unique names.

2. Symbols then use the `wasm-import-name` attribute to ensure that the
   WebAssembly file uses the correct import name.

When put together this should ensure we don't trip over the LLD bug [1]
and we also codegen IR correctly always referencing the right symbols
with the right import module/name pairs.

Closes #50021
Closes #56309
Closes #63562

[1]: https://bugs.llvm.org/show_bug.cgi?id=44316
2019-12-20 17:22:22 +01:00
Mazdak Farrokhzad
5a8083c665
Rollup merge of #67354 - VirrageS:blame-wrong-line, r=estebank
Fix pointing at arg when cause is outside of call

Follow up after: #66933

Closes: #66923

r? @estebank
2019-12-20 17:22:21 +01:00
Mazdak Farrokhzad
ec82174fad
Rollup merge of #67131 - Centril:item-merge, r=petrochenkov
Merge `TraitItem` & `ImplItem into `AssocItem`

In this PR we:

- Merge `{Trait,Impl}Item{Kind?}` into `AssocItem{Kind?}` as discussed in https://github.com/rust-lang/rust/issues/65041#issuecomment-538105286.

   - This is done by using the cover grammar of both forms.

   - In particular, it requires that we syntactically allow (under `#[cfg(FALSE)]`):

      - `default`ness on `trait` items,

      - `impl` items without a body / definition (`const`, `type`, and `fn`),

      - and associated `type`s in `impl`s with bounds, e.g., `type Foo: Ord;`.

   - The syntactic restrictions are replaced by semantic ones in `ast_validation`.

- Move syntactic restrictions around C-variadic parameters from the parser into `ast_validation`:

    - `fn`s in all contexts now syntactically allow `...`,

    - `...` can occur anywhere in the list syntactically (`fn foo(..., x: usize) {}`),

    - and `...` can be the sole parameter (`fn foo(...) {}`.

r? @petrochenkov
2019-12-20 17:22:19 +01:00
Mazdak Farrokhzad
ba1a488251
Rollup merge of #67031 - mati865:tokio-update, r=nikomatsakis
Update tokio crates to latest versions

Drops few old crates from the workspace (they are only used during tests, not in Rust itself) and allows to remove even more crates during next `rustc-ap-*` update.
2019-12-20 17:22:17 +01:00
Mazdak Farrokhzad
ef01330887
Rollup merge of #64588 - matthewjasper:mir-address-of, r=oli-obk
Add a raw "address of" operator

* Parse and feature gate `&raw [const | mut] expr` (feature gate name is `raw_address_of`)
* Add `mir::Rvalue::AddressOf`
* Use the new `Rvalue` for:
    * the new syntax
    * reference to pointer casts
    * drop shims for slices and arrays
* Stop using `mir::Rvalue::Cast` with a reference as the operand
* Correctly evaluate `mir::Rvalue::{Ref, AddressOf}` in constant propagation

cc @Centril @RalfJung @oli-obk @eddyb
cc #64490
2019-12-20 17:22:16 +01:00
Michael Woerister
1ca145c3b5 Remove rarely used -Zdisable_instrumentation_preinliner flag.
The same effect can be achieved by `-Cllvm-args=-disable-preinline`.
2019-12-20 17:08:46 +01:00
Michael Woerister
963f20db1a Allow -Cllvm-args to override rustc's default LLVM args. 2019-12-20 15:57:51 +01:00
Dylan DPC
dce0f06f95
Update E0121.md 2019-12-20 17:02:39 +05:30
Dylan DPC
7f0741db9e
Update E0120.md 2019-12-20 16:50:20 +05:30
bors
6b561b4917 Auto merge of #67449 - Centril:rollup-04hvg57, r=Centril
Rollup of 7 pull requests

Successful merges:

 - #66755 (Remove a const-if-hack in RawVec)
 - #67127 (Use structured suggestion for disambiguating method calls)
 - #67219 (Fix up Command Debug output when arg0 is specified.)
 - #67285 (Indicate origin of where type parameter for uninferred types )
 - #67328 (Remove now-redundant range check on u128 -> f32 casts)
 - #67367 (Move command line option definitions into a dedicated file)
 - #67442 (Remove `SOCK_CLOEXEC` dummy variable on platforms that don't use it.)

Failed merges:

r? @ghost
2019-12-20 11:17:47 +00:00
Mazdak Farrokhzad
3a336c48c3
Rollup merge of #67442 - reitermarkus:dummy-variable, r=kennytm
Remove `SOCK_CLOEXEC` dummy variable on platforms that don't use it.
2019-12-20 12:17:27 +01:00
Mazdak Farrokhzad
9f39cb1d8e
Rollup merge of #67367 - 0dvictor:options, r=Centril
Move command line option definitions into a dedicated file

config.rs has reached the 3000 line tidy limit, this commit moves command line option definitions into a new file - options.rs,  and leaves the rest of configuration infrastructure in config.rs.
2019-12-20 12:17:26 +01:00
Mazdak Farrokhzad
efd31c23e8
Rollup merge of #67328 - rkruppe:simplify-u128-f32-cast, r=matthewjasper
Remove now-redundant range check on u128 -> f32 casts

This code was added to avoid UB in LLVM 6 and earlier, but we no longer support those LLVM versions.
Since https://reviews.llvm.org/D47807 (released in LLVM 7), uitofp does exactly what we need.

Closes #51872
2019-12-20 12:17:25 +01:00
Mazdak Farrokhzad
403bb097fc
Rollup merge of #67285 - ohadravid:indicate-origin-of-where-type-parameter, r=estebank
Indicate origin of where type parameter for uninferred types

Based on #65951 (which is not merge yet), fixes #67277.

This PR improves a little the diagnostic for code like:

```
 async fn foo() {
     bar().await;
}

 async fn bar<T>() -> () {}
```

by showing:
```
error[E0698]: type inside `async fn` body must be known in this context
 --> unresolved_type_param.rs:9:5
  |
9 |     bar().await;
  |     ^^^ cannot infer type for type parameter `T` declared on the function `bar`
  |
...
```
(The
```
declared on the function `bar`
```
part is new)

A small side note: `Vec` and `slice` seem to resist this change, because querying `item_name()` panics, and `get_opt_name()` returns `None`.

r? @estebank
2019-12-20 12:17:23 +01:00
Mazdak Farrokhzad
b779cbbe68
Rollup merge of #67219 - jsgf:command-argv0-debug, r=joshtriplett
Fix up Command Debug output when arg0 is specified.

PR https://github.com/rust-lang/rust/pull/66512 added the ability to set argv[0] on
Command. As a side effect, it changed the Debug output to print both the program and
argv[0], which in practice results in stuttery output (`"echo" "echo" "foo"`).

This PR reverts the behaviour to the the old one, so that the command is only printed
once - unless arg0 has been set. In that case it emits `"[command]" "arg0" "arg1" ...`.
2019-12-20 12:17:22 +01:00
Mazdak Farrokhzad
f0eb4b4752
Rollup merge of #67127 - estebank:disambiguate-suggestion, r=varkor
Use structured suggestion for disambiguating method calls

Fix #65635.
2019-12-20 12:17:20 +01:00
Mazdak Farrokhzad
57da9d3269
Rollup merge of #66755 - mark-i-m:const-vec-new, r=ecstatic-morse
Remove a const-if-hack in RawVec

r? @ecstatic-morse

cc @Centril
2019-12-20 12:17:18 +01:00
Mazdak Farrokhzad
7353ff20d6 SliceKind::VarLen: make doc-comment render correctly.
(The backticks were rendering badly in VSCode.)
2019-12-20 11:54:27 +01:00
Victor Ding
83fc600a28 Move command line option definitions into a dedicated file
config.rs has reached the 3000 line tidy limit, this commit moves
command line option definitions into a new file - options.rs,  and
leaves the rest of configuration infrastructure in config.rs.
2019-12-20 18:14:35 +11:00
Felix S. Klock II
42b00a4681 General purpose teest cases contributed by mw. 2019-12-20 04:47:28 +01:00
Felix S. Klock II
5763627ccd save LTO import information and check it when trying to reuse build products.
adopts simple strategy devised with assistance from mw: Instead of accumulating
(and acting upon) LTO import information over an unbounded number of prior
compilations, just see if the current import set matches the previous import set.
if they don't match, then you cannot reuse the PostLTO build product for that
module.

In either case (of a match or a non-match), we can (and must) unconditionally
emit the current import set as the recorded information in the incremental
compilation cache, ready to be loaded during the next compiler run for use in
the same check described above.

resolves issue 59535.
2019-12-20 04:47:28 +01:00
bors
696735f71b Auto merge of #67443 - Mark-Simulacrum:toolstate-no-commit-newline, r=Mark-Simulacrum
Remove newline from commit in toolstate
2019-12-20 03:33:07 +00:00
Mark Rousskov
1d9a1799e8 Remove newline from commit in toolstate 2019-12-19 22:32:07 -05:00
Markus Reiter
b82671112c Remove SOCK_CLOEXEC dummy variable on platforms that don't use it. 2019-12-20 04:27:28 +01:00
bors
19b3813b5e Auto merge of #67440 - Mark-Simulacrum:rollup-z59a7ky, r=Mark-Simulacrum
Rollup of 6 pull requests

Successful merges:

 - #67253 (Add more delegations to the fmt docs and add doctests)
 - #67281 (add string.insert benchmarks)
 - #67351 (Set release channel on non-dist builders)
 - #67421 (Fix internal documentation typo)
 - #67432 (Fix toolstate history format)
 - #67436 (Correct the todo! stabilization version)

Failed merges:

r? @ghost
2019-12-19 23:02:09 +00:00
Mark Rousskov
5f64777e63
Rollup merge of #67436 - NieDzejkob:todo-stabilization-fix, r=alexcrichton
Correct the todo! stabilization version

None
2019-12-19 17:53:58 -05:00
Mark Rousskov
8f20e67501
Rollup merge of #67432 - Mark-Simulacrum:fix-toolstate, r=Centril
Fix toolstate history format

We were inserting *before* the existing newline, so we should prepend it
not append it to our inserted string.
2019-12-19 17:53:57 -05:00
Mark Rousskov
ac80d59e97
Rollup merge of #67421 - LeSeulArtichaut:patch-1, r=Centril
Fix internal documentation typo

r? @Centril
2019-12-19 17:53:56 -05:00