Skip to content

Commit 743d29c

Browse files
authored
Merge pull request swiftlang#73473 from ahoppen/import-extern-c-from-bridging-header
[ClangImporter] Import `extern "C"` declarations from the bridging header
2 parents 8848811 + 9fdbb86 commit 743d29c

File tree

2 files changed

+41
-4
lines changed

2 files changed

+41
-4
lines changed

lib/ClangImporter/ClangImporter.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1686,11 +1686,24 @@ bool ClangImporter::Implementation::importHeader(
16861686

16871687
// We can't do this as we're parsing because we may want to resolve naming
16881688
// conflicts between the things we've parsed.
1689-
for (auto group : allParsedDecls)
1690-
for (auto *D : group)
1691-
if (auto named = dyn_cast<clang::NamedDecl>(D))
1692-
addEntryToLookupTable(*BridgingHeaderLookupTable, named,
1689+
1690+
std::function<void(clang::Decl *)> visit = [&](clang::Decl *decl) {
1691+
// Iterate into extern "C" {} type declarations.
1692+
if (auto linkageDecl = dyn_cast<clang::LinkageSpecDecl>(decl)) {
1693+
for (auto *decl : linkageDecl->noload_decls()) {
1694+
visit(decl);
1695+
}
1696+
}
1697+
if (auto named = dyn_cast<clang::NamedDecl>(decl)) {
1698+
addEntryToLookupTable(*BridgingHeaderLookupTable, named,
16931699
getNameImporter());
1700+
}
1701+
};
1702+
for (auto group : allParsedDecls) {
1703+
for (auto *D : group) {
1704+
visit(D);
1705+
}
1706+
}
16941707

16951708
pp.EndSourceFile();
16961709
bumpGeneration();
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: split-file --leading-lines %s %t
3+
4+
//--- Bridging-Header.h
5+
6+
void func_from_bridging_header(void);
7+
8+
extern "C"
9+
void extern_c_func_from_bridging_header(void);
10+
11+
extern "C" {
12+
extern "C" {
13+
void nested_extern_c_func_from_bridging_header(void);
14+
}
15+
}
16+
17+
//--- test.swift
18+
19+
// Passes
20+
// RUN: %sourcekitd-test -req=complete -pos 1:1 %t/test.swift -- %t/test.swift -import-bridging-header %t/Bridging-Header.h -cxx-interoperability-mode=default -pch-output-dir %t/pch-dir | %FileCheck %s
21+
// RUN: %sourcekitd-test -req=complete -pos 1:1 %t/test.swift -- %t/test.swift -import-bridging-header %t/Bridging-Header.h -cxx-interoperability-mode=default | %FileCheck %s
22+
// CHECK-DAG: func_from_bridging_header
23+
// CHECK-DAG: extern_c_func_from_bridging_header
24+
// CHECK-DAG: nested_extern_c_func_from_bridging_header

0 commit comments

Comments
 (0)