swiftlang / swift

The Swift Programming Language
https://swift.org
Apache License 2.0
67.32k stars 10.34k forks source link

Regression: compiler crash when matching some overlapping patterns #76590

Open z2oh opened 3 hours ago

z2oh commented 3 hours ago

Description

We started seeing this crash with nightly windows toolchains around the beginning of this month (Sept. 6th or earlier). It seems in some cases when patterns overlap, instead of the more specialized pattern being given a higher priority, the compiler will crash.

Reproduction

public struct ExampleType: Equatable {
    public static let test1 = Self()
}

public enum ExampleEnum: Equatable {

    case exampleCase(ExampleType)

    public var exampleVar: [String] {
        switch self {
        case let .exampleCase(exampleType):
            return []
        case .exampleCase(.test1):
            return []
        }
    }
}

Stack dump

Stack dump:
0.      Program arguments: C:\\Users\\JeremyDay\\AppData\\Local\\Programs\\Swift\\Toolchains\\0.0.0+Asserts\\usr\\bin\\swift-frontend.exe -frontend -interpret C:\\Users\\JeremyDay\\Desktop\\dominance_repro\\repro.swift -disable-objc-interop -sdk C:\\Users\\JeremyDay\\AppData\\Local\\Programs\\Swift\\Platforms\\0.0.0\\Windows.platform\\Developer\\SDKs\\Windows.sdk\\ -color-diagnostics -empty-abi-descriptor -Xcc -working-directory -Xcc C:\\Users\\JeremyDay\\Desktop\\dominance_repro -resource-dir C:\\Users\\JeremyDay\\AppData\\Local\\Programs\\Swift\\Toolchains\\0.0.0+Asserts\\usr\\lib\\swift -module-name repro -in-process-plugin-server-path C:\\Users\\JeremyDay\\AppData\\Local\\Programs\\Swift\\Toolchains\\0.0.0+Asserts\\usr\\bin\\SwiftInProcPluginServer.dll -plugin-path C:\\Users\\JeremyDay\\AppData\\Local\\Programs\\Swift\\Toolchains\\0.0.0+Asserts\\usr\\bin -plugin-path C:\\Users\\JeremyDay\\AppData\\Local\\Programs\\Swift\\Toolchains\\0.0.0+Asserts\\usr\\local\\bin
1.      compnerd.org Swift version 6.1-dev (LLVM cdc8e8b92cfb482, Swift 4bb9a587fa3c1f1)
2.      Compiling with effective version 5.10
Exception Code: 0xC0000005
 #0 0x00007ff9757bb330 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Runtimes\0.0.0\usr\bin\swiftCore.dll+0x34b330)
 #1 0x00007ff9757ba74f (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Runtimes\0.0.0\usr\bin\swiftCore.dll+0x34a74f)
 #2 0x00007ff975770757 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Runtimes\0.0.0\usr\bin\swiftCore.dll+0x300757)
 #3 0x00007ff9757b9090 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Runtimes\0.0.0\usr\bin\swiftCore.dll+0x349090)
 #4 0x00007ff9757a5273 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Runtimes\0.0.0\usr\bin\swiftCore.dll+0x335273)
 #5 0x00007ff9757adbcd (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Runtimes\0.0.0\usr\bin\swiftCore.dll+0x33dbcd)
 #6 0x00007ff9757aac9d (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Runtimes\0.0.0\usr\bin\swiftCore.dll+0x33ac9d)
 #7 0x00007ff9757a7163 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Runtimes\0.0.0\usr\bin\swiftCore.dll+0x337163)
 #8 0x00007ff9757a22d5 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Runtimes\0.0.0\usr\bin\swiftCore.dll+0x3322d5)
 #9 0x00007ff97579072d (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Runtimes\0.0.0\usr\bin\swiftCore.dll+0x32072d)
