Skip to content

Modernize and simplify assert_eq/ne - #165649

Open
dwars-loeper wants to merge 2 commits into
rust-lang:mainfrom
dwars-loeper:patch-1
Open

dwars-loeper wants to merge 2 commits into
rust-lang:mainfrom
dwars-loeper:patch-1

Conversation

@dwars-loeper

Copy link
Copy Markdown

Switch from heavy pre-if-let syntax to if-let chains. This shortens the code and saves two nested blocks, i.e. 8 spaces of indentation.

The generated asm retains the identical size both with and without -O and with and without an arg message.

Compile duration of this standalone 1000 times, on a file of 25 different functions of 40 invocations each, in the above mentioned variants, differs only marginally (max 0.033% on my not benchmark optimized laptop.) Irlo discussion with Kevin Reid.

Switch from heavy pre-if-let syntax to if-let chains. This shortens the code and saves two nested blocks, i.e. 8 spaces of indentation.

The generated asm retains the identical size both with and without -O and with and without an arg message.

Compile duration of this standalone 1000 times, on a file of 25 different functions of 40 invocations each, in the above mentioned variants, differs only marginally (sub 0.033% on my not benchmark optimized laptop.) [Irlo discussion](https://internals.rust-lang.org/t/optimising-assert-eq-assert-ne/24739/9?u=dwarsloeper) with Kevin Reid.
@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Nov 8, 2026
@rustbot

rustbot commented Nov 8, 2026

Copy link
Copy Markdown
Collaborator

Thanks for the pull request, and welcome! The Rust Project has assigned @JohnTitor (or someone else) to review your changes, you should hear from them (or someone else) within the next two weeks.

Please see the contribution instructions and our LLM policy for more information.

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: libs
  • libs expanded to 38 candidates
  • Random selection from JohnTitor, LawnGnome, Mark-Simulacrum, nia-e

@rust-log-analyzer

This comment has been minimized.

@dwars-loeper

Copy link
Copy Markdown
Author

The job test-x86_64-gnu-llvm-22 failed! Check out the build log: (web) (plain enhanced) (plain)

So I changed the macro-generated code and unsurprisingly that translates to different Mir. Now I had checked that the end outcome (asm) is unchanged, so it should be ok. But I can’t read the Mir to validate that at this level.

@hanna-kruppe

Copy link
Copy Markdown
Contributor

Let’s see what rustc’s own benchmarking says about this: @bors try @rust-timer queue

@rust-timer

This comment has been minimized.

@rustbot rustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Nov 8, 2026
@rust-bors

This comment has been minimized.

rust-bors Bot pushed a commit that referenced this pull request Nov 8, 2026
Modernize and simplify assert_eq/ne
@rust-bors

rust-bors Bot commented Nov 8, 2026

Copy link
Copy Markdown
Contributor

☀️ Try build successful (CI)
Build commit: 2830348 (28303489f42dc7f6b6e9087cd3d7ef8e608fba0b)
Base parent: fe0ea19 (fe0ea190ddb7a26f9aff8dc5114ad8ad2d4adbf5)

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (2830348): comparison URL.

Overall result: no relevant changes - no action needed

Benchmarking means the PR may be perf-sensitive. Consider adding rollup=never if this change is not fit for rolling up.

@rustbot label: -S-waiting-on-perf -perf-regression

Instruction count

This perf run didn't have relevant results for this metric.

Max RSS (memory usage)

This perf run didn't have relevant results for this metric.

Cycles

Results (primary 2.1%)

A less reliable metric. May be of interest, but not used to determine the overall result above.

mean range count
Regressions ❌
(primary)
2.1% [2.1%, 2.1%] 1
Regressions ❌
(secondary)
- - 0
Improvements ✅
(primary)
- - 0
Improvements ✅
(secondary)
- - 0
All ❌✅ (primary) 2.1% [2.1%, 2.1%] 1

Binary size

Results (primary -0.0%, secondary -0.0%)

A less reliable metric. May be of interest, but not used to determine the overall result above.

mean range count
Regressions ❌
(primary)
0.0% [0.0%, 0.0%] 2
Regressions ❌
(secondary)
0.0% [0.0%, 0.0%] 2
Improvements ✅
(primary)
-0.0% [-0.1%, -0.0%] 18
Improvements ✅
(secondary)
-0.0% [-0.0%, -0.0%] 1
All ❌✅ (primary) -0.0% [-0.1%, 0.0%] 20

Bootstrap: 484.128s -> 484.572s (0.09%)
Artifact size: 406.22 MiB -> 406.32 MiB (0.03%)

@rustbot rustbot removed the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Nov 8, 2026
@maxdexh

maxdexh commented Nov 8, 2026 •

Copy link
Copy Markdown
Member

Does this change behavior in any way (in particular with temporary extension)? This is all inside a surrounding block, so I'd assume not?
(if it wasn't in a block, then it'd affect whether in (assert_eq!(NoisyDrop, NoisyDrop), println!("a")), NoisyDrop is dropped first or "a" printed first)

@dwars-loeper

Copy link
Copy Markdown
Author

Does this change behavior in any way (in particular with temporary extension)? This is all inside a surrounding block, so I'd assume not? (if it wasn't in a block, then it'd affect whether in (assert_eq!(NoisyDrop, NoisyDrop), println!("a")), NoisyDrop is dropped first or "a" printed first)

The if let chain is a drop in replacement for match. So, unless these differ in their scoping, no.

I had asked about the extra braces, and Kevin Reid dug this out in response: assert_eq/assert_matches vs debug_assert_eq/debug_assert_matches have different temporary scoping behavior

@maxdexh

maxdexh commented Nov 9, 2026 •

Copy link
Copy Markdown
Member

I just explained that if let and match do differ in their scoping behavior, since edition 2024.
I'm just not sure if there is a way to observe this, due to the surrounding braces

@dwars-loeper

dwars-loeper commented Nov 9, 2026 •

Copy link
Copy Markdown
Author

I just explained that if let and match do differ in their scoping behavior, since edition 2024. I'm just not sure if there is a way to observe this, due to the surrounding braces

Ok, I see where your reservations come from. I’ve read up on Edition 2024 again. I didn’t even realize that “match ergonomics” is in fact the name for how cool matching is.

As for drop order, any extra args remain in a nested block within the scope of the bindings. AFAICT edition 2024 only changed drop order with regards to if let else. Since we have neither that, nor an alternate match branch, nothing should change – and certainly not outward facing, due to the extra braces.

@theemathas

Copy link
Copy Markdown
Contributor

cc @dianne

@dianne dianne left a comment •

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

scoping-wise, this looks the same as before to me! I believe tests were added for this in #155739 as well: temporaries are dropped by the end of the macro. CI passing will mean that property holds, as long as this PR doesn't do anything to subvert those tests.

As for drop order, any extra args remain in a nested block within the scope of the bindings. AFAICT edition 2024 only changed drop order with regards to if let else. Since we have neither that, nor an alternate match branch, nothing should change – and certainly not outward facing, due to the extra braces.

as of edition 2024, temporaries in if let conditions generally don't live past the end of the end of the if expression at all, since they're restricted to the condition expressions and the consequent block. this is in contrast to match, where the scrutinee's temporaries aren't dropped at the end (which is what necessitated adding blocks around the matches in these macros).

View changes since this review

Comment thread library/core/src/macros/mod.rs Resolved
Remove outer braces as requested.
@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

The job test-x86_64-gnu-next-trait-solver-polonius failed! Check out the build log: (web) (plain enhanced) (plain)

Click to see the possible cause of the failure (guessed by this bot)
1 error[E0308]: mismatched types
-   --> $DIR/dont-suggest-cyclic-constraint.rs:7:35
+   --> $DIR/dont-suggest-cyclic-constraint.rs:7:5
3    |
4 LL |     debug_assert_eq!(iter.next(), Some(value));
-    |                                   ^^^^^^^^^^^ expected `Option<<I as Iterator>::Item>`, found `Option<&<I as Iterator>::Item>`
+    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Option<<I as Iterator>::Item>`, found `Option<&<I as Iterator>::Item>`
6    |
7    = note: expected enum `Option<_>`
8               found enum `Option<&_>`

+    = note: this error originates in the macro `$crate::assert_eq` which comes from the expansion of the macro `debug_assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
9 
10 error: aborting due to 1 previous error
11 

Note: some mismatched output was normalized before being compared
-   --> /checkout/tests/ui/associated-types/dont-suggest-cyclic-constraint.rs:7:5
+   --> $DIR/dont-suggest-cyclic-constraint.rs:7:5
+    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Option<<I as Iterator>::Item>`, found `Option<&<I as Iterator>::Item>`
+    = note: this error originates in the macro `$crate::assert_eq` which comes from the expansion of the macro `debug_assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info)


