306 Commits

Author SHA1 Message Date
bors
38bdbb7cf9 Auto merge of #43748 - RalfJung:mir-validate2, r=arielb1
AddValidation: handle Call terminators into blocks that have multiple incoming edges

The old code was just wrong: It would add validation on paths that don't even come from the call, and it would add multiple validations if multiple calls end return to the same block.
2017-08-11 13:04:59 +00:00
bors
13d94d5fa8 Auto merge of #43559 - Nashenas88:nll-region-renumberer, r=arielb1
Non-lexical lifetimes region renumberer

Regenerates region variables for all regions in a cloned MIR in the nll mir pass. This is part of the work for #43234.
2017-08-10 19:48:14 +00:00
bors
d21ec9b4ef Auto merge of #43582 - ivanbakel:unused_mut_ref, r=arielb1
Fixed mutable vars being marked used when they weren't

#### NB : bootstrapping is slow on my machine, even with `keep-stage` - fixes for occurances in the current codebase are <s>in the pipeline</s> done. This PR is being put up for review of the fix of the issue.

Fixes #43526, Fixes #30280, Fixes #25049

### Issue
Whenever the compiler detected a mutable deref being used mutably, it marked an associated value as being used mutably as well. In the case of derefencing local variables which were mutable references, this incorrectly marked the reference itself being used mutably, instead of its contents - with the consequence of making the following code emit no warnings
```
fn do_thing<T>(mut arg : &mut T) {
    ... // don't touch arg - just deref it to access the T
}
```

### Fix
Make dereferences not be counted as a mutable use, but only when they're on borrows on local variables.
#### Why not on things other than local variables?
  * Whenever you capture a variable in a closure, it gets turned into a hidden reference - when you use it in the closure, it gets dereferenced. If the closure uses the variable mutably, that is actually a mutable use of the thing being dereffed to, so it has to be counted.
  * If you deref a mutable `Box` to access the contents mutably, you are using the `Box` mutably - so it has to be counted.
2017-08-10 08:53:22 +00:00
Ralf Jung
718a8d1c38 run AddCallGuards for *all* call edges before running AddValidation 2017-08-09 12:16:59 -07:00
Ariel Ben-Yehuda
453ad8122c make for_all_relevant_impls O(1) again
A change in #41911 had made `for_all_relevant_impls` do a linear scan over
all impls, instead of using an HashMap. Use an HashMap again to avoid
quadratic blowup when there is a large number of structs with impls.

I think this fixes #43141 completely, but I want better measurements in
order to be sure. As a perf patch, please don't roll this up.
2017-08-08 11:18:12 +03:00
Paul Faria
0d29cd4c80 Keep map hidden and instead move it out after visitor is finished 2017-08-04 09:06:55 -04:00
bors
c523b3f954 Auto merge of #43403 - RalfJung:mir-validate, r=nikomatsakis
Add MIR Validate statement

