swiftlang / swift

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

`Signal 6` when attempting to run `swift package generate-documentation` in certain cases. #75258

Open fibrechannelscsi opened 1 month ago

fibrechannelscsi commented 1 month ago

Description

The code shown below generates a signal 6 when an attempt is made to build DocC-style documentation via swift package generate-documentation. This affects some toolchains, but not others.

It is sufficient to invoke the generation of documentation via an effected toolchain via: /Library/Developer/Toolchains/swift-6.0-DEVELOPMENT-SNAPSHOT-2024-07-13-a.xctoolchain/usr/bin/swift package generate-documentation

Reproduction

This project requires one dependency: dependencies: [.package(url: "https://github.com/apple/swift-docc-plugin", from: "1.0.0")]

Adding this dependency will also pull in swift-docc-symbolkit.

Copy and paste the following code into a new project with the above dependency.

import _Differentiation
extension Array where Element: Differentiable {func a(o: inout TangentVector) {}}
public extension Sequence where Self: Collection, Self: Differentiable, Self.TangentVector: RangeReplaceableCollection, Self.TangentVector.Element == Element.TangentVector, Element: Differentiable, Element: Comparable
    ,Index == Self.TangentVector.Index
{
    @derivative(of: min) func v() -> (value: Element?, pullback: (Element?.TangentVector) -> (Self.TangentVector)) {return (value: withoutDerivative(at: self.indices.min{self[$0] < self[$1]}).map {self[$0]}, pullback: {v in return Self.TangentVector(repeating: .zero, count: 1)})}
}

Then, run: swift package generate-documentation via the command line, or via Xcode: Product -> Build Documentation.

Stack dump

The stack dump has been formatted for easier readability.

