mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Clang-importer-synthesized declarations get an extra tag character included in their mangling, which was not being preserved in type context descriptors. This caused runtime lookup for these synthesized types to fail. Fix this by adding the tag information to type context descriptors and teaching the runtime to match it up when fetching metadata by mangled name. Fixes rdar://problem/40878715.
90 lines
2.6 KiB
Swift
90 lines
2.6 KiB
Swift
// RUN: %target-run-simple-swift-swift3
|
|
// REQUIRES: executable_test
|
|
// REQUIRES: objc_interop
|
|
|
|
import StdlibUnittest
|
|
import Foundation
|
|
import CoreFoundation
|
|
import CoreLocation
|
|
|
|
let DemangleToMetadataTests = TestSuite("DemangleToMetadataObjC")
|
|
|
|
@objc class C : NSObject { }
|
|
@objc enum E: Int { case a }
|
|
@objc protocol P1 { }
|
|
protocol P2 { }
|
|
|
|
DemangleToMetadataTests.test("@objc classes") {
|
|
expectEqual(type(of: C()), _typeByMangledName("4main1CC")!)
|
|
}
|
|
|
|
DemangleToMetadataTests.test("@objc enums") {
|
|
expectEqual(type(of: E.a), _typeByMangledName("4main1EO")!)
|
|
}
|
|
|
|
func f1_composition_objc_protocol(_: P1) { }
|
|
|
|
DemangleToMetadataTests.test("@objc protocols") {
|
|
expectEqual(type(of: f1_composition_objc_protocol),
|
|
_typeByMangledName("yy4main2P1_pc")!)
|
|
}
|
|
|
|
DemangleToMetadataTests.test("Objective-C classes") {
|
|
expectEqual(type(of: NSObject()), _typeByMangledName("So8NSObjectC")!)
|
|
}
|
|
|
|
func f1_composition_NSCoding(_: NSCoding) { }
|
|
|
|
DemangleToMetadataTests.test("Objective-C protocols") {
|
|
expectEqual(type(of: f1_composition_NSCoding), _typeByMangledName("yySo8NSCoding_pc")!)
|
|
}
|
|
|
|
DemangleToMetadataTests.test("Classes that don't exist") {
|
|
expectNil(_typeByMangledName("4main4BoomC"))
|
|
}
|
|
|
|
DemangleToMetadataTests.test("CoreFoundation classes") {
|
|
expectEqual(CFArray.self, _typeByMangledName("So10CFArrayRefa")!)
|
|
}
|
|
|
|
DemangleToMetadataTests.test("Imported error types") {
|
|
expectEqual(URLError.self, _typeByMangledName("10Foundation8URLErrorV")!)
|
|
expectEqual(URLError.Code.self,
|
|
_typeByMangledName("10Foundation8URLErrorV4CodeV")!)
|
|
}
|
|
|
|
DemangleToMetadataTests.test("Imported swift_wrapper types") {
|
|
expectEqual(URLFileResourceType.self,
|
|
_typeByMangledName("So21NSURLFileResourceTypea")!)
|
|
}
|
|
|
|
DemangleToMetadataTests.test("Imported enum types") {
|
|
expectEqual(NSURLSessionTask.State.self,
|
|
_typeByMangledName("So21NSURLSessionTaskStateV")!)
|
|
}
|
|
|
|
class CG4<T: P1, U: P2> { }
|
|
extension C : P1 { }
|
|
extension C : P2 { }
|
|
|
|
class D: P2 { }
|
|
|
|
DemangleToMetadataTests.test("@objc protocol conformances") {
|
|
expectEqual(CG4<C, C>.self,
|
|
_typeByMangledName("4main3CG4CyAA1CCAA1CCG")!)
|
|
expectNil(_typeByMangledName("4main3CG4CyAA1DCAA1DCG"))
|
|
}
|
|
|
|
DemangleToMetadataTests.test("synthesized declarations") {
|
|
expectEqual(CLError.self, _typeByMangledName("SC7CLErrorLeV")!)
|
|
expectNil(_typeByMangledName("SC7CLErrorV"))
|
|
expectEqual(CLError.Code.self, _typeByMangledName("So7CLErrorV")!)
|
|
|
|
let error = NSError(domain: NSCocoaErrorDomain, code: 0)
|
|
let reflectionString = String(reflecting: CLError(_nsError: error))
|
|
expectTrue(reflectionString.hasPrefix("__C_Synthesized.related decl 'e' for CLError(_nsError:"))
|
|
}
|
|
|
|
runAllTests()
|
|
|