Skip ImplWitnessTable::elements_id when generating fingerprints (#7629)

Implementing interface modifiers causes an infinite loop when generating
fingerprints because the witness value generates a fingerprint that's
dependent on something dependent on the witness value. We've debugged
this to the witness table's `elements_id` field.

This hack is a workaround for creating a new block type whose value is
not codependent with its identity.

Co-authored-by: Richard Smith <richard@metafoo.co.uk>

Co-authored-by: Richard Smith <richard@metafoo.co.uk>
This commit is contained in:
Christopher Di Bella
2026-08-11 22:39:30 +00:00
committed by GitHub
co-authored by Richard Smith
parent cb5e9b6555
commit 4ea5ef45dd
368 changed files with 11718 additions and 11723 deletions
@@ -57,22 +57,22 @@ fn Run() {
// CHECK:STDOUT: ; Function Attrs: nounwind
// CHECK:STDOUT: define i32 @main() #0 !dbg !12 {
// CHECK:STDOUT: entry:
// CHECK:STDOUT: call void @_CG.Main.c81631f865470482(), !dbg !16
// CHECK:STDOUT: call void @_CG.Main.0b241ec84a68877b(), !dbg !17
// CHECK:STDOUT: call void @_CG.Main.d0cc85b6c89517e3(), !dbg !16
// CHECK:STDOUT: call void @_CG.Main.e8d4d639bae9ba40(), !dbg !17
// CHECK:STDOUT: ret i32 0, !dbg !18
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: declare i32 @printf(ptr, ...)
// CHECK:STDOUT:
// CHECK:STDOUT: ; Function Attrs: nounwind
// CHECK:STDOUT: define linkonce_odr void @_CG.Main.c81631f865470482() #0 !dbg !19 {
// CHECK:STDOUT: define linkonce_odr void @_CG.Main.d0cc85b6c89517e3() #0 !dbg !19 {
// CHECK:STDOUT: entry:
// CHECK:STDOUT: call void @"_CF.X.Main:I.Main"(), !dbg !20
// CHECK:STDOUT: ret void, !dbg !21
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: ; Function Attrs: nounwind
// CHECK:STDOUT: define linkonce_odr void @_CG.Main.0b241ec84a68877b() #0 !dbg !22 {
// CHECK:STDOUT: define linkonce_odr void @_CG.Main.e8d4d639bae9ba40() #0 !dbg !22 {
// CHECK:STDOUT: entry:
// CHECK:STDOUT: call void @"_CF.Y.Main:I.Main"(), !dbg !23
// CHECK:STDOUT: ret void, !dbg !24
@@ -105,10 +105,10 @@ fn Run() {
// CHECK:STDOUT: !16 = !DILocation(line: 33, column: 3, scope: !12)
// CHECK:STDOUT: !17 = !DILocation(line: 34, column: 3, scope: !12)
// CHECK:STDOUT: !18 = !DILocation(line: 32, column: 1, scope: !12)
// CHECK:STDOUT: !19 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.c81631f865470482", scope: null, file: !1, line: 30, type: !5, spFlags: DISPFlagDefinition, unit: !0)
// CHECK:STDOUT: !19 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.d0cc85b6c89517e3", scope: null, file: !1, line: 30, type: !5, spFlags: DISPFlagDefinition, unit: !0)
// CHECK:STDOUT: !20 = !DILocation(line: 30, column: 22, scope: !19)
// CHECK:STDOUT: !21 = !DILocation(line: 30, column: 1, scope: !19)
// CHECK:STDOUT: !22 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.0b241ec84a68877b", scope: null, file: !1, line: 30, type: !5, spFlags: DISPFlagDefinition, unit: !0)
// CHECK:STDOUT: !22 = distinct !DISubprogram(name: "G", linkageName: "_CG.Main.e8d4d639bae9ba40", scope: null, file: !1, line: 30, type: !5, spFlags: DISPFlagDefinition, unit: !0)
// CHECK:STDOUT: !23 = !DILocation(line: 30, column: 22, scope: !22)
// CHECK:STDOUT: !24 = !DILocation(line: 30, column: 1, scope: !22)
// CHECK:STDOUT: