r336332 - [ASTImporter] Fix import of objects with anonymous types
Gabor Marton via cfe-commits
cfe-commits at lists.llvm.org
Thu Jul 5 02:51:13 PDT 2018
Author: martong
Date: Thu Jul 5 02:51:13 2018
New Revision: 336332
URL: http://llvm.org/viewvc/llvm-project?rev=336332&view=rev
Log:
[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
Modified:
cfe/trunk/lib/AST/ASTImporter.cpp
cfe/trunk/unittests/AST/ASTImporterTest.cpp
Modified: cfe/trunk/lib/AST/ASTImporter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTImporter.cpp?rev=336332&r1=336331&r2=336332&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ASTImporter.cpp (original)
+++ cfe/trunk/lib/AST/ASTImporter.cpp Thu Jul 5 02:51:13 2018
@@ -2072,17 +2072,8 @@ Decl *ASTNodeImporter::VisitRecordDecl(R
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)
- continue;
- }
- }
+ if (!IsStructuralMatch(D, FoundRecord, false))
+ continue;
}
PrevDecl = FoundRecord;
Modified: cfe/trunk/unittests/AST/ASTImporterTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/AST/ASTImporterTest.cpp?rev=336332&r1=336331&r2=336332&view=diff
==============================================================================
--- cfe/trunk/unittests/AST/ASTImporterTest.cpp (original)
+++ cfe/trunk/unittests/AST/ASTImporterTest.cpp Thu Jul 5 02:51:13 2018
@@ -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,
More information about the cfe-commits
mailing list