[ASTImporter] Improved import of AlignedAttr.
Summary:
It is not enough to clone the attributes at import.
They can contain reference to objects that should be imported.
This work is done now for AlignedAttr.
Reviewers: martong, a.sidorin, shafik
Reviewed By: shafik
Subscribers: rnkovacs, dkrupp, Szelethus, gamesh411, teemperor, martong, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D75048
diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp
index 6c1d878..ea4a49a 100644
--- a/clang/unittests/AST/ASTImporterTest.cpp
+++ b/clang/unittests/AST/ASTImporterTest.cpp
@@ -5887,6 +5887,41 @@
EXPECT_FALSE(ToSM.isBeforeInTranslationUnit(Location2, Location1));
}
+TEST_P(ASTImporterOptionSpecificTestBase, ImportExprOfAlignmentAttr) {
+ // Test if import of these packed and aligned attributes does not trigger an
+ // error situation where source location from 'From' context is referenced in
+ // 'To' context through evaluation of the alignof attribute.
+ // This happens if the 'alignof(A)' expression is not imported correctly.
+ Decl *FromTU = getTuDecl(
+ R"(
+ struct __attribute__((packed)) A { int __attribute__((aligned(8))) X; };
+ struct alignas(alignof(A)) S {};
+ )",
+ Lang_CXX11, "input.cc");
+ auto *FromD = FirstDeclMatcher<CXXRecordDecl>().match(
+ FromTU, cxxRecordDecl(hasName("S"), unless(isImplicit())));
+ ASSERT_TRUE(FromD);
+
+ auto *ToD = Import(FromD, Lang_CXX11);
+ ASSERT_TRUE(ToD);
+
+ auto *FromAttr = FromD->getAttr<AlignedAttr>();
+ auto *ToAttr = ToD->getAttr<AlignedAttr>();
+ EXPECT_EQ(FromAttr->isInherited(), ToAttr->isInherited());
+ EXPECT_EQ(FromAttr->isPackExpansion(), ToAttr->isPackExpansion());
+ EXPECT_EQ(FromAttr->isImplicit(), ToAttr->isImplicit());
+ EXPECT_EQ(FromAttr->getSyntax(), ToAttr->getSyntax());
+ EXPECT_EQ(FromAttr->getSemanticSpelling(), ToAttr->getSemanticSpelling());
+ EXPECT_TRUE(ToAttr->getAlignmentExpr());
+
+ auto *ToA = FirstDeclMatcher<CXXRecordDecl>().match(
+ ToD->getTranslationUnitDecl(),
+ cxxRecordDecl(hasName("A"), unless(isImplicit())));
+ // Ensure that 'struct A' was imported (through reference from attribute of
+ // 'S').
+ EXPECT_TRUE(ToA);
+}
+
INSTANTIATE_TEST_CASE_P(ParameterizedTests, ASTImporterLookupTableTest,
DefaultTestValuesForRunOptions, );