File tree 2 files changed +19
-3
lines changed
compiler/rustc_middle/src/ty
2 files changed +19
-3
lines changed Original file line number Diff line number Diff line change @@ -153,7 +153,11 @@ impl<'tcx> CtxtInterners<'tcx> {
153
153
. intern ( kind, |kind| {
154
154
let flags = super :: flags:: FlagComputation :: for_kind ( & kind) ;
155
155
156
- let stable_hash = if flags. flags . intersects ( TypeFlags :: HAS_RE_INFER ) {
156
+ // It's impossible to hash inference regions (and will ICE), so we don't need to try to cache them.
157
+ // Without incremental, we rarely stable-hash types, so let's not do it proactively.
158
+ let stable_hash = if flags. flags . intersects ( TypeFlags :: HAS_RE_INFER )
159
+ || sess. opts . incremental . is_none ( )
160
+ {
157
161
Fingerprint :: ZERO
158
162
} else {
159
163
let mut hasher = StableHasher :: new ( ) ;
Original file line number Diff line number Diff line change @@ -464,8 +464,20 @@ impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for Ty<'tcx> {
464
464
stable_hash,
465
465
} = self . 0 . 0 ;
466
466
467
- assert_ne ! ( * stable_hash, Fingerprint :: ZERO , "{:#?}" , kind) ;
468
- stable_hash. hash_stable ( hcx, hasher) ;
467
+ if * stable_hash == Fingerprint :: ZERO {
468
+ // No cached hash available. This can only mean that incremental is disabled.
469
+ // We don't cache stable hashes in non-incremental mode, because they are used
470
+ // so rarely that the performance actually suffers.
471
+
472
+ let stable_hash: Fingerprint = {
473
+ let mut hasher = StableHasher :: new ( ) ;
474
+ kind. hash_stable ( hcx, & mut hasher) ;
475
+ hasher. finish ( )
476
+ } ;
477
+ stable_hash. hash_stable ( hcx, hasher) ;
478
+ } else {
479
+ stable_hash. hash_stable ( hcx, hasher) ;
480
+ }
469
481
}
470
482
}
471
483
You can’t perform that action at this time.
0 commit comments