Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4b30b3f

Browse files
authored
[clang][ASTImporter] Fix AST import if anonymous namespaces are merged (#128735)
Fix of a faulty case that is shown in the second of the added tests (an anonymous namespace is imported that resides in a `extern "C"` block).
1 parent 6d85de8 commit 4b30b3f

File tree

2 files changed

+80
-3
lines changed

2 files changed

+80
-3
lines changed

clang/lib/AST/ASTImporter.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -2628,11 +2628,12 @@ ExpectedDecl ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) {
26282628
if (!Name) {
26292629
// This is an anonymous namespace. Adopt an existing anonymous
26302630
// namespace if we can.
2631-
// FIXME: Not testable.
2632-
if (auto *TU = dyn_cast<TranslationUnitDecl>(DC))
2631+
DeclContext *EnclosingDC = DC->getEnclosingNamespaceContext();
2632+
if (auto *TU = dyn_cast<TranslationUnitDecl>(EnclosingDC))
26332633
MergeWithNamespace = TU->getAnonymousNamespace();
26342634
else
2635-
MergeWithNamespace = cast<NamespaceDecl>(DC)->getAnonymousNamespace();
2635+
MergeWithNamespace =
2636+
cast<NamespaceDecl>(EnclosingDC)->getAnonymousNamespace();
26362637
} else {
26372638
SmallVector<NamedDecl *, 4> ConflictingDecls;
26382639
auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);

clang/unittests/AST/ASTImporterTest.cpp

+76
Original file line numberDiff line numberDiff line change
@@ -10456,6 +10456,79 @@ TEST_P(ASTImporterOptionSpecificTestBase,
1045610456
EXPECT_EQ(ToFr1Imp, ToFr1);
1045710457
}
1045810458

10459+
struct ImportAndMergeAnonymousNamespace
10460+
: public ASTImporterOptionSpecificTestBase {
10461+
protected:
10462+
void test(const char *ToCode, const char *FromCode) {
10463+
Decl *ToTU = getToTuDecl(ToCode, Lang_CXX11);
10464+
Decl *FromTU = getTuDecl(FromCode, Lang_CXX11);
10465+
auto *FromNS = FirstDeclMatcher<NamespaceDecl>().match(
10466+
FromTU, namespaceDecl(isAnonymous()));
10467+
auto *ToNS = FirstDeclMatcher<NamespaceDecl>().match(
10468+
ToTU, namespaceDecl(isAnonymous()));
10469+
auto *FromF = FirstDeclMatcher<FunctionDecl>().match(
10470+
FromTU, functionDecl(hasName("f")));
10471+
auto *ImportedF = Import(FromF, Lang_CXX11);
10472+
EXPECT_TRUE(ImportedF);
10473+
EXPECT_EQ(ImportedF->getDeclContext(), ToNS);
10474+
auto *ImportedNS = Import(FromNS, Lang_CXX11);
10475+
EXPECT_EQ(ImportedNS, ToNS);
10476+
}
10477+
};
10478+
10479+
TEST_P(ImportAndMergeAnonymousNamespace, NamespaceInTU) {
10480+
const char *ToCode =
10481+
R"(
10482+
namespace {
10483+
}
10484+
)";
10485+
const char *FromCode =
10486+
R"(
10487+
namespace {
10488+
void f();
10489+
}
10490+
)";
10491+
test(ToCode, FromCode);
10492+
}
10493+
10494+
TEST_P(ImportAndMergeAnonymousNamespace, NamespaceInLinkageSpec) {
10495+
const char *ToCode =
10496+
R"(
10497+
extern "C" {
10498+
namespace {
10499+
}
10500+
}
10501+
)";
10502+
const char *FromCode =
10503+
R"(
10504+
extern "C" {
10505+
namespace {
10506+
void f();
10507+
}
10508+
}
10509+
)";
10510+
test(ToCode, FromCode);
10511+
}
10512+
10513+
TEST_P(ImportAndMergeAnonymousNamespace, NamespaceInNamespace) {
10514+
const char *ToCode =
10515+
R"(
10516+
namespace X {
10517+
namespace {
10518+
}
10519+
}
10520+
)";
10521+
const char *FromCode =
10522+
R"(
10523+
namespace X {
10524+
namespace {
10525+
void f();
10526+
}
10527+
}
10528+
)";
10529+
test(ToCode, FromCode);
10530+
}
10531+
1045910532
INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ASTImporterLookupTableTest,
1046010533
DefaultTestValuesForRunOptions);
1046110534

@@ -10542,6 +10615,9 @@ INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportMatrixType,
1054210615
INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportTemplateParmDeclDefaultValue,
1054310616
DefaultTestValuesForRunOptions);
1054410617

10618+
INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportAndMergeAnonymousNamespace,
10619+
DefaultTestValuesForRunOptions);
10620+
1054510621
// FIXME: Make ImportOpenCLPipe test work.
1054610622
// INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportOpenCLPipe,
1054710623
// DefaultTestValuesForRunOptions);

0 commit comments

Comments
 (0)