Commit graph

939 commits

Author SHA1 Message Date
Dylan MacKenzie
d84f0c8d32 Update tests 2020-06-28 10:08:12 -07:00
Dylan MacKenzie
d6139f76c0 Update tests 2020-06-28 10:08:10 -07:00
Oliver Scherer
819cde5dab Show the values and computation that would overflow a const evaluation or propagation 2020-06-26 10:08:52 +02:00
Nathan Corbyn
c2dfc25c0e Fix tests 2020-06-24 15:10:10 +01:00
Nathan Corbyn
d36d351afc Implement intrinsic 2020-06-24 14:38:42 +01:00
Manish Goregaokar
0f9a6edc09
Rollup merge of #73515 - christianpoveda:livedrop-diagnostics, r=oli-obk
Add second message for LiveDrop errors

This is an attempt to fix https://github.com/rust-lang/rust/issues/72907 by adding a second message to the `LiveDrop` diagnostics. Changing from this
```
error[E0493]: destructors cannot be evaluated at compile-time
 --> src/lib.rs:7:9
  |
7 |     let mut always_returned = None;
  |         ^^^^^^^^^^^^^^^^^^^ constants cannot evaluate destructors

error: aborting due to previous error
```
to this
```
error[E0493]: destructors cannot be evaluated at compile-time
  --> foo.rs:6:9
   |
6  |     let mut always_returned = None;
   |         ^^^^^^^^^^^^^^^^^^^ constants cannot evaluate destructors
...
10 |         always_returned = never_returned;
   |         --------------- value is dropped here

error: aborting due to previous error
```
r? @RalfJung @ecstatic-morse
2020-06-23 00:34:00 -07:00
Manish Goregaokar
ae38698e7f
Rollup merge of #73398 - oli-obk:const_raw_ptr_cmp, r=varkor,RalfJung,nagisa
A way forward for pointer equality in const eval

r? @varkor on the first commit and @RalfJung on the second commit

cc #53020
2020-06-23 00:33:54 -07:00
Aaron Hill
ad9972a20d
Revert "Rollup merge of #72389 - Aaron1011:feature/move-fn-self-msg, r=nikomatsakis"
This reverts commit 372cb9b69c, reversing
changes made to 5c61a8dc34.
2020-06-22 12:46:29 -04:00
Christian Poveda
935516803e update tests 2020-06-20 20:38:57 +00:00
Oliver Scherer
53686b91ca Satisfy tidy 2020-06-20 14:15:36 +02:00
Oliver Scherer
9e88b48133 Refer just to the issue in the raw ptr cmp diagnostic instead of explaining everything in the diagnostic 2020-06-20 14:09:07 +02:00
Manish Goregaokar
dac512e04a
Rollup merge of #72934 - christianpoveda:mut-borrows-in-consts, r=oli-obk
forbid mutable references in all constant contexts except for const-fns

PR to address #71212

cc: @ecstatic-morse
2020-06-19 19:42:51 -07:00
Manish Goregaokar
203305d095
Rollup merge of #71420 - RalfJung:specialization-incomplete, r=matthewjasper
Specialization is unsound

As discussed in https://github.com/rust-lang/rust/issues/31844#issuecomment-617013949, it might be a good idea to warn users of specialization that the feature they are using is unsound.

I also expanded the "incomplete feature" warning to link the user to the tracking issue.
2020-06-19 19:42:43 -07:00
Christian Poveda
96031e22d2
add new error code 2020-06-19 14:16:38 -05:00
Christian Poveda
1f48465a01
update diagnostics for &mut in constants 2020-06-19 11:48:46 -05:00
Christian Poveda
014e605870
update tests 2020-06-19 11:48:46 -05:00
Oliver Scherer
e09b620339 Add fuzzy pointer comparison intrinsics 2020-06-19 18:13:41 +02:00
Oliver Scherer
9245ba8304 Remove the const_raw_ptr_comparison feature gate.
We can never supply a meaningful implementation of this.
Instead, the follow up commits will create two intrinsics
that approximate comparisons:

* `ptr_maybe_eq`
* `ptr_maybe_ne`

The fact that `ptr_maybe_eq(a, b)` is not necessarily the same
value as `!ptr_maybe_ne(a, b)` is a symptom of this entire
problem.
2020-06-19 18:13:41 +02:00
Ralf Jung
5e7eec2eaa
Rollup merge of #72497 - RalfJung:tag-term, r=oli-obk
tag/niche terminology cleanup

The term "discriminant" was used in two ways throughout the compiler:
* every enum variant has a corresponding discriminant, that can be given explicitly with `Variant = N`.
* that discriminant is then encoded in memory to store which variant is active -- but this encoded form of the discriminant was also often called "discriminant", even though it is conceptually quite different (e.g., it can be smaller in size, or even use niche-filling).

After discussion with @eddyb, this renames the second term to "tag". The way the tag is encoded can be either `TagEncoding::Direct` (formerly `DiscriminantKind::Tag`) or `TagEncoding::Niche` (formerly `DiscrimianntKind::Niche`).

This finally resolves some long-standing confusion I had about the handling of variant indices and discriminants, which surfaced in https://github.com/rust-lang/rust/pull/72419.

(There is also a `DiscriminantKind` type in libcore, it remains unaffected. I think this corresponds to the discriminant, not the tag, so that seems all right.)

r? @eddyb
2020-06-19 08:56:02 +02:00
bors
a39c7787ba Auto merge of #73486 - Manishearth:rollup-11iyqpc, r=Manishearth
Rollup of 17 pull requests

Successful merges:

 - #70551 (Make all uses of ty::Error delay a span bug)
 - #71338 (Expand "recursive opaque type" diagnostic)
 - #71976 (Improve diagnostics for `let x += 1`)
 - #72279 (add raw_ref macros)
 - #72628 (Add tests for 'impl Default for [T; N]')
 - #72804 (Further tweak lifetime errors involving `dyn Trait` and `impl Trait` in return position)
 - #72814 (remove visit_terminator_kind from MIR visitor)
 - #72836 (Complete the std::time documentation to warn about the inconsistencies between OS)
 - #72968 (Only highlight doc search results via mouseover if mouse has moved)
 - #73034 (Export `#[inline]` fns with extern indicators)
 - #73315 (Clean up some weird command strings)
 - #73320 (Make new type param suggestion more targetted)
 - #73361 (Tweak "non-primitive cast" error)
 - #73425 (Mention functions pointers in the documentation)
 - #73428 (Fix typo in librustc_ast docs)
 - #73447 (Improve document for `Result::as_deref(_mut)` methods)
 - #73476 (Added tooltip for should_panic code examples)

Failed merges:

r? @ghost
2020-06-19 01:20:49 +00:00
Manish Goregaokar
9ca811772c
Rollup merge of #73361 - estebank:non-primitive-cast, r=davidtwco
Tweak "non-primitive cast" error

- Suggest borrowing expression if it would allow cast to work.
- Suggest using `<Type>::from(<expr>)` when appropriate.
- Minor tweak to `;` typo suggestion.

Partily address #47136.
2020-06-18 15:20:57 -07:00
Dylan MacKenzie
38e921b2c1 Add regression test for #73431 2020-06-17 09:55:08 -07:00
Ralf Jung
5fbef22a44 warn against 'specialization' feature 2020-06-16 09:39:34 +02:00
Esteban Küber
e857696cf8 Tweak "non-primitive cast" error
- Suggest borrowing expression if it would allow cast to work.
- Suggest using `<Type>::from(<expr>)` when appropriate.
- Minor tweak to `;` typo suggestion.

Partily address #47136.
2020-06-15 08:57:20 -07:00
bors
ff4a2533a0 Auto merge of #73369 - RalfJung:rollup-hl8g9zf, r=RalfJung
Rollup of 10 pull requests

Successful merges:

 - #72707 (Use min_specialization in the remaining rustc crates)
 - #72740 (On recursive ADT, provide indirection structured suggestion)
 - #72879 (Miri: avoid tracking current location three times)
 - #72938 (Stabilize Option::zip)
 - #73086 (Rename "cyclone" to "apple-a7" per changes in upstream LLVM)
 - #73104 (Example about explicit mutex dropping)
 - #73139 (Add methods to go from a nul-terminated Vec<u8> to a CString)
 - #73296 (Remove vestigial CI job msvc-aux.)
 - #73304 (Revert heterogeneous SocketAddr PartialEq impls)
 - #73331 (extend network support for HermitCore)

Failed merges:

