Do not attempt to compute size of a type with escaping lifetimes (#15434)

A type with escaping bound vars cannot be wrapped in a dummy binder
during size computation.

Fixes rust-lang/rust-clippy#15429

changelog: [`zero_sized_hashmap_values`]: fix ICE in types with escaping
lifetimes

r? Jarcho

<!-- TRIAGEBOT_START -->

<!-- TRIAGEBOT_SUMMARY_START -->

### Summary Notes

- [Beta
nomination](https://github.com/rust-lang/rust-clippy/pull/15434#issuecomment-3164866684)
by [samueltardieu](https://github.com/samueltardieu)

*Managed by `@rustbot`—see
[help](https://forge.rust-lang.org/triagebot/note.html) for details*

<!-- TRIAGEBOT_SUMMARY_END -->
<!-- TRIAGEBOT_END -->
This commit is contained in:
Jason Newcomb 2025-08-09 14:09:43 +00:00 committed by GitHub
commit ea7ebaa825
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 14 additions and 3 deletions

View file

@ -56,6 +56,9 @@ impl LateLintPass<'_> for ZeroSizedMapValues {
// cannot check if it is `Sized` or not, such as an incomplete associated type in a
// type alias. See an example in `issue14822()` of `tests/ui/zero_sized_hashmap_values.rs`.
&& !ty.has_non_region_param()
// Ensure that no region escapes to avoid an assertion error when computing the layout.
// See an example in `issue15429()` of `tests/ui/zero_sized_hashmap_values.rs`.
&& !ty.has_escaping_bound_vars()
&& let Ok(layout) = cx.layout_of(ty)
&& layout.is_zst()
{

View file

@ -92,6 +92,14 @@ fn issue14822() {
//~^ zero_sized_map_values
}
fn issue15429() {
struct E<'a>(&'a [E<'a>]);
// The assertion error happens when the type being evaluated has escaping bound vars
// as it cannot be wrapped in a dummy binder during size computation.
type F = dyn for<'a> FnOnce(HashMap<u32, E<'a>>) -> u32;
}
fn main() {
let _: HashMap<String, ()> = HashMap::new();
//~^ zero_sized_map_values

View file

@ -89,7 +89,7 @@ LL | type D = HashMap<u32, S<E>>;
= help: consider using a set instead
error: map with zero-sized value type
--> tests/ui/zero_sized_hashmap_values.rs:96:34
--> tests/ui/zero_sized_hashmap_values.rs:104:34
|
LL | let _: HashMap<String, ()> = HashMap::new();
| ^^^^^^^
@ -97,7 +97,7 @@ LL | let _: HashMap<String, ()> = HashMap::new();
= help: consider using a set instead
error: map with zero-sized value type
--> tests/ui/zero_sized_hashmap_values.rs:96:12
--> tests/ui/zero_sized_hashmap_values.rs:104:12
|
LL | let _: HashMap<String, ()> = HashMap::new();
| ^^^^^^^^^^^^^^^^^^^
@ -105,7 +105,7 @@ LL | let _: HashMap<String, ()> = HashMap::new();
= help: consider using a set instead
error: map with zero-sized value type
--> tests/ui/zero_sized_hashmap_values.rs:102:12
--> tests/ui/zero_sized_hashmap_values.rs:110:12
|
LL | let _: HashMap<_, _> = std::iter::empty::<(String, ())>().collect();
| ^^^^^^^^^^^^^