auto ToDCOrErr = Importer.ImportContext(FromDC);
return ToDCOrErr.takeError();
}
-
- const auto *FromRD = dyn_cast<RecordDecl>(FromDC);
+ llvm::SmallVector<Decl *, 8> ImportedDecls;
for (auto *From : FromDC->decls()) {
ExpectedDecl ImportedOrErr = import(From);
- if (!ImportedOrErr) {
- // For RecordDecls, failed import of a field will break the layout of the
- // structure. Handle it as an error.
- if (FromRD)
- return ImportedOrErr.takeError();
+ if (!ImportedOrErr)
// Ignore the error, continue with next Decl.
// FIXME: Handle this case somehow better.
- else
- consumeError(ImportedOrErr.takeError());
- }
- }
-
- // Reorder declarations in RecordDecls because they may have another
- // order. Keeping field order is vitable because it determines structure
- // layout.
- // FIXME: This is an ugly fix. Unfortunately, I cannot come with better
- // solution for this issue. We cannot defer expression import here because
- // type import can depend on them.
- if (!FromRD)
- return Error::success();
-
- auto ImportedDC = import(cast<Decl>(FromDC));
- assert(ImportedDC);
- auto *ToRD = cast<RecordDecl>(*ImportedDC);
-
- for (auto *D : FromRD->decls()) {
- if (isa<FieldDecl>(D) || isa<FriendDecl>(D)) {
- Decl *ToD = Importer.GetAlreadyImportedOrNull(D);
- assert(ToRD == ToD->getDeclContext() && ToRD->containsDecl(ToD));
- ToRD->removeDecl(ToD);
- }
- }
-
- assert(ToRD->field_empty());
-
- for (auto *D : FromRD->decls()) {
- if (isa<FieldDecl>(D) || isa<FriendDecl>(D)) {
- Decl *ToD = Importer.GetAlreadyImportedOrNull(D);
- assert(ToRD == ToD->getDeclContext());
- assert(ToRD == ToD->getLexicalDeclContext());
- assert(!ToRD->containsDecl(ToD));
- ToRD->addDeclInternal(ToD);
- }
+ consumeError(ImportedOrErr.takeError());
}
return Error::success();
}
TEST_P(ASTImporterTestBase,
- CXXRecordDeclFieldOrderShouldNotDependOnImportOrder) {
+ DISABLED_CXXRecordDeclFieldOrderShouldNotDependOnImportOrder) {
Decl *From, *To;
std::tie(From, To) = getImportedDecl(
// The original recursive algorithm of ASTImporter first imports 'c' then
INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportVariables,
DefaultTestValuesForRunOptions, );
-TEST_P(ImportDecl, ImportFieldOrder) {
- MatchVerifier<Decl> Verifier;
- testImport("struct declToImport {"
- " int b = a + 2;"
- " int a = 5;"
- "};",
- Lang_CXX11, "", Lang_CXX11, Verifier,
- recordDecl(hasFieldOrder({"b", "a"})));
-}
-
-
} // end namespace ast_matchers
} // end namespace clang