diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -1701,7 +1701,7 @@ // Remove all declarations, which may be in wrong order in the // lexical DeclContext and then add them in the proper order. for (auto *D : FromRD->decls()) { - if (isa(D) || isa(D)) { + if (isa(D) || isa(D) || isa(D)) { assert(D && "DC contains a null decl"); Decl *ToD = Importer.GetAlreadyImportedOrNull(D); // Remove only the decls which we successfully imported. diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp --- a/clang/unittests/AST/ASTImporterTest.cpp +++ b/clang/unittests/AST/ASTImporterTest.cpp @@ -1431,6 +1431,23 @@ return Index == Order.size(); } +AST_MATCHER_P(RecordDecl, hasFieldIndirectFieldOrder, std::vector, + Order) { + size_t Index = 0; + for (Decl *D : Node.decls()) { + if (isa(D) || isa(D)) { + if (auto *ND = cast(D)) { + if (Index == Order.size()) + return false; + if (ND->getName() != Order[Index]) + return false; + ++Index; + } + } + } + return Index == Order.size(); +} + TEST_P(ASTImporterOptionSpecificTestBase, TUshouldContainClassTemplateSpecializationOfExplicitInstantiation) { Decl *From, *To; @@ -1493,6 +1510,31 @@ 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, then "d". + R"s( + struct declToImport { + int a = d; + union { + int b; + int c; + }; + int d; + }; + )s", + Lang_CXX11, "", Lang_CXX11); + + MatchVerifier Verifier; + ASSERT_TRUE(Verifier.match(From, cxxRecordDecl(hasFieldIndirectFieldOrder( + {"a", "", "b", "c", "d"})))); + EXPECT_TRUE(Verifier.match( + To, cxxRecordDecl(hasFieldIndirectFieldOrder({"a", "", "b", "c", "d"})))); +} + TEST_P(ASTImporterOptionSpecificTestBase, ShouldImportImplicitCXXRecordDecl) { Decl *From, *To; std::tie(From, To) = getImportedDecl(