Rollup merge of #135493 - compiler-errors:legacy-mangle-closure, r=lqd

Fix legacy symbol mangling of closures

When this code was written, there was no `type_of` implementation for closures. That has long since been changed.

In the UI test:

```
trait A where
    [(); (|| {}, 1).1]: Sized,
{
}
```

We tried to walk up the def path tree for the closure, from closure -> anon const -> trait. When we reached the trait, we tried to call `type_of` on it which obviously doesn't do the right thing and ICEs.

Fixes #135418
This commit is contained in:
Matthias Krüger 2025-01-14 19:25:08 +01:00 committed by GitHub
commit f9c2c1256b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 10 additions and 4 deletions

View File

@ -19,15 +19,15 @@ pub(super) fn mangle<'tcx>(
let def_id = instance.def_id();
// We want to compute the "type" of this item. Unfortunately, some
// kinds of items (e.g., closures) don't have an entry in the
// item-type array. So walk back up the find the closest parent
// that DOES have an entry.
// kinds of items (e.g., synthetic static allocations from const eval)
// don't have a proper implementation for the `type_of` query. So walk
// back up the find the closest parent that DOES have a type.
let mut ty_def_id = def_id;
let instance_ty;
loop {
let key = tcx.def_key(ty_def_id);
match key.disambiguated_data.data {
DefPathData::TypeNs(_) | DefPathData::ValueNs(_) => {
DefPathData::TypeNs(_) | DefPathData::ValueNs(_) | DefPathData::Closure => {
instance_ty = tcx.type_of(ty_def_id).instantiate_identity();
debug!(?instance_ty);
break;

View File

@ -10,3 +10,9 @@ pub async fn async_fn() {}
pub fn closure() {
let _ = || {};
}
//~ MONO_ITEM fn A::{constant#0}::{closure#0} @@
trait A where
[(); (|| {}, 1).1]: Sized,
{
}