This adds statements to MIR that express when types are to be validated (following [Types as Contracts](https://internals.rust-lang.org/t/types-as-contracts/5562)). Obviously nothing is stabilized, and in fact a `-Z` flag has to be passed for behavior to even change at all.

This is meant to make experimentation with Types as Contracts in miri possible. The design is definitely not final.

Cc @nikomatsakis @aturon
2017-08-04 07:48:07 +00:00
Paul Faria
7193c68271 Store map of region variable ids to lookups in nll visitor and remove reference to mir 2017-08-03 00:16:36 -04:00
Ralf Jung
7d8dc7a979 also release-validate return value before a call 2017-08-01 21:06:33 -07:00
Ralf Jung
321a72c1c1 closure unsafety check: stop moving up when we hit an item 2017-08-01 18:26:28 -07:00
Isaac van Bakel
400075d9d9 Fixed all unnecessary muts in language core 2017-08-01 23:01:24 +01:00
Ralf Jung
c5154d036d use FnLike to recognize functions for us 2017-08-01 13:07:45 -07:00
Ralf Jung
8f910bcbbc handle trait items as well 2017-08-01 09:22:58 -07:00
Ralf Jung
4310edb4cb handle tuple struct ctors 2017-08-01 08:48:28 -07:00
Ralf Jung
584d823bf2 Handle closures. Add some more tests. 2017-07-31 20:00:20 -07:00
Ralf Jung
e73d3145f5 fix AddValidation on methods 2017-07-31 18:33:45 -07:00
Ralf Jung
26ca0d1b3a tidy 2017-07-31 16:15:37 -07:00
Ralf Jung
5e426e1068 optionally only emit basic validation for functions containing unsafe block / unsafe function 2017-07-31 15:46:36 -07:00
Ariel Ben-Yehuda
5b99523de9 rustc_mir::transform::simplify - remove nops first
Removing nops can allow more basic blocks to be merged, but merging
basic blocks can't allow for more nops to be removed, so we should
remove nops first.

This doesn't matter *that* much, because normally we run SimplifyCfg
several times, but there's no reason not to do it.
2017-08-01 00:12:31 +03:00
Ralf Jung
6135461f9a CleanEndRegions: use default impl where possible 2017-07-31 13:21:10 -07:00
Paul Faria
5b2f6c7302 Consume MirVisitor changes and use more accurate spans for region renumbering 2017-07-30 16:01:02 -04:00
Ralf Jung
6641415e87 do not use doc comments inside functions 2017-07-30 10:29:15 -07:00
Paul Faria
d2fc06e7f6 Renumber regions as the first step of the non-lexical lifetimes inference 2017-07-30 12:09:35 -04:00
Ralf Jung
7ec50dfee3 also release/validate around non-Misc casts 2017-07-30 01:11:59 -07:00
Ralf Jung
b934506e68 Reorder passes so that AddValidation can run after ElaborateDrops 2017-07-30 01:11:59 -07:00
Ralf Jung
04f962adc3 after a Ref, only acquire the Deref'd destination 2017-07-30 01:11:59 -07:00
Ralf Jung
b6816b2b56 please the tidy 2017-07-30 01:11:59 -07:00
Ralf Jung
23cd90ed41 add -Z flag for AddValidation pass 2017-07-30 01:11:59 -07:00
Ralf Jung
e869cf2be7 make ValidationOperand generic so that we can reuse it in miri with a different Lvalue type 2017-07-30 01:11:59 -07:00
Ralf Jung
60096b9e82 when suspending, we need to specify for which lifetime to recover
This matters if the lvalues that is suspended involves Deref'ing a reference --
that reference's lifetime will then not be in the type any more
2017-07-30 01:11:59 -07:00
Ralf Jung
511b88cdce only emit Suspend validation for mutable paths 2017-07-30 01:11:59 -07:00
Ralf Jung
24a2ac9e46 add_validation: handle drop 2017-07-30 01:11:59 -07:00
Ralf Jung
82786b2fe1 emit validation for function calls and Ref 2017-07-30 01:11:59 -07:00
Ralf Jung
33585f4fe1 CleanEndRegions: do not clean regions that occur in types in validation statements 2017-07-30 01:11:59 -07:00
Ralf Jung
735ace977c add a pass for validation commands; for now just emit the initial AcquireValid 2017-07-30 01:11:59 -07:00
Ralf Jung
5264103de4 add new instructions for asserting when values are valid, and to describe when we can rely on them being locked in memory 2017-07-30 01:11:59 -07:00
bors
e2b5d7e6b3 Auto merge of #43324 - Nashenas88:visit_locations, r=arielb1
Provide positional information when visiting ty, substs and closure_substs in MIR

This will enable the region renumbering portion of #43234 (non-lexical lifetimes). @nikomatsakis's current plan [here](https://gist.github.com/nikomatsakis/dfc27b28cd024eb25054b52bb11082f2) shows that we need spans of the original code to create new region variables, e.g. `self.infcx.next_region_var(infer::MiscVariable(span))`. The current visitor impls did not pass positional information (`Location` in some, `Span` and `SourceInfo` for others) for all types. I did not expand this to all visits, just the ones necessary for the above-mentioned plan.
2017-07-28 12:55:12 +00:00
Paul Faria
4b9acad7c6 Squash Span into SourceInfo and rename enum and its inner types 2017-07-27 19:43:05 -04:00
bors
9d54ebe550 Auto merge of #43271 - Nashenas88:nll, r=nikomatsakis
Add empty MIR pass for non-lexical lifetimes

This is the first step for #43234.
2017-07-20 11:31:30 +00:00
Paul Faria
7a966b4328 Add empty MIR pass for non-lexical lifetimes 2017-07-19 07:55:53 -04:00
Eduard-Mihai Burtescu
148718b4f3 Implement const fn {size,align}_of. 2017-07-19 14:46:54 +03:00
Paul Faria
059a9a16d5 Provide positional information when visiting ty, substs and closure_substs in MIR 2017-07-18 22:31:38 -04:00
Ralf Jung
66fce33ecb overload the mir ty methods to make them more ergonomic to use 2017-07-12 12:59:05 -07:00
Ralf Jung
62b2e5446d Refactor: {Lvalue,Rvalue,Operand}::ty only need the locals' types, not the full &Mir 2017-07-11 16:38:16 -07:00
bors
a4c68c62f0 Auto merge of #42924 - pnkfelix:mir-dataflow, r=arielb1
Shift mir-dataflow from `rustc_borrowck` to `rustc_mir` crate.

Shift mir-dataflow from `rustc_borrowck` to `rustc_mir` crate.

Turn `elaborate_drops` and `rustc_peek` implementations into MIR passes that also live in `rustc_mir` crate.

Rewire things so `rustc_driver` uses the `ElaborateDrops` from `rustc_mir` crate.

(This PR is another baby step for mir-borrowck; it is a piece of work that other people want to rebase their stuff on top of, namely developers who are doing other dataflow analyses on top of MIR.)

I have deliberately architected this PR in an attempt to minimize the number of actual code changes. The majority of the diff should be little more than changes to mod and use declarations, as well as a few visibility promotions to pub(crate) when a declaration was moved downward in the module hierarchy.

(I have no problem with other PR's that move declarations around to try to clean this up; my goal was to ensure that the diff here was as small as possible, to make the review nearly trivial.)
2017-06-30 03:56:33 +00:00
Venkata Giri Reddy
5ed21f5d47 rustc_typeck: use body-id of type-checking item in need_type_info 2017-06-28 20:19:52 +00:00
Felix S. Klock II
13cd022060 Shift mir-dataflow from rustc_borrowck to rustc_mir crate.
Turn `elaborate_drops` and `rustc_peek` implementations into MIR
passes that also live in `rustc_mir` crate.

Rewire things so `rustc_driver` uses the `ElaborateDrops` from
`rustc_mir` crate.
2017-06-28 13:59:12 +02:00
bors
6b52a1162e Auto merge of #42931 - arielb1:statement-visitor, r=eddyb
re-add the call to `super_statement` in EraseRegions

The move gathering code is sensitive to type-equality - that is rather
un-robust and I plan to fix it eventually, but that's a more invasive
change. And we want to fix the visitor anyway.

Fixes #42903.

r? @eddyb
2017-06-28 08:47:29 +00:00
Ariel Ben-Yehuda
71abfa7b91 re-add the call to super_statement in EraseRegions
The move gathering code is sensitive to type-equality - that is rather
un-robust and I plan to fix it eventually, but that's a more invasive
change. And we want to fix the visitor anyway.

Fixes #42903.
2017-06-28 11:01:42 +03:00
Eduard-Mihai Burtescu
33ecf72e8e rustc: move the PolyFnSig out of TyFnDef. 2017-06-27 16:39:52 +03:00