summary refs log tree commit diff
path: root/compiler/rustc_mir_build/src
AgeCommit message (Collapse)AuthorLines
2021-02-05Run x.py fmt to fix tidy issuesWesley Wiser-22/+19
2021-02-04Revert "Simplify unscheduling of drops after moves"Felix S. Klock II-13/+25
This reverts commit b766abc88f78f36193ddefb1079dbc832346b358.
2021-02-04Revert "Use `record_operands_moved` more aggresively"Felix S. Klock II-15/+3
This reverts commit 7f3e8551dde7f14641618cdb8fda2f99ff1d74b6.
2021-02-04Revert "Avoid leaking block expression values"Felix S. Klock II-284/+150
This reverts commit 4fef39113a514bb270f5661a82fdba17d3e41dbb.
2021-02-02Bump rustfmt versionMark Rousskov-90/+108
Also switches on formatting of the mir build module
2021-02-01Rollup merge of #81364 - camelid:improve-build-matches-docs, r=varkorJonas Schievink-55/+74
Improve `rustc_mir_build::matches` docs - Fix typos - Add more information - General cleanup
2021-01-31Update outdated commentCamelid-3/+3
The highest-priority item is the *first* in the list, not the last. See [this code][1] for more. [this code]: https://github.com/rust-lang/rust/blob/0e63af5da3400ace48a0345117980473fd21ad73/compiler/rustc_mir_build/src/build/matches/mod.rs#L1334-L1335
2021-01-31Rollup merge of #80092 - sexxi-goose:restrict_precision, r=nikomatsakisJonas Schievink-10/+1
2229: Fix issues with move closures and mutability This PR fixes two issues when feature `capture_disjoint_fields` is used. 1. Can't mutate using a mutable reference 2. Move closures try to move value out through a reference. To do so, we 1. Compute the mutability of the capture and store it as part of the `CapturedPlace` that is written in TypeckResults 2. Restrict capture precision. Note this is temporary for now, to allow the feature to be used with move closures and ByValue captures and might change depending on discussions with the lang team. - No Derefs are captured for ByValue captures, since that will result in value behind a reference getting moved. - No projections are applied to raw pointers since these require unsafe blocks. We capture them completely. r? `````@nikomatsakis`````
2021-01-30Rollup merge of #81291 - ↵Yuki Okushi-5/+10
sexxi-goose:fix-struct-update-functional-record-update-syntax-error, r=nikomatsakis Support FRU pattern with `[feature(capture_disjoint_fields)]` In case of a functional record update syntax for creating a structure, `ExprUseVisitor` to only detect the precise use of some of the field in the `..x` part of the syntax. However, when we start building MIR, we 1. First, build the place for `x` 2. and then, add precise field projections so that only some parts of `x` end up getting read. When `capture_disjoint_fields` is enabled, and FRU is used within a closure `x` won't be completely captured, and therefore the first step will fail. This PR updates `mir_build` to create a place builder in the first step and then create place from the builder only after applying the field projection. Closes https://github.com/rust-lang/project-rfc-2229/issues/32 r? ``````@nikomatsakis``````
2021-01-29Compute mutability of closure capturesAman Arora-10/+1
When `capture_disjoint_fields` is not enabled, checking if the root variable binding is mutable would suffice. However with the feature enabled, the captured place might be mutable because it dereferences a mutable reference. This PR computes the mutability of each capture after capture analysis in rustc_typeck. We store this in `ty::CapturedPlace` and then use `ty::CapturedPlace::mutability` in mir_build and borrow_check.
2021-01-28Rollup merge of #79951 - LeSeulArtichaut:ty-ir, r=nikomatsakisYuki Okushi-18/+14
Refractor a few more types to `rustc_type_ir` In the continuation of #79169, ~~blocked on that PR~~. This PR: - moves `IntVarValue`, `FloatVarValue`, `InferTy` (and friends) and `Variance` - creates the `IntTy`, `UintTy` and `FloatTy` enums in `rustc_type_ir`, based on their `ast` and `chalk_ir` equilavents, and uses them for types in the rest of the compiler. ~~I will split up that commit to make this easier to review and to have a better commit history.~~ EDIT: done, I split the PR in commits of 200-ish lines each r? `````@nikomatsakis````` cc `````@jackh726`````
2021-01-24Improve `rustc_mir_build::matches` docsCamelid-53/+72
- Fix typos - Add more information - General cleanup
2021-01-22Make functional record update/struct update syntax works inside closures ↵Dhruv Jauhar-5/+10
when feature capture_disjoint_fields is enabled
2021-01-21Add loop head span to hirEsteban Küber-3/+1
2021-01-18Use ty::{IntTy,UintTy,FloatTy} in rustcLeSeulArtichaut-18/+14
2021-01-18Fix typo in simplify.rsIkko Ashimine-1/+1
prexisting -> preexisting
2021-01-16Auto merge of #80290 - RalfJung:less-intrinsic-write, r=lcnrbors-74/+34
implement ptr::write without dedicated intrinsic This makes `ptr::write` more consistent with `ptr::write_unaligned`, `ptr::read`, `ptr::read_unaligned`, all of which are implemented in terms of `copy_nonoverlapping`. This means we can also remove `move_val_init` implementations in codegen and Miri, and its special handling in the borrow checker. Also see [this Zulip discussion](https://rust-lang.zulipchat.com/#narrow/stream/131828-t-compiler/topic/ptr.3A.3Aread.20vs.20ptr.3A.3Awrite).
2021-01-14Use Option::map_or instead of `.map(..).unwrap_or(..)`LingMan-1/+1
2021-01-14Auto merge of #79328 - c410-f3r:hir-if, r=matthewjasperbors-1/+48
Reintroduce hir::ExprKind::If Basically copied and paste #59288/https://github.com/rust-lang/rust-clippy/pull/4080 with some modifications. The vast majority of tests were fixed and now there are only a few remaining. Since I am still unable to figure out the missing pieces, any help with the following list is welcome. - [ ] **Unnecessary `typeck` exception**: [Cheated on this one to make CI green.](https://github.com/rust-lang/rust/pull/79328/files#diff-3faee9ba23fc54a12b7c43364ba81f8c5660045c7e1d7989a02a0cee1c5b2051) - [x] **Incorrect span**: [Span should reference `then` and `else` separately.](https://github.com/rust-lang/rust/pull/79328/files#diff-cf2c46e82222ee4b1037a68fff8a1af3c4f1de7a6b3fd798aacbf3c0475abe3d) - [x] **New note regarding `assert!`**: [Modified but not "wrong". Maybe can be a good thing?](https://github.com/rust-lang/rust/pull/79328/files#diff-9e0d7c89ed0224e2b62060c957177c27db43c30dfe3c2974cb6b5091cda9cfb5) - [x] **Inverted report location**: [Modified but not "wrong". Locations were inverted.](https://github.com/rust-lang/rust/pull/79328/files#diff-f637ce7c1f68d523a165aa9651765df05e36c4d7d279194b1a6b28b48a323691) - [x] **`src/test/ui/point-to-type-err-cause-on-impl-trait-return.rs` has weird errors**: [Not sure why this is happening.](https://github.com/rust-lang/rust/pull/79328/files#diff-c823c09660f5b112f95e97e8ff71f1797b6c7f37dbb3d16f8e98bbaea8072e95) - [x] **Missing diagnostic**: [???](https://github.com/rust-lang/rust/pull/79328/files#diff-6b8ab09360d725ba4513933827f9796b42ff9522b0690f80b76de067143af2fc)
2021-01-13Rollup merge of #80232 - bugadani:roundtrip, r=estebankDylan DPC-2/+1
Remove redundant def_id lookups Simplify `DefId -> LocalDefId -> HirId -> LocalDefId -> DefId` chains.
2021-01-07Reintroduce hir::ExprKind::IfCaio-1/+48
2021-01-03Add note to non-exhaustive match on reference to emptyDaniel Noom-0/+5
Rust prints "type `&A` is non-empty" even is A is empty. This is the intended behavior, but can be confusing. This commit adds a note to non-exhaustive pattern errors if they are a reference to something uninhabited. I did not add tests to check that the note is not shown for non-references or inhabited references, because this is already done in other tests. Maybe the added test is superfluous, because `always-inhabited-union-ref` already checks for this case. This does not handle &&Void or &&&void etc. I could add those as special cases as well and ignore people who need quadruple references. Fixes #78123
2020-12-31remove move_val_init leftoversRalf Jung-74/+34
2020-12-30Rollup merge of #80495 - jyn514:rename-empty, r=petrochenkovMara Bos-1/+1
Rename kw::Invalid -> kw::Empty See https://rust-lang.zulipchat.com/#narrow/stream/182449-t-compiler.2Fhelp/topic/Is.20there.20a.20symbol.20for.20the.20empty.20string.3F/near/220054471 for context. r? `@petrochenkov`
2020-12-30Rename kw::Invalid -> kw::EmptyJoshua Nelson-1/+1
See https://rust-lang.zulipchat.com/#narrow/stream/182449-t-compiler.2Fhelp/topic/Is.20there.20a.20symbol.20for.20the.20empty.20string.3F/near/220054471 for context.
2020-12-30Rollup merge of #80509 - matthiaskrgr:ptr_arg, r=varkorYuki Okushi-3/+3
where possible, pass slices instead of &Vec or &String (clippy::ptr_arg)
2020-12-30where possible, pass slices instead of &Vec or &String (clippy::ptr_arg)Matthias Krüger-3/+3
2020-12-30Rollup merge of #80348 - matthiaskrgr:less_clones, r=Dylan-DPCYuki Okushi-2/+2
remove redundant clones (clippy::redundant_clone)
2020-12-24use matches!() macro in more placesMatthias Krüger-5/+1
2020-12-24remove redundant clones (clippy::redundant_clone)Matthias Krüger-2/+2
2020-12-22Fix a commentNadrieril-4/+4
2020-12-22Apply suggestions from code reviewNadrieril-14/+15
Co-authored-by: varkor <github@varkor.com>
2020-12-22Simplify field filteringNadrieril-64/+56
2020-12-22Make the special "missing patterns" constructor realNadrieril-64/+57
2020-12-22Completely rework the explanation of the algorithmNadrieril-285/+324
2020-12-22Pass `Matrix` explicitly instead of via `PatCtxt`Nadrieril-27/+48
2020-12-22Inline the constructor-specific `split` functionsNadrieril-34/+19
2020-12-22Inline `all_constructors`Nadrieril-121/+115
2020-12-22Rebrand `MissingConstructors` as `SplitWildcard`Nadrieril-49/+67
2020-12-22Factor out `SplitVarLenSlice` used for slice splittingNadrieril-105/+117
2020-12-22Run the annoying lint separatelyNadrieril-54/+43
2020-12-22Factor out `SplitIntRange` used for integer range splittingNadrieril-89/+110
2020-12-22Auto merge of #78242 - Nadrieril:rename-overlapping_endpoints-lint, r=varkorbors-9/+9
Rename `overlapping_patterns` lint As discussed in https://github.com/rust-lang/rust/issues/65477. I also tweaked a few things along the way. r? `@varkor` `@rustbot` modify labels: +A-exhaustiveness-checking
2020-12-20Remove redundant def_id lookupsDániel Buga-2/+1
2020-12-19Auto merge of #80104 - Nadrieril:usefulness-merging, r=varkorbors-114/+185
Improve and fix diagnostics of exhaustiveness checking Primarily, this fixes https://github.com/rust-lang/rust/issues/56379. This also fixes incorrect interactions between or-patterns and slice patterns that I discovered while working on #56379. Those two examples show the incorrect diagnostics: ```rust match &[][..] { [true] => {} [true // detected as unreachable but that's not true | false, ..] => {} _ => {} } match (true, None) { (true, Some(_)) => {} (false, Some(true)) => {} (true | false, None | Some(true // should be detected as unreachable | false)) => {} } ``` I did not measure any perf impact. However, I suspect that [`616ba9f`](https://github.com/rust-lang/rust/pull/80104/commits/616ba9f9f7f5845777a36e1a41a515e6c33a8776) should have a negative impact on large or-patterns. I'll see what the perf run says; I have optimization ideas up my sleeve if needed. EDIT: I initially had a noticeable perf impact that I thought unavoidable. I then proceeded to avoid it x) r? `@varkor` `@rustbot` label +A-exhaustiveness-checking
2020-12-19Tweak diagnosticsNadrieril-3/+2
2020-12-18Unify the two kinds of usefulness mergingNadrieril-63/+35
This is elegant but a bit of a perf gamble. That said, or-patterns rarely have many branches and it's easy to optimize or revert if we ever need to. In the meantime simpler code is worth it.
2020-12-18Merge unreachable subpatterns correctlyNadrieril-3/+28
2020-12-18Keep all witnesses of non-exhaustivenessNadrieril-27/+37
2020-12-18Rewrite usefulness merging using `SpanSet`Nadrieril-65/+114
`SpanSet` is heavily inspired from `DefIdForest`.