#10 0x00007ff975790455 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Runtimes\0.0.0\usr\bin\swiftCore.dll+0x320455)
#11 0x00007ff97558555d (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Runtimes\0.0.0\usr\bin\swiftCore.dll+0x11555d)
#12 0x00007ff9ca45c570 $s25_CompilerSwiftDiagnostics07GroupedC0V12SourceFileIDVMa (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\_CompilerSwiftDiagnostics.dll+0xc570)
#13 0x00007ff9ca45afcd $s25_CompilerSwiftDiagnostics07GroupedC0V13addDiagnostic_2inyAA0F0V_AC12SourceFileIDVSgtF (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\_CompilerSwiftDiagnostics.dll+0xafcd)
#14 0x00007ff9ca45e223 $s25_CompilerSwiftDiagnostics07GroupedC0V12SourceFileIDVMa (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\_CompilerSwiftDiagnostics.dll+0xe223)
#15 0x00007ff9ca45b43a $s25_CompilerSwiftDiagnostics0C9FormatterV15annotateSources2in11contextSize8colorizeSSAA07GroupedC0V_SiSbtFZ (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\_CompilerSwiftDiagnostics.dll+0xb43a)
#16 0x00007ff9ca45bdfe $s25_CompilerSwiftDiagnostics07GroupedC0V12SourceFileIDVMa (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\_CompilerSwiftDiagnostics.dll+0xbdfe)
#17 0x00007ff9ca45b193 $s25_CompilerSwiftDiagnostics0C9FormatterV15annotateSources2inSSAA07GroupedC0V_tF (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\_CompilerSwiftDiagnostics.dll+0xb193)
#18 0x00007ff6eeb6615f (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x26615f)
#19 0x00007ff6f0959940 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x2059940)
#20 0x00007ff6ef0f3925 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x7f3925)
#21 0x00007ff6ef0f38db (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x7f38db)
#22 0x00007ff6f06a46db (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x1da46db)
#23 0x00007ff6eeeab2be (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x5ab2be)
#24 0x00007ff6eed00c8c (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x400c8c)
#25 0x00007ff6eed0085c (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x40085c)
#26 0x00007ff6f4cace2c (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x63ace2c)
#27 0x00007ffa24c3257d (C:\Windows\System32\KERNEL32.DLL+0x1257d)
#28 0x00007ffa2534af28 (C:\Windows\SYSTEM32\ntdll.dll+0x5af28)

Expected behavior

The code should compile

Environment

compnerd.org Swift version 6.1-dev (LLVM cdc8e8b92cfb482, Swift 4bb9a587fa3c1f1) Target: x86_64-unknown-windows-msv

Additional information

The above trace (partially) symbolized with windbg:

