Revert "[ASTImporter] Reorder fields after structure import is finished"
This reverts commit r345545 because it breaks some lldb tests. llvm-svn: 345643
This commit is contained in:
parent
caf5f5c490
commit
93a64efcd3
|
@ -1658,53 +1658,13 @@ ASTNodeImporter::ImportDeclContext(DeclContext *FromDC, bool ForceImport) {
|
|||
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();
|
||||
|
|
|
@ -1457,7 +1457,7 @@ TEST_P(ASTImporterTestBase, CXXRecordDeclFieldsShouldBeInCorrectOrder) {
|
|||
}
|
||||
|
||||
TEST_P(ASTImporterTestBase,
|
||||
CXXRecordDeclFieldOrderShouldNotDependOnImportOrder) {
|
||||
DISABLED_CXXRecordDeclFieldOrderShouldNotDependOnImportOrder) {
|
||||
Decl *From, *To;
|
||||
std::tie(From, To) = getImportedDecl(
|
||||
// The original recursive algorithm of ASTImporter first imports 'c' then
|
||||
|
@ -3767,16 +3767,5 @@ INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportImplicitMethods,
|
|||
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
|
||||
|
|
Loading…
Reference in New Issue