Skip to content

Commit ad68bf3

Browse files
authored
Merge pull request #68241 from apple/egorzhdan/5.9-cxx-to-swift-to-objcxx
🍒[cxx-interop][SwiftToCxx] Emit foreign reference types with `*` in the generated Clang header
2 parents 46a3b41 + 83cc82b commit ad68bf3

File tree

5 files changed

+27
-2
lines changed

5 files changed

+27
-2
lines changed

lib/PrintAsClang/DeclAndTypePrinter.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2504,15 +2504,16 @@ class DeclAndTypePrinter::Implementation
25042504
void visitClassType(ClassType *CT,
25052505
llvm::Optional<OptionalTypeKind> optionalKind) {
25062506
const ClassDecl *CD = CT->getClassOrBoundGenericClass();
2507-
assert(CD->isObjC());
2507+
assert(CD->isObjC() || CD->isForeignReferenceType());
25082508
auto clangDecl = dyn_cast_or_null<clang::NamedDecl>(CD->getClangDecl());
25092509
if (clangDecl) {
25102510
// Hack for <os/object.h> types, which use classes in Swift but
25112511
// protocols in Objective-C, and a typedef to hide the difference.
25122512
StringRef osObjectName = maybeGetOSObjectBaseName(clangDecl);
25132513
if (!osObjectName.empty()) {
25142514
os << osObjectName << "_t";
2515-
} else if (isa<clang::ObjCInterfaceDecl>(clangDecl)) {
2515+
} else if (isa<clang::ObjCInterfaceDecl>(clangDecl) ||
2516+
CD->isForeignReferenceType()) {
25162517
os << clangDecl->getName() << " *";
25172518
} else {
25182519
maybePrintTagKeyword(CD);
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
class __attribute__((swift_attr("import_reference"),
2+
swift_attr("retain:immortal"),
3+
swift_attr("release:immortal"))) X {};
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module MyCxxModule {
2+
header "bridge-cxx-types-to-objcxx.h"
3+
export *
4+
requires cplusplus
5+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// RUN: %empty-directory(%t)
2+
3+
// RUN: %target-swift-frontend -typecheck %s -module-name UseCxxTy -emit-clang-header-path %t/UseCxxTy.h -I %t -I %S/Inputs -enable-experimental-cxx-interop -clang-header-expose-decls=all-public -target arm64-apple-macosx13.3
4+
// RUN: %FileCheck %s < %t/UseCxxTy.h
5+
6+
// REQUIRES: OS=macosx
7+
8+
import Foundation
9+
import MyCxxModule
10+
11+
@objc class C: NSObject {
12+
@objc var x: X? = nil
13+
}
14+
15+
// CHECK: @property (nonatomic) X * _Nullable x;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
config.suffixes = ['.swift', '.cpp', '.mm']

0 commit comments

Comments
 (0)