swiftlang / swift

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

6.0 Toolchain (May 14th) crash when type checking DistributedActorSystem implementation #73704

Closed martialln closed 2 days ago

martialln commented 4 months ago

Description

When compiling a project with the toolchain 6.0 and main from May 14th the compiler with an assertion when type checking the Distributed Actor System implemention.

Project can be found here : https://github.com/martiall/swift-subprocess-distributedactors (commit 7ac9349) When compiling with the following toolchain included in Xcode 15.4 (15F31d), everything works fine.

swift-driver version: 1.90.11.1 Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4)
Target: arm64-apple-macosx14.0

Sorry I don't have a reduced version of the crash.

Reproduction

Clone https://github.com/martiall/swift-subprocess-distributedactors Checkout the commit 7ac9349 Compile the project with TOOLCHAINS=org.swift.600202405141a swiftc -version

Stack dump

Assertion failed: (member->getDeclContext() == ext && "Added member to the wrong context"), function addMember, file DeclContext.cpp, line 973.
Please submit a bug report (https://swift.org/contributing/#reporting-bugs) and include the crash backtrace.
Stack dump:
0.  Program arguments: <homedir>/Library/Developer/Toolchains/swift-6.0-DEVELOPMENT-SNAPSHOT-2024-05-14-a.xctoolchain/usr/bin/swift-frontend -frontend -emit-module -experimental-skip-non-inlinable-function-bodies-without-types <rootdir>/swift-subprocess-distributedactors/Sources/SubprocessDistributedActors/ActorID.swift <rootdir>/swift-subprocess-distributedactors/Sources/SubprocessDistributedActors/ActorSystem+Guest.swift <rootdir>/swift-subprocess-distributedactors/Sources/SubprocessDistributedActors/ActorSystem+Host.swift <rootdir>/swift-subprocess-distributedactors/Sources/SubprocessDistributedActors/ActorSystem.swift <rootdir>/swift-subprocess-distributedactors/Sources/SubprocessDistributedActors/InvocationDecoder.swift <rootdir>/swift-subprocess-distributedactors/Sources/SubprocessDistributedActors/InvocationEncoder.swift <rootdir>/swift-subprocess-distributedactors/Sources/SubprocessDistributedActors/Locks.swift <rootdir>/swift-subprocess-distributedactors/Sources/SubprocessDistributedActors/Message.swift <rootdir>/swift-subprocess-distributedactors/Sources/SubprocessDistributedActors/ResultHandler.swift -target arm64-apple-macosx13.0 -Xllvm -aarch64-use-tbi -enable-objc-interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk -I <rootdir>/swift-subprocess-distributedactors/.build/arm64-apple-macosx/debug/Modules -I /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/lib -F /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks -color-diagnostics -enable-testing -g -debug-info-format=dwarf -dwarf-version=4 -module-cache-path <rootdir>/swift-subprocess-distributedactors/.build/arm64-apple-macosx/debug/ModuleCache -swift-version 5 -Onone -D SWIFT_PACKAGE -D DEBUG -enable-experimental-feature StrictConcurrency -enable-upcoming-feature BareSlashRegexLiterals -enable-upcoming-feature ConciseMagicFile -enable-upcoming-feature ForwardTrailingClosures -enable-upcoming-feature ImportObjcForwardDeclarations -enable-upcoming-feature DisableOutwardActorInference -enable-upcoming-feature ExistentialAny -enable-upcoming-feature DeprecateApplicationMain -enable-upcoming-feature GlobalConcurrency -enable-upcoming-feature IsolatedDefaultValues -empty-abi-descriptor -resource-dir <homedir>/Library/Developer/Toolchains/swift-6.0-DEVELOPMENT-SNAPSHOT-2024-05-14-a.xctoolchain/usr/lib/swift -enable-anonymous-context-mangled-names -file-compilation-dir <rootdir>/swift-subprocess-distributedactors -Xcc -fmodule-map-file=<rootdir>/swift-subprocess-distributedactors/.build/checkouts/swift-atomics/Sources/_AtomicsShims/include/module.modulemap -Xcc -I -Xcc <rootdir>/swift-subprocess-distributedactors/.build/checkouts/swift-atomics/Sources/_AtomicsShims/include -Xcc -isysroot -Xcc /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk -Xcc -F -Xcc /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks -Xcc -fPIC -Xcc -g -module-name SubprocessDistributedActors -package-name swift_subprocess_distributedactors -plugin-path <homedir>/Library/Developer/Toolchains/swift-6.0-DEVELOPMENT-SNAPSHOT-2024-05-14-a.xctoolchain/usr/lib/swift/host/plugins -plugin-path <homedir>/Library/Developer/Toolchains/swift-6.0-DEVELOPMENT-SNAPSHOT-2024-05-14-a.xctoolchain/usr/local/lib/swift/host/plugins -target-sdk-version 14.5 -target-sdk-name macosx14.5 -external-plugin-path /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/lib/swift/host/plugins#/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/bin/swift-plugin-server -external-plugin-path /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/local/lib/swift/host/plugins#/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/bin/swift-plugin-server -emit-module-doc-path <rootdir>/swift-subprocess-distributedactors/.build/arm64-apple-macosx/debug/Modules/SubprocessDistributedActors.swiftdoc -emit-module-source-info-path <rootdir>/swift-subprocess-distributedactors/.build/arm64-apple-macosx/debug/Modules/SubprocessDistributedActors.swiftsourceinfo -emit-objc-header-path <rootdir>/swift-subprocess-distributedactors/.build/arm64-apple-macosx/debug/SubprocessDistributedActors.build/SubprocessDistributedActors-Swift.h -emit-dependencies-path <rootdir>/swift-subprocess-distributedactors/.build/arm64-apple-macosx/debug/SubprocessDistributedActors.build/SubprocessDistributedActors.emit-module.d -parse-as-library -o <rootdir>/swift-subprocess-distributedactors/.build/arm64-apple-macosx/debug/Modules/SubprocessDistributedActors.swiftmodule -emit-abi-descriptor-path <rootdir>/swift-subprocess-distributedactors/.build/arm64-apple-macosx/debug/Modules/SubprocessDistributedActors.abi.json
1.  Apple Swift version 6.0-dev (LLVM 5b202efbc95a8bf, Swift a17d360d1cc66ab)
2.  Compiling with effective version 5.10
3.  While evaluating request TypeCheckSourceFileRequest(source_file "<rootdir>/swift-subprocess-distributedactors/Sources/SubprocessDistributedActors/ActorSystem.swift")
4.  While type-checking extension of SubprocessActorSystem (at <rootdir>/swift-subprocess-distributedactors/Sources/SubprocessDistributedActors/ActorSystem.swift:91:1)
5.  While type-checking protocol conformance SubprocessActorSystem: DistributedActorSystem at extension of SubprocessActorSystem (at <rootdir>/swift-subprocess-distributedactors/Sources/SubprocessDistributedActors/ActorSystem.swift:91:1)
6.  While evaluating request ResolveValueWitnessesRequest(SubprocessActorSystem: DistributedActorSystem module SubprocessDistributedActors)
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           0x000000010a1f3808 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 56
1  swift-frontend           0x000000010a1f1fd4 llvm::sys::RunSignalHandlers() + 112
2  swift-frontend           0x000000010a1f3e50 SignalHandler(int) + 304
3  libsystem_platform.dylib 0x000000019b07f584 _sigtramp + 56
4  libsystem_pthread.dylib  0x000000019b04ec20 pthread_kill + 288
5  libsystem_c.dylib        0x000000019af5ba30 abort + 180
6  libsystem_c.dylib        0x000000019af5ad20 err + 0
7  swift-frontend           0x000000010a707acc swift::IterableDeclContext::addMemberSilently(swift::Decl*, swift::Decl*, bool) const (.cold.1) + 0
8  swift-frontend           0x00000001064ecefc swift::IterableDeclContext::addMemberSilently(swift::Decl*, swift::Decl*, bool) const + 0
9  swift-frontend           0x0000000105ee92fc swift::DerivedConformance::addMembersToConformanceContext(llvm::ArrayRef<swift::Decl*>) + 84
10 swift-frontend           0x0000000105ecf588 swift::DerivedConformance::deriveDistributedActorSystem(swift::ValueDecl*) + 576
11 swift-frontend           0x000000010605cac8 swift::ConformanceChecker::resolveWitnessViaDerivation(swift::ValueDecl*) + 584
12 swift-frontend           0x000000010605cc70 swift::ConformanceChecker::resolveWitnessTryingAllStrategies(swift::ValueDecl*) + 44
13 swift-frontend           0x000000010605d2bc swift::ConformanceChecker::resolveValueWitnesses() + 832
14 swift-frontend           0x000000010605dda8 swift::ResolveValueWitnessesRequest::evaluate(swift::Evaluator&, swift::NormalProtocolConformance*) const + 72
15 swift-frontend           0x00000001065e8f28 swift::ResolveValueWitnessesRequest::OutputType swift::Evaluator::getResultUncached<swift::ResolveValueWitnessesRequest, swift::ResolveValueWitnessesRequest::OutputType swift::evaluateOrDefault<swift::ResolveValueWitnessesRequest>(swift::Evaluator&, swift::ResolveValueWitnessesRequest, swift::ResolveValueWitnessesRequest::OutputType)::'lambda'()>(swift::ResolveValueWitnessesRequest const&, swift::ResolveValueWitnessesRequest::OutputType swift::evaluateOrDefault<swift::ResolveValueWitnessesRequest>(swift::Evaluator&, swift::ResolveValueWitnessesRequest, swift::ResolveValueWitnessesRequest::OutputType)::'lambda'()) + 224
16 swift-frontend           0x00000001065e8d68 swift::ResolveValueWitnessesRequest::OutputType swift::Evaluator::getResultCached<swift::ResolveValueWitnessesRequest, swift::ResolveValueWitnessesRequest::OutputType swift::evaluateOrDefault<swift::ResolveValueWitnessesRequest>(swift::Evaluator&, swift::ResolveValueWitnessesRequest, swift::ResolveValueWitnessesRequest::OutputType)::'lambda'(), (void*)0>(swift::ResolveValueWitnessesRequest const&, swift::ResolveValueWitnessesRequest::OutputType swift::evaluateOrDefault<swift::ResolveValueWitnessesRequest>(swift::Evaluator&, swift::ResolveValueWitnessesRequest, swift::ResolveValueWitnessesRequest::OutputType)::'lambda'()) + 360
17 swift-frontend           0x00000001065dfaf4 swift::NormalProtocolConformance::resolveValueWitnesses() const + 88
18 swift-frontend           0x00000001060650b4 (anonymous namespace)::MultiConformanceChecker::checkAllConformances() + 10840
19 swift-frontend           0x0000000106060650 swift::TypeChecker::checkConformancesInContext(swift::IterableDeclContext*) + 6164
20 swift-frontend           0x0000000106004960 (anonymous namespace)::DeclChecker::visitExtensionDecl(swift::ExtensionDecl*) + 5740
21 swift-frontend           0x0000000105ff8eb4 (anonymous namespace)::DeclChecker::visit(swift::Decl*) + 3584
22 swift-frontend           0x0000000105ff80a0 swift::TypeChecker::typeCheckDecl(swift::Decl*) + 136
23 swift-frontend           0x00000001060c0c54 swift::TypeCheckSourceFileRequest::evaluate(swift::Evaluator&, swift::SourceFile*) const + 176
24 swift-frontend           0x00000001060c27fc swift::TypeCheckSourceFileRequest::OutputType swift::Evaluator::getResultUncached<swift::TypeCheckSourceFileRequest, swift::TypeCheckSourceFileRequest::OutputType swift::evaluateOrDefault<swift::TypeCheckSourceFileRequest>(swift::Evaluator&, swift::TypeCheckSourceFileRequest, swift::TypeCheckSourceFileRequest::OutputType)::'lambda'()>(swift::TypeCheckSourceFileRequest const&, swift::TypeCheckSourceFileRequest::OutputType swift::evaluateOrDefault<swift::TypeCheckSourceFileRequest>(swift::Evaluator&, swift::TypeCheckSourceFileRequest, swift::TypeCheckSourceFileRequest::OutputType)::'lambda'()) + 232
25 swift-frontend           0x00000001060c0b7c swift::performTypeChecking(swift::SourceFile&) + 84
26 swift-frontend           0x0000000104fc2e30 bool llvm::function_ref<bool (swift::SourceFile&)>::callback_fn<swift::CompilerInstance::performSema()::$_7>(long, swift::SourceFile&) + 16
27 swift-frontend           0x0000000104fbc8c0 swift::CompilerInstance::forEachFileToTypeCheck(llvm::function_ref<bool (swift::SourceFile&)>) + 156
28 swift-frontend           0x0000000104fbc804 swift::CompilerInstance::performSema() + 76
29 swift-frontend           0x0000000104d91cd4 withSemanticAnalysis(swift::CompilerInstance&, swift::FrontendObserver*, llvm::function_ref<bool (swift::CompilerInstance&)>, bool) + 60
30 swift-frontend           0x0000000104d830ec performCompile(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 708
31 swift-frontend           0x0000000104d82058 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 2384
32 swift-frontend           0x0000000104b9c350 swift::mainEntry(int, char const**) + 3096
33 dyld                     0x000000019acc60e0 start + 2360

Expected behavior

The compiler doesn't crash and the compilation succeed just like with the toolchain included in Xcode 15.4 (15F31d)

Environment

Apple Swift version 6.0-dev (LLVM 5b202efbc95a8bf, Swift a17d360d1cc66ab) Target: arm64-apple-macosx14.0

Additional information

No response

ktoso commented 4 months ago

Thanks for the report, I'll check what's up with that.

rdar://128368486

martialln commented 4 months ago

Foud a small reproducer:

import Distributed

public struct CustomResultHandler: DistributedTargetInvocationResultHandler {
    public typealias SerializationRequirement = any Codable
    public func onReturn<Success: Codable>(value: Success) async throws {}
    public func onReturnVoid() async throws {}
    public func onThrow<Err>(error: Err) async throws where Err : Error {}
}

public struct CustomActorInvocationEncoder: DistributedTargetInvocationEncoder {
    public typealias SerializationRequirement = any Codable
    public mutating func recordArgument<Value: Codable>(_ argument: RemoteCallArgument<Value>) throws {}
    public mutating func recordGenericSubstitution<T>(_ type: T.Type) throws {}
    public mutating func recordReturnType<R: Codable>(_ type: R.Type) throws {}
    public mutating func recordErrorType<E: Error>(_ type: E.Type) throws {}
    public mutating func doneRecording() throws {}
}

public struct CustomActorInvocationDecoder: DistributedTargetInvocationDecoder {
    public typealias SerializationRequirement = any Codable

    public mutating func decodeNextArgument<Argument: Codable>() throws -> Argument { fatalError() }

    public mutating func decodeGenericSubstitutions() throws -> [Any.Type] { [] }

    public mutating func decodeErrorType() throws -> (Any.Type)? { nil }
    public mutating func decodeReturnType() throws -> (Any.Type)? { nil }
}

public final class CustomActorSystem {
}

extension CustomActorSystem: DistributedActorSystem {
    public typealias SerializationRequirement = any Codable
    public typealias ActorID = Int
    public typealias InvocationEncoder = CustomActorInvocationEncoder
    public typealias InvocationDecoder = CustomActorInvocationDecoder
    public typealias ResultHandler = CustomResultHandler

    public func resolve<Act: DistributedActor>(id: ActorID, as actorType: Act.Type) throws -> Act? where ActorID == Act.ID {
        fatalError()
    }

    public func assignID<Act: DistributedActor>(_ actorType: Act.Type) -> ActorID where ActorID == Act.ID {
        fatalError()
    }

    public func actorReady<Act: DistributedActor>(_ actor: Act) where ActorID == Act.ID {
        fatalError()
    }

    public func resignID(_ id: ActorID) {
        fatalError()
    }

    public func makeInvocationEncoder() -> InvocationEncoder {
        fatalError()
    }

    public func remoteCall<Act: DistributedActor, Err: Error, Res: Codable>(
        on actor: Act,
        target: RemoteCallTarget,
        invocation: inout InvocationEncoder,
        throwing _: Err.Type,
        returning _: Res.Type
    ) async throws -> Res where Act.ID == ActorID {
        fatalError()
    }

    public func remoteCallVoid<Act: DistributedActor, Err: Error>(
        on actor: Act,
        target: RemoteCallTarget,
        invocation: inout InvocationEncoder,
        throwing error: Err.Type
    ) async throws where Act.ID == ActorID {
        fatalError()
    }
}

If you move the protocol conformance of DistributedActorSystem from the extension to the class declaration it doesn't crash anymore.

Hope that helps 😄

martialln commented 2 days ago

Seems fixed in Xcode 16.0 (16A242)

Thanks!