forked from OSchip/llvm-project
[ASTImporter] Fix import of objects with anonymous types
Summary: Currently, anonymous types are merged into the same redecl chain even if they are structurally inequivalent. This results that global objects are not imported, if there are at least two global objects with different anonymous types. This patch provides a fix. Reviewers: a.sidorin, balazske, r.stahl Subscribers: rnkovacs, dkrupp, cfe-commits Differential Revision: https://reviews.llvm.org/D48773 llvm-svn: 336332
This commit is contained in:
parent
6dc45e6ca0
commit
0bebf95944
|
@ -2072,18 +2072,9 @@ Decl *ASTNodeImporter::VisitRecordDecl(RecordDecl *D) {
|
|||
|
||||
if (auto *FoundRecord = dyn_cast<RecordDecl>(Found)) {
|
||||
if (!SearchName) {
|
||||
// If both unnamed structs/unions are in a record context, make sure
|
||||
// they occur in the same location in the context records.
|
||||
if (Optional<unsigned> Index1 =
|
||||
StructuralEquivalenceContext::findUntaggedStructOrUnionIndex(
|
||||
D)) {
|
||||
if (Optional<unsigned> Index2 = StructuralEquivalenceContext::
|
||||
findUntaggedStructOrUnionIndex(FoundRecord)) {
|
||||
if (*Index1 != *Index2)
|
||||
if (!IsStructuralMatch(D, FoundRecord, false))
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PrevDecl = FoundRecord;
|
||||
|
||||
|
|
|
@ -1682,6 +1682,35 @@ TEST_P(
|
|||
.match(ToTU, classTemplateSpecializationDecl()));
|
||||
}
|
||||
|
||||
TEST_P(ASTImporterTestBase, ObjectsWithUnnamedStructType) {
|
||||
Decl *FromTU = getTuDecl(
|
||||
R"(
|
||||
struct { int a; int b; } object0 = { 2, 3 };
|
||||
struct { int x; int y; int z; } object1;
|
||||
)",
|
||||
Lang_CXX, "input0.cc");
|
||||
|
||||
auto getRecordDecl = [](VarDecl *VD) {
|
||||
auto *ET = cast<ElaboratedType>(VD->getType().getTypePtr());
|
||||
return cast<RecordType>(ET->getNamedType().getTypePtr())->getDecl();
|
||||
};
|
||||
|
||||
auto *Obj0 =
|
||||
FirstDeclMatcher<VarDecl>().match(FromTU, varDecl(hasName("object0")));
|
||||
auto *From0 = getRecordDecl(Obj0);
|
||||
auto *Obj1 =
|
||||
FirstDeclMatcher<VarDecl>().match(FromTU, varDecl(hasName("object1")));
|
||||
auto *From1 = getRecordDecl(Obj1);
|
||||
|
||||
auto *To0 = Import(From0, Lang_CXX);
|
||||
auto *To1 = Import(From1, Lang_CXX);
|
||||
|
||||
EXPECT_TRUE(To0);
|
||||
EXPECT_TRUE(To1);
|
||||
EXPECT_NE(To0, To1);
|
||||
EXPECT_NE(To0->getCanonicalDecl(), To1->getCanonicalDecl());
|
||||
}
|
||||
|
||||
struct ImportFunctions : ASTImporterTestBase {};
|
||||
|
||||
TEST_P(ImportFunctions,
|
||||
|
|
Loading…
Reference in New Issue