Commit Graph

318900 Commits

Author SHA1 Message Date
Guillaume Gomez 36116e3c9b Create new diag_lint_level function, aiming to replace lint_level once all LintDiagnostic items have been removed 2026-02-21 13:35:13 +01:00
Guillaume Gomez bb2d55e2ec Add new MultiSpan methods: push_primary_span, push_span_diag and span_labels_raw 2026-02-21 12:46:53 +01:00
bors 59fd4ef94d Auto merge of #152747 - nnethercote:bring-back-enum-DepKind, r=Zalathar
Bring back `enum DepKind`.

*[View all comments](https://triagebot.infra.rust-lang.org/gh-comments/rust-lang/rust/pull/152747)*

It was removed in rust-lang/rust#115920 to enable it being moved to `rustc_query_system`, a move that has recently been reversed. It's much simpler as an enum.

r? @Zalathar
2026-02-20 06:07:20 +00:00
bors ef70767064 Auto merge of #152689 - scottmcm:also-simplify-of-sized-val-alt, r=cjgillot
Simplify `size/align_of_val<T: Sized>` to `size/align_of<T>` instead

This is relevant to things like `Box<[u8; 1024]>` where the drop looks at the `size_of_val` (since obviously it might be DST in general) but where we don't actually need to do that since it's always that same value for the `Sized` type.

(Equivalent to rust-lang/rust#152681, but flipped in the rebase so it can land before rust-lang/rust#152641 instead of depending on it.)
2026-02-19 22:03:50 +00:00
bors 7f99507f57 Auto merge of #149375 - oli-obk:const_typeck, r=fee1-dead
Perform many const checks in typeck

Some smaller diagnostic changes, the biggest ones avoided by https://github.com/rust-lang/rust/pull/148641

We should be able to move various checks in mir const checking to using `span_bug!` instead of reporting an error, just like mir typeck does as a sanity check. I would like to start doing so separately though, as this PR is a big enough (in what effects it causes, pun intended).

r? @fee1-dead
2026-02-19 18:41:36 +00:00
bors b6bed6f2d9 Auto merge of #152839 - JonathanBrouwer:rollup-iPaprtK, r=JonathanBrouwer
Rollup of 9 pull requests

Successful merges:

 - rust-lang/rust#151733 (Use function shims to make sure EII works on apple targets)
 - rust-lang/rust#152558 (rustc_expand: improve diagnostics for non-repeatable metavars in repetition)
 - rust-lang/rust#152596 (Make all multipart suggestions verbose)
 - rust-lang/rust#152815 (Add CURRENT_RUSTC_VERSION support for Clippy)
 - rust-lang/rust#152733 (Port #[rustc_doc_primitive] to the new attribute parser)
 - rust-lang/rust#152817 (Update enzyme submodule to match upstream)
 - rust-lang/rust#152819 (explicitly show behavior of <_>::assoc_fn)
 - rust-lang/rust#152823 (fix stale comments left over from ed3711e)
 - rust-lang/rust#152824 (Enable "View all comments" link feature in `triagebot.toml`)
2026-02-19 14:07:01 +00:00
Jonathan Brouwer cad5b1a46f Rollup merge of #152824 - Urgau:triagebot-view-all-comments, r=Kobzol
Enable "View all comments" link feature in `triagebot.toml`

This PR enables triagebot "View all comments" link feature.

Documentation: https://forge.rust-lang.org/triagebot/view-all-comments-link.html

Example for this PR: [View all comments](https://triage.rust-lang.org/gh-comments/rust-lang/rust/issues/152824)
2026-02-19 10:56:41 +01:00
Jonathan Brouwer 8f8af0b5ba Rollup merge of #152823 - Zeromemer:fix-stale-comments, r=jhpratt
fix stale comments left over from ed3711e

Remove stale overflow comments in core::str.

Commit ed3711ea introduced stale comments in library/core/src/str/iter.rs.

Prior to that commit, the comments explained why `(len + 3)` and `(len + 2)` couldn't overflow.
Since the code now uses `div_ceil`, these specific overflow justifications are no longer relevant to the current implementation.
2026-02-19 10:56:40 +01:00
Jonathan Brouwer f17139477b Rollup merge of #152819 - yaahc:explicit_probe_assembly, r=Kivooeo
explicitly show behavior of <_>::assoc_fn

Inspired by a conversation with @lcnr about type relative name resolution.

From lcnr:

> and i hate the fact that this match isn't exhaustive (hiding the behavior for `<_>::assoc_fn` https://github.com/rust-lang/rust/blob/13c38730d981289cc7ae4cc109fd7756bf83ee67/compiler/rustc_hir_typeck/src/method/probe.rs#L893

This PR changes that match to be exhaustive.
2026-02-19 10:56:40 +01:00
Jonathan Brouwer 8b74e12f3e Rollup merge of #152817 - ZuseZ4:update-enzyme-to-main, r=Kobzol
Update enzyme submodule to match upstream

For a while we were carying one extra commit to handle static builds on macos. That commit got upstreamed, so we can drop it (and update to a newer Enzyme while at it).

r? @Kobzol
Can I get a rollup, please?
2026-02-19 10:56:39 +01:00
Jonathan Brouwer 9a90ad485e Rollup merge of #152733 - Ozzy1423:attr-doc, r=jdonszelmann
Port #[rustc_doc_primitive] to the new attribute parser

Tracking issue: https://github.com/rust-lang/rust/issues/131229

r? @JonathanBrouwer
2026-02-19 10:56:39 +01:00
Jonathan Brouwer 6b227bb187 Rollup merge of #152815 - blyxyas:current-rustc-version-clippy, r=Mark-Simulacrum
Add CURRENT_RUSTC_VERSION support for Clippy

We've been talking about this since Sept. 2022, finally decided to add the dreaded 1-line diff.

cc https://rust-lang.zulipchat.com/#narrow/channel/257328-clippy/topic/Using.20CURRENT_RUSTC_VERSION.20in.20clippy.3A.3Aversion.3F/with/516468805

cc https://rust-lang.zulipchat.com/#narrow/channel/257328-clippy/topic/Use.20CURRENT_RUSTC_VERSION.20for.20version.20attribute/with/299900715

Overrides the currently unmerged rust-lang/rust-clippy#14299

cc @rust-lang/clippy

---

This PR does not modify in any way the needed behaviour of T-Release when releasing (I hope)
2026-02-19 10:56:38 +01:00
Jonathan Brouwer 9330931a2b Rollup merge of #152596 - estebank:multipart_suggestions, r=petrochenkov
Make all multipart suggestions verbose

The ShowAlways style of suggestions is usually easier to understand than the inline style.
2026-02-19 10:56:37 +01:00
Jonathan Brouwer 610e63b9ba Rollup merge of #152558 - Unique-Usman:ua/decmacrorepeatable, r=estebank
rustc_expand: improve diagnostics for non-repeatable metavars in repetition

Enhance `NoSyntaxVarsExprRepeat` by suggesting similarly named metavariables, distinguishing repeatable vs non-repeatable bindings, and listing available repeatable variables when no match exists.
2026-02-19 10:56:37 +01:00
Jonathan Brouwer 46126ac931 Rollup merge of #151733 - jdonszelmann:eii-on-apple, r=oli-obk
Use function shims to make sure EII works on apple targets

Use function shims to make sure EII works on apple targets (and generally accepts target-arch attributes)

Explainer: https://github.com/rust-lang/rust/pull/146348#issuecomment-3631810110
Tracking issue: https://github.com/rust-lang/rust/issues/125418
2026-02-19 10:56:36 +01:00
bors 41198cb965 Auto merge of #148034 - dianqk:matchbr-copy, r=cjgillot
Simplify the canonical enum clone branches to a copy statement

I have overhauled MatchBranchSimplification in this PR. This pass tries to unify statements one by one, which is more readable and extensible.

This PR also unifies the following pattern that is mostly generated by GVN into one basic block that contains the copy statement:

```rust
match a {
    Foo::A(_) => *a,
    Foo::B => Foo::B
}
```

Fixes https://github.com/rust-lang/rust/issues/128081.
2026-02-19 09:56:26 +00:00
bors fbd6934114 Auto merge of #152825 - JonathanBrouwer:rollup-0YvwE70, r=JonathanBrouwer
Rollup of 18 pull requests

Successful merges:

 - rust-lang/rust#152799 (Subtree sync for rustc_codegen_cranelift)
 - rust-lang/rust#152814 (stdarch subtree update)
 - rust-lang/rust#151059 (x86: support passing `u128`/`i128` to inline assembly)
 - rust-lang/rust#152097 (Suggest local variables for captured format args)
 - rust-lang/rust#152734 (Respect the `--ci` flag in more places in bootstrap)
 - rust-lang/rust#151703 (Fix ICE in transmutability error reporting when type aliases are normalized)
 - rust-lang/rust#152173 (Reflection TypeKind::FnPtr)
 - rust-lang/rust#152564 (Remove unnecessary closure.)
 - rust-lang/rust#152628 (tests: rustc_public: Check const allocation for all variables (1 of 11 was missing))
 - rust-lang/rust#152658 (compiletest: normalize stderr before SVG rendering)
 - rust-lang/rust#152766 (std::r#try! - avoid link to nightly docs)
 - rust-lang/rust#152780 (Remove some clones in deriving)
 - rust-lang/rust#152787 (Add a mir-opt test for alignment check generation [zero changes outside tests])
 - rust-lang/rust#152790 (Fix incorrect target in aarch64-unknown-linux-gnu docs)
 - rust-lang/rust#152792 (Fix an ICE while checking param env shadowing on an erroneous trait impl)
 - rust-lang/rust#152793 (Do no add -no-pie on Windows)
 - rust-lang/rust#152803 (Avoid delayed-bug ICE for malformed diagnostic attrs)
 - rust-lang/rust#152806 (interpret: fix comment typo)
2026-02-19 04:18:20 +00:00
Nicholas Nethercote 1c8abe6d26 Adjust a module visibility. 2026-02-19 09:05:39 +11:00
Nicholas Nethercote baa74a85ee Remove DepKind name plumbing.
There is a bunch of plumbing to record the string `"foo"` for each
variant `DepKind::foo`. But that's what the `Debug `impl` now produces.
So this commit removes the plumbing.
2026-02-19 09:05:39 +11:00
Nicholas Nethercote c4a69d4712 Bring back enum DepKind.
It was removed in #115920 to enable it being moved to
`rustc_query_system`, a move that has recently been reversed. It's much
simpler as an enum.

Also:
- Remove the overly complicated `Debug` impl for `DepKind`.
- Remove the trivial `DepKind` associated constants (`NULL` et al.)
- Add an assertion to ensure that the number of `DepKinds` fits within a
  `u16`.
- Rename `DEP_KIND_VARIANTS` as `DEP_KIND_NUM_VARIANTS`, to make it
  clearer that it's a count, not a collection.
- Use `stringify!` in one place to make the code clearer.
2026-02-19 09:05:37 +11:00
Nicholas Nethercote 90b994b883 Rename query dep_kind.
The next commit will bring back `enum DepKind` and there would be a
variant `DepKind::dep_kind`. This makes it impossible to have a variable
named `dep_kind`, because the `bindings_with_variant_name` lint is
overzealous. For this code:
```
let dep_kind = DepKind::dep_kind;
```
the lint will give this error:
```
pattern binding `dep_kind` is named the same as one of the variants of the type `DepKind`
```
This is arguably a bug in the lint. To work around it, this commit
renames the `dep_kind` query as `crate_dep_kind`. It is a better name
anyway given that `DepKind` and `CrateDepKind` are different things.
2026-02-19 08:56:43 +11:00
Nicholas Nethercote 1d410c5831 Fix a typo. 2026-02-19 08:56:42 +11:00
Jonathan Brouwer 689301f4e4 Rollup merge of #152806 - RalfJung:interpret-typo, r=Kivooeo
interpret: fix comment typo

Pointed out in https://github.com/rust-lang/rust/pull/152756#pullrequestreview-3819458236 after that PR already had been rolled up.
2026-02-18 22:19:55 +01:00
Jonathan Brouwer 462a348042 Rollup merge of #152803 - TaKO8Ki:fix-152744-diagnostic-attr-ice, r=JonathanBrouwer
Avoid delayed-bug ICE for malformed diagnostic attrs

Fixes rust-lang/rust#152744

Skip suggestions in `expected_lit` when parsing with `Recovery::Forbidden`, since this may later cancel `InvalidMetaItem`. This avoids creating delayed bugs that can be promoted to ICE.
2026-02-18 22:19:55 +01:00
Jonathan Brouwer a1e029b8ba Rollup merge of #152793 - mati865:disable-no-pie-on-windows, r=petrochenkov
Do no add -no-pie on Windows

Windows binaries are always position independent and Clang warns when trying to enable or disable that:
```
❯ clang hello.c -pie
clang: warning: argument unused during compilation: '-pie' [-Wunused-command-line-argument]

❯ clang hello.c -no-pie
clang: warning: argument unused during compilation: '-no-pie' [-Wunused-command-line-argument]
```

https://github.com/rust-lang/rust/pull/149937 will turn these warnings into build errors:
```
❯ cargo rustc -- -D linker-messages
   Compiling hello v0.1.0 (E:\tmp\hello)
error: linker stderr: x86_64-w64-mingw32-clang: argument unused during compilation: '-nolibc' [-Wunused-command-line-argument]␍
       x86_64-w64-mingw32-clang: argument unused during compilation: '-no-pie' [-Wunused-command-line-argument]␍

  |
  = note: requested on the command line with `-D linker-messages`

error: could not compile `hello` (bin "hello") due to 1 previous error
```
2026-02-18 22:19:54 +01:00
Jonathan Brouwer a28a4845e7 Rollup merge of #152792 - ShoyuVanilla:issue-152663, r=petrochenkov
Fix an ICE while checking param env shadowing on an erroneous trait impl

Fixes https://github.com/rust-lang/rust/issues/152663
2026-02-18 22:19:53 +01:00
Jonathan Brouwer 856e3d7a8a Rollup merge of #152790 - Zelzahn:patch-1, r=jieyouxu
Fix incorrect target in aarch64-unknown-linux-gnu docs

Very minor thing, but the target should be `-gnu` instead of `-musl`.
2026-02-18 22:19:53 +01:00
Jonathan Brouwer 2f545c4309 Rollup merge of #152787 - scottmcm:alignment-checks-test, r=jieyouxu
Add a mir-opt test for alignment check generation [zero changes outside tests]

I wrote this as part of rust-lang/rust#152641 which it looks like I'm going to just close, so submitting the new test separately since we didn't have any mir-opt testing of this pass that I could find (at least `x test tests/mir-opt` didn't fail when I broke them) so figured it's something that should exist.
2026-02-18 22:19:52 +01:00
Jonathan Brouwer 17a2e09068 Rollup merge of #152780 - camsteffen:less-clone, r=Kivooeo
Remove some clones in deriving

Just factoring away a few `.clone()`s.
2026-02-18 22:19:52 +01:00
Jonathan Brouwer 7fbb53066d Rollup merge of #152766 - DanielEScherzer:patch-1, r=joboet
std::r#try! - avoid link to nightly docs

Use a relative link to the current version of rust-by-example rather than sending people to the nightly version.
2026-02-18 22:19:50 +01:00
Jonathan Brouwer f239e45045 Rollup merge of #152658 - scrabsha:normalize-before-svg, r=jieyouxu
compiletest: normalize stderr before SVG rendering

Element position is hardcoded in the rendered SVG. This means that any change in element length (for instance, when substituting the path with the `rust` checkout with `$DIR`) would not change the position and result in buggy SVG being generated. Normalizing before SVG rendering allows us to keep a consistent element placement.
2026-02-18 22:19:50 +01:00
Jonathan Brouwer 1489a8e3d7 Rollup merge of #152628 - Enselic:ptr-const-allocation, r=jieyouxu
tests: rustc_public: Check const allocation for all variables (1 of 11 was missing)

In the test `tests/ui-fulldeps/rustc_public/check_allocation.rs` there is a check for constant allocations of local variables of this function:

    fn other_consts() {{
        let _max_u128 = u128::MAX;
        let _min_i128 = i128::MIN;
        let _max_i8 = i8::MAX;
        let _char = 'x';
        let _false = false;
        let _true = true;
        let _ptr = &BAR;
        let _null_ptr: *const u8 = NULL;
        let _tuple = TUPLE;
        let _char_id = const {{ type_id::<char>() }};
        let _bool_id = const {{ type_id::<bool>() }};
    }}

The current test only finds 10 out of 11 allocations. The constant allocation for

    let _ptr = &BAR;

is not checked, because the `SingleUseConsts` MIR pass does not optimize away that assignment. Add code to also collect constant allocation from assignment rvalues to find the constant allocation for that last variable.

Not only does this change make sense on its own, it also makes the test pass both with and without the `SingleUseConsts` pass.

Discovered while investigating ways to avoid [this tests/ui-fulldeps/rustc_public/check_allocation.rs](https://github.com/Enselic/rust/commit/d7fffabc31904434cd41304c2f419f8b4abc6e70#diff-c4a926f9e8ba22bcfb1e6f2491b79b80608ab018641f85f66d6718d7f3716a5e) hack from https://github.com/rust-lang/rust/pull/151426 which wants to stop running `SingleUseConsts` for non-optimized builds.
2026-02-18 22:19:49 +01:00
Jonathan Brouwer b54436c4ca Rollup merge of #152564 - nnethercote:rm-closure-gcx, r=adwinwhite
Remove unnecessary closure.

The comments that says it's necessary is wrong.

r? @adwinwhite
2026-02-18 22:19:49 +01:00
Jonathan Brouwer 5d6c830832 Rollup merge of #152173 - 9SonSteroids:fn_ptr_type_info, r=oli-obk
Reflection TypeKind::FnPtr

This is for https://github.com/rust-lang/rust/issues/146922.

Const-eval currently lacks full support for function pointer (fn) types. We should implement handling of FnPtr TypeKind, covering safe and unsafe functions, Rust and custom ABIs, input and output types, higher-ranked lifetimes, and variadic functions.
2026-02-18 22:19:49 +01:00
Jonathan Brouwer d7ad9f7ec9 Rollup merge of #151703 - zedddie:fix-151462-ice, r=jdonszelmann
Fix ICE in transmutability error reporting when type aliases are normalized

Fixes rust-lang/rust#151462

Transmutability error reporting hit an ICE when type aliases were normalized for diagnostics. For example, when type
 `JustUnit = ()` normalizes to `()`, the check passes unexpectedly even though the original check with `JustUnit` failed.

Fixed by adding a retry in the `Answer::Yes` arm that checks with the root obligation's types before panicking. The retry only occurs when the root obligation differs and is a Transmute trait predicate.

Also added a test that reproduces the original ICE.
2026-02-18 22:19:48 +01:00
Jonathan Brouwer 6bfd154f57 Rollup merge of #152734 - Shunpoco:cleanup-bootstrap-ci, r=Kobzol
Respect the `--ci` flag in more places in bootstrap

### Motivation
Currently, the way of checking CI environment in bootstrap is not unified. Sometimes `--ci` flag is respected, but in other cases only GITHUB_ACTIONS env var is checked.

### Change
This PR modifies the way of treating the flag in bootstrap. If `--ci` (or `--ci=true`) is added, bootstrap's config set ci_env as `CiEnv::GithubActions`. This PR also modifies some lines in bootstrap to respect the config's CiEnv instance.

### Note
I haven't touched anything in tidy, because I want to raise another PR for introducing --ci flag in tidy. In the PR, I will need to change how tidy treats CI information. So currently I leave it as it is.
2026-02-18 22:19:47 +01:00
Jonathan Brouwer 57178ef5d2 Rollup merge of #152097 - JohnTitor:issue-114108, r=BoxyUwU
Suggest local variables for captured format args

Fixes https://github.com/rust-lang/rust/issues/114108
2026-02-18 22:19:47 +01:00
Jonathan Brouwer 1607bc1288 Rollup merge of #151059 - folkertdev:x86-u128-reg, r=Amanieu
x86: support passing `u128`/`i128` to inline assembly

tracking issue: https://github.com/rust-lang/rust/issues/133416

Seems like an oversight. LLVM has supported this since 2019, see https://github.com/llvm/llvm-project/issues/42502. I've put this under `asm_experimental_reg`.

cc @taiki-e
r? @Amanieu
2026-02-18 22:19:46 +01:00
Jonathan Brouwer 3759e48d19 Rollup merge of #152814 - folkertdev:stdarch-sync-2026-02-18, r=folkertdev
stdarch subtree update

Subtree update of `stdarch` to https://github.com/rust-lang/stdarch/commit/a894c238310a27c0dd55207ee208f7a4986c25a9.

Created using https://github.com/rust-lang/josh-sync.

r? @ghost
2026-02-18 22:19:46 +01:00
Jonathan Brouwer 90ac20f430 Rollup merge of #152799 - bjorn3:sync_cg_clif-2026-02-18, r=bjorn3
Subtree sync for rustc_codegen_cranelift

The highlight this time is a Cranelift update.

r? @ghost

@rustbot label +A-codegen +A-cranelift +T-compiler
2026-02-18 22:19:45 +01:00
Urgau 0512fb068c Enable "View all comments" link feature in triagebot.toml 2026-02-18 21:55:31 +01:00
bors e0cb264b81 Auto merge of #141295 - Kivooeo:if-let-guard-stable, r=fee1-dead,est31
Stabilize `if let` guards (`feature(if_let_guard)`)



## Summary

This proposes the stabilization of `if let` guards (tracking issue: rust-lang/rust#51114, RFC: rust-lang/rfcs#2294). This feature allows `if let` expressions to be used directly within match arm guards, enabling conditional pattern matching within guard clauses.

## What is being stabilized

The ability to use `if let` expressions within match arm guards.

Example:

```rust
enum Command {
    Run(String),
    Stop,
    Pause,
}

fn process_command(cmd: Command, state: &mut String) {
    match cmd {
        Command::Run(name) if let Some(first_char) = name.chars().next() && first_char.is_ascii_alphabetic() => {
            // Both `name` and `first_char` are available here
            println!("Running command: {} (starts with '{}')", name, first_char);
            state.push_str(&format!("Running {}", name));
        }
        Command::Run(name) => {
            println!("Cannot run command '{}'. Invalid name.", name);
        }
        Command::Stop if state.contains("running") => {
            println!("Stopping current process.");
            state.clear();
        }
        _ => {
            println!("Unhandled command or state.");
        }
    }
}
```

## Motivation

The primary motivation for `if let` guards is to reduce nesting and improve readability when conditional logic depends on pattern matching. Without this feature, such logic requires nested `if let` statements within match arms:

```rust
// Without if let guards
match value {
    Some(x) => {
        if let Ok(y) = compute(x) {
            // Both `x` and `y` are available here
            println!("{}, {}", x, y);
        }
    }
    _ => {}
}

// With if let guards
match value {
    Some(x) if let Ok(y) = compute(x) => {
        // Both `x` and `y` are available here
        println!("{}, {}", x, y);
    }
    _ => {}
}
```

## Implementation and Testing

The feature has been implemented and tested comprehensively across different scenarios:

### Core Functionality Tests

**Scoping and variable binding:**
- [`scope.rs`](https://github.com/rust-lang/rust/blob/5796073c134eaac30475f9a19462c4e716c9119c/tests/ui/rfcs/rfc-2294-if-let-guard/scope.rs) - Verifies that bindings created in `if let` guards are properly scoped and available in match arms
- [`shadowing.rs`](https://github.com/rust-lang/rust/blob/5796073c134eaac30475f9a19462c4e716c9119c/tests/ui/rfcs/rfc-2294-if-let-guard/shadowing.rs) - Tests that variable shadowing works correctly within guards
- [`scoping-consistency.rs`](https://github.com/rust-lang/rust/blob/5796073c134eaac30475f9a19462c4e716c9119c/tests/ui/rfcs/rfc-2294-if-let-guard/scoping-consistency.rs) - Ensures temporaries in guards remain valid for the duration of their match arms

**Type system integration:**
- [`type-inference.rs`](https://github.com/rust-lang/rust/blob/5796073c134eaac30475f9a19462c4e716c9119c/tests/ui/rfcs/rfc-2294-if-let-guard/type-inference.rs) - Confirms type inference works correctly in `if let` guards  
- [`typeck.rs`](https://github.com/rust-lang/rust/blob/5796073c134eaac30475f9a19462c4e716c9119c/tests/ui/rfcs/rfc-2294-if-let-guard/typeck.rs) - Verifies type mismatches are caught appropriately

**Pattern matching semantics:**
- [`exhaustive.rs`](https://github.com/rust-lang/rust/blob/5796073c134eaac30475f9a19462c4e716c9119c/tests/ui/rfcs/rfc-2294-if-let-guard/exhaustive.rs) - Validates that `if let` guards are correctly handled in exhaustiveness analysis
- [`move-guard-if-let.rs`](https://github.com/rust-lang/rust/blob/5796073c134eaac30475f9a19462c4e716c9119c/tests/ui/rfcs/rfc-2294-if-let-guard/move-guard-if-let.rs) and [`move-guard-if-let-chain.rs`](https://github.com/rust-lang/rust/blob/5796073c134eaac30475f9a19462c4e716c9119c/tests/ui/rfcs/rfc-2294-if-let-guard/move-guard-if-let-chain.rs) - Test that conditional moves in guards are tracked correctly by the borrow checker

### Error Handling and Diagnostics

- [`warns.rs`](https://github.com/rust-lang/rust/blob/5796073c134eaac30475f9a19462c4e716c9119c/tests/ui/rfcs/rfc-2294-if-let-guard/warns.rs) - Tests warnings for irrefutable patterns and unreachable code in guards
- [`parens.rs`](https://github.com/rust-lang/rust/blob/5796073c134eaac30475f9a19462c4e716c9119c/tests/ui/rfcs/rfc-2294-if-let-guard/parens.rs) - Ensures parentheses around `let` expressions are properly rejected
- [`macro-expanded.rs`](https://github.com/rust-lang/rust/blob/5796073c134eaac30475f9a19462c4e716c9119c/tests/ui/rfcs/rfc-2294-if-let-guard/macro-expanded.rs) - Verifies macro expansions that produce invalid constructs are caught
- [`guard-mutability-2.rs`](https://github.com/rust-lang/rust/blob/5796073c134eaac30475f9a19462c4e716c9119c/tests/ui/rfcs/rfc-2294-if-let-guard/guard-mutability-2.rs) - Tests mutability and ownership violations in guards
- [`ast-validate-guards.rs`](https://github.com/rust-lang/rust/blob/5796073c134eaac30475f9a19462c4e716c9119c/tests/ui/rfcs/rfc-2497-if-let-chains/ast-validate-guards.rs) - Validates AST-level syntax restrictions

### Drop Order and Temporaries

**Key insight:** Unlike `let_chains` in regular `if` expressions, `if let` guards do not have drop order inconsistencies because:
1. Match guards are clearly scoped to their arms
2. There is no "else block" equivalent that could cause temporal confusion

- [`drop-order.rs`](https://github.com/rust-lang/rust/blob/5796073c134eaac30475f9a19462c4e716c9119c/tests/ui/rfcs/rfc-2294-if-let-guard/drop-order.rs) - Check drop order of temporaries create in match guards
- [`compare-drop-order.rs`](https://github.com/rust-lang/rust/blob/aef3f5fdf052fbbc16e174aef5da6d50832ca316/tests/ui/rfcs/rfc-2294-if-let-guard/compare-drop-order.rs) - Compares drop order between `if let` guards and nested `if let` in match arms, confirming they behave identically across all editions
- rust-lang/rust#140981 - A complicated drop order test involved `let chain` was made by @est31
- [`drop-order-comparisons-let-chains.rs`](https://github.com/rust-lang/rust/blob/902b4d28783e03e231d8513082cc30c4fcce5d95/tests/ui/drop/drop-order-comparisons-let-chains.rs) - Compares drop order between `let chains` in `if let guard` and regular `if` expressions
- [`if-let-guards.rs`](https://github.com/rust-lang/rust/blob/5650d716e0589e2e145ce9027f35bd534e5f862a/tests/ui/drop/if-let-guards.rs) - Test correctness of drop order for bindings and temporaries
- [`if-let-guards-2`](https://github.com/rust-lang/rust/blob/3a6c8c8f3d7ae654fdb6ce1255182bda21680655/tests/ui/drop/if-let-guards-2.rs) - The same test as above but more comprehensive and tests more interactions between different features and their drop order, checking that drop order is correct, created by @traviscross 

## Edition Compatibility

This feature stabilizes on all editions, unlike `let chains` which was limited to edition 2024. This is safe because:

1. `if let` guards don't suffer from the drop order issues that affected `let chains` in regular `if` expressions
2. The scoping is unambiguous - guards are clearly tied to their match arms
3. Extensive testing confirms identical behavior across all editions

## Interactions with Future Features

The lang team has reviewed potential interactions with planned "guard patterns" and determined that stabilizing `if let` guards now does not create obstacles for future work. The scoping and evaluation semantics established here align with what guard patterns will need.

## Unresolved Issues

- [x] - rust-lang/rust#140981
- [x] - added tests description by @jieyouxu request
- [x] - Concers from @scottmcm about stabilizing this across all editions
- [x] - check if drop order in all edition when using `let chains` inside `if let` guard is the same
- [x] - interactions with guard patters
- [x] - pattern bindings drops before guard bindings https://github.com/rust-lang/rust/pull/143376
- [x] - documentaion (https://github.com/rust-lang/reference/pull/1957)
- [ ] (non-blocking) add tests for [this](https://github.com/rust-lang/rust/issues/145237) and [this](https://github.com/rust-lang/rust/pull/141295#issuecomment-3173059821)

---

**Related:**
- Tracking Issue: rust-lang/rust#51114  
- RFC: rust-lang/rfcs#2294
- Documentation PR: https://github.com/rust-lang/reference/pull/1957
2026-02-18 20:49:50 +00:00
Zeromemer 4a0f916e33 fix stale comments left over from ed3711e 2026-02-18 22:30:59 +02:00
Oscar Bray bd54cd66a1 Port #[rustc_doc_primitive] to the new attribute parser 2026-02-18 20:13:19 +00:00
Jane Losare-Lusby 0487f58fba explicitly show behavior of <_>::assoc_fn 2026-02-18 11:51:44 -08:00
Manuel Drehwald 385eaf450f Update enzyme submodule to match upstream 2026-02-18 13:55:37 -05:00
Alejandra Gonzalez 6a8c42da90 Add CURRENT_RUSTC_VERSION support for Clippy 2026-02-18 19:46:46 +01:00
Esteban Küber 37684bdfc5 Make all multipart suggestions verbose
The ShowAlways style of suggestions is usually easier to understand than the inline style.
2026-02-18 18:33:35 +00:00
Ralf Jung 3cb093af1f interpret: fix comment typo 2026-02-18 18:22:26 +01:00
Takayuki Maeda 61c9af20c7 avoid delayed-bug ICE for malformed diagnostic attrs
remove -Znext-solver from ui tests
2026-02-19 01:43:26 +09:00