swiftlang / swift

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

[SR-14160] Runtime crash on passing functions with incompatible representations #56539

Open LucianoPAlmeida opened 3 years ago

LucianoPAlmeida commented 3 years ago
Previous ID SR-14160
Radar rdar://problem/74110413
Original Reporter @LucianoPAlmeida
Type Sub-task

Attachment: Download

Environment Xcode 12.3 (12C33)
Additional Detail from JIRA | | | |------------------|-----------------| |Votes | 0 | |Component/s | Compiler | |Labels | Sub-task | |Assignee | None | |Priority | Medium | md5: d343b7970380688af4185c9df548b637

Parent-Task:

relates to:

Issue Description:

Both compiles fine, but crashes at runtime because of thick-to-thin conversion
Note: Removing @convention(thin) this executes fine

I think the compiler should emit a conversion mismatch diagnostic.

func a<K: Hashable, V>(d: [K: V], p: @convention(thin) (K, V) -> Void) {
  //_ = d.lazy.map(p) // Runtime crash
  p(d.first!.key, d.first!.value) // Also runtime crash.
}

let v = [1: "1"]

a(d: v, p: { _,_  in })

![](Screen Shot 2021-02-05 at 22.13.59.png)
![](Screen Shot 2021-02-05 at 22.09.57.png)

LucianoPAlmeida commented 3 years ago

cc theindigamer (JIRA User)

LucianoPAlmeida commented 3 years ago

I don't understand why, but if we constraint the generic arguments to objc convertible it runs fine, so maybe is just a runtime issue?

import Foundation

func a<K: NSObject, V: NSObject>(d: [K: V], p: @convention(thin) (K, V) -> Void) {
  _ = d.lazy.map(p) // NO crash
  p(d.first!.key, d.first!.value) // No crash.
}

let v = [1 as NSNumber: "1" as NSString]

a(d: v, p: { _,_  in })

print("finished")
typesanitizer commented 3 years ago

I think this might be the same problem as https://bugs.swift.org/browse/SR-14058 , we should be emitting a compile-time error.

typesanitizer commented 3 years ago

Maybe we should create an umbrella task for conversions between function conventions. Then this JIRA, SR-14058 and SR-14060 would all be sub-tasks of that.

LucianoPAlmeida commented 3 years ago

I like the idea of creating an umbrella task =]

LucianoPAlmeida commented 3 years ago

theindigamer (JIRA User) Here it is https://bugs.swift.org/browse/SR-14169

typesanitizer commented 3 years ago

@swift-ci create