311 Commits

Author SHA1 Message Date
Ralf Jung
27ce224a8f fix --emit=mir: StructCtors are functions 2019-02-09 12:11:12 +01:00
Ralf Jung
fed4c5d9e1 disambiguate filenames of multiple drop shims being dumped 2019-02-09 12:11:12 +01:00
Ralf Jung
2708946787 pass full InstanceDef to run_passes 2019-02-09 12:11:12 +01:00
Ralf Jung
cd2169682e fix rebase fallout: AnonConsts are Consts, and Methods are functions 2019-02-09 12:11:12 +01:00
Ralf Jung
276219e0e2 fix dumping MIR from another crate 2019-02-09 12:11:12 +01:00
Taiki Endo
d2514523db Use real try blocks 2019-02-08 20:08:08 +09:00
Taiki Endo
725af30809 librustc_mir => 2018 2019-02-08 06:28:15 +09:00
Nicholas Nethercote
f2871a9ce5 Make intern_lazy_const actually intern its argument.
Currently it just unconditionally allocates it in the arena.

For a "Clean Check" build of the the `packed-simd` benchmark, this
change reduces both the `max-rss` and `faults` counts by 59%; it
slightly (~3%) increases the instruction counts but the `wall-time` is
unchanged.

For the same builds of a few other benchmarks, `max-rss` and `faults`
drop by 1--5%, but instruction counts and `wall-time` changes are in the
noise.

Fixes #57432, fixes #57829.
2019-02-06 12:50:28 +11:00
bors
0b1669d96c Auto merge of #57714 - matthewjasper:wellformed-unreachable, r=pnkfelix
[NLL] Clean up handling of type annotations

* Renames (Canonical)?UserTypeAnnotation -> (Canonical)?UserType so that the name CanonicalUserTypeAnnotation is free.
* Keep the inferred type associated to user type annotations in the MIR, so that it can be compared against the annotated type, even when the annotated expression gets removed from the MIR. (#54943)
* Use the inferred type to allow infallible handling of user type projections (#57531)
* Uses revisions for the tests in #56993
* Check the types of `Unevaluated` constants with no annotations (#46702)
* Some drive-by cleanup

Closes #46702
Closes #54943
Closes #57531
Closes #57731
cc #56993 leaving this open to track the underlying issue: we are not running tests with full NLL enabled on CI at the moment

r? @nikomatsakis
2019-01-25 14:25:37 +00:00
Oliver Scherer
64afc6b517 Differentiate between closure and function bodies 2019-01-21 10:12:17 +01:00
Matthew Jasper
ed871cb368 Use a struct for user type annotations 2019-01-19 15:15:07 +00:00
Mazdak Farrokhzad
ca1e379090
Rollup merge of #57102 - davidtwco:issue-57100, r=nikomatsakis
NLL: Add union justifications to conflicting borrows.

Fixes #57100.

This PR adds justifications to error messages for conflicting borrows of union fields.

Where previously an error message would say ``cannot borrow `u.b` as mutable..``, it now says ``cannot borrow `u` (via `u.b`) as mutable..``.

r? @pnkfelix
2019-01-13 17:21:40 +01:00
David Wood
c2b477c19a
Improve diagnostic labels and add note.
This commit improves diagnostic labels to mention which field a borrow
overlaps with and adds a note explaining that the fields overlap.
2019-01-04 22:43:51 +01:00
Oliver Scherer
f36c6559ea Add unwrap_usize to LazyConst, too 2019-01-01 20:05:02 +01:00
Oliver Scherer
b903cb9d60 Move the Unevaluated constant arm upwards in the type structure 2019-01-01 20:05:02 +01:00
David Wood
162dcdc16f
Add user type annotations to MIR dump.
This commit writes the user type annotations to the MIR dump so that
they are visible again.
2018-12-30 14:30:58 +01:00
Mark Rousskov
2a663555dd Remove licenses 2018-12-25 21:08:33 -07:00
Alexander Regueiro
ee89c088b0 Various minor/cosmetic improvements to code 2018-12-07 23:53:34 +00:00
John Kåre Alsaker
a70babed03 Use a function to access the Hir map to be able to turn it into a query later 2018-12-06 17:24:36 +01:00
Pietro Albini
e941e1a624
Rollup merge of #56500 - ljedrz:cleanup_rest_of_const_lifetimes, r=zackmdavis
cleanup: remove static lifetimes from consts

A follow-up to https://github.com/rust-lang/rust/pull/56497.
2018-12-06 07:48:57 +01:00
ljedrz
d0c64bb296 cleanup: remove static lifetimes from consts 2018-12-04 12:46:10 +01:00
Daan de Graaf
1560a75f6a Refer to the second borrow as the "second borrow". 2018-11-30 14:55:51 +01:00
Eduard-Mihai Burtescu
3ce8d444af rustc_target: separate out an individual Align from AbiAndPrefAlign. 2018-11-22 04:38:00 +02:00
Oliver Scherer
4a9ed3f25a Use type safe VariantIdx instead of usize everywhere 2018-11-12 14:24:45 +01:00
bors
87a3c1ee70 Auto merge of #55316 - RalfJung:retagging, r=oli-obk
Add Retagging statements

This adds a `Retag` statement kind to MIR, used to perform the retagging operation from [Stacked Borrows](https://www.ralfj.de/blog/2018/08/07/stacked-borrows.html). It also kills the old `Validate` statements that I added last year.

NOTE: This includes https://github.com/rust-lang/rust/pull/55270. Only [these commits are new](https://github.com/RalfJung/rust/compare/stacked-borrows-ng...RalfJung:retagging).
2018-11-02 12:45:03 +00:00
Matthias Krüger
f6b8876d45 use String::from() instead of format!() macro to construct Strings. 2018-10-31 00:10:10 +01:00
Ralf Jung
aafcf2c942 Emit Retag statements, kill Validate statements
Also "rename" -Zmir-emit-validate to -Zmir-emit-retag, which is just a boolean (yes or no).
2018-10-29 09:05:18 +01:00
David Wood
6208bd8e03
Refactor and add PlaceContext::AscribeUserTy.
This commit refactors `PlaceContext` to split it into four different
smaller enums based on if the context represents a mutating use,
non-mutating use, maybe-mutating use or a non-use (this is based on the
recommendation from @oli-obk on Zulip[1]).

This commit then introduces a `PlaceContext::AscribeUserTy` variant.
`StatementKind::AscribeUserTy` is now correctly mapped to
`PlaceContext::AscribeUserTy` instead of `PlaceContext::Validate`.
`PlaceContext::AscribeUserTy` can also now be correctly categorized as a
non-use which fixes an issue with constant promotion in statics after a
cast introduces a `AscribeUserTy` statement.

[1]: https://rust-lang.zulipchat.com/#narrow/stream/122657-wg-nll/subject/.2355288.20cast.20fails.20to.20promote.20to.20'static/near/136536949
2018-10-27 12:11:37 +02:00
Felix S. Klock II
b569caf267 Checkpoint: Added abstraction over collection of projections into user type.
I did not think I would need this in the MIR, but in general local
decls are going to need to support this. (That, or we need to be able
define a least-upper-bound for a collection of types encountered via
the pattern compilation.)
2018-10-26 23:46:21 +02:00
Shotaro Yamada
3878d24ef6 Remove redundant clone 2018-10-26 12:07:39 +09:00
Matthew Jasper
2a3969a3f7 Use new region infer errors for explaining borrows
This gives at least some explanation for why a borrow is expected to
last for a certain free region. Also:

* Reports E0373: "closure may outlive the current function" with NLL.
* Special cases the case of returning a reference to (or value
  referencing) a local variable or temporary (E0515).
* Special case assigning a reference to a local variable in a closure
  to a captured variable.
2018-10-21 12:35:00 +01:00
Matthew Jasper
275432c115 Give an error number for "borrowed data escapes outside of closure" 2018-10-20 23:11:30 +01:00
bors
ca2639e82e Auto merge of #55014 - ljedrz:lazyboye_unwraps, r=matthewjasper
Prefer unwrap_or_else to unwrap_or in case of function calls/allocations

The contents of `unwrap_or` are evaluated eagerly, so it's not a good pick in case of function calls and allocations. This PR also changes a few `unwrap_or`s with `unwrap_or_default`.

An added bonus is that in some cases this change also reveals if the object it's called on is an `Option` or a `Result` (based on whether the closure takes an argument).
2018-10-20 11:22:48 +00:00
Oliver Scherer
3c9258e604 Prefer Default::default over FxHash*::default in struct constructors 2018-10-19 14:34:44 +02:00
Oliver Scherer
ee81739dc1 Deprecate the FxHashMap() and FxHashSet() constructor function hack 2018-10-19 14:34:44 +02:00
ljedrz
d28aed6dc4 Prefer unwrap_or_else to unwrap_or in case of function calls/allocations 2018-10-19 09:45:45 +02:00
David Wood
aa701154f0
Extend closure special-casing for generators.
This commit extends existing special-casing of closures to highlight the
use of variables within generators that are causing the generator to
borrow them.
2018-10-18 17:48:18 +02:00
Matthew Jasper
cc09cb5e5a Record whether a Call in MIR corresponds to a call in HIR 2018-10-03 19:54:55 +01:00
bors
441519536c Auto merge of #54526 - nnethercote:shrink-StatementKind, r=nagisa
Shrink `StatementKind`

`StatementKind` occurs in significant amounts in Massif profiles.
2018-09-26 23:22:48 +00:00
Felix S. Klock II
ea4d934c32 Change the diagnostic number from 714 to 716. 2018-09-25 15:23:57 +01:00
Mikhail Modin
5fc0b743d7 add "temporary value dropped while borrowed" error
Issue #54131
2018-09-25 15:23:56 +01:00
Matthew Jasper
b55bb2e918 Better messages for errors from Shallow borrows 2018-09-24 23:33:13 +01:00
Nicholas Nethercote
a577f900a9 Shrink StatementKind::Assign.
This shrinks StatementKind from 80 bytes to 64 bytes on 64-bit.
2018-09-24 18:45:37 +10:00
bors
7714c430ae Auto merge of #54310 - pnkfelix:issue-52059-report-borrow-drop-conflict, r=nikomatsakis
Report when borrow could cause `&mut` aliasing during Drop

We were already issuing an error for the cases where this cropped up, so this is not fixing any soundness holes. The previous diagnostic just wasn't accurately describing the problem in the user's code.

Fix #52059
2018-09-23 04:06:15 +00:00
Felix S. Klock II
1f0fbddfff Fine tune dianostics for when a borrow conflicts with a destructor that needs exclusive access.
In particular:

 1. Extend `WriteKind::StorageDeadOrDrop` with state to track whether
    we are running a destructor or just freeing backing storage.  (As
    part of this, when we drop a Box<..<Box<T>..> where `T` does not
    need drop, we now signal that the drop of `T` is a kind of storage
    dead rather than a drop.)

 2. When reporting that a value does not live long enough, check if
    we're doing an "interesting" drop, i.e. we aren't just trivally
    freeing the borrowed state, but rather a user-defined dtor will
    run and potentially require exclusive aces to the borrowed state.

 3. Added a new diagnosic to describe the scenario here.
2018-09-18 02:06:45 +02:00
Nicholas Nethercote
266e2d3d69 Merge indexed_set.rs into bitvec.rs, and rename it bit_set.rs.
Currently we have two files implementing bitsets (and 2D bit matrices).
This commit combines them into one, taking the best features from each.

This involves renaming a lot of things. The high level changes are as
follows.
- bitvec.rs              --> bit_set.rs
- indexed_set.rs         --> (removed)
- BitArray + IdxSet      --> BitSet (merged, see below)
- BitVector              --> GrowableBitSet
- {,Sparse,Hybrid}IdxSet --> {,Sparse,Hybrid}BitSet
- BitMatrix              --> BitMatrix
- SparseBitMatrix        --> SparseBitMatrix

The changes within the bitset types themselves are as follows.

```
OLD             OLD             NEW
BitArray<C>     IdxSet<T>       BitSet<T>
--------        ------          ------
grow            -               grow
new             -               (remove)
new_empty       new_empty       new_empty
new_filled      new_filled      new_filled
-               to_hybrid       to_hybrid
clear           clear           clear
set_up_to       set_up_to       set_up_to
clear_above     -               clear_above
count           -               count
contains(T)     contains(&T)    contains(T)
contains_all    -               superset
is_empty        -               is_empty
insert(T)       add(&T)         insert(T)
insert_all      -               insert_all()
remove(T)       remove(&T)      remove(T)
words           words           words
words_mut       words_mut       words_mut
-               overwrite       overwrite
merge           union           union
-               subtract        subtract
-               intersect       intersect
iter            iter            iter
```

In general, when choosing names I went with:
- names that are more obvious (e.g. `BitSet` over `IdxSet`).
- names that are more like the Rust libraries (e.g. `T` over `C`,
  `insert` over `add`);
- names that are more set-like (e.g. `union` over `merge`, `superset`
  over `contains_all`, `domain_size` over `num_bits`).

Also, using `T` for index arguments seems more sensible than `&T` --
even though the latter is standard in Rust collection types -- because
indices are always copyable. It also results in fewer `&` and `*`
sigils in practice.
2018-09-18 07:08:09 +10:00
kenta7777
26dbf56196 Merge branch 'master' into kenta7777#53719 2018-09-12 21:36:31 +09:00
Niko Matsakis
e87bf30f5f propagate user-ascribes types down onto resulting bindings
But only in very simple cases.
2018-09-10 10:58:31 -04:00
kenta7777
5c3ba4aa4f renamed mk_nil to mk_unit 2018-09-10 11:07:13 +09:00
bors
0198a1ea45 Auto merge of #53909 - mikhail-m1:53643, r=nikomatsakis
Skip a shared borrow of a immutable local variables

issue #53643

r? @nikomatsakis
2018-09-08 19:57:14 +00:00