Files
swift-mirror/test/Interop/Cxx/class/access/private-fileid-irgen.swift
John Hui bafcb9dcca [cxx-interop] Do not get private discriminator for private Clang types (#80485)
When generating debug symbols for private Clang types (which we started
importing recently), the compiler crashes due to an assertion failure
from ClangModuleUnit::getDiscriminatorForPrivateDecl(), which is called
by getFilePrivateScope().

This patch fixes the issue crash by not calling getFilePrivateScope()
for Clang types. A discriminator is usually needed to disambiguate
private Swift types declared in different files, but Clang types follow
different scoping conventions that make this discriminator unnecessary.

rdar://148481025
(cherry picked from commit dd2f465025)
2025-04-10 06:54:58 -07:00

113 lines
4.0 KiB
Swift

//--- blessed.swift
// RUN: split-file %s %t
// RUN: %target-swift-frontend -emit-ir -module-name main %t/blessed.swift -I %S/Inputs -cxx-interoperability-mode=default -Onone | %FileCheck %s
// RUN: %target-swift-frontend -emit-ir -module-name main %t/blessed.swift -I %S/Inputs -cxx-interoperability-mode=default -Onone -g | %FileCheck %s
import NonPublic
// These extension methods are just here to make it clear what we are doing to
// each Int32-typed member.
extension Int32 {
func read() { }
mutating func write() { }
}
extension MyClass {
public func extMethod() {
publMethod()
privMethod()
}
// CHECK: define {{.*}}swiftcc void @"{{.*}}extMethod{{.*}}"
// CHECK: {{invoke|call}} void @{{.*}}publMethod{{.*}}
// CHECK: {{invoke|call}} void @{{.*}}privMethod{{.*}}
public mutating func extMutatingMethod() {
publMutatingMethod()
privMutatingMethod()
}
// CHECK: define {{.*}}swiftcc void @"{{.*}}extMutatingMethod{{.*}}"
// CHECK: {{invoke|call}} void @{{.*}}publMutatingMethod{{.*}}
// CHECK: {{invoke|call}} void @{{.*}}privMutatingMethod{{.*}}
public func extVarRead() {
publVar.read()
privVar.read()
}
// CHECK: define {{.*}}swiftcc void @"{{.*}}extVarRead{{.*}}"
public mutating func extVarWrite() {
publVar.write()
privVar.write()
}
// CHECK: define {{.*}}swiftcc void @"{{.*}}extVarWrite{{.*}}"
public func extStaticFunc() {
MyClass.publStaticFunc()
MyClass.privStaticFunc()
}
// CHECK: define {{.*}}swiftcc void @"{{.*}}extStaticFunc{{.*}}"
// CHECK: {{invoke|call}} void @{{.*}}publStaticFunc
// CHECK: {{invoke|call}} void @{{.*}}privStaticFunc
public func extStaticVarRead() {
MyClass.publStaticVar.read()
MyClass.privStaticVar.read()
}
// CHECK: define {{.*}}swiftcc void @"{{.*}}extStaticVarRead{{.*}}"
public func extStaticVarWrite() {
MyClass.publStaticVar.write()
MyClass.privStaticVar.write()
}
// CHECK: define {{.*}}swiftcc void @"{{.*}}extStaticVarWrite{{.*}}"
public func extTypedef() {
let u: publTypedef = publTypedefMake()
publTypedefTake(u)
let i: privTypedef = privTypedefMake()
privTypedefTake(i)
}
// CHECK: define {{.*}}swiftcc void @"{{.*}}extTypedef{{.*}}"
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publTypedefMake{{.*}}
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publTypedefTake{{.*}}
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privTypedefMake{{.*}}
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privTypedefTake{{.*}}
public func extStruct() {
let u: publStruct = publStructMake()
publStructTake(u)
let i: privStruct = privStructMake()
privStructTake(i)
}
// CHECK: define {{.*}}swiftcc void @"{{.*}}extStruct{{.*}}"
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publStructMake{{.*}}
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publStructTake{{.*}}
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privStructMake{{.*}}
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privStructTake{{.*}}
public func extEnum() {
let u: publEnum = publEnumMake()
publEnumTake(u)
let i: privEnum = privEnumMake()
privEnumTake(i)
}
// CHECK: define {{.*}}swiftcc void @"{{.*}}extEnum{{.*}}"
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publEnumMake{{.*}}
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publEnumTake{{.*}}
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privEnumMake{{.*}}
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privEnumTake{{.*}}
// If we call this extEnumClass, the name gets mangled to something else.
public func extEnumCls() {
let u: publEnumClass = publEnumClassMake()
publEnumClassTake(u)
let i: privEnumClass = privEnumClassMake()
privEnumClassTake(i)
}
// CHECK: define {{.*}}swiftcc void @"{{.*}}extEnumCls{{.*}}"
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publEnumClassMake{{.*}}
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publEnumClassTake{{.*}}
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privEnumClassMake{{.*}}
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privEnumClassTake{{.*}}
}