Commit graph

30568 commits

Author SHA1 Message Date
Dylan DPC
4422cb73b6
Rollup merge of #71937 - mzohreva:mz/ui-tests-ignore-sgx, r=nikomatsakis
Ignore SGX on a few ui tests

cc @jethrogb
2020-05-06 16:59:02 +02:00
Dylan DPC
14d608f1d8
Rollup merge of #71269 - Mark-Simulacrum:sat-float-casts, r=nikic
Define UB in float-to-int casts to saturate

This closes #10184 by defining the behavior there to saturate infinities and values exceeding the integral range (on the lower or upper end). `NaN` is sent to zero.
2020-05-06 16:58:50 +02:00
Mark Rousskov
d4f31b4687 Fixup tests to test both const-eval and runtime 2020-05-06 08:14:21 -04:00
Mark Rousskov
0dbce10bcd Pull in miri test cases 2020-05-06 08:14:21 -04:00
Mark Rousskov
9907ad6ed9 Define UB in float-to-int casts to saturate
- Round to zero, and representable values cast directly.
- `NaN` goes to 0
- Values beyond the limits of the type are saturated to the "nearest value"
  (essentially rounding to zero, in some sense) in the integral type, so e.g.
  `f32::INFINITY` would go to `{u,i}N::MAX.`
2020-05-06 08:14:21 -04:00
Ralf Jung
0e2a712743 more precise vtable errors 2020-05-06 13:46:01 +02:00
Dylan DPC
3f56b84182
Rollup merge of #71727 - hbina:simplified_usage, r=Mark-Simulacrum
SipHasher with keys initialized to 0 should just use new()

I believe that is what the `new()` is for, for good reasons.
2020-05-06 13:22:13 +02:00
mibac138
b6d5d1fb79 Dead-code pass highlights too much of impl functions 2020-05-06 11:26:30 +02:00
csmoe
d2e5a8e2e9 bless issue-70818 test case 2020-05-06 17:03:15 +08:00
Ralf Jung
19bd72e623 convert remaining try_validation to new macro 2020-05-06 09:22:52 +02:00
Yuki Okushi
e69748ba4f
Move tests from test/run-fail to UI 2020-05-06 14:02:55 +09:00
Esteban Küber
3cf556939e Detect errors caused by async block in 2015 edition 2020-05-05 19:35:20 -07:00
Mohsen Zohrevandi
7db74beaec Ignore SGX on a few ui tests 2020-05-05 19:19:39 -07:00
mibac138
4b7a92838c Fix unused_parens nested binary op false positive 2020-05-06 01:50:55 +02:00
Ralf Jung
aa2eaca443 add test for insufficiently aligned vtable 2020-05-06 00:13:41 +02:00
Guillaume Gomez
4ade6eb2a2 Add test for new implementations section title 2020-05-05 22:56:23 +02:00
Guillaume Gomez
cf184823d1 Update tests 2020-05-05 22:56:23 +02:00
csmoe
a5d103ff90 record upvar into GeneratorInteriorTypeCause 2020-05-05 23:35:45 +08:00
Michael
717a7a8486
Update src/test/ui/lint/issue-71290-unused-paren-binop.rs
Co-authored-by: Bastian Kauschke <bastian_kauschke@hotmail.de>
2020-05-05 16:58:13 +02:00
Dylan DPC
67a7b7a329
Rollup merge of #71894 - mibac138:semicolon-not-always-helpful, r=estebank
Suggest removing semicolon in last expression only if it's type is known

Fixes #67971

Is there a syntax for explicitly checking if a note doesn't exist in test output? Something like `//~ !NOTE ...`

I believe r? @estebank deals with diagnostics.
2020-05-05 12:55:11 +02:00
Dylan DPC
12fc1e0fa5
Rollup merge of #69984 - lenary:lenary/force-uwtables, r=hanna-kruppe
Add Option to Force Unwind Tables

When panic != unwind, `nounwind` is added to all functions for a target.
This can cause issues when a panic happens with RUST_BACKTRACE=1, as
there needs to be a way to reconstruct the backtrace. There are three
possible sources of this information: forcing frame pointers (for which
an option exists already), debug info (for which an option exists), or
unwind tables.

Especially for embedded devices, forcing frame pointers can have code
size overheads (RISC-V sees ~10% overheads, ARM sees ~2-3% overheads).
In production code, it can be the case that debug info is not kept, so it is useful
to provide this third option, unwind tables, that users can use to
reconstruct the call stack. Reconstructing this stack is harder than
with frame pointers, but it is still possible.

---

This came up in discussion on #69890, and turned out to be a fairly simple addition.

