Skip to content

Commit 786d6ed

Browse files
authored
Merge pull request #42427 from zoecarver/ufo-metadata
2 parents c3529ef + 491f556 commit 786d6ed

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
@@ -2556,6 +2556,15 @@ void irgen::emitLazyTypeContextDescriptor(IRGenModule &IGM,
25562556
void irgen::emitLazyTypeMetadata(IRGenModule &IGM, NominalTypeDecl *type) {
25572557
eraseExistingTypeContextDescriptor(IGM, type);
25582558

2559+
// Special case, UFOs are opaque pointers for now.
2560+
if (auto cd = dyn_cast<ClassDecl>(type)) {
2561+
if (cd->isForeignReferenceType()) {
2562+
auto sd = cast<StructDecl>(type->getASTContext().getOpaquePointerDecl());
2563+
emitStructMetadata(IGM, sd);
2564+
return;
2565+
}
2566+
}
2567+
25592568
if (requiresForeignTypeMetadata(type)) {
25602569
emitForeignTypeMetadata(IGM, type);
25612570
} 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
@@ -724,21 +724,21 @@ class FieldTypeMetadataBuilder : public ReflectionMetadataBuilder {
724724
if (!type) {
725725
B.addInt32(0);
726726
} else {
727-
if (type->isForeignReferenceType()) {
728-
type->getASTContext().Diags.diagnose(
729-
type->lookThroughAllOptionalTypes()
730-
->getClassOrBoundGenericClass()
731-
->getLoc(),
732-
diag::foreign_reference_types_unsupported.ID, {});
733-
exit(1);
734-
}
735-
736727
auto genericSig = NTD->getGenericSignature();
737728

738-
// The standard library's Mirror demangles metadata from field
739-
// descriptors, so use MangledTypeRefRole::Metadata to ensure
740-
// runtime metadata is available.
741-
addTypeRef(type, genericSig, MangledTypeRefRole::Metadata);
729+
// Special case, UFOs are opaque pointers for now.
730+
if (type->isForeignReferenceType()) {
731+
auto opaqueType = type->getASTContext().getOpaquePointerType();
732+
// The standard library's Mirror demangles metadata from field
733+
// descriptors, so use MangledTypeRefRole::Metadata to ensure
734+
// runtime metadata is available.
735+
addTypeRef(opaqueType, genericSig, MangledTypeRefRole::Metadata);
736+
} else {
737+
// The standard library's Mirror demangles metadata from field
738+
// descriptors, so use MangledTypeRefRole::Metadata to ensure
739+
// runtime metadata is available.
740+
addTypeRef(type, genericSig, MangledTypeRefRole::Metadata);
741+
}
742742
}
743743

744744
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)