00 000000fe`c5d87fa0 00007ff9`737aa74f     swiftCore!swift_conformsToProtocolCommon+0xc00
01 000000fe`c5d880d0 00007ff9`73760757     swiftCore!swift_conformsToProtocolCommon+0x1f
02 000000fe`c5d88120 00007ff9`737a9090     swiftCore!swift_getFunctionFullNameFromMangledName+0xbe7
03 000000fe`c5d88150 00007ff9`73795273     swiftCore!swift_copyAuxiliaryExecutablePath+0x1d30
04 000000fe`c5d88540 00007ff9`7379dbcd     swiftCore!swift_instantiateCheckedGenericMetadata+0xfe3
05 000000fe`c5d88770 00007ff9`7379ac9d     swiftCore!swift_getTypeByMangledNode+0x6cad
06 000000fe`c5d88880 00007ff9`73797163     swiftCore!swift_getTypeByMangledNode+0x3d7d
07 000000fe`c5d88da0 00007ff9`737922d5     swiftCore!swift_getTypeByMangledNode+0x243
08 000000fe`c5d88fd0 00007ff9`7378072d     swiftCore!swift_getTypeByMangledName+0x465
09 000000fe`c5d89bc0 00007ff9`73780455     swiftCore!swift_getAssociatedTypeWitness+0x30d
0a 000000fe`c5d89ea0 00007ff9`7357555d     swiftCore!swift_getAssociatedTypeWitness+0x35
0b 000000fe`c5d89ed0 00007ff9`ca45c570     swiftCore!$sSKsSS7ElementRtzrlE6joined9separatorS2S_tF+0x6d
0c 000000fe`c5d8a010 00007ff9`ca45afcd     _CompilerSwiftDiagnostics!$s25_CompilerSwiftDiagnostics07GroupedC0V12SourceFileIDVMa+0x10f0
0d 000000fe`c5d8a290 00007ff9`ca45e223     _CompilerSwiftDiagnostics!$s25_CompilerSwiftDiagnostics07GroupedC0V13addDiagnostic_2inyAA0F0V_AC12SourceFileIDVSgtF+0x19dd
0e 000000fe`c5d8a640 00007ff9`ca45b43a     _CompilerSwiftDiagnostics!$s25_CompilerSwiftDiagnostics07GroupedC0V12SourceFileIDVMa+0x2da3
0f 000000fe`c5d8a6b0 00007ff9`ca45bdfe     _CompilerSwiftDiagnostics!$s25_CompilerSwiftDiagnostics0C9FormatterV15annotateSources2in11contextSize8colorizeSSAA07GroupedC0V_SiSbtFZ+0x21a
10 000000fe`c5d8a6e0 00007ff9`ca45b193     _CompilerSwiftDiagnostics!$s25_CompilerSwiftDiagnostics07GroupedC0V12SourceFileIDVMa+0x97e
11 000000fe`c5d8a780 00007ff6`eeb6615f     _CompilerSwiftDiagnostics!$s25_CompilerSwiftDiagnostics0C9FormatterV15annotateSources2inSSAA07GroupedC0V_tF+0x43
12 000000fe`c5d8a820 00007ff6`f0959940     swift_frontend+0x26615f
13 000000fe`c5d8a8b0 00007ff6`ef0f3925     swift_frontend+0x2059940
14 000000fe`c5d8a900 00007ff6`ef0f38db     swift_frontend+0x7f3925
15 000000fe`c5d8a990 00007ff6`f06a46db     swift_frontend+0x7f38db
16 000000fe`c5d8a9c0 00007ff6`eeeab2be     swift_frontend+0x1da46db
17 000000fe`c5d8a9f0 00007ff6`eed00c8c     swift_frontend+0x5ab2be
18 000000fe`c5d8cbb0 00007ff6`eed0085c     swift_frontend+0x400c8c
19 000000fe`c5d8e2c0 00007ff6`f4cace2c     swift_frontend+0x40085c
1a 000000fe`c5d8f790 00007ffa`24c3257d     swift_frontend+0x63ace2c
1b 000000fe`c5d8f7d0 00007ffa`2534af28     KERNEL32!BaseThreadInitThunk+0x1d
1c 000000fe`c5d8f800 00000000`00000000     ntdll!RtlUserThreadStart+0x28

Un-minimizing the reproducer a bit gives a slightly different error complaining about "Found a leak due to a consuming post-dominance failure!" as well as crashing with a stack trace. This was the initial error we saw in production code. I'm guessing the fully minimal repro is more representative of the underlying issue and this additional error stems from that root problem, but in case it is useful, here is a slightly less minimal reproduction and the associated error:

public struct ExampleType: Equatable {
    public let example: String

    public static let test1 = Self(example: "test1")
}

public enum ExampleEnum: Equatable {

    case exampleCase(ExampleType)

    public var exampleVar: [String] {
        switch self {
        case let .exampleCase(exampleType):
            return [exampleType.example]
        case .exampleCase(.test1):
            return ["test1"]
        }
    }
}

crashes with

Begin Error in Function: '$s5repro11ExampleEnumO10exampleVarSaySSGvg'
Error! Found a leak due to a consuming post-dominance failure!
Value:   %25 = move_value [var_decl] %24 : $ExampleType  // users: %45, %33
Post Dominating Failure Blocks:
 bb4
End Error in Function: '$s5repro11ExampleEnumO10exampleVarSaySSGvg'
Found ownership error?!
<unknown>:0: error: fatal error encountered during compilation; please submit a bug report (https://swift.org/contributing/#reporting-bugs)
<unknown>:0: note: triggering standard assertion failure routine
Stack dump:
0.      Program arguments: C:\\Users\\JeremyDay\\AppData\\Local\\Programs\\Swift\\Toolchains\\0.0.0+Asserts\\usr\\bin\\swift-frontend.exe -frontend -interpret C:\\Users\\JeremyDay\\Desktop\\dominance_repro\\repro.swift -disable-objc-interop -sdk C:\\Users\\JeremyDay\\AppData\\Local\\Programs\\Swift\\Platforms\\0.0.0\\Windows.platform\\Developer\\SDKs\\Windows.sdk\\ -color-diagnostics -empty-abi-descriptor -Xcc -working-directory -Xcc C:\\Users\\JeremyDay\\Desktop\\dominance_repro -resource-dir C:\\Users\\JeremyDay\\AppData\\Local\\Programs\\Swift\\Toolchains\\0.0.0+Asserts\\usr\\lib\\swift -module-name repro -in-process-plugin-server-path C:\\Users\\JeremyDay\\AppData\\Local\\Programs\\Swift\\Toolchains\\0.0.0+Asserts\\usr\\bin\\SwiftInProcPluginServer.dll -plugin-path C:\\Users\\JeremyDay\\AppData\\Local\\Programs\\Swift\\Toolchains\\0.0.0+Asserts\\usr\\bin -plugin-path C:\\Users\\JeremyDay\\AppData\\Local\\Programs\\Swift\\Toolchains\\0.0.0+Asserts\\usr\\local\\bin
1.      compnerd.org Swift version 6.1-dev (LLVM cdc8e8b92cfb482, Swift 4bb9a587fa3c1f1)
2.      Compiling with effective version 5.10
3.      While evaluating request ExecuteSILPipelineRequest(Run pipelines { SILGen Passes } on SIL for repro)
4.      While running pass #0 SILModuleTransform "SILGenCleanup".
5.      While silgen cleanup SIL function "@$s5repro11ExampleEnumO10exampleVarSaySSGvg".
 for getter for exampleVar (at C:\Users\JeremyDay\Desktop\dominance_repro\repro.swift:11:16)
Exception Code: 0x80000003
 #0 0x00007ff6f4c4ca65 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x634ca65)
 #1 0x00007ffa22ebe6d5 (C:\Windows\System32\ucrtbase.dll+0x7e6d5)
 #2 0x00007ffa22ebf6e1 (C:\Windows\System32\ucrtbase.dll+0x7f6e1)
 #3 0x00007ff6ef145def (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x845def)
 #4 0x00007ff6f4bd34ca (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x62d34ca)
 #5 0x00007ff6f4bd3671 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x62d3671)
 #6 0x00007ff6f00b1360 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x17b1360)
 #7 0x00007ff6f00afdc0 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x17afdc0)
 #8 0x00007ff6f00b0c54 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x17b0c54)
 #9 0x00007ff6f00b033f (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x17b033f)
#10 0x00007ff6eff2fc2a (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x162fc2a)
#11 0x00007ff6eff32593 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x1632593)
#12 0x00007ff6eff32187 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x1632187)
#13 0x00007ff6efa65b49 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x1165b49)
#14 0x00007ff6efa65fa5 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x1165fa5)
#15 0x00007ff6ef71eb7f (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0xe1eb7f)
#16 0x00007ff6ef71865f (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0xe1865f)
#17 0x00007ff6ef7188a4 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0xe188a4)
#18 0x00007ff6ef7182f7 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0xe182f7)
#19 0x00007ff6ef76db1d (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0xe6db1d)
#20 0x00007ff6ef718a3c (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0xe18a3c)
#21 0x00007ff6ef701bad (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0xe01bad)
#22 0x00007ff6ef11fc54 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x81fc54)
#23 0x00007ff6eeea8f4a (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x5a8f4a)
#24 0x00007ff6eeea9903 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x5a9903)
#25 0x00007ff6eeea86b8 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x5a86b8)
#26 0x00007ff6eeea8c4b (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x5a8c4b)
#27 0x00007ff6eeeaaa95 (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x5aaa95)
#28 0x00007ff6eed00c8c (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x400c8c)
#29 0x00007ff6eed0085c (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x40085c)
#30 0x00007ff6f4cace2c (C:\Users\JeremyDay\AppData\Local\Programs\Swift\Toolchains\0.0.0+Asserts\usr\bin\swift-frontend.exe+0x63ace2c)
#31 0x00007ffa24c3257d (C:\Windows\System32\KERNEL32.DLL+0x1257d)
#32 0x00007ffa2534af28 (C:\Windows\SYSTEM32\ntdll.dll+0x5af28)
z2oh commented 3 hours ago

Another interesting bit, adding a default handler avoids the crash (and should be a noop as the match is exhaustive). That is, this program compiles:

public struct ExampleType: Equatable {
    public static let test1 = Self()
}

public enum ExampleEnum: Equatable {

    case exampleCase(ExampleType)

    public var exampleVar: [String] {
        switch self {
        case let .exampleCase(exampleType):
            return []
        case .exampleCase(.test1):
            return []
        default:
            fatalError("unreachable")
        }
    }
}