Skip to content

Commit fc33728

Browse files
committed
[cxx-interop] Skip already-imported sub decls.
Rather than skipping non-definitions, we should just check whether we've already seen this decl. This not only fixes the specific problem with class templates but also is a more general fix for other sub decls.
1 parent 22acb2f commit fc33728

File tree

3 files changed

+27
-6
lines changed

3 files changed

+27
-6
lines changed

lib/ClangImporter/ImportDecl.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3371,6 +3371,11 @@ namespace {
33713371
}
33723372
}
33733373

3374+
// If we've already imported this decl, skip it so we don't add the same
3375+
// member twice.
3376+
if (Impl.ImportedDecls.count({nd->getCanonicalDecl(), getVersion()}))
3377+
continue;
3378+
33743379
auto member = Impl.importDecl(nd, getActiveSwiftVersion());
33753380
if (!member) {
33763381
if (!isa<clang::TypeDecl>(nd) && !isa<clang::FunctionDecl>(nd)) {
@@ -3383,11 +3388,6 @@ namespace {
33833388
}
33843389

33853390
if (auto nestedType = dyn_cast<TypeDecl>(member)) {
3386-
// Only import definitions. Otherwise, we might add the same member
3387-
// twice.
3388-
if (auto tagDecl = dyn_cast<clang::TagDecl>(nd))
3389-
if (tagDecl->getDefinition() != tagDecl)
3390-
continue;
33913391
nestedTypes.push_back(nestedType);
33923392
continue;
33933393
}

test/Interop/Cxx/class/Inputs/nested-records.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,18 @@ struct HasForwardDeclaredNestedType {
5151
struct ForwardDeclaredType { };
5252
};
5353

54+
struct HasForwardDeclaredTemplateChild {
55+
template <class T> struct ForwardDeclaredClassTemplate;
56+
57+
struct DeclaresForwardDeclaredClassTemplateFriend {
58+
template <class T>
59+
friend struct HasForwardDeclaredTemplateChild::ForwardDeclaredClassTemplate;
60+
};
61+
62+
template <class T> struct ForwardDeclaredClassTemplate { };
63+
};
64+
65+
5466
// TODO: Nested class templates (SR-13853).
5567

5668
#endif // TEST_INTEROP_CXX_CLASS_INPUTS_NESTED_RECORDS_H

test/Interop/Cxx/class/nested-records-module-interface.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,19 @@
5757
// CHECK: }
5858

5959
// CHECK: struct HasForwardDeclaredNestedType {
60+
// CHECK: struct ForwardDeclaredType {
61+
// CHECK: init()
62+
// CHECK: }
6063
// CHECK: struct NormalSubType {
6164
// CHECK: init()
6265
// CHECK: }
63-
// CHECK: struct ForwardDeclaredType {
66+
// CHECK: init()
67+
// CHECK: }
68+
69+
// CHECK: struct HasForwardDeclaredTemplateChild {
70+
// CHECK: struct ForwardDeclaredClassTemplate<T> {
71+
// CHECK: }
72+
// CHECK: struct DeclaresForwardDeclaredClassTemplateFriend {
6473
// CHECK: init()
6574
// CHECK: }
6675
// CHECK: init()

0 commit comments

Comments
 (0)