r? @hanna-kruppe
2020-05-05 12:55:08 +02:00
LG3696
707cfd1672
Fix the numbering of the tests 2020-05-05 10:08:02 +02:00
bors
de27cd7649 Auto merge of #71846 - petrochenkov:fresh2, r=davidtwco
resolve: Relax fresh binding disambiguation slightly to fix regression

Fixes https://github.com/rust-lang/rust/issues/71765
2020-05-05 06:01:08 +00:00
mibac138
3471bc8306 Fix unused_parens false positive when using binary operations 2020-05-05 02:21:50 +02:00
mibac138
ca72352e60 Suggest removing semicolon in last expression only if it's type is known 2020-05-05 02:08:26 +02:00
Dylan DPC
ad74ce9d04
Rollup merge of #71902 - mibac138:const-feature-diag, r=varkor
Suggest to add missing feature when using gated const features

Fixes #71797
2020-05-05 01:49:51 +02:00
Dylan DPC
04776b15a7
Rollup merge of #71711 - Mark-Simulacrum:deignore-tests, r=nikomatsakis
Updates to some ignored tests

This removes or fixes some ignored test cases.

cc #13745
2020-05-05 01:49:37 +02:00
Dylan DPC
4bde46e0e3
Rollup merge of #71587 - matthewjasper:promoted-move-errors, r=nikomatsakis
Report cannot move errors in promoted MIR

Closes #70934
2020-05-05 01:49:32 +02:00
mibac138
73867365a8 Suggest to add missing feature when using gated const features 2020-05-04 23:47:00 +02:00
Esteban Küber
c93c660b0d review comments and rebase fix 2020-05-04 09:53:15 -07:00
Esteban Küber
d8d02f8f18 On incorrect equality constraint likely to be assoc type, suggest appropriate syntax
When encountering `where <A as Foo>::Bar = B`, it is possible that `Bar`
is an associated type. If so, suggest `where A: Foo<Bar = B>`.

CC #20041.
2020-05-04 09:53:15 -07:00
Esteban Küber
1473a66318 Suggest restricting type param when it doesn't satisfy projection
When encountering a projection that isn't satisfied by a type parameter,
suggest constraining the type parameter.
2020-05-04 09:53:15 -07:00
Esteban Küber
75f066dc68 Handle binop on unbound type param
When encountering a binary operation involving a type parameter that has
no bindings, suggest adding the appropriate bound.
2020-05-04 09:52:40 -07:00
Tobias Rapp
f99344ace4 Stabilize saturating_abs and saturating_neg
Stabilizes the following signed integer functions with saturation
mechanics:
 * saturating_abs()
 * saturating_neg()

Closes #59983
2020-05-04 17:32:27 +02:00
Dylan DPC
3f38b99a63
Rollup merge of #71810 - estebank:issue-71798, r=davidtwco
Do not try to find binop method on RHS `TyErr`

Fix #71798.
2020-05-04 16:15:37 +02:00
Dylan DPC
d47ec16582
Rollup merge of #71697 - felix91gr:new_prop_into_fn_call, r=wesleywiser
Added MIR constant propagation of Scalars into function call arguments

Now for the function call arguments!

Caveats:
1. It's only being enabled at `mir-opt-2` or higher, because currently codegen gives performance regressions with this optimization.
2. Only propagates Scalars. Tuples and references (references are `Indirect`, right??) are not being propagated into as of this PR.
3. Maybe more tests would be nice?
4. I need (shamefully) to ask @wesleywiser to write in his words (or explain to me, and then I can write it down) why we want to ignore propagation into `ScalarPairs` and `Indirect` arguments.

r? @wesleywiser
2020-05-04 16:15:28 +02:00
Dylan DPC
679431f741
Rollup merge of #71038 - lcnr:dyn_trait_structural_match, r=pnkfelix
forbid `dyn Trait` in patterns

Do not allow `&dyn Trait` as a generic const parameters.
This also changes dyn trait in pattern from ICE to error.

closes #63322
closes #70972

r? @eddyb
2020-05-04 16:15:24 +02:00
Sam Elliott
cda994633e Add Option to Force Unwind Tables
When panic != unwind, `nounwind` is added to all functions for a target.
This can cause issues when a panic happens with RUST_BACKTRACE=1, as
there needs to be a way to reconstruct the backtrace. There are three
possible sources of this information: forcing frame pointers (for which
an option exists already), debug info (for which an option exists), or
unwind tables.

Especially for embedded devices, forcing frame pointers can have code
size overheads (RISC-V sees ~10% overheads, ARM sees ~2-3% overheads).
In code, it can be the case that debug info is not kept, so it is useful
to provide this third option, unwind tables, that users can use to
reconstruct the call stack. Reconstructing this stack is harder than
with frame pointers, but it is still possible.

