about summary refs log tree commit diff
path: root/src/librustc_mir
AgeCommit message (Collapse)AuthorLines
2019-12-10cleanup polonius liveness fact generationRemy Rakic-22/+14
For the var_uses_region and var_drops_region relations: - check for all facts existence only once - remove function only used once - pull var_uses_region with the other access facts instead of on its own
2019-12-09Rollup merge of #67149 - JohnTitor:fix-ice-1, r=Dylan-DPCTyler Mandry-1/+2
Do not ICE #67123 Fixes #67123 r? @matthewjasper
2019-12-09Rollup merge of #67145 - RalfJung:miri-step, r=oli-obkTyler Mandry-1/+3
fix miri step debug printing r? @oli-obk
2019-12-09Check for `ConstantIndex` move paths correctly in borrowckMatthew Jasper-15/+6
2019-12-09Remove `uniform_array_move_out` passesMatthew Jasper-432/+163
These passes were buggy, MIR building is now responsible for canonicalizing `ConstantIndex` projections and `MoveData` is responsible for splitting `Subslice` projections.
2019-12-09Make const index and subslice array projections more usefulMatthew Jasper-42/+84
* `min_length` is now exact for const index elements. * const index elements are always from the start. * make array `Subslice` `PlaceElems` count both `from` and `to` from the start.
2019-12-09Ensure that unevaluated constants of type `!` are present in the MIRMatthew Jasper-1/+8
2019-12-09Auto merge of #67016 - lqd:placeholder_loans, r=matthewjasperbors-35/+250
In which we implement illegal subset relations errors using Polonius This PR is the rustc side of implementing subset errors using Polonius. That is, in ```rust fn foo<'a, 'b>(x: &'a u32, y: &'b u32) -> &'a u32 { y } ``` returning `y` requires that `'b: 'a` but we have no evidence of that, so this is an error. (Evidence that the relation holds could come from explicit bounds, or via implied bounds). Polonius outputs one such error per CFG point where the free region's placeholder loan unexpectedly flowed into another free region. While all these CFG locations could be useful in diagnostics in the future, rustc does not do that (and the duplication is only partially handled in the rest of the errors/diagnostics infrastructure, e.g. duplicate suggestions will be shown by the "outlives suggestions" or some of the `#[rustc_*]` NLL/MIR debug dumps), so I deduplicated the errors. (The ordering also matters, otherwise some of the elided lifetime naming would change behaviour). I've blessed a couple of tests, where the output is currently suboptimal: - the `hrtb-perfect-forwarding` tests mix subset errors with higher-ranked subtyping, however the plan is for chalk to eventually take care of some of this to generate polonius constraints (i.e. it's not polonius' job). Until that happens, polonius will not see the error that NLL sees. - some other tests have errors and diagnostics specific to `'static`, I _believe_ this to be because of it being treated as more "special" than in polonius. I believe the output is not wrong, but could be better, and appears elsewhere (I feel we'll need to look at polonius' handling of `'static` at some point in the future, maybe to match a bit more what NLL does when it produces errors) I'll create a tracking issue in the polonius repo to record these 2 points (and a general "we'll need to go over the blessed output" issue, much like we did for NLLs) The last blessed test is because it's an improvement: in this case, more errors/suggestions were computed, instead of the existing code path where this case apparently stops at the first error. The `Naive` variant in Polonius computes those errors, so this PR also switches the default variant to that, as we're also in the process of temporarily deactivating all other variants (which exist mostly for performance considerations) until we have completed more work on completeness and correctness, before focusing on efficiency once again. While most of the correctness in this PR is hidden in the polonius compare-mode (which of course passes locally), I've added a couple of smoke-tests to the existing ones, so that we have some confidence that it works (and keeps working) until we're in a position where we can run them on CI. As mentioned during yesterday's wg-polonius meeting, @nikomatsakis has already read through most of this PR (and which is matching what they thought needed to be done [during the recent Polonius sprint](https://hackmd.io/CGMNjt1hR_qYtsR9hgdGmw#Compiler-notes-on-generating-the-placeholder-loans-support)), but Matthew was hopefully going to review (again, not urgent), so: r? @matthewjasper (This updates to the latest `polonius-engine` release, and I'm not sure whether `Cargo.lock` updates can easily be rolled up, but apart from that: this changes little that's tested on CI, so seems safe-ish to rollup ?)
2019-12-09Do not ICE on closureYuki Okushi-1/+2
2019-12-09Auto merge of #67004 - estebank:issue-66958, r=eddybbors-9/+10
Do not ICE on async fn with non-Copy infered type arg Fix #66958.
2019-12-08fix miri step debug printingRalf Jung-1/+3
2019-12-08Rollup merge of #66991 - Nashenas88:body_cache_cleanup, r=eddybMazdak Farrokhzad-161/+167
Cleanup BodyCache After this PR: - `BodyCache` is renamed to `BodyAndCache` - `ReadOnlyBodyCache` is renamed to `ReadOnlyBodyAndCache` - `ReadOnlyBodyAndCache::body` fn is removed and all calls to it are replaced by a deref (possible due to fix of its `Deref` imp in #65947) cc @eddyb @oli-obk
2019-12-08Rollup merge of #66325 - BartMassey:master, r=joshtriplettMazdak Farrokhzad-1/+1
Change unused_labels from allow to warn Fixes #66324, making the unused_labels lint warn instead of allow by default. I'm told @rust-lang/lang will need to review this, and perhaps will want to do a crater run.
2019-12-08Ensure that we get a hard error on generic ZST constants if their body ↵Oliver Scherer-4/+9
causes an error during evaluation
2019-12-07Auto merge of #65881 - anp:implicit-caller-location, r=eddyb,oli-obkbors-8/+28
Implement #[track_caller] attribute. (RFC 2091 4/N) Implements the `#[track_caller]` attribute in both const and codegen contexts. The const implementation walks up the stack to find the nearest untracked callsite. The codegen implementation adds an implicit argument to tracked function calls, and populates it with either a call to the previously-landed intrinsic or if the caller has `#[track_caller]` with a copy of the location passed to the current function. Also includes a little cleanup and a few comments in the other caller location areas. [Depends on: 65664](https://github.com/rust-lang/rust/pull/65664) [RFC 2091 text](https://github.com/rust-lang/rfcs/blob/master/text/2091-inline-semantic.md) [Tracking issue](https://github.com/rust-lang/rust/issues/47809) [Tracking doc](https://paper.dropbox.com/doc/track_rfc_2091_impl-notes--Anf1NwnIb0xcRv31YLIadyj0Ag-rwCdRc2fi2yvRZ7syGZ9q#:uid=863513134494965680023183&h2=TODO-actually-pass-location-to)
2019-12-07Auto merge of #66927 - RalfJung:engines-dont-panic, r=oli-obkbors-8/+6
Miri core engine: use throw_ub instead of throw_panic See https://github.com/rust-lang/rust/issues/66902 for context: panicking is not really an "interpreter error", but just part of a normal Rust execution. This is a first step towards removing the `InterpError::Panic` variant: the core Miri engine does not use it any more. ConstProp and ConstEval still use it, though. This will be addressed in future PRs. From what I can tell, all the error messages this removes are actually duplicates. r? @oli-obk @wesleywiser
2019-12-06Address review feedback.Adam Perry-13/+6
2019-12-06Always call const fns with #[track_caller].Adam Perry-2/+6
The caller location is passed as an implicit argument, so we must consider it when checking the sizedness of arguments.
2019-12-06Rollup merge of #66606 - christianpoveda:mut-refs-in-const-fn, r=oli-obkMazdak Farrokhzad-32/+57
Add feature gate for mut refs in const fn r? @oli-obk
2019-12-06Auto merge of #65195 - varkor:to_option, r=Centrilbors-36/+19
Rename `bool::then_*` to `bool::to_option_*` and use where appropriate Name change following https://github.com/rust-lang/rfcs/pull/2757. Also try it out throughout the compiler in places I think makes the code more readable.
2019-12-06Do not ICE on async fn with non-Copy infered type argEsteban Küber-9/+10
Fix #66958.
2019-12-06const-prop: Restrict scalar pair propagationÖmer Sinan Ağacan-11/+37
We now only propagate a scalar pair if the Rvalue is a tuple with two scalars. This for example avoids propagating a (u8, u8) value when Rvalue has type `((), u8, u8)` (see the regression test). While this is a correct thing to do, implementation is tricky and will be done later. Fixes #66971 Fixes #66339 Fixes #67019
2019-12-07Rollup merge of #66988 - osa1:issue66985, r=matthewjasperYuki Okushi-1/+1
Fix angle bracket formatting when dumping MIR debug vars Fixes #66985
2019-12-06Fix rebase issuesvarkor-3/+2
2019-12-06Rename to `then_some` and `then`varkor-9/+9
2019-12-06Use `to_option` in various placesvarkor-33/+17
2019-12-06appease the vociferous tidyRemy Rakic-7/+22
2019-12-06Implement subset errors using PoloniusRemy Rakic-18/+172
- switches to using the Naive variant by default - emits subset errors or propagates unsatisfied obligations to the caller
2019-12-06Polonius: emit `placeholder` and `known_subset` facts, as inputs to the ↵Remy Rakic-0/+32
subset error computation
2019-12-06UniversalRegionRelations: add a way to list the base non-transitive ↵Remy Rakic-0/+5
`outlives` constraints
2019-12-06update to polonius 0.11 to compute subset errorslqd-14/+23
- adapt to the new polonius `FactTypes` API - reorganize the type aliases referring to polonius to avoid referencing the inner atom or fact types multiple times: only one input and output types should be enough for everyone. They could equally be in `borrow_check` as `nll` though.
2019-12-05`#[track_caller]` suppresses MIR inlining.Adam Perry-0/+5
2019-12-05Generate &core::panic::Location type in a single place.Adam Perry-6/+1
2019-12-05Implement #[track_caller] in const.Adam Perry-0/+23
2019-12-05rustc_mir: Fix tidy line lengthsPaul Daniel Faria-2/+8
2019-12-05rustc: Apply clearer naming to BodyAndCache, fix Deref impl, remove unneeded ↵Paul Daniel Faria-161/+161
Index impl, remove body fn rustc_codegen_ssa: Fix BodyAndCache reborrow to Body and change instances of body() call to derefence rustc_mir: Fix BodyAndCache reborrow to Body and change intances of body() call to derefence
2019-12-06Auto merge of #66911 - eddyb:nicer-rustc_regions, r=matthewjasperbors-12/+10
rustc_mir: use nicer path printing for #[rustc_regions] NLL tests. Similar to #66850, spotted while working on #66907. r? @matthewjasper
2019-12-05Rollup merge of #67055 - lqd:const_qualif, r=oli-obkMazdak Farrokhzad-1/+6
Make const-qualification look at more `const fn`s As explained in a lot more detail in #67053 this makes const-qualification not ignore the unstable const fns in libcore. r? @oli-obk cc @ecstatic-morse (Still a bit unsure about the `cfg`s here, for bootstrapping, does that seem correct ?) Fixes #67053.
2019-12-05update comment to explain the importance of this check more clearlyRemy Rakic-2/+3
2019-12-05Auto merge of #66815 - mark-i-m:simplify-borrow_check-errors, r=Dylan-DPCbors-110/+130
Reorganize borrow check diagnostic code Currently borrow checker diagnostics are split across many different modules in different places in the `librustc_mir` crate. This moves them all to a `diagnostics` module. This also reduces the nesting of the modules a bit (sooo much nesting). I am also thinking of moving stuff out of the `nll` module since we only have one borrow checker now (:tada:), and maybe it even makes sense to split out all of this stuff to a `librustc_borrow_check`, but those are for the future. Feel free to ping me here or on zulip and let me know what you think... cc @nikomatsakis @matthewjasper @eddyb
2019-12-05make const-qualif look at more `const fn`sRemy Rakic-1/+5
the unstables ones in libcore, with the unstable feature disabled, were not checked
2019-12-04Auto merge of #66866 - oli-obk:const_fn_memoization, r=RalfJungbors-19/+20
Only memoize const fn calls during const eval Miri and other engines may want to execute the function in order to detect UB inside of them. r? @RalfJung
2019-12-04SimplifyNadrieril-18/+13
2019-12-04Only special-case empty matches when `exhaustive_patterns` is offNadrieril-17/+14
When the feature is on, the special casing is not needed. That way when we stabilize the feature this `if` can just be removed.
2019-12-04Move empty_match check after usefulness checkNadrieril-41/+39
2019-12-04Reuse `adt_defined_here`Nadrieril-8/+4
2019-12-04Move empty match check to `check_exhaustive`Nadrieril-53/+56
2019-12-04SimplifyNadrieril-22/+24
2019-12-04Use the default code path to list missing patternsNadrieril-32/+19
This uses the exact same code path that would be used for `match x { _ if false => {} }`, since in both cases the resulting matrix is empty. Since we think the behaviour in that case is ok, then we can remove the special case and use the default code path.
2019-12-04List missing constructors in an almost empty matchNadrieril-6/+14
Actually empty matches are still handled by a different code path