The actual stderr differed from the expected stderr
To update references, rerun the tests and pass the `--bless` flag
To only update this specific test, also pass `--test-args associated-types/dont-suggest-cyclic-constraint.rs`

error: 1 errors occurred comparing output.
status: exit status: 1
command: env -u RUSTC_LOG_COLOR RUSTC_ICE="0" RUST_BACKTRACE="short" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage1/bin/rustc" "/checkout/tests/ui/associated-types/dont-suggest-cyclic-constraint.rs" "-Zsimulate-remapped-rust-src-base=/rustc/FAKE_PREFIX" "-Ztranslate-remapped-path-to-local-path=no" "-Z" "ignore-directory-in-diagnostics-source-blocks=/cargo" "-Z" "ignore-directory-in-diagnostics-source-blocks=/checkout/vendor" "--sysroot" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage1" "--target=x86_64-unknown-linux-gnu" "--check-cfg" "cfg(test,FALSE)" "--error-format" "json" "--json" "future-incompat" "-Ccodegen-units=1" "-Zui-testing" "-Zdeduplicate-diagnostics=no" "-Zwrite-long-types-to-disk=no" "-Cstrip=debuginfo" "--emit" "metadata" "-C" "prefer-dynamic" "--out-dir" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/ui/associated-types/dont-suggest-cyclic-constraint" "-Znext-solver=coherence" "-A" "unused" "-W" "unused_attributes" "-A" "internal_features" "-A" "incomplete_features" "-A" "unused_parens" "-A" "unused_braces" "-Crpath" "-Cdebuginfo=0" "-Lnative=/checkout/obj/build/x86_64-unknown-linux-gnu/native/rust-test-helpers" "--edition=2015"
stdout: none
--- stderr -------------------------------
error[E0308]: mismatched types
##[error]  --> /checkout/tests/ui/associated-types/dont-suggest-cyclic-constraint.rs:7:5
   |
LL |     debug_assert_eq!(iter.next(), Some(value));
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Option<<I as Iterator>::Item>`, found `Option<&<I as Iterator>::Item>`
   |
   = note: expected enum `Option<_>`
              found enum `Option<&_>`
   = note: this error originates in the macro `$crate::assert_eq` which comes from the expansion of the macro `debug_assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info)

---
20 error[E0308]: mismatched types
-   --> $DIR/builtin-superkinds-self-type.rs:16:27
+   --> $DIR/builtin-superkinds-self-type.rs:16:5
22    |
23 LL |     assert_eq!(rx.recv(), 1193182);
-    |                           ^^^^^^^ expected `Result<{integer}, RecvError>`, found integer
+    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    |     |
+    |     expected `Result<{integer}, RecvError>`, found integer
+    |     expected because this is `Result<{integer}, RecvError>`
25    |
26    = note: expected enum `Result<{integer}, RecvError>`
27               found type `{integer}`

- help: try wrapping the expression in `Ok`
-    |
- LL |     assert_eq!(rx.recv(), Ok(1193182));
-    |                           +++       +
32 
33 error: aborting due to 2 previous errors
34 

Note: some mismatched output was normalized before being compared
-   --> /checkout/tests/ui/builtin-superkinds/builtin-superkinds-self-type.rs:16:5
+   --> $DIR/builtin-superkinds-self-type.rs:16:5
+    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    |     |
+    |     expected `Result<{integer}, RecvError>`, found integer
+    |     expected because this is `Result<{integer}, RecvError>`


The actual stderr differed from the expected stderr
To update references, rerun the tests and pass the `--bless` flag
To only update this specific test, also pass `--test-args builtin-superkinds/builtin-superkinds-self-type.rs`

error: 1 errors occurred comparing output.
status: exit status: 1
command: env -u RUSTC_LOG_COLOR RUSTC_ICE="0" RUST_BACKTRACE="short" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage1/bin/rustc" "/checkout/tests/ui/builtin-superkinds/builtin-superkinds-self-type.rs" "-Zsimulate-remapped-rust-src-base=/rustc/FAKE_PREFIX" "-Ztranslate-remapped-path-to-local-path=no" "-Z" "ignore-directory-in-diagnostics-source-blocks=/cargo" "-Z" "ignore-directory-in-diagnostics-source-blocks=/checkout/vendor" "--sysroot" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage1" "--target=x86_64-unknown-linux-gnu" "--check-cfg" "cfg(test,FALSE)" "--error-format" "json" "--json" "future-incompat" "-Ccodegen-units=1" "-Zui-testing" "-Zdeduplicate-diagnostics=no" "-Zwrite-long-types-to-disk=no" "-Cstrip=debuginfo" "--emit" "metadata" "-C" "prefer-dynamic" "--out-dir" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/ui/builtin-superkinds/builtin-superkinds-self-type" "-Znext-solver=coherence" "-A" "unused" "-W" "unused_attributes" "-A" "internal_features" "-A" "incomplete_features" "-A" "unused_parens" "-A" "unused_braces" "-Crpath" "-Cdebuginfo=0" "-Lnative=/checkout/obj/build/x86_64-unknown-linux-gnu/native/rust-test-helpers" "--edition=2015"
stdout: none
--- stderr -------------------------------
error[E0310]: the parameter type `T` may not live long enough
##[error]  --> /checkout/tests/ui/builtin-superkinds/builtin-superkinds-self-type.rs:10:16
   |
LL | impl <T: Sync> Foo for T { }
   |                ^^^
   |                |
   |                the parameter type `T` must be valid for the static lifetime...
   |                ...so that the type `T` will meet its required lifetime bounds...
   |
note: ...that is required by this bound
  --> /checkout/tests/ui/builtin-superkinds/builtin-superkinds-self-type.rs:6:24
   |
LL | trait Foo : Sized+Sync+'static {
   |                        ^^^^^^^
help: consider adding an explicit lifetime bound
   |
LL | impl <T: Sync + 'static> Foo for T { }
   |               +++++++++

error[E0308]: mismatched types
##[error]  --> /checkout/tests/ui/builtin-superkinds/builtin-superkinds-self-type.rs:16:5
   |
LL |     assert_eq!(rx.recv(), 1193182);
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |     |
   |     expected `Result<{integer}, RecvError>`, found integer
   |     expected because this is `Result<{integer}, RecvError>`
   |
   = note: expected enum `Result<{integer}, RecvError>`
              found type `{integer}`

error: aborting due to 2 previous errors

Some errors have detailed explanations: E0308, E0310.
For more information about an error, try `rustc --explain E0308`.
---