This commit adds a compiler option which allows a user to force the
addition of unwind tables. Unwind tables cannot be disabled on targets
that require them for correctness, or when using `-C panic=unwind`.
2020-05-04 12:08:35 +01:00
bors
6318d24ad8 Auto merge of #71751 - oli-obk:const_ice, r=RalfJung
Move recursion check for zsts back to read site instead of access check site

Reverts https://github.com/rust-lang/rust/pull/71140#discussion_r413709446

Fix #71612
Fix #71709

r? @RalfJung
2020-05-04 09:39:53 +00:00
csmoe
e07f63e79a add testcase for issue-70818 2020-05-04 17:32:03 +08:00
bors
d6823ba166 Auto merge of #71108 - estebank:suggest-proj-type-mismatch-constraint, r=oli-obk
On type mismatch involving associated type, suggest constraint

When an associated type is found when a specific type was expected, if
possible provide a structured suggestion constraining the associated
type in a bound.

```
error[E0271]: type mismatch resolving `<T as Foo>::Y == i32`
  --> $DIR/associated-types-multiple-types-one-trait.rs:13:5
   |
LL |     want_y(t);
   |     ^^^^^^ expected `i32`, found associated type
...
LL | fn want_y<T:Foo<Y=i32>>(t: &T) { }
   |                 ----- required by this bound in `want_y`
   |
   = note:         expected type `i32`
           found associated type `<T as Foo>::Y`
help: consider constraining the associated type `<T as Foo>::Y` to `i32`
   |
LL | fn have_x_want_y<T:Foo<X=u32, Y = i32>>(t: &T)
   |                             ^^^^^^^^^
```

```
error[E0308]: mismatched types
  --> $DIR/trait-with-missing-associated-type-restriction.rs:12:9
   |
LL |     qux(x.func())
   |         ^^^^^^^^ expected `usize`, found associated type
   |
   = note:         expected type `usize`
           found associated type `<impl Trait as Trait>::A`
help: consider constraining the associated type `<impl Trait as Trait>::A` to `usize`
   |
LL | fn foo(x: impl Trait<A = usize>) {
   |                     ^^^^^^^^^^
```

Fix #71035. Related to #70908.
2020-05-04 06:32:49 +00:00
bors
ff4df04799 Auto merge of #71866 - Dylan-DPC:rollup-g9xqc8k, r=Dylan-DPC
Rollup of 4 pull requests

Successful merges:

 - #71645 (Direct contributors to try stage 0 rustdoc first)
 - #71801 (Correctly check comparison operator in MIR typeck)
 - #71844 (List Clippy as a subtree, instead of a submodule)
 - #71864 (Update link in contributing.md)

Failed merges:

r? @ghost
2020-05-04 01:48:07 +00:00
Dylan DPC
911bf89468
Rollup merge of #71801 - matthewjasper:operator-subtyping, r=varkor
Correctly check comparison operator in MIR typeck

The subtyping for comparisons between pointers was reversed in MIR typeck.
There also wasn't a check that comparisons between numeric types had matching types.
2020-05-04 03:14:57 +02:00
bors
a0c61a9044 Auto merge of #71631 - RalfJung:miri-unleash-the-gates, r=oli-obk
Miri: unleash all feature gates

IMO it is silly to unleash features that do not even have a feature gate yet, but not unleash features that do. The only thing this achieves is making unleashed mode annoying to use as we have to figure out the feature flags to enable (and not always do the error messages say what that flag is).

Given that the point of `-Z unleash-the-miri-inside-of-you` is to debug the Miri internals, I see no good reason for this extra hurdle. I cannot imagine a situation where we'd use that flag, realize the program also requires some feature gate, and then be like "oh I guess if this feature is unstable I will do something else". Instead, we'll always just add that flag to the code as well, so requiring the flag achieves nothing.

r? @oli-obk @ecstatic-morse
Fixes https://github.com/rust-lang/rust/issues/71630
2020-05-03 22:54:55 +00:00
Esteban Küber
de3b4d4dae fix rebase 2020-05-03 14:23:20 -07:00
bors
65b448273d Auto merge of #71006 - ecstatic-morse:dataflow-bidi, r=ecstatic-morse
Use existing framework for backward dataflow analyses

This PR adds support for backward analyses to the dataflow framework and adds a new live variable analysis (based on the existing one in `librustc_mir/util/liveness.rs`). By adding these to the framework instead of having a separate API, all newly implemented backward dataflow analyses get cursors/visitors, `rustc_peek` tests, and graphviz visualizations for free. In the near-term, this makes it much easier to implement global dead-store elimination, and I believe that this will enable even more MIR optimizations in the future.