error: unspecified("signalled(6): /Library/Developer/Toolchains/swift-6.0-DEVELOPMENT-SNAPSHOT-2024-07-13-a.xctoolchain/usr/bin/swift-symbolgraph-extract -sdk /Users/user/Downloads/Xcode15RC1.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.2.sdk -F /Users/user/Downloads/Xcode15RC1.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks -I /Users/user/Downloads/Xcode15RC1.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/lib -L /Users/user/Downloads/Xcode15RC1.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/lib -I /Users/user/aaa/.build/arm64-apple-macosx/debug/Modules -module-name aaa -target arm64-apple-macosx10.13 -module-cache-path /Users/user/aaa/.build/arm64-apple-macosx/debug/ModuleCache -minimum-access-level internal -skip-inherited-docs -emit-extension-block-symbols -output-dir /Users/user/aaa/.build/arm64-apple-macosx/extracted-symbols/aaa/aaa output:
    Term verification failed
    Initial term:    τ_0_0.[Differentiable:TangentVector]
    Erased term:     τ_0_0.TangentVector
    Simplified term: τ_0_0.TangentVector

    Requirement machine for <τ_0_0 where τ_0_0 : Sequence>
    Rewrite system: {
    - [Sequence].[Sequence] => [Sequence] [permanent]
    - [Sequence].Element => [Sequence:Element] [permanent]
    - [Sequence].Iterator => [Sequence:Iterator] [permanent]
    - [Sequence].[Copyable] => [Sequence] [explicit]
    - [Sequence].[Escapable] => [Sequence] [explicit]
    - [Sequence:Iterator].[IteratorProtocol:Element] => [Sequence:Element] [explicit]
    - [Sequence:Iterator].[IteratorProtocol] => [Sequence:Iterator] [explicit]
    - [Sequence].Generator => [Sequence:Iterator] [explicit]
    - [Sequence].[Sequence:Element] => [Sequence:Element]
    - [Sequence].[Sequence:Iterator] => [Sequence:Iterator]
    - [Sequence:Element].[Copyable] => [Sequence:Element]
    - [Sequence:Element].[Escapable] => [Sequence:Element]
    - [Sequence:Iterator].Element => [Sequence:Element]
    - [Sequence:Iterator].[Copyable] => [Sequence:Iterator]
    - [Sequence:Iterator].[Escapable] => [Sequence:Iterator]
    - [Copyable].[Copyable] => [Copyable] [permanent]
    - [Escapable].[Escapable] => [Escapable] [permanent]
    - [IteratorProtocol].[IteratorProtocol] => [IteratorProtocol] [permanent]
    - [IteratorProtocol].Element => [IteratorProtocol:Element] [permanent]
    - [IteratorProtocol].[Copyable] => [IteratorProtocol] [explicit]
    - [IteratorProtocol].[Escapable] => [IteratorProtocol] [explicit]
    - [IteratorProtocol:Element].[Copyable] => [IteratorProtocol:Element] [explicit]
    - [IteratorProtocol:Element].[Escapable] => [IteratorProtocol:Element] [explicit]
    - [IteratorProtocol].[IteratorProtocol:Element] => [IteratorProtocol:Element]
    - τ_0_0.[Sequence] => τ_0_0 [explicit]
    - τ_0_0.Element => τ_0_0.[Sequence:Element]
    - τ_0_0.Iterator => τ_0_0.[Sequence:Iterator]
    - τ_0_0.[Copyable] => τ_0_0
    - τ_0_0.[Escapable] => τ_0_0
    - τ_0_0.Generator => τ_0_0.[Sequence:Iterator]
    }
    Property map: {
      [Sequence] => { conforms_to: [Sequence Copyable Escapable] }
      [Sequence:Iterator] => { conforms_to: [IteratorProtocol Copyable Escapable] }
      [Sequence:Element] => { conforms_to: [Copyable Escapable] }
      [Copyable] => { conforms_to: [Copyable] }
      [Escapable] => { conforms_to: [Escapable] }
      [IteratorProtocol] => { conforms_to: [IteratorProtocol Copyable Escapable] }
      [IteratorProtocol:Element] => { conforms_to: [Copyable Escapable] }
      τ_0_0 => { conforms_to: [Sequence Copyable Escapable] }
    }
    Conformance paths: {
    }
    PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
    Stack dump:
    0.  Program arguments: /Library/Developer/Toolchains/swift-6.0-DEVELOPMENT-SNAPSHOT-2024-07-13-a.xctoolchain/usr/bin/swift-symbolgraph-extract -sdk /Users/user/Downloads/Xcode15RC1.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.2.sdk -F /Users/user/Downloads/Xcode15RC1.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks -I /Users/user/Downloads/Xcode15RC1.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/lib -L /Users/user/Downloads/Xcode15RC1.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/lib -I /Users/user/aaa/.build/arm64-apple-macosx/debug/Modules -module-name aaa -target arm64-apple-macosx10.13 -module-cache-path /Users/user/aaa/.build/arm64-apple-macosx/debug/ModuleCache -minimum-access-level internal -skip-inherited-docs -emit-extension-block-symbols -output-dir /Users/user/aaa/.build/arm64-apple-macosx/extracted-symbols/aaa/aaa
    1.  Apple Swift version 6.0-dev (LLVM a41678ee19c803d, Swift ce381e7b159dfac)
    Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
    0  swift-frontend           0x00000001060a4e40 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 56
    1  swift-frontend           0x00000001060a360c llvm::sys::RunSignalHandlers() + 112
    2  swift-frontend           0x00000001060a5488 SignalHandler(int) + 304
    3  libsystem_platform.dylib 0x0000000188935a24 _sigtramp + 56
    4  libsystem_pthread.dylib  0x0000000188905cc0 pthread_kill + 288
    5  libsystem_c.dylib        0x0000000188811a40 abort + 180
    6  swift-frontend           0x00000001065fd03c swift::rewriting::RequirementMachine::verify(swift::rewriting::MutableTerm const&) const (.cold.3) + 0
    7  swift-frontend           0x00000001024aac7c swift::rewriting::RequirementMachine::verify(swift::rewriting::MutableTerm const&) const + 1016
    8  swift-frontend           0x00000001024aafc8 swift::rewriting::RequirementMachine::requiresProtocol(swift::Type, swift::ProtocolDecl const*) const + 136
    9  swift-frontend           0x00000001025148c8 swift::SubstitutionMap::lookupConformance(swift::CanType, swift::ProtocolDecl*) const + 284
    10 swift-frontend           0x00000001025476f0 swift::LookUpConformanceInSubstitutionMap::operator()(swift::CanType, swift::Type, swift::ProtocolDecl*) const + 136
    11 swift-frontend           0x0000000102548fac swift::InFlightSubstitution::lookupConformance(swift::CanType, swift::Type, swift::ProtocolDecl*, unsigned int) + 52
    12 swift-frontend           0x000000010254815c getMemberForBaseType(swift::InFlightSubstitution&, swift::Type, swift::Type, swift::AssociatedTypeDecl*, swift::Identifier, unsigned int) + 620
    13 swift-frontend           0x000000010254ba8c std::__1::optional<swift::Type> llvm::function_ref<std::__1::optional<swift::Type> (swift::TypeBase*)>::callback_fn<substType(swift::Type, unsigned int, swift::InFlightSubstitution&)::$_4>(long, swift::TypeBase*) + 416
    14 swift-frontend           0x00000001025280b4 swift::Type::transformWithPosition(swift::TypePosition, llvm::function_ref<std::__1::optional<swift::Type> (swift::TypeBase*, swift::TypePosition)>) const + 112
    15 swift-frontend           0x000000010252a4e0 swift::Type::transformRec(llvm::function_ref<std::__1::optional<swift::Type> (swift::TypeBase*)>) const + 36
    16 swift-frontend           0x0000000102549318 substType(swift::Type, unsigned int, swift::InFlightSubstitution&) + 348
    17 swift-frontend           0x0000000102549140 swift::Type::subst(swift::SubstitutionMap, swift::SubstOptions) const + 212
    18 swift-frontend           0x00000001017aa4a4 swift::Requirement swift::Requirement::subst<swift::SubstitutionMap&>(swift::SubstitutionMap&) const + 216
    19 swift-frontend           0x00000001018a0e24 swift::SynthesizedExtensionAnalyzer::Implementation::isApplicable(swift::ExtensionDecl*, bool, swift::ExtensionDecl*, swift::NormalProtocolConformance*)::\'lambda\'(swift::SubstitutionMap, swift::ExtensionDecl*, llvm::ArrayRef<swift::Requirement>)::operator()(swift::SubstitutionMap, swift::ExtensionDecl*, llvm::ArrayRef<swift::Requirement>) const + 500
    20 swift-frontend           0x00000001018a08d0 swift::SynthesizedExtensionAnalyzer::Implementation::isApplicable(swift::ExtensionDecl*, bool, swift::ExtensionDecl*, swift::NormalProtocolConformance*) + 464
    21 swift-frontend           0x00000001018a0214 swift::SynthesizedExtensionAnalyzer::Implementation::collectSynthesizedExtensionInfo(std::__1::vector<swift::SynthesizedExtensionAnalyzer::Implementation::ExtensionMergeGroup, std::__1::allocator<swift::SynthesizedExtensionAnalyzer::Implementation::ExtensionMergeGroup>>&)::\'lambda\'(swift::ExtensionDecl*, bool, swift::ExtensionDecl*, swift::NormalProtocolConformance*)::operator()(swift::ExtensionDecl*, bool, swift::ExtensionDecl*, swift::NormalProtocolConformance*) const + 164
    22 swift-frontend           0x000000010189fb64 swift::SynthesizedExtensionAnalyzer::Implementation::collectSynthesizedExtensionInfo(std::__1::vector<swift::SynthesizedExtensionAnalyzer::Implementation::ExtensionMergeGroup, std::__1::allocator<swift::SynthesizedExtensionAnalyzer::Implementation::ExtensionMergeGroup>>&) + 704
    23 swift-frontend           0x000000010189f0e0 swift::SynthesizedExtensionAnalyzer::SynthesizedExtensionAnalyzer(swift::NominalTypeDecl*, swift::PrintOptions, bool) + 156
    24 swift-frontend           0x0000000101878100 swift::symbolgraphgen::SymbolGraph::recordConformanceSynthesizedMemberRelationships(swift::symbolgraphgen::Symbol) + 292
    25 swift-frontend           0x0000000101877d64 swift::symbolgraphgen::SymbolGraph::recordNode(swift::symbolgraphgen::Symbol) + 116
    26 swift-frontend           0x0000000101880764 swift::symbolgraphgen::SymbolGraphASTWalker::walkToDeclPre(swift::Decl*, swift::CharSourceRange) + 364
    27 swift-frontend           0x00000001018bde48 (anonymous namespace)::SemaAnnotator::walkToDeclPre(swift::Decl*) + 1904
    28 swift-frontend           0x000000010226c0d4 (anonymous namespace)::Traversal::doIt(swift::Decl*) + 252
    29 swift-frontend           0x000000010226bfcc swift::Decl::walk(swift::ASTWalker&) + 32
    30 swift-frontend           0x00000001018bc720 swift::SourceEntityWalker::walk(swift::Decl*) + 200
    31 swift-frontend           0x000000010187f5f8 swift::symbolgraphgen::emitSymbolGraphForModule(swift::ModuleDecl*, swift::symbolgraphgen::SymbolGraphOptions const&) + 468
    32 swift-frontend           0x0000000100a71454 swift_symbolgraph_extract_main(llvm::ArrayRef<char const*>, char const*, void*) + 6712
    33 swift-frontend           0x0000000100a1aa90 swift::mainEntry(int, char const**) + 8640
    34 dyld                     0x00000001885850e0 start + 2360
    ")

Expected behavior

The generation of documentation (Generated DocC archive) should complete successfully, without crashing.

Environment

Toolchains that can cause a crash: swift-6.0-DEVELOPMENT-SNAPSHOT-2024-07-13-a swift-DEVELOPMENT-SNAPSHOT-2024-06-13-a

A toolchain that is not affected: swift-DEVELOPMENT-SNAPSHOT-2024-07-07-a

The above pertains to MacOS 14.2.1.

Additional information

Commenting out any of lines 2, 4, or 6 will cause the generation of documentation to succeed. (This is the reason why ,Index == Self.TangentVector.Index is on a separate line). Although the reproducer itself will build correctly both in Debug and Release mode, it is the generation of the DocC documentation that can cause a crash with certain toolchains.

Contents of Package.resolved:

{
  "pins" : [
    {
      "identity" : "swift-docc-plugin",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/apple/swift-docc-plugin",
      "state" : {
        "revision" : "26ac5758409154cc448d7ab82389c520fa8a8247",
        "version" : "1.3.0"
      }
    },
    {
      "identity" : "swift-docc-symbolkit",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/apple/swift-docc-symbolkit",
      "state" : {
        "revision" : "b45d1f2ed151d057b54504d653e0da5552844e34",
        "version" : "1.0.0"
      }
    }
  ],
  "version" : 2
}

Here is a potentially related issue; it is the only search result for Term Verification Failed: https://github.com/swiftlang/swift/issues/66596

If the documentation is generated in Xcode via Product -> Build Documentation, the following stack frames will be shown (there is some overlap between the stack trace shown below and the stack trace shown above):

30 swift-frontend           0x00000001051d0720 swift::SourceEntityWalker::walk(swift::Decl*) + 200
31 swift-frontend           0x00000001051935f8 swift::symbolgraphgen::emitSymbolGraphForModule(swift::ModuleDecl*, swift::symbolgraphgen::SymbolGraphOptions const&) + 468
32 swift-frontend           0x000000010477e664 swift::serialize(llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::SerializationOptions const&, swift::symbolgraphgen::SymbolGraphOptions const&, swift::SILModule const*, swift::fine_grained_dependencies::SourceFileDepGraph const*) + 420
33 swift-frontend           0x0000000104516fb4 std::__1::__function::__func<performCompileStepsPostSILGen(swift::CompilerInstance&, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule>>, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::PrimarySpecificPaths const&, int&, swift::FrontendObserver*)::$_30, std::__1::allocator<performCompileStepsPostSILGen(swift::CompilerInstance&, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule>>, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::PrimarySpecificPaths const&, int&, swift::FrontendObserver*)::$_30>, void ()>::operator()() + 308
34 swift-frontend           0x00000001053b41e8 swift::SILModule::serialize() + 44
35 swift-frontend           0x0000000105063778 SerializeSILPass::run() + 156
36 swift-frontend           0x0000000104f14a38 swift::SILPassManager::runModulePass(unsigned int) + 856
37 swift-frontend           0x0000000104f16ddc swift::SILPassManager::execute() + 624
38 swift-frontend           0x0000000104f117c8 swift::SILPassManager::executePassPipelinePlan(swift::SILPassPipelinePlan const&) + 72
39 swift-frontend           0x0000000104f11748 swift::ExecuteSILPipelineRequest::evaluate(swift::Evaluator&, swift::SILPipelineExecutionDescriptor) const + 68
40 swift-frontend           0x0000000104f4cb50 swift::SimpleRequest<swift::ExecuteSILPipelineRequest, std::__1::tuple<> (swift::SILPipelineExecutionDescriptor), (swift::RequestFlags)1>::evaluateRequest(swift::ExecuteSILPipelineRequest const&, swift::Evaluator&) + 28
41 swift-frontend           0x0000000104f2d0ac swift::ExecuteSILPipelineRequest::OutputType swift::Evaluator::getResultUncached<swift::ExecuteSILPipelineRequest, swift::ExecuteSILPipelineRequest::OutputType swift::evaluateOrFatal<swift::ExecuteSILPipelineRequest>(swift::Evaluator&, swift::ExecuteSILPipelineRequest)::'lambda'()>(swift::ExecuteSILPipelineRequest const&, swift::ExecuteSILPipelineRequest::OutputType swift::evaluateOrFatal<swift::ExecuteSILPipelineRequest>(swift::Evaluator&, swift::ExecuteSILPipelineRequest)::'lambda'()) + 204
42 swift-frontend           0x0000000104f119a4 swift::executePassPipelinePlan(swift::SILModule*, swift::SILPassPipelinePlan const&, bool, swift::irgen::IRGenModule*) + 64
43 swift-frontend           0x0000000104f2f728 swift::runSILOptimizationPasses(swift::SILModule&) + 156
44 swift-frontend           0x0000000104753120 swift::CompilerInstance::performSILProcessing(swift::SILModule*) + 636
45 swift-frontend           0x000000010451303c performCompileStepsPostSILGen(swift::CompilerInstance&, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule>>, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::PrimarySpecificPaths const&, int&, swift::FrontendObserver*) + 796
46 swift-frontend           0x0000000104512938 swift::performCompileStepsPostSema(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 1216
47 swift-frontend           0x000000010451e404 withSemanticAnalysis(swift::CompilerInstance&, swift::FrontendObserver*, llvm::function_ref<bool (swift::CompilerInstance&)>, bool) + 160
48 swift-frontend           0x00000001045145e0 performCompile(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 708
49 swift-frontend           0x0000000104513cb4 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 2344
50 swift-frontend           0x000000010432d4e8 swift::mainEntry(int, char const**) + 3096
51 dyld                     0x00000001885850e0 start + 2360

Both of these stack traces are generated via the swift-6.0-DEVELOPMENT-SNAPSHOT-2024-07-13-a toolchain.

fibrechannelscsi commented 1 month ago

This also fails under Ubuntu 20 (x86) with the swift-DEVELOPMENT-SNAPSHOT-2024-06-04-a-ubuntu20.04 toolchain.

Even though Collection conforms to Sequence, the following modification to line 3 generates an error message saying min cannot be resolved:

public extension Collection where Self: Differentiable, Self.TangentVector: RangeReplaceableCollection, Self.TangentVector.Element == Element.TangentVector, Element: Differentiable & Comparable

The last part of line 3, Element: Differentiable, Element: Comparable can be reduced to Element: Differentiable & Comparable.