Skip to content

Commit daebcc3

Browse files
authored
[interop][SwiftToCxx] Ignore delayedMembers in C++ (swiftlang#70939)
[interop][SwiftToCxx] Ignore delayedMembers in C++ This fixes a bug where an ObjC @interface declaration is emitted for a class that has a member that isn't emitted. Resolves rdar://119835836
1 parent 2ae159b commit daebcc3

File tree

4 files changed

+37
-15
lines changed

4 files changed

+37
-15
lines changed

lib/PrintAsClang/DeclAndTypePrinter.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,8 +247,10 @@ class DeclAndTypePrinter::Implementation
247247
continue;
248248
if (isa<AccessorDecl>(VD))
249249
continue;
250-
if (!AllowDelayed && owningPrinter.delayedMembers.count(VD)) {
251-
os << "// '" << VD->getName() << "' below\n";
250+
if (!AllowDelayed && owningPrinter.objcDelayedMembers.count(VD)) {
251+
os << "// '" << VD->getName()
252+
<< ((outputLang == OutputLanguageMode::Cxx) ? "' cannot be printed\n"
253+
: "' below\n");
252254
continue;
253255
}
254256
if (VD->getAttrs().hasAttribute<OptionalAttr>() !=

lib/PrintAsClang/DeclAndTypePrinter.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class DeclAndTypePrinter {
5757
raw_ostream &os;
5858
raw_ostream &prologueOS;
5959
raw_ostream &outOfLineDefinitionsOS;
60-
const DelayedMemberSet &delayedMembers;
60+
const DelayedMemberSet &objcDelayedMembers;
6161
CxxDeclEmissionScope *cxxDeclEmissionScope;
6262
PrimitiveTypeMapping &typeMapping;
6363
SwiftToClangInteropContext &interopContext;
@@ -84,7 +84,8 @@ class DeclAndTypePrinter {
8484
llvm::StringSet<> &exposedModules,
8585
OutputLanguageMode outputLang)
8686
: M(mod), os(out), prologueOS(prologueOS),
87-
outOfLineDefinitionsOS(outOfLineDefinitionsOS), delayedMembers(delayed),
87+
outOfLineDefinitionsOS(outOfLineDefinitionsOS),
88+
objcDelayedMembers(delayed),
8889
cxxDeclEmissionScope(&topLevelEmissionScope), typeMapping(typeMapping),
8990
interopContext(interopContext), minRequiredAccess(access),
9091
requiresExposedAttribute(requiresExposedAttribute),

lib/PrintAsClang/ModuleContentsWriter.cpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ class ModuleWriter {
130130
llvm::DenseMap<const TypeDecl *, std::pair<EmissionState, bool>> seenTypes;
131131
llvm::DenseSet<const clang::Type *> seenClangTypes;
132132
std::vector<const Decl *> declsToWrite;
133-
DelayedMemberSet delayedMembers;
133+
DelayedMemberSet objcDelayedMembers;
134134
CxxDeclEmissionScope topLevelEmissionScope;
135135
PrimitiveTypeMapping typeMapping;
136136
std::string outOfLineDefinitions;
@@ -147,7 +147,7 @@ class ModuleWriter {
147147
OutputLanguageMode outputLang)
148148
: os(os), imports(imports), M(mod),
149149
outOfLineDefinitionsOS(outOfLineDefinitions),
150-
printer(M, os, prologueOS, outOfLineDefinitionsOS, delayedMembers,
150+
printer(M, os, prologueOS, outOfLineDefinitionsOS, objcDelayedMembers,
151151
topLevelEmissionScope, typeMapping, interopContext, access,
152152
requiresExposedAttribute, exposedModules, outputLang),
153153
outputLangMode(outputLang) {}
@@ -440,7 +440,7 @@ class ModuleWriter {
440440

441441
if (needsToBeIndividuallyDelayed) {
442442
assert(isa<ClassDecl>(container));
443-
delayedMembers.insert(VD);
443+
objcDelayedMembers.insert(VD);
444444
}
445445
}
446446

@@ -796,16 +796,18 @@ class ModuleWriter {
796796
}
797797
}
798798

799-
if (!delayedMembers.empty()) {
800-
auto groupBegin = delayedMembers.begin();
801-
for (auto i = groupBegin, e = delayedMembers.end(); i != e; ++i) {
802-
if ((*i)->getDeclContext() != (*groupBegin)->getDeclContext()) {
803-
printer.printAdHocCategory(make_range(groupBegin, i));
804-
groupBegin = i;
799+
if (outputLangMode == OutputLanguageMode::ObjC)
800+
if (!objcDelayedMembers.empty()) {
801+
auto groupBegin = objcDelayedMembers.begin();
802+
for (auto i = groupBegin, e = objcDelayedMembers.end(); i != e; ++i) {
803+
if ((*i)->getDeclContext() != (*groupBegin)->getDeclContext()) {
804+
printer.printAdHocCategory(make_range(groupBegin, i));
805+
groupBegin = i;
806+
}
805807
}
808+
printer.printAdHocCategory(
809+
make_range(groupBegin, objcDelayedMembers.end()));
806810
}
807-
printer.printAdHocCategory(make_range(groupBegin, delayedMembers.end()));
808-
}
809811

810812
// Print any out of line definitions.
811813
os << outOfLineDefinitionsOS.str();

test/Interop/SwiftToCxx/unsupported/unsupported-generics-in-cxx.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,25 @@ public enum unsupportedGenericEnum<T: Proto> {
3535
case B(T)
3636
}
3737

38+
public struct Struct1<IntType: FixedWidthInteger> {
39+
private var value: IntType
40+
41+
public init(rawValue: IntType) {
42+
self.value = rawValue
43+
}
44+
}
45+
46+
public class Class1 {
47+
public var index1: Struct1<UInt32> { .init(rawValue: 123) }
48+
}
49+
3850
// CHECK: supported
3951

52+
// CHECK: class SWIFT_SYMBOL("s:5Decls6Class1C") Class1 : public swift::_impl::RefCountedClass {
53+
// CHECK: 'index1' cannot be printed
54+
55+
// CHECK: class Struct1 { } SWIFT_UNAVAILABLE_MSG("generic requirements for generic struct 'Struct1' can not yet be represented in C++");
56+
4057
// CHECK: // Unavailable in C++: Swift global function 'unsupportedFunc(_:)'.
4158

4259
// CHECK: class unsupportedGenericClass { } SWIFT_UNAVAILABLE_MSG("generic generic class 'unsupportedGenericClass' can not yet be exposed to C++");

0 commit comments

Comments
 (0)