Skip to content

Commit 491f556

Browse files
committed
[cxx-interop] Add basic support for using UFOs as members, etc.
This does not add support for using UFOs in generic contexts, this just emits their struct/field metadata as opaque pointers.
1 parent 773b755 commit 491f556

File tree

5 files changed

+57
-103
lines changed

5 files changed

+57
-103
lines changed

lib/IRGen/GenMeta.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2515,6 +2515,15 @@ void irgen::emitLazyTypeContextDescriptor(IRGenModule &IGM,
25152515
void irgen::emitLazyTypeMetadata(IRGenModule &IGM, NominalTypeDecl *type) {
25162516
eraseExistingTypeContextDescriptor(IGM, type);
25172517

2518+
// Special case, UFOs are opaque pointers for now.
2519+
if (auto cd = dyn_cast<ClassDecl>(type)) {
2520+
if (cd->isForeignReferenceType()) {
2521+
auto sd = cast<StructDecl>(type->getASTContext().getOpaquePointerDecl());
2522+
emitStructMetadata(IGM, sd);
2523+
return;
2524+
}
2525+
}
2526+
25182527
if (requiresForeignTypeMetadata(type)) {
25192528
emitForeignTypeMetadata(IGM, type);
25202529
} else if (auto sd = dyn_cast<StructDecl>(type)) {

lib/IRGen/GenReflection.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -717,21 +717,21 @@ class FieldTypeMetadataBuilder : public ReflectionMetadataBuilder {
717717
if (!type) {
718718
B.addInt32(0);
719719
} else {
720-
if (type->isForeignReferenceType()) {
721-
type->getASTContext().Diags.diagnose(
722-
type->lookThroughAllOptionalTypes()
723-
->getClassOrBoundGenericClass()
724-
->getLoc(),
725-
diag::foreign_reference_types_unsupported.ID, {});
726-
exit(1);
727-
}
728-
729720
auto genericSig = NTD->getGenericSignature();
730721

731-
// The standard library's Mirror demangles metadata from field
732-
// descriptors, so use MangledTypeRefRole::Metadata to ensure
733-
// runtime metadata is available.
734-
addTypeRef(type, genericSig, MangledTypeRefRole::Metadata);
722+
// Special case, UFOs are opaque pointers for now.
723+
if (type->isForeignReferenceType()) {
724+
auto opaqueType = type->getASTContext().getOpaquePointerType();
725+
// The standard library's Mirror demangles metadata from field
726+
// descriptors, so use MangledTypeRefRole::Metadata to ensure
727+
// runtime metadata is available.
728+
addTypeRef(opaqueType, genericSig, MangledTypeRefRole::Metadata);
729+
} else {
730+
// The standard library's Mirror demangles metadata from field
731+
// descriptors, so use MangledTypeRefRole::Metadata to ensure
732+
// runtime metadata is available.
733+
addTypeRef(type, genericSig, MangledTypeRefRole::Metadata);
734+
}
735735
}
736736

737737
if (IGM.IRGen.Opts.EnableReflectionNames) {

test/Interop/Cxx/foreign-reference/error-as-class-member.swift

Lines changed: 0 additions & 27 deletions
This file was deleted.

test/Interop/Cxx/foreign-reference/error-as-struct-member.swift

Lines changed: 0 additions & 25 deletions
This file was deleted.

test/Interop/Cxx/foreign-reference/pod.swift

Lines changed: 35 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
11
// RUN: %target-run-simple-swift(-I %S/Inputs/ -Xfrontend -enable-experimental-cxx-interop -Xfrontend -validate-tbd-against-ir=none -Xfrontend -disable-llvm-verify -g)
22
//
33
// REQUIRES: executable_test
4+
// XFAIL: OS=windows-msvc
45

56
import StdlibUnittest
67
import POD
78

8-
// TODO: Waiting on foreign reference type metadata implementation.
9-
//
10-
// struct StructHoldingPair {
11-
// var pair: IntPair
12-
// };
13-
//
14-
// class ClassHoldingPair {
15-
// var pair: IntPair
16-
//
17-
// init(pair: IntPair) { self.pair = pair }
18-
// };
9+
struct StructHoldingPair {
10+
var pair: IntPair
11+
};
12+
13+
class ClassHoldingPair {
14+
var pair: IntPair
15+
16+
init(pair: IntPair) { self.pair = pair }
17+
};
1918

2019
var globalPair: IntPair? = nil
2120

@@ -106,33 +105,31 @@ PODTestSuite.test("RefHoldingPairPtr") {
106105
expectEqual(x.test(), 41)
107106
}
108107

109-
// TODO: Waiting on foreign reference types metadata implementation.
110-
//
111-
// PODTestSuite.test("StructHoldingPair") {
112-
// var x = StructHoldingPair(pair: IntPair.create())
113-
// expectEqual(x.pair.test(), 1)
114-
// expectEqual(x.pair.testMutable(), 1)
115-
//
116-
// mutateIt(x.pair)
117-
// expectEqual(x.pair.test(), 2)
118-
// expectEqual(x.pair.testMutable(), 2)
119-
//
120-
// x.pair = IntPair.create()
121-
// expectEqual(x.pair.test(), 1)
122-
// }
123-
//
124-
// PODTestSuite.test("ClassHoldingPair") {
125-
// var x = ClassHoldingPair(pair: IntPair.create())
126-
// expectEqual(x.pair.test(), 1)
127-
// expectEqual(x.pair.testMutable(), 1)
128-
//
129-
// mutateIt(x.pair)
130-
// expectEqual(x.pair.test(), 2)
131-
// expectEqual(x.pair.testMutable(), 2)
132-
//
133-
// x.pair = IntPair.create()
134-
// expectEqual(x.pair.test(), 1)
135-
// }
108+
PODTestSuite.test("StructHoldingPair") {
109+
var x = StructHoldingPair(pair: IntPair.create())
110+
expectEqual(x.pair.test(), 1)
111+
expectEqual(x.pair.testMutable(), 1)
112+
113+
mutateIt(x.pair)
114+
expectEqual(x.pair.test(), 2)
115+
expectEqual(x.pair.testMutable(), 2)
116+
117+
x.pair = IntPair.create()
118+
expectEqual(x.pair.test(), 1)
119+
}
120+
121+
PODTestSuite.test("ClassHoldingPair") {
122+
var x = ClassHoldingPair(pair: IntPair.create())
123+
expectEqual(x.pair.test(), 1)
124+
expectEqual(x.pair.testMutable(), 1)
125+
126+
mutateIt(x.pair)
127+
expectEqual(x.pair.test(), 2)
128+
expectEqual(x.pair.testMutable(), 2)
129+
130+
x.pair = IntPair.create()
131+
expectEqual(x.pair.test(), 1)
132+
}
136133

137134
PODTestSuite.test("BigType") {
138135
var x = BigType.create()

0 commit comments

Comments
 (0)