r? @ghost
2020-06-15 11:39:23 +00:00
Ralf Jung
f9c8a67593
Rollup merge of #72879 - RalfJung:miri-tctx-at, r=oli-obk
Miri: avoid tracking current location three times

Miri tracks the current instruction to execute in the call stack, but it also additionally has two `TyCtxtAt` that carry a `Span` that also tracks the current instruction. That is quite silly, so this PR uses `TyCtxt` instead, and then uses a method for computing the current span when a `TyCtxtAt` is needed. Having less redundant (semi-)global state seems like a good improvement to me. :D

To keep the ConstProp errors the same, I had to add the option to `error_to_const_error` to overwrite the span. Also for some reason this changes cycle errors a bit -- not sure if we are now better or worse as giving those queries the right span. (It is unfortunately quite easy to accidentally use `DUMMY_SP` by calling the query on a `TyCtxt` instead of a `TyCtxtAt`.)

r? @oli-obk @eddyb
2020-06-15 12:01:01 +02:00
Ralf Jung
372cb9b69c
Rollup merge of #72389 - Aaron1011:feature/move-fn-self-msg, r=nikomatsakis
Explain move errors that occur due to method calls involving `self`

When calling a method that takes `self` (e.g. `vec.into_iter()`), the method receiver is moved out of. If the method receiver is used again, a move error will be emitted::

```rust
fn main() {
    let a = vec![true];
    a.into_iter();
    a;
}
```

emits

```
error[E0382]: use of moved value: `a`
 --> src/main.rs:4:5
  |
2 |     let a = vec![true];
  |         - move occurs because `a` has type `std::vec::Vec<bool>`, which does not implement the `Copy` trait
3 |     a.into_iter();
  |     - value moved here
4 |     a;
  |     ^ value used here after move
```

However, the error message doesn't make it clear that the move is caused by the call to `into_iter`.

This PR adds additional messages to move errors when the move is caused by using a value as the receiver of a `self` method::

```
error[E0382]: use of moved value: `a`
   --> vec.rs:4:5
    |
2   |     let a = vec![true];
    |         - move occurs because `a` has type `std::vec::Vec<bool>`, which does not implement the `Copy` trait
3   |     a.into_iter();
    |     ------------- value moved due to this method call
4   |     a;
    |     ^ value used here after move
    |
note: this function takes `self`, which moves the receiver
   --> /home/aaron/repos/rust/src/libcore/iter/traits/collect.rs:239:5
    |
239 |     fn into_iter(self) -> Self::IntoIter;
```

TODO:

- [x] Add special handling for `FnOnce/FnMut/Fn` - we probably don't want to point at the unstable trait methods
- [x] Consider adding additional context for operations (e.g. `Shr::shr`) when the call was generated using the operator syntax (e.g. `a >> b`)
- [x] Consider pointing to the method parent (impl or trait block) in addition to the method itself.
2020-06-15 09:57:22 +02:00
Ralf Jung
5c61a8dc34
Rollup merge of #71824 - ecstatic-morse:const-check-post-drop-elab, r=oli-obk
Check for live drops in constants after drop elaboration

Resolves #66753.

This PR splits the MIR "optimization" pass series in two and introduces a query–`mir_drops_elaborated_and_const_checked`–that holds the result of the `post_borrowck_cleanup` analyses and checks for live drops. This query is invoked in `rustc_interface` for all items requiring const-checking, which means we now do `post_borrowck_cleanup` for items even if they are unused in the crate.

As a result, we are now more precise about when drops are live. This is because drop elaboration can e.g. eliminate drops of a local when all its fields are moved from. This does not mean we are doing value-based analysis on move paths, however; Storing a `Some(CustomDropImpl)` into a field of a local will still set the qualifs for that entire local.

r? @oli-obk
2020-06-15 09:57:20 +02:00
Dylan MacKenzie
2dcf7dbb86 Add tests for const_precise_live_drops 2020-06-13 11:05:13 -07:00
Ralf Jung
60496504ac avoid computing precise span for const_eval query 2020-06-13 13:47:37 +02:00
Lzu Tao
c755292859 Prefer the associated consts for pattern matching error 2020-06-13 01:18:18 +00:00
Dylan DPC
c06799e4c4
Rollup merge of #72906 - lzutao:migrate-numeric-assoc-consts, r=dtolnay
Migrate to numeric associated consts

The deprecation PR is #72885

