Skip to content

Runtime crash when calling functions with opaque return types, stored as closures #69057

Open
@cristik

Description

@cristik

Description
The following code crashes at runtime:

protocol Worker { }

struct DummyWorker: Worker {
    init(_: Int) { }
}

let workerFactory: (Int) -> some Worker = DummyWorker.init

let worker = workerFactory(15)
print(worker)

It crashes when calling workerFactory with

Thread 1: EXC_BAD_ACCESS (code=1, address=0xf)

The address from the crash message is influenced by the value of the parameter passed to workerFactory, for example workerFactory(4) will crash with address 0x4.

If I change the parameter type to [Int] (or any kind of array), the code no longer crashes, however as soon as I add another Int/Double/String/etc parameter it will again crash, but if I add a second array parameter it will not crash.

I think this is a compiler bug, but unsure where the bug is:

  • either the compiler should not allow declaring a type that consist of a function that returns an opaque value (if one tries to write a closure, the compiler won't allow it to use the some keyword)
  • or the bug is when the compiler wraps up the opaque value

Steps to reproduce
Run the above code snippet.

Expected behavior
Either it should not crash, or the compiler should now allow using some in this scenario.

Environment

  • Swift compiler version info:

    swift-driver version: 1.87.1 Apple Swift version 5.9 (swiftlang-5.9.0.128.108 clang-1500.0.40.1)
    Target: arm64-apple-macosx13.0

  • Xcode version info:

    Xcode 15.0
    Build version 15A240d

  • Deployment target: iOS 17, macOS 13

Metadata

Metadata

Assignees

Labels

SILGenArea → compiler: The SIL generation stageassertion failureBug → crash: An assertion failurebugA deviation from expected or documented behavior. Also: expected but undesirable behavior.compilerThe Swift compiler itselfcrashBug: A crash, i.e., an abnormal termination of softwarefunction typesFeature → types: function typesgenericsFeature: generic declarations and typesimplicit conversionsFeature: implicit conversionsopaque result typesFeature → types → opaque types: opaque result typesopaque typesFeature → types: opaque typesswift 6.0typesFeature: types

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions