Skip to content

Commit f94a72d

Browse files
authored
Merge pull request #73523 from ahoppen/6.0/import-extern-c-from-bridging-header
[ClangImporter] Import `extern "C"` declarations from the bridging header
2 parents f39c433 + c39316f commit f94a72d

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
@@ -1672,11 +1672,24 @@ bool ClangImporter::Implementation::importHeader(
16721672

16731673
// We can't do this as we're parsing because we may want to resolve naming
16741674
// conflicts between the things we've parsed.
1675-
for (auto group : allParsedDecls)
1676-
for (auto *D : group)
1677-
if (auto named = dyn_cast<clang::NamedDecl>(D))
1678-
addEntryToLookupTable(*BridgingHeaderLookupTable, named,
1675+
1676+
std::function<void(clang::Decl *)> visit = [&](clang::Decl *decl) {
1677+
// Iterate into extern "C" {} type declarations.
1678+
if (auto linkageDecl = dyn_cast<clang::LinkageSpecDecl>(decl)) {
1679+
for (auto *decl : linkageDecl->noload_decls()) {
1680+
visit(decl);
1681+
}
1682+
}
1683+
if (auto named = dyn_cast<clang::NamedDecl>(decl)) {
1684+
addEntryToLookupTable(*BridgingHeaderLookupTable, named,
16791685
getNameImporter());
1686+
}
1687+
};
1688+
for (auto group : allParsedDecls) {
1689+
for (auto *D : group) {
1690+
visit(D);
1691+
}
1692+
}
16801693

16811694
pp.EndSourceFile();
16821695
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)