Commit Graph

104148 Commits

Author SHA1 Message Date
Mazdak Farrokhzad
c67c30dba6 refactor parse_ty_tuple_or_parens 2019-12-21 18:34:00 +01:00
Mazdak Farrokhzad
f3ef4a416d extract parse_ty_tuple_or_parens 2019-12-21 18:34:00 +01:00
bors
c64eecf4d0 Auto merge of #66994 - Centril:stmt-polish, r=estebank
refactor expr & stmt parsing + improve recovery

Summary of important changes (best read commit-by-commit, ignoring whitespace changes):

- `AttrVec` is introduces as an alias for `ThinVec<Attribute>`
- `parse_expr_bottom` and `parse_stmt` are thoroughly refactored.
- Extract diagnostics logic for `vec![...]` in a pattern context.
- Recovery is added for `do catch { ... }`
- Recovery is added for `'label: non_block_expr`
- Recovery is added for `var $local`, `auto $local`, and `mut $local`. Fixes #65257.
- Recovery is added for `e1 and e2` and `e1 or e2`.
- ~~`macro_legacy_warnings` is turned into an error (has been a warning for 3 years!)~~
- Fixes #63396 by forward-porting #64105 which now works thanks to added recovery.
- `ui-fulldeps/ast_stmt_expr_attr.rs` is turned into UI and pretty tests.
- Recovery is fixed for `#[attr] if expr {}`

r? @estebank
2019-12-21 11:05:03 +00:00
bors
9ff30a7810 Auto merge of #67464 - Centril:rollup-j3mkl1m, r=Centril
Rollup of 6 pull requests

Successful merges:

 - #67130 (Const prop should finish propagation into user defined variables)
 - #67163 (Split up ptr/mod.rs in libcore...)
 - #67314 (Don't suppress move errors for union fields)
 - #67392 (Fix unresolved type span inside async object)
 - #67404 (Separate region inference logic from error handling better)
 - #67428 (`is_binding_pat`: use explicit match & include or-pats in grammar)

Failed merges:

r? @ghost
2019-12-21 01:02:54 +00:00
Mazdak Farrokhzad
621661f8a6 tweak var/auto/mut recovery 2019-12-20 22:53:40 +01:00
Mazdak Farrokhzad
49826845a9 use .span_suggestion_short for && 2019-12-20 22:53:40 +01:00
Mazdak Farrokhzad
19db2d2fed ast_stmt_expr_attr -> pretty & ui tests 2019-12-20 22:53:40 +01:00
Mazdak Farrokhzad
9b53c5be06 fix bug in parse_tuple_parens_expr + related refactoring 2019-12-20 22:53:40 +01:00
Mazdak Farrokhzad
66470d3217 recover #[attr] if expr {} 2019-12-20 22:53:40 +01:00
Mazdak Farrokhzad
c9e1f13f6e recover on 'mut', 'var', 'auto' 2019-12-20 22:53:40 +01:00
Mazdak Farrokhzad
a0d20935cc introduce 'type AttrVec' 2019-12-20 22:53:40 +01:00
Mazdak Farrokhzad
3d5dbcb44a simplify parse_bottom_expr more 2019-12-20 22:41:29 +01:00
Mazdak Farrokhzad
948ff674f9 use mk_expr_err more 2019-12-20 22:41:29 +01:00
Mazdak Farrokhzad
4311a4d7f9 extract parse_lit_expr and simplify 2019-12-20 22:41:29 +01:00
Mazdak Farrokhzad
e9a4d94c44 extract parse_break_expr 2019-12-20 22:41:29 +01:00
Mazdak Farrokhzad
a3c0ef1a8b refactor parse_incorrect_await_syntax 2019-12-20 22:41:29 +01:00
Mazdak Farrokhzad
2f9b191886 extract parse_{expr_opt, return_expr, yield_expr} 2019-12-20 22:41:29 +01:00
Mazdak Farrokhzad
327641e35c recover on 'do catch { .. }' 2019-12-20 22:41:29 +01:00
Mazdak Farrokhzad
32ac9d0e45 pass attr as param in new methods 2019-12-20 22:41:29 +01:00
Mazdak Farrokhzad
4e01b70964 add recovery to parse_labeled_expr 2019-12-20 22:41:29 +01:00
Mazdak Farrokhzad
3ed5ba7fa8 extract parse_labeled_expr 2019-12-20 22:41:29 +01:00
Mazdak Farrokhzad
5f0f86b6ca extract parse_path_start_expr 2019-12-20 22:41:29 +01:00
Mazdak Farrokhzad
cb985ba60f extract parse_array_or_repeat_expr 2019-12-20 22:41:29 +01:00
Mazdak Farrokhzad
9cb2b08a5d extract parse_tuple_parens_expr 2019-12-20 22:41:29 +01:00
A C
0c32ee1781 Clean up parse_bottom_expr 2019-12-20 22:41:29 +01:00
A C
0b7908c550 Add a UI test for correct parsing 2019-12-20 22:41:29 +01:00
Mazdak Farrokhzad
dd15904a4d parse_bottom_expr: use else if 2019-12-20 22:41:29 +01:00
Mazdak Farrokhzad
52acaa6974 implement recovery in check_assoc_op 2019-12-20 22:41:28 +01:00
Mazdak Farrokhzad
903c9dfd18 extract should_continue_as_assoc_expr 2019-12-20 22:41:28 +01:00
Mazdak Farrokhzad
be463cbc2b extract: error_block_no_opening_brace 2019-12-20 22:41:28 +01:00
Mazdak Farrokhzad
cdca5cfbfd parser: extract error_outer_attrs 2019-12-20 22:41:28 +01:00
Mazdak Farrokhzad
467c86f4cb parse_stmt_without_recovery: readability! 2019-12-20 22:41:28 +01:00
Mazdak Farrokhzad
74d9c4b312 parse_stmt_mac: add a comment 2019-12-20 22:41:28 +01:00
Mazdak Farrokhzad
2ddea30178 extract suggest_slice_pat 2019-12-20 22:41:28 +01:00
Mazdak Farrokhzad
c54c9ef863 parser: early return for item stmt 2019-12-20 22:41:28 +01:00
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
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
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