Commit graph

9793 commits

Author SHA1 Message Date
Dylan DPC
678954000a
Rollup merge of #72008 - lcnr:patch-3, r=varkor
Add const-generics test

Taken from #71973 as this apparently already compiles.

r? @varkor
2020-05-08 14:11:52 +02:00
Bastian Kauschke
4fd70e4ed9
add const-generics test 2020-05-08 13:42:17 +02:00
Vadim Petrochenkov
13c93120cf Fix some tests failing in --pass check mode 2020-05-08 14:27:36 +03:00
Dylan DPC
14cbbf3820
Rollup merge of #71960 - estebank:fix-E0284, r=davidtwco
Fix E0284 to not use incorrect wording

Fix #71584, fix #69683.
2020-05-07 21:46:16 +02:00
Dylan DPC
53d15401ba
Rollup merge of #71903 - euclio:reword-possible-better, r=petrochenkov
reword "possible candidate" import suggestion

This suggestion has always read a bit awkwardly to me, particularly the "possible better candidate" variant.

This commit rewords the suggestion to be more concise and mention the kind of the suggested item. There isn't a nice way to label individual suggestions, so I opted to use "items" in the case of multiple suggestions.
2020-05-07 21:46:14 +02:00
Dylan DPC
f3691ac066
Rollup merge of #71783 - estebank:async-block-2015, r=tmandry
Detect errors caused by `async` block in 2015 edition

Fix #67204.
2020-05-07 21:46:12 +02:00
Esteban Küber
a7b03ad4ed Fix E0284 to not use incorrect wording
Fix #71584, fix #69683.
2020-05-07 10:19:37 -07:00
Dylan DPC
806089ad70
Rollup merge of #71972 - RalfJung:miri-validity-error-refine, r=oli-obk
use hex for pointers in Miri error messages

Also refine vtable error message: distinguish between "drop fn does not point to a function" and "drop fn points to a function with the wrong signature".
2020-05-07 17:58:59 +02:00
Dylan DPC
480f718158
Rollup merge of #71952 - JohnTitor:add-tests, r=Dylan-DPC
Add some regression tests

Closes #29988
Closes #34979
Pick up two snippets that have been fixed from #67945 (shouldn't be closed yet!)
2020-05-07 17:58:53 +02:00
Ralf Jung
d1ea287feb use hex for pointers in Miri error messages; refine vtable error message 2020-05-07 08:57:40 +02:00
Andy Russell
9f88d75710
reword "possible candidate" import suggestion 2020-05-07 00:33:25 -04:00
Dylan DPC
066eb08f5d
Rollup merge of #71950 - RalfJung:try-validation-cleanup, r=oli-obk
Miri validation error handling cleanup

Slightly expand @jumbatm's pattern macro and use it throughout validation. This ensures we never incorrectly swallow `InvalidProgram` errors or ICE when they occur.

Fixes https://github.com/rust-lang/rust/issues/71353
r? @oli-obk
2020-05-06 22:36:55 +02:00
Dylan DPC
ce14d6db5a
Rollup merge of #70908 - estebank:suggest-add, r=nikomatsakis
Provide suggestions for type parameters missing bounds for associated types

When implementing the binary operator traits it is easy to forget to restrict the `Output` associated type. `rustc` now accounts for different cases to lead users in the right direction to add the necessary restrictions. The structured suggestions in the following output are new:

```
error: equality constraints are not yet supported in `where` clauses
  --> $DIR/missing-bounds.rs:37:33
   |
LL | impl<B: Add> Add for E<B> where <B as Add>::Output = B {
   |                                 ^^^^^^^^^^^^^^^^^^^^^^ not supported
   |
   = note: see issue #20041 <https://github.com/rust-lang/rust/issues/20041> for more information
help: if `Output` is an associated type you're trying to set, use the associated type binding syntax
   |
LL | impl<B: Add> Add for E<B> where B: Add<Output = B> {
   |                                 ^^^^^^^^^^^^^^^^^

error[E0308]: mismatched types
  --> $DIR/missing-bounds.rs:11:11
   |
7  | impl<B> Add for A<B> where B: Add {
   |      - this type parameter
...
11 |         A(self.0 + rhs.0)
   |           ^^^^^^^^^^^^^^ expected type parameter `B`, found associated type
   |
   = note: expected type parameter `B`
             found associated type `<B as std::ops::Add>::Output`
help: consider further restricting this bound
   |
7  | impl<B> Add for A<B> where B: Add + std::ops::Add<Output = B> {
   |                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0369]: cannot add `B` to `B`
  --> $DIR/missing-bounds.rs:31:21
   |
31 |         Self(self.0 + rhs.0)
   |              ------ ^ ----- B
   |              |
   |              B
   |
help: consider restricting type parameter `B`
   |
27 | impl<B: std::ops::Add<Output = B>> Add for D<B> {
   |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^
```

That output is given for the following cases:

```rust
struct A<B>(B);
impl<B> Add for A<B> where B: Add {
    type Output = Self;

    fn add(self, rhs: Self) -> Self {
        A(self.0 + rhs.0) //~ ERROR mismatched types
    }
}

struct D<B>(B);
impl<B> Add for D<B> {
    type Output = Self;

    fn add(self, rhs: Self) -> Self {
        Self(self.0 + rhs.0) //~ ERROR cannot add `B` to `B`
    }
}

struct E<B>(B);
impl<B: Add> Add for E<B> where <B as Add>::Output = B {
    type Output = Self;

    fn add(self, rhs: Self) -> Self {
        Self(self.0 + rhs.0)
    }
}
```
2020-05-06 22:36:43 +02:00
Yuki Okushi
f22bc7b1cf
Add some tests for #67945 2020-05-07 02:22:08 +09:00
Yuki Okushi
be2d5535ea
Add test for #34979 2020-05-07 02:22:08 +09:00
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
Ralf Jung
19bd72e623 convert remaining try_validation to new macro 2020-05-06 09:22:52 +02: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
Ralf Jung
aa2eaca443 add test for insufficiently aligned vtable 2020-05-06 00:13:41 +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
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
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
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
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
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
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