diff options
author | Balazs Keri <1.int32@gmail.com> | 2019-09-02 07:17:01 +0000 |
---|---|---|
committer | Balazs Keri <1.int32@gmail.com> | 2019-09-02 07:17:01 +0000 |
commit | 6e0866987949be9d1300a82c957bb5c1cef79d58 (patch) | |
tree | 8c8c07d0a7244d9e30eec320df179dbc1118f7aa /clang/unittests/AST/ASTImporterTest.cpp | |
parent | 3ab210862a030196799918b2ea53d176bc714b7f (diff) | |
download | bcm5719-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.cpp | 40 |
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( |