15 error[E0308]: mismatched types
16   --> $DIR/assert-macro-without-else.rs:14:5
17    |
+ LL | fn h() -> bool {
+    |           ---- expected `bool` because of this return type
18 LL |     assert_ne!(1, 2)
19    |     ^^^^^^^^^^^^^^^^ expected `bool`, found `()`
20 


The actual stderr differed from the expected stderr
To update references, rerun the tests and pass the `--bless` flag
To only update this specific test, also pass `--test-args expr/if/assert-macro-without-else.rs`

error: 1 errors occurred comparing output.
status: exit status: 1
command: env -u RUSTC_LOG_COLOR RUSTC_ICE="0" RUST_BACKTRACE="short" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage1/bin/rustc" "/checkout/tests/ui/expr/if/assert-macro-without-else.rs" "-Zsimulate-remapped-rust-src-base=/rustc/FAKE_PREFIX" "-Ztranslate-remapped-path-to-local-path=no" "-Z" "ignore-directory-in-diagnostics-source-blocks=/cargo" "-Z" "ignore-directory-in-diagnostics-source-blocks=/checkout/vendor" "--sysroot" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage1" "--target=x86_64-unknown-linux-gnu" "--check-cfg" "cfg(test,FALSE)" "--error-format" "json" "--json" "future-incompat" "-Ccodegen-units=1" "-Zui-testing" "-Zdeduplicate-diagnostics=no" "-Zwrite-long-types-to-disk=no" "-Cstrip=debuginfo" "--emit" "metadata" "-C" "prefer-dynamic" "--out-dir" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/ui/expr/if/assert-macro-without-else" "-Znext-solver=coherence" "-A" "unused" "-W" "unused_attributes" "-A" "internal_features" "-A" "incomplete_features" "-A" "unused_parens" "-A" "unused_braces" "-Crpath" "-Cdebuginfo=0" "-Lnative=/checkout/obj/build/x86_64-unknown-linux-gnu/native/rust-test-helpers" "--edition=2015"
stdout: none
--- stderr -------------------------------
error[E0308]: mismatched types
##[error]  --> /checkout/tests/ui/expr/if/assert-macro-without-else.rs:4:5
   |
---
94    |
- help: consider removing the borrow
+ help: consider using clone here
96    |
- LL -     assert_eq!(3i32, &3i32);
- LL +     assert_eq!(3i32, 3i32);
-    |
+ LL |     assert_eq!(3i32, &3i32).clone();
+    |                            ++++++++
100 
101 error[E0308]: mismatched types
102   --> $DIR/deref-suggestion.rs:40:17

Note: some mismatched output was normalized before being compared
-   --> /checkout/tests/ui/inference/deref-suggestion.rs:37:5
+   --> $DIR/deref-suggestion.rs:37:5
+    |     ^^^^^^^^^^^^^^^^^^^^^^^
+    |     |
+    |     expected `i32`, found `&i32`
+    |     expected because this is `i32`
+ help: consider using clone here
+ LL |     assert_eq!(3i32, &3i32).clone();
+    |                            ++++++++


The actual stderr differed from the expected stderr
To update references, rerun the tests and pass the `--bless` flag
To only update this specific test, also pass `--test-args inference/deref-suggestion.rs`

error: 1 errors occurred comparing output.
status: exit status: 1
command: env -u RUSTC_LOG_COLOR RUSTC_ICE="0" RUST_BACKTRACE="short" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage1/bin/rustc" "/checkout/tests/ui/inference/deref-suggestion.rs" "-Zsimulate-remapped-rust-src-base=/rustc/FAKE_PREFIX" "-Ztranslate-remapped-path-to-local-path=no" "-Z" "ignore-directory-in-diagnostics-source-blocks=/cargo" "-Z" "ignore-directory-in-diagnostics-source-blocks=/checkout/vendor" "--sysroot" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage1" "--target=x86_64-unknown-linux-gnu" "--check-cfg" "cfg(test,FALSE)" "--error-format" "json" "--json" "future-incompat" "-Ccodegen-units=1" "-Zui-testing" "-Zdeduplicate-diagnostics=no" "-Zwrite-long-types-to-disk=no" "-Cstrip=debuginfo" "--emit" "metadata" "-C" "prefer-dynamic" "--out-dir" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/ui/inference/deref-suggestion" "-Znext-solver=coherence" "-A" "unused" "-W" "unused_attributes" "-A" "internal_features" "-A" "incomplete_features" "-A" "unused_parens" "-A" "unused_braces" "-Crpath" "-Cdebuginfo=0" "-Lnative=/checkout/obj/build/x86_64-unknown-linux-gnu/native/rust-test-helpers" "--edition=2015"
stdout: none
--- stderr -------------------------------
error[E0308]: mismatched types
##[error]  --> /checkout/tests/ui/inference/deref-suggestion.rs:8:9
   |
---

error[E0308]: mismatched types
##[error]  --> /checkout/tests/ui/inference/deref-suggestion.rs:14:10
   |
LL |     foo3(u);
   |     ---- ^ expected `u32`, found `&u32`
   |     |
   |     arguments to this function are incorrect
   |
note: function defined here
  --> /checkout/tests/ui/inference/deref-suggestion.rs:12:4
---

error[E0308]: mismatched types
##[error]  --> /checkout/tests/ui/inference/deref-suggestion.rs:30:9
   |
LL |     foo(&"aaa".to_owned());
   |     --- ^^^^^^^^^^^^^^^^^ expected `String`, found `&String`
   |     |
   |     arguments to this function are incorrect
   |
note: function defined here
  --> /checkout/tests/ui/inference/deref-suggestion.rs:5:4
   |
LL | fn foo(_: String) {}
   |    ^^^ ---------
help: consider removing the borrow
   |
LL -     foo(&"aaa".to_owned());
LL +     foo("aaa".to_owned());
   |

error[E0308]: mismatched types
##[error]  --> /checkout/tests/ui/inference/deref-suggestion.rs:32:9
   |
LL |     foo(&mut "aaa".to_owned());
   |     --- ^^^^^^^^^^^^^^^^^^^^^ expected `String`, found `&mut String`
   |     |
   |     arguments to this function are incorrect
   |
note: function defined here
  --> /checkout/tests/ui/inference/deref-suggestion.rs:5:4
   |
LL | fn foo(_: String) {}
   |    ^^^ ---------
help: consider removing the borrow
   |
LL -     foo(&mut "aaa".to_owned());
LL +     foo("aaa".to_owned());
   |

error[E0308]: mismatched types
##[error]  --> /checkout/tests/ui/inference/deref-suggestion.rs:34:10
   |
LL |     foo3(borrow!(0));
   |     ---- ^^^^^^^^^^ expected `u32`, found `&{integer}`
   |     |
   |     arguments to this function are incorrect
   |
note: function defined here
  --> /checkout/tests/ui/inference/deref-suggestion.rs:12:4
---
   |     expected because this is `i32`
   |
help: consider using clone here
   |
LL |     assert_eq!(3i32, &3i32).clone();
   |                            ++++++++

error[E0308]: mismatched types
##[error]  --> /checkout/tests/ui/inference/deref-suggestion.rs:40:17
   |
LL |     let s = S { u };
   |                 ^ expected `&u32`, found integer
   |
help: consider borrowing here
   |
LL |     let s = S { u: &u };
   |                 ++++

error[E0308]: mismatched types
##[error]  --> /checkout/tests/ui/inference/deref-suggestion.rs:42:20
   |
LL |     let s = S { u: u };
   |                    ^ expected `&u32`, found integer
   |
help: consider borrowing here
   |
LL |     let s = S { u: &u };
   |                    +

error[E0308]: mismatched types
##[error]  --> /checkout/tests/ui/inference/deref-suggestion.rs:45:17
   |
LL |     let r = R { i };
   |                 ^ expected `u32`, found `&{integer}`
   |
help: consider dereferencing the borrow
   |
LL |     let r = R { i: *i };
   |                 ++++

error[E0308]: mismatched types
##[error]  --> /checkout/tests/ui/inference/deref-suggestion.rs:47:20
   |
LL |     let r = R { i: i };
   |                    ^ expected `u32`, found `&{integer}`
   |
help: consider dereferencing the borrow
   |
LL |     let r = R { i: *i };
   |                    +

error[E0308]: mismatched types
##[error]  --> /checkout/tests/ui/inference/deref-suggestion.rs:56:9
   |
---

error[E0308]: mismatched types
##[error]  --> /checkout/tests/ui/inference/deref-suggestion.rs:81:15
   |
LL |     if foo == bar {
   |        ---    ^^^ expected `Foo`, found `&Foo`
   |        |
   |        expected because this is `Foo`
   |
help: consider dereferencing the borrow
   |
LL |     if foo == *bar {
   |               +

error: aborting due to 14 previous errors

For more information about this error, try `rustc --explain E0308`.
---
To only update this specific test, also pass `--test-args rustc_public-ir-print/operands.rs`

error: 1 errors occurred comparing output.
status: exit status: 0
command: env -u RUSTC_LOG_COLOR RUSTC_ICE="0" RUST_BACKTRACE="short" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage1/bin/rustc" "/checkout/tests/ui/rustc_public-ir-print/operands.rs" "-Zsimulate-remapped-rust-src-base=/rustc/FAKE_PREFIX" "-Ztranslate-remapped-path-to-local-path=no" "-Z" "ignore-directory-in-diagnostics-source-blocks=/cargo" "-Z" "ignore-directory-in-diagnostics-source-blocks=/checkout/vendor" "--sysroot" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage1" "--target=x86_64-unknown-linux-gnu" "--check-cfg" "cfg(test,FALSE)" "--error-format" "json" "--json" "future-incompat" "-Ccodegen-units=1" "-Zui-testing" "-Zdeduplicate-diagnostics=no" "-Zwrite-long-types-to-disk=no" "-Cstrip=debuginfo" "--emit" "metadata" "-C" "prefer-dynamic" "--out-dir" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/ui/rustc_public-ir-print/operands" "-Znext-solver=coherence" "-A" "unused" "-W" "unused_attributes" "-A" "internal_features" "-A" "incomplete_features" "-A" "unused_parens" "-A" "unused_braces" "-Crpath" "-Cdebuginfo=0" "-Lnative=/checkout/obj/build/x86_64-unknown-linux-gnu/native/rust-test-helpers" "--edition=2015" "-Z" "unpretty=stable-mir" "--crate-type" "lib" "-C" "panic=abort" "-Zmir-opt-level=0"
--- stdout -------------------------------
// WARNING: This is highly experimental output it's intended for rustc_public developers only.
// If you find a bug or want to improve the output open a issue at https://github.com/rust-lang/rustc_public.
fn operands(_1: u8) -> () {
    let mut _0: ();
    let  _2: [u8; 10];
    let mut _3: u8;
    let  _4: u8;
    let  _5: usize;
    let mut _6: bool;
    let  _7: u8;
    let  _8: usize;
    let mut _9: (usize, bool);
    let mut _10: bool;
    let  _11: ();
    let mut _12: (&u8, &u8);
    let mut _13: &u8;
    let mut _14: &u8;
    let  _15: &u8;
    let  _16: &u8;
    let mut _17: bool;
    let mut _18: u8;
    let mut _19: u8;
    let mut _20: !;
    let  _21: core::panicking::AssertKind;
    let  _22: !;
    let mut _23: core::panicking::AssertKind;
    let mut _24: &u8;
    let  _25: &u8;
    let mut _26: &u8;
    let  _27: &u8;
    let mut _28: Option<Arguments<'_>>;
    let  _29: &u8;
    let  _30: u8;
    let  _31: ();
    let mut _32: (&u8, &u8);
    let mut _33: &u8;
    let mut _34: &u8;
    let  _35: &u8;
    let  _36: &u8;
    let mut _37: bool;
    let mut _38: u8;
    let mut _39: u8;
    let mut _40: !;
    let  _41: core::panicking::AssertKind;
    let  _42: !;
    let mut _43: core::panicking::AssertKind;
    let mut _44: &u8;
    let  _45: &u8;
    let mut _46: &u8;
    let  _47: &u8;
    let mut _48: Option<Arguments<'_>>;
    let  _49: (u8, u8);
    let mut _50: u8;
    let mut _51: u8;
    let  _52: u8;
    let  _53: u8;
    let  _54: ();
    let mut _55: (&u8, &u8);
    let mut _56: &u8;
    let mut _57: &u8;
    let  _58: &u8;
    let  _59: &u8;
    let mut _60: bool;
    let mut _61: u8;
    let mut _62: u8;
    let mut _63: !;
    let  _64: core::panicking::AssertKind;
    let  _65: !;
    let mut _66: core::panicking::AssertKind;
    let mut _67: &u8;
    let  _68: &u8;
    let mut _69: &u8;
    let  _70: &u8;
    let mut _71: Option<Arguments<'_>>;
    let  _72: usize;
    let mut _73: &[u8];
    let mut _74: &[u8; 10];
    let  _75: usize;
    let mut _76: &usize;
    let  _77: &usize;
    let  _78: ();
    let mut _79: (&usize, &usize);
    let mut _80: &usize;
    let mut _81: &usize;
    let  _82: &usize;
    let  _83: &usize;
    let mut _84: bool;
    let mut _85: usize;
    let mut _86: usize;
    let mut _87: !;
    let  _88: core::panicking::AssertKind;
    let  _89: !;
    let mut _90: core::panicking::AssertKind;
    let mut _91: &usize;
    let  _92: &usize;
    let mut _93: &usize;
    let  _94: &usize;
    let mut _95: Option<Arguments<'_>>;
    debug val => _1;
    debug array => _2;
    debug first => _4;
    debug last => _7;
    debug left_val => _15;
    debug right_val => _16;
    debug kind => _21;
    debug reference => _29;
    debug dereferenced => _30;
    debug left_val => _35;
    debug right_val => _36;
    debug kind => _41;
    debug tuple => _49;
    debug first_again => _52;
    debug first_again_again => _53;
    debug left_val => _58;
    debug right_val => _59;
    debug kind => _64;
    debug length => _72;
    debug size_of => _75;
    debug left_val => _82;
    debug right_val => _83;
    debug kind => _88;
    bb0: {
        StorageLive(_2);
        StorageLive(_3);
        _3 = _1;
        _2 = [move _3; 10];
        StorageDead(_3);
        StorageLive(_4);
        StorageLive(_5);
        _5 = 0_usize;
        _6 = Lt(_5, 10_usize);
        assert(move _6, "index out of bounds: the length is {} but the index is {}", 10_usize, _5) -> [success: bb1, unwind unreachable];
    }
    bb1: {
        _4 = _2[_5];
        StorageDead(_5);
        StorageLive(_7);
        StorageLive(_8);
        _9 = CheckedSub(10_usize, 1_usize);
        assert(!move (_9.1: bool), "attempt to compute `{} - {}`, which would overflow", 10_usize, 1_usize) -> [success: bb2, unwind unreachable];
    }
    bb2: {
        _8 = move (_9.0: usize);
        _10 = Lt(_8, 10_usize);
        assert(move _10, "index out of bounds: the length is {} but the index is {}", 10_usize, _8) -> [success: bb3, unwind unreachable];
    }
    bb3: {
        _7 = _2[_8];
        StorageDead(_8);
        StorageLive(_11);
        StorageLive(_12);
        StorageLive(_13);
        _13 = &_4;
        StorageLive(_14);
        _14 = &_7;
        _12 = (move _13, move _14);
        StorageDead(_14);
        StorageDead(_13);
        StorageLive(_15);
        _15 = (_12.0: &u8);
        StorageLive(_16);
        _16 = (_12.1: &u8);
        StorageLive(_17);
        StorageLive(_18);
        _18 = (*_15);
        StorageLive(_19);
        _19 = (*_16);
        _17 = Eq(move _18, move _19);
        switchInt(move _17) -> [0: bb5, otherwise: bb4];
    }
    bb4: {
        StorageDead(_19);
        StorageDead(_18);
        StorageDead(_16);
---
        StorageLive(_32);
        StorageLive(_33);
        _33 = &_30;
        StorageLive(_34);
        _34 = &_4;
        _32 = (move _33, move _34);
        StorageDead(_34);
        StorageDead(_33);
        StorageLive(_35);
        _35 = (_32.0: &u8);
        StorageLive(_36);
        _36 = (_32.1: &u8);
        StorageLive(_37);
        StorageLive(_38);
        _38 = (*_35);
        StorageLive(_39);
        _39 = (*_36);
        _37 = Eq(move _38, move _39);
        switchInt(move _37) -> [0: bb7, otherwise: bb6];
    }
    bb5: {
        StorageDead(_19);
        StorageDead(_18);
        StorageLive(_21);
---
        StorageLive(_27);
        _27 = &(*_16);
        _26 = &(*_27);
        StorageLive(_28);
        _28 = Option::None;
        _22 = core::panicking::assert_failed::<u8, u8>(move _23, move _24, move _26, move _28) -> unwind unreachable;
    }
    bb6: {
        StorageDead(_39);
        StorageDead(_38);
        StorageDead(_36);
---
        StorageLive(_49);
        StorageLive(_50);
        _50 = _4;
        StorageLive(_51);
        _51 = _7;
        _49 = (move _50, move _51);
        StorageDead(_51);
        StorageDead(_50);
        StorageLive(_52);
        _52 = (_49.0: u8);
        StorageLive(_53);
        _53 = (_49.0: u8);
        StorageLive(_54);
        StorageLive(_55);
        StorageLive(_56);
        _56 = &_52;
        StorageLive(_57);
        _57 = &_53;
        _55 = (move _56, move _57);
        StorageDead(_57);
        StorageDead(_56);
        StorageLive(_58);
        _58 = (_55.0: &u8);
        StorageLive(_59);
        _59 = (_55.1: &u8);
        StorageLive(_60);
        StorageLive(_61);
        _61 = (*_58);
        StorageLive(_62);
        _62 = (*_59);
        _60 = Eq(move _61, move _62);
        switchInt(move _60) -> [0: bb9, otherwise: bb8];
    }
    bb7: {
        StorageDead(_39);
        StorageDead(_38);
        StorageLive(_41);
---
        StorageLive(_47);
        _47 = &(*_36);
        _46 = &(*_47);
        StorageLive(_48);
        _48 = Option::None;
        _42 = core::panicking::assert_failed::<u8, u8>(move _43, move _44, move _46, move _48) -> unwind unreachable;
    }
    bb8: {
        StorageDead(_62);
        StorageDead(_61);
        StorageDead(_59);
---
        StorageDead(_54);
        StorageLive(_72);
        StorageLive(_73);
        StorageLive(_74);
        _74 = &_2;
        _73 = move _74 as &[u8];
        StorageDead(_74);
        _72 = core::slice::<impl [u8]>::len(move _73) -> [return: bb10, unwind unreachable];
    }
    bb9: {
        StorageDead(_62);
        StorageDead(_61);
        StorageLive(_64);
---
        StorageLive(_70);
        _70 = &(*_59);
        _69 = &(*_70);
        StorageLive(_71);
        _71 = Option::None;
        _65 = core::panicking::assert_failed::<u8, u8>(move _66, move _67, move _69, move _71) -> unwind unreachable;
    }
    bb10: {
        StorageDead(_73);
        StorageLive(_75);
        StorageLive(_76);
        StorageLive(_77);
        _77 = &_72;
        _76 = &(*_77);
        _75 = std::mem::size_of_val::<usize>(move _76) -> [return: bb11, unwind unreachable];
    }
    bb11: {
        StorageDead(_76);
        StorageDead(_77);
        StorageLive(_78);
        StorageLive(_79);
        StorageLive(_80);
        _80 = &_72;
        StorageLive(_81);
        _81 = &_75;
        _79 = (move _80, move _81);
        StorageDead(_81);
        StorageDead(_80);
        StorageLive(_82);
        _82 = (_79.0: &usize);
        StorageLive(_83);
        _83 = (_79.1: &usize);
        StorageLive(_84);
        StorageLive(_85);
        _85 = (*_82);
        StorageLive(_86);
        _86 = (*_83);
        _84 = Eq(move _85, move _86);
        switchInt(move _84) -> [0: bb13, otherwise: bb12];
    }
    bb12: {
        StorageDead(_86);
        StorageDead(_85);
        StorageDead(_83);
---
        StorageLive(_94);
        _94 = &(*_83);
        _93 = &(*_94);
        StorageLive(_95);
        _95 = Option::None;
        _89 = core::panicking::assert_failed::<usize, usize>(move _90, move _91, move _93, move _95) -> unwind unreachable;
    }
}
fn more_operands() -> [Ctors; 3] {
    let mut _0: [Ctors; 3];
    let  _1: Dummy;
    let  _2: Ctors;
    let  _3: Ctors;
    let mut _4: Dummy;
    let  _5: Ctors;
    let mut _6: Ctors;
    let mut _7: Ctors;
    let mut _8: Ctors;
    debug dummy => _1;
    debug unit => _2;
    debug struct_like => _3;
    debug tup_like => _5;
    bb0: {
        StorageLive(_1);
        _1 = Dummy('a', core::num::<impl i32>::MIN);
        StorageLive(_2);
        _2 = Ctors::Unit;
        StorageLive(_3);
        StorageLive(_4);
        _4 = move _1;
        _3 = Ctors::StructLike(move _4);
        StorageDead(_4);
        StorageLive(_5);
        _5 = Ctors::TupLike(false);
        StorageLive(_6);
        _6 = move _2;
        StorageLive(_7);
        _7 = move _3;
        StorageLive(_8);
        _8 = move _5;
        _0 = [move _6, move _7, move _8];
        StorageDead(_8);
        StorageDead(_7);
        StorageDead(_6);
        StorageDead(_5);
        StorageDead(_3);
        StorageDead(_2);
        StorageDead(_1);
        return;
    }
}
fn closures(_1: bool, _2: bool) -> {closure@/checkout/tests/ui/rustc_public-ir-print/operands.rs:47:5: 47:19} {
    let mut _0: {closure@/checkout/tests/ui/rustc_public-ir-print/operands.rs:47:5: 47:19};
    debug x => _1;
    debug z => _2;
    bb0: {
        _0 = {closure@/checkout/tests/ui/rustc_public-ir-print/operands.rs:47:5: 47:19}(_1, _2);
        return;
    }
}
fn closures::{closure#0}(_1: {closure@/checkout/tests/ui/rustc_public-ir-print/operands.rs:47:5: 47:19}, _2: bool) -> bool {
    let mut _0: bool;
    let mut _3: bool;
    let mut _4: bool;
    let mut _5: bool;
    debug y => _2;
    debug x => (_1.0: bool);
    debug z => (_1.1: bool);
    bb0: {
        StorageLive(_3);
        StorageLive(_4);
        _4 = (_1.0: bool);
        StorageLive(_5);
        _5 = _2;
        _3 = BitXor(move _4, move _5);
        switchInt(move _3) -> [0: bb2, otherwise: bb1];
    }
    bb1: {
        StorageDead(_5);
        StorageDead(_4);
        _0 = true;
---
        StorageDead(_3);
        return;
    }
}
fn Ctors::TupLike(_1: bool) -> Ctors {
    let mut _0: Ctors;
    bb0: {
        _0 = Ctors::TupLike(move _1);
        return;
    }
}
------------------------------------------
stderr: none
---
To only update this specific test, also pass `--test-args suggestions/dont-suggest-try_into-in-macros.rs`

error: 1 errors occurred comparing output.
status: exit status: 1
command: env -u RUSTC_LOG_COLOR RUSTC_ICE="0" RUST_BACKTRACE="short" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage1/bin/rustc" "/checkout/tests/ui/suggestions/dont-suggest-try_into-in-macros.rs" "-Zsimulate-remapped-rust-src-base=/rustc/FAKE_PREFIX" "-Ztranslate-remapped-path-to-local-path=no" "-Z" "ignore-directory-in-diagnostics-source-blocks=/cargo" "-Z" "ignore-directory-in-diagnostics-source-blocks=/checkout/vendor" "--sysroot" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage1" "--target=x86_64-unknown-linux-gnu" "--check-cfg" "cfg(test,FALSE)" "--error-format" "json" "--json" "future-incompat" "-Ccodegen-units=1" "-Zui-testing" "-Zdeduplicate-diagnostics=no" "-Zwrite-long-types-to-disk=no" "-Cstrip=debuginfo" "--emit" "metadata" "-C" "prefer-dynamic" "--out-dir" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/ui/suggestions/dont-suggest-try_into-in-macros" "-Znext-solver=coherence" "-A" "unused" "-W" "unused_attributes" "-A" "internal_features" "-A" "incomplete_features" "-A" "unused_parens" "-A" "unused_braces" "-Crpath" "-Cdebuginfo=0" "-Lnative=/checkout/obj/build/x86_64-unknown-linux-gnu/native/rust-test-helpers" "--edition=2015"
stdout: none
--- stderr -------------------------------
error[E0308]: mismatched types
##[error]  --> /checkout/tests/ui/suggestions/dont-suggest-try_into-in-macros.rs:2:5
   |
---
1 error[E0308]: mismatched types
-   --> $DIR/suggest-add-wrapper-issue-145294.rs:24:32
+   --> $DIR/suggest-add-wrapper-issue-145294.rs:24:5
3    |
4 LL |     assert_eq!(Ok(Some("hi")), foo());
-    |                                ^^^^^ expected `Result<Option<&str>, _>`, found `Result<Option<String>, ()>`
+    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Result<Option<&str>, _>`, found `Result<Option<String>, ()>`
6    |
7    = note: expected enum `Result<Option<&str>, _>`
8               found enum `Result<Option<String>, ()>`

9 
10 error[E0308]: mismatched types
-   --> $DIR/suggest-add-wrapper-issue-145294.rs:25:30
+   --> $DIR/suggest-add-wrapper-issue-145294.rs:25:5
12    |
13 LL |     assert_eq!(Bar::A("hi"), bar());
-    |                              ^^^^^ expected `Bar<&str, _>`, found `Bar<String, ()>`
+    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Bar<&str, _>`, found `Bar<String, ()>`
15    |
16    = note: expected enum `Bar<&str, _>`
17               found enum `Bar<String, ()>`

Note: some mismatched output was normalized before being compared
-   --> /checkout/tests/ui/typeck/suggestions/suggest-add-wrapper-issue-145294.rs:24:5
-   --> /checkout/tests/ui/typeck/suggestions/suggest-add-wrapper-issue-145294.rs:25:5
+   --> $DIR/suggest-add-wrapper-issue-145294.rs:24:5
+    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Result<Option<&str>, _>`, found `Result<Option<String>, ()>`
+   --> $DIR/suggest-add-wrapper-issue-145294.rs:25:5
+    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Bar<&str, _>`, found `Bar<String, ()>`


The actual stderr differed from the expected stderr
To update references, rerun the tests and pass the `--bless` flag
To only update this specific test, also pass `--test-args typeck/suggestions/suggest-add-wrapper-issue-145294.rs`

error: 1 errors occurred comparing output.
status: exit status: 1
command: env -u RUSTC_LOG_COLOR RUSTC_ICE="0" RUST_BACKTRACE="short" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage1/bin/rustc" "/checkout/tests/ui/typeck/suggestions/suggest-add-wrapper-issue-145294.rs" "-Zsimulate-remapped-rust-src-base=/rustc/FAKE_PREFIX" "-Ztranslate-remapped-path-to-local-path=no" "-Z" "ignore-directory-in-diagnostics-source-blocks=/cargo" "-Z" "ignore-directory-in-diagnostics-source-blocks=/checkout/vendor" "--sysroot" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage1" "--target=x86_64-unknown-linux-gnu" "--check-cfg" "cfg(test,FALSE)" "--error-format" "json" "--json" "future-incompat" "-Ccodegen-units=1" "-Zui-testing" "-Zdeduplicate-diagnostics=no" "-Zwrite-long-types-to-disk=no" "-Cstrip=debuginfo" "--emit" "metadata" "-C" "prefer-dynamic" "--out-dir" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/ui/typeck/suggestions/suggest-add-wrapper-issue-145294" "-Znext-solver=coherence" "-A" "unused" "-W" "unused_attributes" "-A" "internal_features" "-A" "incomplete_features" "-A" "unused_parens" "-A" "unused_braces" "-Crpath" "-Cdebuginfo=0" "-Lnative=/checkout/obj/build/x86_64-unknown-linux-gnu/native/rust-test-helpers" "--edition=2015"
stdout: none
--- stderr -------------------------------
error[E0308]: mismatched types
##[error]  --> /checkout/tests/ui/typeck/suggestions/suggest-add-wrapper-issue-145294.rs:24:5
   |
LL |     assert_eq!(Ok(Some("hi")), foo()); //~ ERROR mismatched types [E0308]
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Result<Option<&str>, _>`, found `Result<Option<String>, ()>`
   |
   = note: expected enum `Result<Option<&str>, _>`
              found enum `Result<Option<String>, ()>`

error[E0308]: mismatched types
##[error]  --> /checkout/tests/ui/typeck/suggestions/suggest-add-wrapper-issue-145294.rs:25:5
   |
LL |     assert_eq!(Bar::A("hi"), bar()); //~ ERROR mismatched types [E0308]
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Bar<&str, _>`, found `Bar<String, ()>`
   |
   = note: expected enum `Bar<&str, _>`
              found enum `Bar<String, ()>`

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0308`.
------------------------------------------

Important

For more information how to resolve CI failures of this job, visit this link.

@dianne

dianne commented Nov 9, 2026

Copy link
Copy Markdown
Member

regarding the test failures, it looks like some type-checker diagnostics expect assert_eq! to expand a certain way involving a match expression. a quick look turned up

fn adjust_expr_for_assert_eq_macro(
&self,
found_expr: &mut &'tcx hir::Expr<'tcx>,
expected_expr: &mut Option<&'tcx hir::Expr<'tcx>>,
) {
let Some(expected_expr) = expected_expr else {
return;
};
if found_expr.span.ctxt() != expected_expr.span.ctxt() {
return;
}
if !found_expr
.span
.ctxt()
.outer_expn_data()
.macro_def_id
.is_some_and(|def_id| self.tcx.is_diagnostic_item(sym::assert_eq_macro, def_id))
{
return;
}
let hir::ExprKind::Unary(
hir::UnOp::Deref,
hir::Expr { kind: hir::ExprKind::Path(found_path), .. },
) = found_expr.kind
else {
return;
};
let hir::ExprKind::Unary(
hir::UnOp::Deref,
hir::Expr { kind: hir::ExprKind::Path(expected_path), .. },
) = expected_expr.kind
else {
return;
};
for (path, name, idx, var) in [
(expected_path, "left_val", 0, expected_expr),
(found_path, "right_val", 1, found_expr),
] {
if let hir::QPath::Resolved(_, path) = path
&& let [segment] = path.segments
&& segment.ident.name.as_str() == name
&& let Res::Local(hir_id) = path.res
&& let Some((_, hir::Node::Expr(match_expr))) =
self.tcx.hir_parent_iter(hir_id).nth(2)
&& let hir::ExprKind::Match(scrutinee, _, _) = match_expr.kind
&& let hir::ExprKind::Tup(exprs) = scrutinee.kind
&& let hir::ExprKind::AddrOf(_, _, macro_arg) = exprs[idx].kind
{
*var = macro_arg;
}
}
}
so that'd need to be changed to reflect the new expansion

@dwars-loeper

dwars-loeper commented Nov 10, 2026 •

Copy link
Copy Markdown
Author

so that'd need to be changed to reflect the new expansion

Thank you, Dianne, for looking this up! TBH, I’m out of my depth with that code. Also it is beyond me, how the IMHO still identical matcher would once result in a reference, and once not.

Would anybody be able to take care of this part for me?

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants