forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of rust-lang#92259 - Aaron1011:normal-mod-hashing, r=micha…
…elwoerister Remove special-cased stable hashing for HIR module All other 'containers' (e.g. `impl` blocks) hashed their contents in the normal, order-dependent way. However, `Mod` was hashing its contents in a (sort-of) order-independent way. However, the exact order is exposed to consumers through `Mod.item_ids`, and through query results like `hir_module_items`. Therefore, stable hashing needs to take the order of items into account, to avoid fingerprint ICEs. Unforuntately, I was unable to directly build a reproducer for the ICE, due to the behavior of `Fingerprint::combine_commutative`. This operation swaps the upper and lower `u64` when constructing the result, which makes the function non-associative. Since we start the hashing of module items by combining `Fingerprint::ZERO` with the first item, it's difficult to actually build an example where changing the order of module items leaves the final hash unchanged. However, this appears to have been hit in practice in rust-lang#92218 While we're not able to reproduce it, the fact that proc-macros are involved (which can give an entire module the same span, preventing any span-related invalidations) makes me confident that the root cause of that issue is our method of hashing module items. This PR removes all of the special handling for `Mod`, instead deriving a `HashStable` implementation. This makes `Mod` consistent with other 'contains' like `Impl`, which hash their contents through the typical derive of `HashStable`.
- Loading branch information
Showing
4 changed files
with
31 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
// revisions: rpass1 rpass2 | ||
// compile-flags: -Z incremental-ignore-spans -Z query-dep-graph | ||
|
||
// Tests that module hashing depends on the order of the items | ||
// (since the order is exposed through `Mod.item_ids`). | ||
// Changing the order of items (while keeping `Span`s the same) | ||
// should still result in `hir_owner` being invalidated. | ||
// Note that it's possible to keep the spans unchanged using | ||
// a proc-macro (e.g. producing the module via `quote!`) | ||
// but we use `-Z incremental-ignore-spans` for simplicity | ||
|
||
#![feature(rustc_attrs)] | ||
|
||
#[cfg(rpass1)] | ||
#[rustc_clean(cfg="rpass1",except="hir_owner")] | ||
mod foo { | ||
struct First; | ||
struct Second; | ||
} | ||
|
||
#[cfg(rpass2)] | ||
#[rustc_clean(cfg="rpass2",except="hir_owner")] | ||
mod foo { | ||
struct Second; | ||
struct First; | ||
} | ||
|
||
fn main() {} |