swiftlang / swift

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

`Assertion failed: (functionIsolation.isGlobalActor())` occurs when `defer` in `actor` method contains non-Sendable reference. #77065

Open YOCKOW opened 3 days ago

YOCKOW commented 3 days ago

Description

Compiler crashes while compiling the following short code. (only with Swift 6 mode)

Reproduction

import Darwin

actor MyActor {
  func doSomething() {
    print("Start.")
    let p = malloc(4)
    defer {
      free(p)
    }
    print("End.")
  }
}

Stack dump

Assertion failed: (functionIsolation.isGlobalActor()), function get, file SILIsolationInfo.cpp, line 880.
Stack dump:
0.  Program arguments: /Library/Developer/Toolchains/swift-6.0.1-RELEASE.xctoolchain/usr/bin/swift-frontend -frontend -interpret _defer-c-non-sendable_.swift -Xllvm -aarch64-use-tbi -enable-objc-interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.0.sdk -color-diagnostics -swift-version 6 -empty-abi-descriptor -resource-dir /Library/Developer/Toolchains/swift-6.0.1-RELEASE.xctoolchain/usr/lib/swift -module-name main -plugin-path /Library/Developer/Toolchains/swift-6.0.1-RELEASE.xctoolchain/usr/lib/swift/host/plugins -plugin-path /Library/Developer/Toolchains/swift-6.0.1-RELEASE.xctoolchain/usr/local/lib/swift/host/plugins -target-sdk-version 15.0 -target-sdk-name macosx15.0 -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
1.  Apple Swift version 6.0.1 (swift-6.0.1-RELEASE)
2.  Compiling with the current language version
3.  While evaluating request ExecuteSILPipelineRequest(Run pipelines { Mandatory Diagnostic Passes + Enabling Optimization Passes } on SIL for main)
4.  While running pass #91 SILFunctionTransform "TransferNonSendable" on SILFunction "@$s4main7MyActorC11doSomethingyyF6$deferL_yyF".
 for '$defer()' (in module 'main')
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           0x0000000109831b78 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 56
1  swift-frontend           0x0000000109830344 llvm::sys::RunSignalHandlers() + 112
2  swift-frontend           0x00000001098321c0 SignalHandler(int) + 304
3  libsystem_platform.dylib 0x0000000183adc184 _sigtramp + 56
4  libsystem_pthread.dylib  0x0000000183aa6f70 pthread_kill + 288
5  libsystem_c.dylib        0x00000001839b3908 abort + 128
6  libsystem_c.dylib        0x00000001839b2c1c err + 0
7  swift-frontend           0x0000000109af1058 swift::SILIsolationInfo::get(swift::SILArgument*) (.cold.3) + 0
8  swift-frontend           0x0000000104fd1288 swift::SILIsolationInfo::get(swift::SILArgument*) + 920
9  swift-frontend           0x0000000104b0feb0 swift::RegionAnalysisValueMap::getTrackableValue(swift::SILValue, bool) const + 1548
10 swift-frontend           0x0000000104b27200 swift::regionanalysisimpl::PartitionOpTranslator::PartitionOpTranslator(swift::SILFunction*, swift::PostOrderFunctionInfo*, swift::RegionAnalysisValueMap&, swift::IsolationHistory::Factory&) + 1456
11 swift-frontend           0x0000000104b0e118 swift::RegionAnalysisFunctionInfo::RegionAnalysisFunctionInfo(swift::SILFunction*, swift::PostOrderFunctionInfo*) + 436
12 swift-frontend           0x0000000104b10844 swift::RegionAnalysis::newFunctionAnalysis(swift::SILFunction*) + 56
13 swift-frontend           0x0000000104d60114 swift::FunctionAnalysisBase<swift::RegionAnalysisFunctionInfo>::get(swift::SILFunction*) + 80
14 swift-frontend           0x0000000104d5fdf8 (anonymous namespace)::TransferNonSendable::run() + 128
15 swift-frontend           0x0000000104d84630 swift::SILPassManager::runPassOnFunction(unsigned int, swift::SILFunction*) + 1432
16 swift-frontend           0x0000000104d8549c swift::SILPassManager::runFunctionPasses(unsigned int, unsigned int) + 1060
17 swift-frontend           0x0000000104d87c08 swift::SILPassManager::execute() + 596
18 swift-frontend           0x0000000104d8266c swift::SILPassManager::executePassPipelinePlan(swift::SILPassPipelinePlan const&) + 72
19 swift-frontend           0x0000000104d825ec swift::ExecuteSILPipelineRequest::evaluate(swift::Evaluator&, swift::SILPipelineExecutionDescriptor) const + 68
20 swift-frontend           0x0000000104dbcd5c swift::SimpleRequest<swift::ExecuteSILPipelineRequest, std::__1::tuple<> (swift::SILPipelineExecutionDescriptor), (swift::RequestFlags)1>::evaluateRequest(swift::ExecuteSILPipelineRequest const&, swift::Evaluator&) + 28
21 swift-frontend           0x0000000104d9d3bc 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
22 swift-frontend           0x0000000104d82848 swift::executePassPipelinePlan(swift::SILModule*, swift::SILPassPipelinePlan const&, bool, swift::irgen::IRGenModule*) + 64
23 swift-frontend           0x0000000104d9f780 swift::runSILDiagnosticPasses(swift::SILModule&) + 192
24 swift-frontend           0x00000001045bf0b4 swift::CompilerInstance::performSILProcessing(swift::SILModule*) + 80
25 swift-frontend           0x000000010437ed2c 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
26 swift-frontend           0x000000010437e628 swift::performCompileStepsPostSema(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 1216
27 swift-frontend           0x000000010438a104 withSemanticAnalysis(swift::CompilerInstance&, swift::FrontendObserver*, llvm::function_ref<bool (swift::CompilerInstance&)>, bool) + 160
28 swift-frontend           0x00000001043802d0 performCompile(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 708
29 swift-frontend           0x000000010437f9a4 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 2344
30 swift-frontend           0x0000000104195fdc swift::mainEntry(int, char const**) + 3096
31 dyld                     0x0000000183724274 start + 2840

Expected behavior

Compiler doesn't crash.

Environment

Apple Swift version 6.0.1 (swift-6.0.1-RELEASE)
Target: arm64-apple-macosx15.0

Additional information

Note: Compiler crashes only with Swift 6 mode. Compile succeeds with Swift 5 mode.

xedin commented 3 days ago

cc @gottesmm, looks like it’s a crash in region-based analysis pass.

YOCKOW commented 2 days ago

I noticed defer just having a non-Sendable reference can cause the same error: (C function is unnecessary.)

// import Darwin

actor MyActor {
  func doSomething() {
    print("Start.")
    let p = UnsafeMutablePointer<Int32>.allocate(capacity: 1) // malloc(4)
    defer {
      p.deallocate() // free(p)
    }
    print("End.")
  }
}