@@ -178,13 +178,16 @@ pub fn intern_const_alloc_recursive<
178
178
// promoteds as immutable.
179
179
found_bad_mutable_pointer = true ;
180
180
}
181
- // It is tempting to intern as immutable if `prov.immutable()`. However, there
182
- // might be multiple pointers to the same allocation, and if *at least one* of
183
- // them is mutable, the allocation must be interned mutably. We will intern the
184
- // allocation when we encounter the first pointer. Therefore we always intern
185
- // with `inner_mutability`, and furthermore we ensured above that if that is
186
- // "immutable", then there are *no* mutable pointers anywhere in the newly
187
- // interned memory.
181
+ // We always intern with `inner_mutability`, and furthermore we ensured above that if
182
+ // that is "immutable", then there are *no* mutable pointers anywhere in the newly
183
+ // interned memory -- justifying that we can indeed intern immutably. However this also
184
+ // means we can *not* easily intern immutably here if `prov.immutable()` is true and
185
+ // `inner_mutability` is `Mut`: there might be other pointers to that allocation, and
186
+ // we'd have to somehow check that they are *all* immutable before deciding that this
187
+ // allocation can be made immutable. In the future we could consider analyzing all
188
+ // pointers before deciding which allocations can be made immutable; but for now we are
189
+ // okay with losing some potential for immutability here. This can anyway only affect
190
+ // `static mut`.
188
191
todo. push ( ( alloc_id, inner_mutability) ) ;
189
192
} )
190
193
. map_err ( |( ) | {
0 commit comments