Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
martialln opened this issue May 17, 2024 · 2 comments
Labels
bug A deviation from expected or documented behavior. Also: expected but undesirable behavior. crash Bug: A crash, i.e., an abnormal termination of software distributed Feature → concurrency: distributed actor

Comments

@martialln
Copy link

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 a17d360)
Target: arm64-apple-macosx14.0

Additional information

No response

@martialln martialln added bug A deviation from expected or documented behavior. Also: expected but undesirable behavior. crash Bug: A crash, i.e., an abnormal termination of software triage needed This issue needs more specific labels labels May 17, 2024
@ktoso ktoso added distributed Feature → concurrency: distributed actor and removed triage needed This issue needs more specific labels labels May 20, 2024
@ktoso
Copy link
Member

ktoso commented May 20, 2024

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

rdar://128368486

@martialln
Copy link
Author

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 😄

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug A deviation from expected or documented behavior. Also: expected but undesirable behavior. crash Bug: A crash, i.e., an abnormal termination of software distributed Feature → concurrency: distributed actor
Projects
None yet
Development

No branches or pull requests

2 participants