summaryrefslogtreecommitdiffstats
path: root/clang/unittests/AST/ASTImporterTest.cpp
diff options
context:
space:
mode:
authorBalazs Keri <1.int32@gmail.com>2019-09-02 07:17:01 +0000
committerBalazs Keri <1.int32@gmail.com>2019-09-02 07:17:01 +0000
commit6e0866987949be9d1300a82c957bb5c1cef79d58 (patch)
tree8c8c07d0a7244d9e30eec320df179dbc1118f7aa /clang/unittests/AST/ASTImporterTest.cpp
parent3ab210862a030196799918b2ea53d176bc714b7f (diff)
downloadbcm5719-llvm-6e0866987949be9d1300a82c957bb5c1cef79d58.tar.gz
bcm5719-llvm-6e0866987949be9d1300a82c957bb5c1cef79d58.zip
[ASTImporter] At import of records re-order indirect fields too.
Summary: Correct order of fields and indirect fields in imported RecordDecl is needed for correct work of record layout calculations. Reviewers: martong, a.sidorin, shafik, a_sidorin Reviewed By: martong, a_sidorin Subscribers: rnkovacs, dkrupp, Szelethus, gamesh411, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D66866 llvm-svn: 370621
Diffstat (limited to 'clang/unittests/AST/ASTImporterTest.cpp')
-rw-r--r--clang/unittests/AST/ASTImporterTest.cpp40
1 files changed, 34 insertions, 6 deletions
diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp
index cfee284e687..17696a38e94 100644
--- a/clang/unittests/AST/ASTImporterTest.cpp
+++ b/clang/unittests/AST/ASTImporterTest.cpp
@@ -1421,12 +1421,15 @@ TEST_P(ASTImporterOptionSpecificTestBase,
AST_MATCHER_P(RecordDecl, hasFieldOrder, std::vector<StringRef>, Order) {
size_t Index = 0;
- for (FieldDecl *Field : Node.fields()) {
- if (Index == Order.size())
- return false;
- if (Field->getName() != Order[Index])
- return false;
- ++Index;
+ for (Decl *D : Node.decls()) {
+ if (isa<FieldDecl>(D) || isa<IndirectFieldDecl>(D)) {
+ auto *ND = cast<NamedDecl>(D);
+ if (Index == Order.size())
+ return false;
+ if (ND->getName() != Order[Index])
+ return false;
+ ++Index;
+ }
}
return Index == Order.size();
}
@@ -1493,6 +1496,31 @@ TEST_P(ASTImporterOptionSpecificTestBase,
Verifier.match(To, cxxRecordDecl(hasFieldOrder({"a", "b", "c"}))));
}
+TEST_P(ASTImporterOptionSpecificTestBase,
+ CXXRecordDeclFieldAndIndirectFieldOrder) {
+ Decl *From, *To;
+ std::tie(From, To) = getImportedDecl(
+ // First field is "a", then the field for unnamed union, then "b" and "c"
+ // from it (indirect fields), then "d".
+ R"s(
+ struct declToImport {
+ int a = d;
+ union {
+ int b;
+ int c;
+ };
+ int d;
+ };
+ )s",
+ Lang_CXX11, "", Lang_CXX11);
+
+ MatchVerifier<Decl> Verifier;
+ ASSERT_TRUE(Verifier.match(
+ From, cxxRecordDecl(hasFieldOrder({"a", "", "b", "c", "d"}))));
+ EXPECT_TRUE(Verifier.match(
+ To, cxxRecordDecl(hasFieldOrder({"a", "", "b", "c", "d"}))));
+}
+
TEST_P(ASTImporterOptionSpecificTestBase, ShouldImportImplicitCXXRecordDecl) {
Decl *From, *To;
std::tie(From, To) = getImportedDecl(
OpenPOWER on IntegriCloud