about summary refs log tree commit diff
path: root/compiler/rustc_mir_build/src/thir
AgeCommit message (Collapse)AuthorLines
2023-11-02Factor out pointing at ADT definitionNadrieril-44/+41
2023-11-02Always do all the pattern checksNadrieril-60/+60
2023-11-02Tweak diagnostic for consistencyNadrieril-4/+2
2023-11-02Check pattern error while loweringNadrieril-42/+29
2023-11-02Uncomplicate check_let_chainNadrieril-45/+35
2023-11-02ReorderNadrieril-148/+151
2023-11-01Auto merge of #114208 - GKFX:offset_of_enum, r=wesleywiserbors-1/+1
Support enum variants in offset_of! This MR implements support for navigating through enum variants in `offset_of!`, placing the enum variant name in the second argument to `offset_of!`. The RFC placed it in the first argument, but I think it interacts better with nested field access in the second, as you can then write things like ```rust offset_of!(Type, field.Variant.field) ``` Alternatively, a syntactic distinction could be made between variants and fields (e.g. `field::Variant.field`) but I'm not convinced this would be helpful. [RFC 3308 # Enum Support](https://rust-lang.github.io/rfcs/3308-offset_of.html#enum-support-offset_ofsomeenumstructvariant-field_on_variant) Tracking Issue #106655.
2023-11-01Auto merge of #116692 - Nadrieril:half-open-ranges, r=cjgillotbors-272/+378
Match usize/isize exhaustively with half-open ranges The long-awaited finale to the saga of [exhaustiveness checking for integers](https://github.com/rust-lang/rust/pull/50912)! ```rust match 0usize { 0.. => {} // exhaustive! } match 0usize { 0..usize::MAX => {} // helpful error message! } ``` Features: - Half-open ranges behave as expected for `usize`/`isize`; - Trying to use `0..usize::MAX` will tell you that `usize::MAX..` is missing and explain why. No more unhelpful "`_` is missing"; - Everything else stays the same. This should unblock https://github.com/rust-lang/rust/issues/37854. Review-wise: - I recommend looking commit-by-commit; - This regresses perf because of the added complexity in `IntRange`; hopefully not too much; - I measured each `#[inline]`, they all help a bit with the perf regression (tho I don't get why); - I did not touch MIR building; I expect there's an easy PR there that would skip unnecessary comparisons when the range is half-open.
2023-10-31Support enum variants in offset_of!George Bateman-1/+1
2023-10-30Some more coroutine renamingsMichael Goulet-4/+9
2023-10-30Correctly handle nested or-patterns in column-wise analysesNadrieril-1/+1
2023-10-30remove some dead codeRalf Jung-10/+0
2023-10-28also lint against fn ptr and raw ptr nested inside the constRalf Jung-13/+9
2023-10-28patterns: reject raw pointers that are not just integersRalf Jung-8/+25
2023-10-27Make IntRange exclusiveNadrieril-57/+65
2023-10-27s/to_pat/to_diagnostic_pat/Nadrieril-18/+24
2023-10-27Match usize/isize exhaustivelyNadrieril-50/+113
2023-10-27Propagate half-open ranges through exhaustiveness checkingNadrieril-102/+158
2023-10-27Inline `RangeInclusive` into `IntRange`Nadrieril-41/+33
2023-10-27Don't use `IntRange` for booleansNadrieril-14/+56
2023-10-27Propagate half-open ranges through THIRNadrieril-15/+16
2023-10-27Abstract over `PatRange` boundary valueNadrieril-90/+28
2023-10-27Handle `ty::Opaque` correctlyNadrieril-1/+16
2023-10-27Lint overlapping ranges as a separate passNadrieril-89/+91
2023-10-27Abstract over per-column pattern traversalNadrieril-36/+77
2023-10-26Auto merge of #113262 - Nilstrieb:rawr-casting, r=lcnrbors-19/+13
Never consider raw pointer casts to be trival HIR typeck tries to figure out which casts are trivial by doing them as coercions and seeing whether this works. Since HIR typeck is oblivious of lifetimes, this doesn't work for pointer casts that only change the lifetime of the pointee, which are, as borrowck will tell you, not trivial. This change makes it so that raw pointer casts are never considered trivial. This also incidentally fixes the "trivial cast" lint false positive on the same code. Unfortunately, "trivial cast" lints are now never emitted on raw pointer casts, even if they truly are trivial. This could be fixed by also doing the lint in borrowck for raw pointers specifically. fixes #113257
2023-10-25Use let chains instead of let elseNilstrieb-19/+13
This makes it more obvious that we're looking at a special case.
2023-10-25Auto merge of #116482 - matthewjasper:thir-unsafeck-inline-constants, r=b-naberbors-18/+40
Fix inline const pattern unsafety checking in THIR Fix THIR unsafety checking of inline constants. - Steal THIR in THIR unsafety checking (if enabled) instead of MIR lowering. - Represent inline constants in THIR patterns.
2023-10-21Fix #117033Nadrieril-0/+3
2023-10-21Auto merge of #116734 - Nadrieril:lint-per-column, r=cjgillotbors-241/+324
Lint `non_exhaustive_omitted_patterns` by columns This is a rework of the `non_exhaustive_omitted_patterns` lint to make it more consistent. The intent of the lint is to help consumers of `non_exhaustive` enums ensure they stay up-to-date with all upstream variants. This rewrite fixes two cases we didn't handle well before: First, because of details of exhaustiveness checking, the following wouldn't lint `Enum::C` as missing: ```rust match Some(x) { Some(Enum::A) => {} Some(Enum::B) => {} _ => {} } ``` Second, because of the fundamental workings of exhaustiveness checking, the following would treat the `true` and `false` cases separately and thus lint about missing variants: ```rust match (true, x) { (true, Enum::A) => {} (true, Enum::B) => {} (false, Enum::C) => {} _ => {} } ``` Moreover, it would correctly not lint in the case where the pair is flipped, because of asymmetry in how exhaustiveness checking proceeds. A drawback is that it no longer makes sense to set the lint level per-arm. This will silently break the lint for current users of it (but it's behind a feature gate so that's ok). The new approach is now independent of the exhaustiveness algorithm; it's a separate pass that looks at patterns column by column. This is another of the motivations for this: I'm glad to move it out of the algorithm, it was akward there. This PR is almost identical to https://github.com/rust-lang/rust/pull/111651. cc `@eholk` who reviewed it at the time. Compared to then, I'm more confident this is the right approach.
2023-10-20s/Generator/Coroutine/Oli Scherer-4/+4
2023-10-16Address review commentsMatthew Jasper-24/+31
Clean up code and add comments. Use InlineConstant to wrap range patterns.
2023-10-16Fix inline const pattern unsafety checking in THIRMatthew Jasper-4/+19
THIR unsafety checking was getting a cycle of function unsafety checking -> building THIR for the function -> evaluating pattern inline constants in the function -> building MIR for the inline constant -> checking unsafety of functions (so that THIR can be stolen) This is fixed by not stealing THIR when generating MIR but instead when unsafety checking. This leaves an issue with pattern inline constants not being unsafety checked because they are evaluated away when generating THIR. To fix that we now represent inline constants in THIR patterns and visit them in THIR unsafety checking.
2023-10-15Rollup merge of #116522 - bvanjoi:fix-115599, r=oli-obkMatthias Krüger-0/+8
use `PatKind::Error` when an ADT const value has violation Fixes #115599 Since the [to_pat](https://github.com/rust-lang/rust/pull/111913/files#diff-6d8d99538aca600d633270051580c7a9e40b35824ea2863d9dda2c85a733b5d9R126-R155) behavior has been changed in the #111913 update, the kind of `inlined_const_ast_pat` has transformed from `PatKind::Leaf { pattern: Pat { kind: Wild, ..} } ` to `PatKind::Constant`. This caused a scenario where there are no matched candidates, leading to a testing of the candidates. This process ultimately attempts to test the string const, triggering the `bug!` invocation finally. r? ``@oli-obk``
2023-10-15Auto merge of #116688 - compiler-errors:rustfmt-up, r=WaffleLapkin,Nilstriebbors-59/+83
Format all the let-chains in compiler crates Since rust-lang/rustfmt#5910 has landed, soon we will have support for formatting let-chains (as soon as rustfmt syncs and beta gets bumped). This PR applies the changes [from master rustfmt to rust-lang/rust eagerly](https://rust-lang.zulipchat.com/#narrow/stream/122651-general/topic/out.20formatting.20of.20prs/near/374997516), so that the next beta bump does not have to deal with a 200+ file diff and can remain concerned with other things like `cfg(bootstrap)` -- #113637 was a pain to land, for example, because of let-else. I will also add this commit to the ignore list after it has landed. The commands that were run -- I'm not great at bash-foo, but this applies rustfmt to every compiler crate, and then reverts the two crates that should probably be formatted out-of-tree. ``` ~/rustfmt $ ls -1d ~/rust/compiler/* | xargs -I@ cargo run --bin rustfmt -- `@/src/lib.rs` --config-path ~/rust --edition=2021 # format all of the compiler crates ~/rust $ git checkout HEAD -- compiler/rustc_codegen_{gcc,cranelift} # revert changes to cg-gcc and cg-clif ``` cc `@rust-lang/rustfmt` r? `@WaffleLapkin` or `@Nilstrieb` who said they may be able to review this purely mechanical PR :> cc `@Mark-Simulacrum` and `@petrochenkov,` who had some thoughts on the order of operations with big formatting changes in https://github.com/rust-lang/rust/pull/95262#issue-1178993801. I think the situation has changed since then, given that let-chains support exists on master rustfmt now, and I'm fairly confident that this formatting PR should land even if *bootstrap* rustfmt doesn't yet format let-chains in order to lessen the burden of the next beta bump.
2023-10-15use `PatKind::error` when an ADT const value has violationbohan-0/+8
2023-10-14Lint `non_exhaustive_omitted_patterns` per columnNadrieril-78/+128
2023-10-14Distinguish user patterns from reconstructed witnessesNadrieril-165/+198
2023-10-14Skip most of check_match checks in the presence of `PatKind::Error`Nadrieril-7/+19
2023-10-14Use `PatKind::Error` instead of `PatKind::Wild` to report errorsNadrieril-22/+25
2023-10-14Propagate pattern errors via a new `PatKind::Error` variantNadrieril-17/+17
Instead of via `Const::new_error`
2023-10-13Bless tests and new warnings due to formatting changesMichael Goulet-1/+1
2023-10-13Format all the let chains in compilerMichael Goulet-59/+83
2023-10-12Auto merge of #116391 - Nadrieril:constructorset, r=cjgillotbors-581/+665
exhaustiveness: Rework constructor splitting `SplitWildcard` was pretty opaque. I replaced it with a more legible abstraction: `ConstructorSet` represents the set of constructors for patterns of a given type. This clarifies responsibilities: `ConstructorSet` handles one clear task, and diagnostic-related shenanigans can be done separately. I'm quite excited, I had has this in mind for years but could never quite introduce it. This opens up possibilities, including type-specific optimisations (like using a `FxHashSet` to collect enum variants, which had been [hackily attempted some years ago](https://github.com/rust-lang/rust/pull/76918)), my one-pass rewrite (https://github.com/rust-lang/rust/pull/116042), and future librarification.
2023-10-11Remember the `ErrorReported` used to silence follow up errors instead of ↵Oli Scherer-13/+15
recreating it with `delay_span_bug`
2023-10-11Avoid emitting the non_exhaustive error if other errors already occurredOli Scherer-1/+7
2023-10-11Prevent spurious `unreachable pattern` lintsOli Scherer-26/+35
Means you'll get more `non-exhaustive` patterns
2023-10-11Fix range overflow checkingNadrieril-31/+63
2023-10-11Rework error handling when lowering range endpointsNadrieril-114/+87
2023-10-05Fix handling slices of empty typesNadrieril-8/+21