cc #68490
cc rust-lang/rfcs#2700
2020-06-12 12:28:23 +02:00
Ralf Jung
0ac6fd0405 fix const_prop spans and re-bless tests 2020-06-12 09:43:55 +02:00
Aaron Hill
2c11c35f89
Explain move errors that occur due to method calls involving self 2020-06-11 17:40:40 -04:00
Dylan DPC
298467ee9a
Rollup merge of #72380 - lcnr:const_context, r=estebank
Fix `is_const_context`, update `check_for_cast`

A better version of #71477

Adds `fn enclosing_body_owner` and uses it in `is_const_context`.
`is_const_context` now uses the same mechanism as `mir_const_qualif` as it was previously incorrect.
Renames `is_const_context` to `is_inside_const_context`.

I also updated `check_for_cast` in the second commit, so r? @estebank

(I removed one lvl of indentation, so it might be easier to review by hiding whitespace changes)
2020-06-11 13:15:53 +02:00
Lzu Tao
fff822fead Migrate to numeric associated consts 2020-06-10 01:35:47 +00:00
Ralf Jung
4f30c68937
Fix comment
Co-authored-by: Aaron Hill <aa1ronham@gmail.com>
2020-06-02 00:55:11 +02:00
Ralf Jung
d022603a45 test miri-unleash TLS accesses 2020-06-01 20:53:45 +02:00
Matthew Jasper
8894bd220b Add descriptions for all queries 2020-05-31 20:15:32 +01:00
Ralf Jung
356d1e9f4f
Rollup merge of #72772 - RalfJung:valid-char, r=petrochenkov
miri validation: clarify valid values of 'char'

The old text said "expected a valid unicode codepoint", which is not actually correct -- it has to be a scalar value (which is a code point that is not part of a surrogate pair).
2020-05-30 23:09:00 +02:00
Ralf Jung
7a6d03c269 miri errors: rename InvalidDiscriminant -> InvalidTag 2020-05-30 14:37:15 +02:00
Ralf Jung
f8d3805733 miri validation: clarify valid values of 'char' 2020-05-30 09:33:05 +02:00
Joe Richey
7d5415b5a2 Add additional checks for isize overflow
We now perform the correct checks even if the pointer size differs
between the host and target.

Signed-off-by: Joe Richey <joerichey@google.com>
2020-05-27 19:10:17 -07:00
Joe Richey
71ef8414bd Add checks and tests for computing abs(offset_bytes)
The previous code paniced if offset_bytes == i64::MIN. This commit:
  - Properly computes the absoulte value to avoid this panic
  - Adds a test for this edge case

Signed-off-by: Joe Richey <joerichey@google.com>
2020-05-26 02:06:18 -07:00
Joe Richey
6b20f58c0d miri_unleached: We now allow offset in const fn
Signed-off-by: Joe Richey <joerichey@google.com>
2020-05-25 13:09:02 -07:00
Joe Richey
88a37a2086 test/ui/consts: Add tests for const ptr offsets
Signed-off-by: Joe Richey <joerichey@google.com>
2020-05-25 13:09:02 -07:00
bors
7f79e98c03 Auto merge of #72205 - ecstatic-morse:nrvo, r=oli-obk
Dumb NRVO

This is a very simple version of an NRVO pass, which scans backwards from the `return` terminator to see if there is an an assignment like `_0 = _1`. If a basic block with two or more predecessors is encountered during this scan without first seeing an assignment to the return place, we bail out. This avoids running a full "reaching definitions" dataflow analysis.

I wanted to see how much `rustc` would benefit from even a very limited version of this optimization. We should be able to use this as a point of comparison for more advanced versions that are based on live ranges.

r? @ghost
2020-05-21 07:16:44 +00:00
Bastian Kauschke
72a2d35f16 fix is_const_context 2020-05-20 14:57:16 +02:00
Dylan DPC
4c48f5ab69
Rollup merge of #71886 - t-rapp:tr-saturating-funcs, r=dtolnay
Stabilize saturating_abs and saturating_neg

Stabilizes the following signed integer functions with saturation mechanics:
 * saturating_abs()
 * saturating_neg()

Closes #59983
2020-05-19 13:53:36 +02:00
Dylan MacKenzie
1deaaa610c Don't unleash NRVO const-eval test 2020-05-17 10:23:44 -07:00