This PR makes many changes to the dataflow API, since some concepts and terminology only make sense in forward dataflow. Below is a list of the important changes.
- ~~`entry_set` -> `fixpoint` (the fixpoint for backward dataflow problems is after the block's terminator)~~
- `seek_{before,after}` -> `seek_{before,after}_primary_effect` (the unprefixed dataflow effect is now referred to as the "primary" effect instead of the "after" effect. The "before" effect remains the same, although I considered changing it to the "antecedent" effect. In both backward and forward dataflow, the "before" effect is applied prior to the "primary" effect. I feel very strongly that this is the correct choice, as it means consumers don't have to switch between `seek_before` and `seek_after` based on the direction of their analysis.
- `seek_after_assume_call_returns` is now gone. Users can use `ResultsCursor::apply_custom_effect` to emulate it.
- `visit_{statement,terminator}_exit` -> `visit_{statement,terminator}_after_primary_effect`
- `visit_{statement,terminator}` -> `visit_{statement,terminator}_before_primary_effect`

Implementing this also required refactoring the dataflow cursor implementation so it could work in both directions. This is a large percentage of the diff, since the cursor code is rather complex. The fact that the cursor is exhaustively tested in both directions should reassure whomever is unlucky enough to review this 🤣.

In order to avoid computing the reverse CFG for forward dataflow analyses, I've added some hacks to the existing `mir::BodyAndCache` interface. I've requested changes to this interface that would let me implement this more efficiently.

r? @eddyb (feel free to reassign)
cc @rust-lang/wg-mir-opt
2020-05-03 19:46:17 +00:00
Dylan MacKenzie
c530b2d8ef Add rustc_peek test for liveness with borrows 2020-05-03 11:36:11 -07:00
Dylan DPC
ce1dba9918
Rollup merge of #71808 - unexge:long-err-expl-for-e0539, r=GuillaumeGomez
Add long error explanation for E0539

since this error is similar to [E0551](https://github.com/rust-lang/rust/blob/master/src/librustc_error_codes/error_codes/E0551.md) most of the content was copied from it. part of #61137.
2020-05-03 18:34:50 +02:00
Dylan DPC
44e678bf9e
Rollup merge of #71726 - ldm0:ref2ptr, r=oli-obk
Suggest deref when coercing `ty::Ref` to `ty::RawPtr` with arbitrary mutability

Fixes #71676
1. Implement dereference suggestion when coercing `ty::Ref` to `ty::RawPtr` with arbitrary mutability.
2. Extract the dereference steps into `deref_steps()`, which removes all the `use` and `pub` noise introduced by last PR #71540, and makes the code more readable.
3. Use the `remove_prefix()` closure which makes the prefix removal more readable.
4. Introduce `Applicability` as a return value of `check_ref` to suggest `Applicability::Unspecified` suggestion.

**Special**: I found it is not possible to genereate `Applicability::MachineApplicable` suggestion for situation like this:
```rust
use std::ops::Deref;
use std::ops::DerefMut;
struct Bar(u8);
struct Foo(Bar);
struct Emm(Foo);
impl Deref for Bar{
    type Target = u8;
    fn deref(&self) -> &Self::Target {
        &self.0
    }
}
impl Deref for Foo {
    type Target = Bar;
    fn deref(&self) -> &Self::Target {
        &self.0
    }
}
impl Deref for Emm {
    type Target = Foo;
    fn deref(&self) -> &Self::Target {
        &self.0
    }
}
impl DerefMut for Bar{
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.0
    }
}
impl DerefMut for Foo {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.0
    }
}
impl DerefMut for Emm {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.0
    }
}
fn main() {
    let a = Emm(Foo(Bar(0)));
    let _: *mut u8 = &a; //~ ERROR mismatched types
}
```
We may suggest `&mut ***a` here, but the `a` is not declared as mutable variable. And also when processing HIR, it's not possible to check if `a` is declared as a mutable variable (currently we do borrow checking with MIR). So we cannot ensure that suggestion when coercing immutable reference to mutable pointer is always machine applicable. Therefore I added a `Applicability` return value in `check_ref()`. And move the `immutable reference -> mutable pointer` situation into a sperate test file without `run-rustfix`. (It seems that `run-rustfix` will also adopt `Applicability::Unspecified` suggestion, which is strange)
2020-05-03 18:34:46 +02:00
Dylan DPC
5b1729030a
Rollup merge of #71663 - jumbatm:caller-handles-validation-error, r=RalfJung
Fix exceeding bitshifts not emitting for assoc. consts (properly this time, I swear!)

Fixes #69021 and fixes #71353.

As described in https://github.com/rust-lang/rust/issues/71353#issuecomment-617901923, this PR:

- adds a variant of `try_validation!` called `try_validation_pat!` that allows specific failures to be turned into validation failures (but returns the rest, unchanged), and
- allows `InvalidProgram` to be returned out of validation

r? @RalfJung
2020-05-03 18:34:41 +02:00