Skip to content

Commit 3123950

Browse files
committed
[cxx-interop] Allow extensions on namespaces.
This used to work and broke with lazy member loading. This commit fixes it again.
1 parent bc15343 commit 3123950

File tree

4 files changed

+67
-3
lines changed

4 files changed

+67
-3
lines changed

lib/AST/NameLookup.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1453,11 +1453,13 @@ DirectLookupRequest::evaluate(Evaluator &evaluator,
14531453
DeclBaseName baseName(name.getBaseName());
14541454

14551455
if (isa_and_nonnull<clang::NamespaceDecl>(decl->getClangDecl())) {
1456-
// Namespaces will never have any members so we can just return whatever
1457-
// the lookup finds.
1458-
return evaluateOrDefault(
1456+
auto allFound = evaluateOrDefault(
14591457
ctx.evaluator, CXXNamespaceMemberLookup({cast<EnumDecl>(decl), name}),
14601458
{});
1459+
for (auto found : allFound)
1460+
Table.addMember(found);
1461+
1462+
populateLookupTableEntryFromExtensions(ctx, Table, baseName, decl);
14611463
} else if (isa_and_nonnull<clang::RecordDecl>(decl->getClangDecl())) {
14621464
auto allFound = evaluateOrDefault(
14631465
ctx.evaluator,
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#ifndef TEST_INTEROP_CXX_NAMESPACE_INPUTS_EXTENSIONS_H
2+
#define TEST_INTEROP_CXX_NAMESPACE_INPUTS_EXTENSIONS_H
3+
4+
namespace EmptyNamespace {}
5+
6+
namespace EmptyRedeclaredNamespace {}
7+
8+
namespace EmptyRedeclaredNamespace {}
9+
10+
namespace ParentNamespace {
11+
namespace EmptyChildNamespace {}
12+
}
13+
14+
#endif // TEST_INTEROP_CXX_NAMESPACE_INPUTS_EXTENSIONS_H

test/Interop/Cxx/namespace/Inputs/module.modulemap

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,8 @@ module TemplatesWithForwardDecl {
4848
header "templates-with-forward-decl.h"
4949
requires cplusplus
5050
}
51+
52+
module Extensions {
53+
header "extensions.h"
54+
requires cplusplus
55+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// RUN: %target-run-simple-swift(-I %S/Inputs/ -Xfrontend -enable-cxx-interop)
2+
//
3+
// REQUIRES: executable_test
4+
5+
import StdlibUnittest
6+
import Extensions
7+
8+
extension EmptyNamespace {
9+
static var a = "a"
10+
}
11+
12+
extension EmptyNamespace {
13+
static var b = "b"
14+
}
15+
16+
fileprivate extension EmptyRedeclaredNamespace {
17+
static var c = "c"
18+
}
19+
20+
extension ParentNamespace.EmptyChildNamespace {
21+
static var d = "d"
22+
23+
static func e() -> String { "e" }
24+
}
25+
26+
var NamespacesTestSuite = TestSuite("Extensions on namespaces")
27+
28+
NamespacesTestSuite.test("EmptyNamespace") {
29+
expectEqual(EmptyNamespace.a, "a")
30+
expectEqual(EmptyNamespace.b, "b")
31+
}
32+
33+
NamespacesTestSuite.test("EmptyRedeclaredNamespace") {
34+
expectEqual(EmptyRedeclaredNamespace.c, "c")
35+
}
36+
37+
NamespacesTestSuite.test("Nested namespace") {
38+
expectEqual(ParentNamespace.EmptyChildNamespace.d, "d")
39+
expectEqual(ParentNamespace.EmptyChildNamespace.e(), "e")
40+
}
41+
42+
runAllTests()
43+

0 commit comments

Comments
 (0)