[PATCH] D55049: Changed every use of ASTImporter::Import to Import_New
This revision was automatically updated to reflect the committed changes. Closed by commit rC357913: Changed every use of ASTImporter::Import to Import_New (authored by balazske, committed by ). Changed prior to commit: https://reviews.llvm.org/D55049?vs=192110=194140#toc Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D55049/new/ https://reviews.llvm.org/D55049 Files: lib/AST/ASTImporter.cpp lib/AST/ExternalASTMerger.cpp lib/CrossTU/CrossTranslationUnit.cpp lib/Frontend/ASTMerge.cpp unittests/AST/ASTImporterTest.cpp Index: unittests/AST/ASTImporterTest.cpp === --- unittests/AST/ASTImporterTest.cpp +++ unittests/AST/ASTImporterTest.cpp @@ -89,8 +89,8 @@ public ::testing::WithParamInterface { template - NodeType importNode(ASTUnit *From, ASTUnit *To, ASTImporter , - NodeType Node) { + llvm::Expected importNode(ASTUnit *From, ASTUnit *To, + ASTImporter , NodeType Node) { ASTContext = To->getASTContext(); // Add 'From' file to virtual file system so importer can 'find' it @@ -100,17 +100,19 @@ createVirtualFileIfNeeded(To, FromFileName, From->getBufferForFile(FromFileName)); -auto Imported = Importer.Import(Node); +auto Imported = Importer.Import_New(Node); -// This should dump source locations and assert if some source locations -// were not imported. -SmallString<1024> ImportChecker; -llvm::raw_svector_ostream ToNothing(ImportChecker); -ToCtx.getTranslationUnitDecl()->print(ToNothing); - -// This traverses the AST to catch certain bugs like poorly or not -// implemented subtrees. -Imported->dump(ToNothing); +if (Imported) { + // This should dump source locations and assert if some source locations + // were not imported. + SmallString<1024> ImportChecker; + llvm::raw_svector_ostream ToNothing(ImportChecker); + ToCtx.getTranslationUnitDecl()->print(ToNothing); + + // This traverses the AST to catch certain bugs like poorly or not + // implemented subtrees. + (*Imported)->dump(ToNothing); +} return Imported; } @@ -151,11 +153,16 @@ EXPECT_TRUE(Verifier.match(ToImport, WrapperMatcher)); auto Imported = importNode(FromAST.get(), ToAST.get(), Importer, ToImport); -if (!Imported) - return testing::AssertionFailure() << "Import failed, nullptr returned!"; - +if (!Imported) { + std::string ErrorText; + handleAllErrors( + Imported.takeError(), + [](const ImportError ) { ErrorText = Err.message(); }); + return testing::AssertionFailure() + << "Import failed, error: \"" << ErrorText << "\"!"; +} -return Verifier.match(Imported, WrapperMatcher); +return Verifier.match(*Imported, WrapperMatcher); } template @@ -277,7 +284,9 @@ EXPECT_TRUE(FoundDecl.size() == 1); const Decl *ToImport = selectFirst(DeclToImportID, FoundDecl); auto Imported = importNode(From, To, *ImporterRef, ToImport); - EXPECT_TRUE(Imported); + EXPECT_TRUE(static_cast(Imported)); + if (!Imported) +llvm::consumeError(Imported.takeError()); } // Find the declaration and import it. @@ -339,13 +348,23 @@ Decl *import(ASTImporterLookupTable , ASTUnit *ToAST, Decl *FromDecl) { lazyInitImporter(LookupTable, ToAST); - return Importer->Import(FromDecl); + if (auto ImportedOrErr = Importer->Import_New(FromDecl)) +return *ImportedOrErr; + else { +llvm::consumeError(ImportedOrErr.takeError()); +return nullptr; + } } QualType import(ASTImporterLookupTable , ASTUnit *ToAST, QualType FromType) { lazyInitImporter(LookupTable, ToAST); - return Importer->Import(FromType); + if (auto ImportedOrErr = Importer->Import_New(FromType)) +return *ImportedOrErr; + else { +llvm::consumeError(ImportedOrErr.takeError()); +return QualType{}; + } } }; Index: lib/CrossTU/CrossTranslationUnit.cpp === --- lib/CrossTU/CrossTranslationUnit.cpp +++ lib/CrossTU/CrossTranslationUnit.cpp @@ -357,13 +357,28 @@ assert(FD->hasBody() && "Functions to be imported should have body."); ASTImporter = getOrCreateASTImporter(FD->getASTContext()); - auto *ToDecl = - cast_or_null(Importer.Import(const_cast(FD))); - if (!ToDecl) + auto ToDeclOrError = Importer.Import_New(FD); + if (!ToDeclOrError) { +handleAllErrors(ToDeclOrError.takeError(), +[&](const ImportError ) { + switch (IE.Error) { + case ImportError::NameConflict: +// FIXME: Add statistic. +
[PATCH] D55049: Changed every use of ASTImporter::Import to Import_New
a_sidorin accepted this revision. a_sidorin added a comment. This revision is now accepted and ready to land. LGTM. Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D55049/new/ https://reviews.llvm.org/D55049 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D55049: Changed every use of ASTImporter::Import to Import_New
martong added a comment. Ping @shafik @a_sidorin Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D55049/new/ https://reviews.llvm.org/D55049 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D55049: Changed every use of ASTImporter::Import to Import_New
balazske updated this revision to Diff 192110. balazske added a comment. Corrected rebase problems. Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D55049/new/ https://reviews.llvm.org/D55049 Files: lib/AST/ASTImporter.cpp lib/AST/ExternalASTMerger.cpp lib/CrossTU/CrossTranslationUnit.cpp lib/Frontend/ASTMerge.cpp unittests/AST/ASTImporterTest.cpp Index: unittests/AST/ASTImporterTest.cpp === --- unittests/AST/ASTImporterTest.cpp +++ unittests/AST/ASTImporterTest.cpp @@ -89,8 +89,8 @@ public ::testing::WithParamInterface { template - NodeType importNode(ASTUnit *From, ASTUnit *To, ASTImporter , - NodeType Node) { + llvm::Expected importNode(ASTUnit *From, ASTUnit *To, + ASTImporter , NodeType Node) { ASTContext = To->getASTContext(); // Add 'From' file to virtual file system so importer can 'find' it @@ -100,17 +100,19 @@ createVirtualFileIfNeeded(To, FromFileName, From->getBufferForFile(FromFileName)); -auto Imported = Importer.Import(Node); +auto Imported = Importer.Import_New(Node); -// This should dump source locations and assert if some source locations -// were not imported. -SmallString<1024> ImportChecker; -llvm::raw_svector_ostream ToNothing(ImportChecker); -ToCtx.getTranslationUnitDecl()->print(ToNothing); +if (Imported) { + // This should dump source locations and assert if some source locations + // were not imported. + SmallString<1024> ImportChecker; + llvm::raw_svector_ostream ToNothing(ImportChecker); + ToCtx.getTranslationUnitDecl()->print(ToNothing); -// This traverses the AST to catch certain bugs like poorly or not -// implemented subtrees. -Imported->dump(ToNothing); + // This traverses the AST to catch certain bugs like poorly or not + // implemented subtrees. + (*Imported)->dump(ToNothing); +} return Imported; } @@ -151,11 +153,16 @@ EXPECT_TRUE(Verifier.match(ToImport, WrapperMatcher)); auto Imported = importNode(FromAST.get(), ToAST.get(), Importer, ToImport); -if (!Imported) - return testing::AssertionFailure() << "Import failed, nullptr returned!"; - +if (!Imported) { + std::string ErrorText; + handleAllErrors( + Imported.takeError(), + [](const ImportError ) { ErrorText = Err.message(); }); + return testing::AssertionFailure() + << "Import failed, error: \"" << ErrorText << "\"!"; +} -return Verifier.match(Imported, WrapperMatcher); +return Verifier.match(*Imported, WrapperMatcher); } template @@ -277,7 +284,9 @@ EXPECT_TRUE(FoundDecl.size() == 1); const Decl *ToImport = selectFirst(DeclToImportID, FoundDecl); auto Imported = importNode(From, To, *ImporterRef, ToImport); - EXPECT_TRUE(Imported); + EXPECT_TRUE(static_cast(Imported)); + if (!Imported) +llvm::consumeError(Imported.takeError()); } // Find the declaration and import it. @@ -339,13 +348,23 @@ Decl *import(ASTImporterLookupTable , ASTUnit *ToAST, Decl *FromDecl) { lazyInitImporter(LookupTable, ToAST); - return Importer->Import(FromDecl); + if (auto ImportedOrErr = Importer->Import_New(FromDecl)) +return *ImportedOrErr; + else { +llvm::consumeError(ImportedOrErr.takeError()); +return nullptr; + } } QualType import(ASTImporterLookupTable , ASTUnit *ToAST, QualType FromType) { lazyInitImporter(LookupTable, ToAST); - return Importer->Import(FromType); + if (auto ImportedOrErr = Importer->Import_New(FromType)) +return *ImportedOrErr; + else { +llvm::consumeError(ImportedOrErr.takeError()); +return QualType{}; + } } }; Index: lib/Frontend/ASTMerge.cpp === --- lib/Frontend/ASTMerge.cpp +++ lib/Frontend/ASTMerge.cpp @@ -65,11 +65,13 @@ if (II->isStr("__va_list_tag") || II->isStr("__builtin_va_list")) continue; - Decl *ToD = Importer.Import(D); + llvm::Expected ToDOrError = Importer.Import_New(D); - if (ToD) { -DeclGroupRef DGR(ToD); + if (ToDOrError) { +DeclGroupRef DGR(*ToDOrError); CI.getASTConsumer().HandleTopLevelDecl(DGR); + } else { +llvm::consumeError(ToDOrError.takeError()); } } } Index: lib/CrossTU/CrossTranslationUnit.cpp === --- lib/CrossTU/CrossTranslationUnit.cpp +++ lib/CrossTU/CrossTranslationUnit.cpp @@ -357,13 +357,28 @@ assert(FD->hasBody() && "Functions to be imported should have body."); ASTImporter =
[PATCH] D55049: Changed every use of ASTImporter::Import to Import_New
balazske updated this revision to Diff 192105. balazske added a comment. - Rebase to current master. - Fixed error handling in testImport. Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D55049/new/ https://reviews.llvm.org/D55049 Files: lib/AST/ASTImporter.cpp lib/AST/ExternalASTMerger.cpp lib/CrossTU/CrossTranslationUnit.cpp lib/Frontend/ASTMerge.cpp unittests/AST/ASTImporterTest.cpp Index: unittests/AST/ASTImporterTest.cpp === --- unittests/AST/ASTImporterTest.cpp +++ unittests/AST/ASTImporterTest.cpp @@ -89,8 +89,8 @@ public ::testing::WithParamInterface { template - NodeType importNode(ASTUnit *From, ASTUnit *To, ASTImporter , - NodeType Node) { + llvm::Expected importNode(ASTUnit *From, ASTUnit *To, + ASTImporter , NodeType Node) { ASTContext = To->getASTContext(); // Add 'From' file to virtual file system so importer can 'find' it @@ -100,17 +100,19 @@ createVirtualFileIfNeeded(To, FromFileName, From->getBufferForFile(FromFileName)); -auto Imported = Importer.Import(Node); +auto Imported = Importer.Import_New(Node); -// This should dump source locations and assert if some source locations -// were not imported. -SmallString<1024> ImportChecker; -llvm::raw_svector_ostream ToNothing(ImportChecker); -ToCtx.getTranslationUnitDecl()->print(ToNothing); +if (Imported) { + // This should dump source locations and assert if some source locations + // were not imported. + SmallString<1024> ImportChecker; + llvm::raw_svector_ostream ToNothing(ImportChecker); + ToCtx.getTranslationUnitDecl()->print(ToNothing); -// This traverses the AST to catch certain bugs like poorly or not -// implemented subtrees. -Imported->dump(ToNothing); + // This traverses the AST to catch certain bugs like poorly or not + // implemented subtrees. + (*Imported)->dump(ToNothing); +} return Imported; } @@ -151,11 +153,16 @@ EXPECT_TRUE(Verifier.match(ToImport, WrapperMatcher)); auto Imported = importNode(FromAST.get(), ToAST.get(), Importer, ToImport); -if (!Imported) - return testing::AssertionFailure() << "Import failed, nullptr returned!"; - +if (!Imported) { + std::string ErrorText; + handleAllErrors( + Imported.takeError(), + [](const ImportError ) { ErrorText = Err.message(); }); + return testing::AssertionFailure() + << "Import failed, error: \"" << ErrorText << "\"!"; +} -return Verifier.match(Imported, WrapperMatcher); +return Verifier.match(*Imported, WrapperMatcher); } template @@ -277,7 +284,9 @@ EXPECT_TRUE(FoundDecl.size() == 1); const Decl *ToImport = selectFirst(DeclToImportID, FoundDecl); auto Imported = importNode(From, To, *ImporterRef, ToImport); - EXPECT_TRUE(Imported); + EXPECT_TRUE(static_cast(Imported)); + if (!Imported) +llvm::consumeError(Imported.takeError()); } // Find the declaration and import it. @@ -339,13 +348,23 @@ Decl *import(ASTImporterLookupTable , ASTUnit *ToAST, Decl *FromDecl) { lazyInitImporter(LookupTable, ToAST); - return Importer->Import(FromDecl); + if (auto ImportedOrErr = Importer->Import_New(FromDecl)) +return *ImportedOrErr; + else { +llvm::consumeError(ImportedOrErr.takeError()); +return nullptr; + } } QualType import(ASTImporterLookupTable , ASTUnit *ToAST, QualType FromType) { lazyInitImporter(LookupTable, ToAST); - return Importer->Import(FromType); + if (auto ImportedOrErr = Importer->Import_New(FromType)) +return *ImportedOrErr; + else { +llvm::consumeError(ImportedOrErr.takeError()); +return QualType{}; + } } }; Index: lib/Frontend/ASTMerge.cpp === --- lib/Frontend/ASTMerge.cpp +++ lib/Frontend/ASTMerge.cpp @@ -65,11 +65,13 @@ if (II->isStr("__va_list_tag") || II->isStr("__builtin_va_list")) continue; - Decl *ToD = Importer.Import(D); + llvm::Expected ToDOrError = Importer.Import_New(D); - if (ToD) { -DeclGroupRef DGR(ToD); + if (ToDOrError) { +DeclGroupRef DGR(*ToDOrError); CI.getASTConsumer().HandleTopLevelDecl(DGR); + } else { +llvm::consumeError(ToDOrError.takeError()); } } } Index: lib/CrossTU/CrossTranslationUnit.cpp === --- lib/CrossTU/CrossTranslationUnit.cpp +++ lib/CrossTU/CrossTranslationUnit.cpp @@ -357,13 +357,28 @@ assert(FD->hasBody() && "Functions to be imported should have
[PATCH] D55049: Changed every use of ASTImporter::Import to Import_New
balazske marked an inline comment as done. balazske added inline comments. Comment at: lib/AST/ASTImporter.cpp:8550 +if (ExpectedType ToFromOrErr = Import_New(From)) { + if (ToContext.hasSameType(*ToFromOrErr, To)) +return true; a_sidorin wrote: > Wow, we import types instead of just checking them for structural > equivalence. That's OK to leave it in the patch as-is but looks pretty > strange. Maybe this even deserves a FIXME. The Import call was already here: "ToContext.hasSameType(**Import(From)**, To))" This is not a big thing, because the type already exists in ImportedTypes, so the Import call will return it. Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D55049/new/ https://reviews.llvm.org/D55049 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D55049: Changed every use of ASTImporter::Import to Import_New
a_sidorin added a comment. Hi Balazs, The looks mostly good to me. Comment at: lib/AST/ASTImporter.cpp:3440 - for (const auto *Attr : D->attrs()) -ToIndirectField->addAttr(Importer.Import(Attr)); There is the same deletion in D53757. Comment at: lib/AST/ASTImporter.cpp:8550 +if (ExpectedType ToFromOrErr = Import_New(From)) { + if (ToContext.hasSameType(*ToFromOrErr, To)) +return true; Wow, we import types instead of just checking them for structural equivalence. That's OK to leave it in the patch as-is but looks pretty strange. Maybe this even deserves a FIXME. Comment at: unittests/AST/ASTImporterTest.cpp:146 + << "Import failed, error: \"" << Err << "\"!"; + llvm::consumeError(std::move(Err)); +} Dead code? Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D55049/new/ https://reviews.llvm.org/D55049 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D55049: Changed every use of ASTImporter::Import to Import_New
martong added a reviewer: a_sidorin. martong added a comment. Herald added a subscriber: rnkovacs. Ping Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D55049/new/ https://reviews.llvm.org/D55049 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D55049: Changed every use of ASTImporter::Import to Import_New
martong added inline comments. Herald added a reviewer: martong. Herald added a project: clang. Comment at: lib/AST/ASTImporter.cpp:7767 + if (!ToDCOrErr) +return ToDCOrErr.takeError(); + auto *ToDC = cast(*ToDCOrErr); Actually, this patch is not merely a `Import` -> `Import_New` substitution. As this line shows, the error will be propagated correctly. However, in the old version we return with a nullptr DC which may be referenced later. This is the reason, why https://reviews.llvm.org/D59692 breaks in the unittests and thus depends on this patch. Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D55049/new/ https://reviews.llvm.org/D55049 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D55049: Changed every use of ASTImporter::Import to Import_New
balazske updated this revision to Diff 175864. balazske added a comment. - Changed some missing Import calls. Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D55049/new/ https://reviews.llvm.org/D55049 Files: lib/AST/ASTImporter.cpp lib/AST/ExternalASTMerger.cpp lib/CrossTU/CrossTranslationUnit.cpp lib/Frontend/ASTMerge.cpp unittests/AST/ASTImporterTest.cpp Index: unittests/AST/ASTImporterTest.cpp === --- unittests/AST/ASTImporterTest.cpp +++ unittests/AST/ASTImporterTest.cpp @@ -75,8 +75,8 @@ class TestImportBase : public ParameterizedTestsFixture { template - NodeType importNode(ASTUnit *From, ASTUnit *To, ASTImporter , - NodeType Node) { + llvm::Expected importNode(ASTUnit *From, ASTUnit *To, + ASTImporter , NodeType Node) { ASTContext = To->getASTContext(); // Add 'From' file to virtual file system so importer can 'find' it @@ -86,17 +86,19 @@ createVirtualFileIfNeeded(To, FromFileName, From->getBufferForFile(FromFileName)); -auto Imported = Importer.Import(Node); +auto Imported = Importer.Import_New(Node); -// This should dump source locations and assert if some source locations -// were not imported. -SmallString<1024> ImportChecker; -llvm::raw_svector_ostream ToNothing(ImportChecker); -ToCtx.getTranslationUnitDecl()->print(ToNothing); +if (Imported) { + // This should dump source locations and assert if some source locations + // were not imported. + SmallString<1024> ImportChecker; + llvm::raw_svector_ostream ToNothing(ImportChecker); + ToCtx.getTranslationUnitDecl()->print(ToNothing); -// This traverses the AST to catch certain bugs like poorly or not -// implemented subtrees. -Imported->dump(ToNothing); + // This traverses the AST to catch certain bugs like poorly or not + // implemented subtrees. + (*Imported)->dump(ToNothing); +} return Imported; } @@ -137,11 +139,14 @@ EXPECT_TRUE(Verifier.match(ToImport, WrapperMatcher)); auto Imported = importNode(FromAST.get(), ToAST.get(), Importer, ToImport); -if (!Imported) - return testing::AssertionFailure() << "Import failed, nullptr returned!"; - +if (!Imported) { + llvm::Error Err = Imported.takeError(); + return testing::AssertionFailure() + << "Import failed, error: \"" << Err << "\"!"; + llvm::consumeError(std::move(Err)); +} -return Verifier.match(Imported, WrapperMatcher); +return Verifier.match(*Imported, WrapperMatcher); } template @@ -260,7 +265,9 @@ EXPECT_TRUE(FoundDecl.size() == 1); const Decl *ToImport = selectFirst(DeclToImportID, FoundDecl); auto Imported = importNode(From, To, *ImporterRef, ToImport); - EXPECT_TRUE(Imported); + EXPECT_TRUE(static_cast(Imported)); + if (!Imported) +llvm::consumeError(Imported.takeError()); } // Find the declaration and import it. @@ -320,12 +327,22 @@ Decl *import(ASTUnit *ToAST, Decl *FromDecl) { lazyInitImporter(ToAST); - return Importer->Import(FromDecl); - } + if (auto ImportedOrErr = Importer->Import_New(FromDecl)) +return *ImportedOrErr; + else { +llvm::consumeError(ImportedOrErr.takeError()); +return nullptr; + } +} QualType import(ASTUnit *ToAST, QualType FromType) { lazyInitImporter(ToAST); - return Importer->Import(FromType); + if (auto ImportedOrErr = Importer->Import_New(FromType)) +return *ImportedOrErr; + else { +llvm::consumeError(ImportedOrErr.takeError()); +return QualType{}; + } } }; Index: lib/Frontend/ASTMerge.cpp === --- lib/Frontend/ASTMerge.cpp +++ lib/Frontend/ASTMerge.cpp @@ -65,11 +65,13 @@ if (II->isStr("__va_list_tag") || II->isStr("__builtin_va_list")) continue; - Decl *ToD = Importer.Import(D); + llvm::Expected ToDOrError = Importer.Import_New(D); - if (ToD) { -DeclGroupRef DGR(ToD); + if (ToDOrError) { +DeclGroupRef DGR(*ToDOrError); CI.getASTConsumer().HandleTopLevelDecl(DGR); + } else { +llvm::consumeError(ToDOrError.takeError()); } } } Index: lib/CrossTU/CrossTranslationUnit.cpp === --- lib/CrossTU/CrossTranslationUnit.cpp +++ lib/CrossTU/CrossTranslationUnit.cpp @@ -245,11 +245,28 @@ llvm::Expected CrossTranslationUnitContext::importDefinition(const FunctionDecl *FD) { - ASTImporter = getOrCreateASTImporter(FD->getASTContext()); - auto *ToDecl = - cast(Importer.Import(const_cast(FD))); - assert(ToDecl->hasBody()); assert(FD->hasBody() &&
[PATCH] D55049: Changed every use of ASTImporter::Import to Import_New
balazske created this revision. Herald added subscribers: cfe-commits, gamesh411, Szelethus, martong, dkrupp. Herald added a reviewer: a.sidorin. Herald added a reviewer: shafik. Repository: rC Clang https://reviews.llvm.org/D55049 Files: lib/AST/ExternalASTMerger.cpp lib/CrossTU/CrossTranslationUnit.cpp lib/Frontend/ASTMerge.cpp unittests/AST/ASTImporterTest.cpp Index: unittests/AST/ASTImporterTest.cpp === --- unittests/AST/ASTImporterTest.cpp +++ unittests/AST/ASTImporterTest.cpp @@ -75,8 +75,8 @@ class TestImportBase : public ParameterizedTestsFixture { template - NodeType importNode(ASTUnit *From, ASTUnit *To, ASTImporter , - NodeType Node) { + llvm::Expected importNode(ASTUnit *From, ASTUnit *To, + ASTImporter , NodeType Node) { ASTContext = To->getASTContext(); // Add 'From' file to virtual file system so importer can 'find' it @@ -86,17 +86,19 @@ createVirtualFileIfNeeded(To, FromFileName, From->getBufferForFile(FromFileName)); -auto Imported = Importer.Import(Node); +auto Imported = Importer.Import_New(Node); -// This should dump source locations and assert if some source locations -// were not imported. -SmallString<1024> ImportChecker; -llvm::raw_svector_ostream ToNothing(ImportChecker); -ToCtx.getTranslationUnitDecl()->print(ToNothing); +if (Imported) { + // This should dump source locations and assert if some source locations + // were not imported. + SmallString<1024> ImportChecker; + llvm::raw_svector_ostream ToNothing(ImportChecker); + ToCtx.getTranslationUnitDecl()->print(ToNothing); -// This traverses the AST to catch certain bugs like poorly or not -// implemented subtrees. -Imported->dump(ToNothing); + // This traverses the AST to catch certain bugs like poorly or not + // implemented subtrees. + (*Imported)->dump(ToNothing); +} return Imported; } @@ -137,11 +139,14 @@ EXPECT_TRUE(Verifier.match(ToImport, WrapperMatcher)); auto Imported = importNode(FromAST.get(), ToAST.get(), Importer, ToImport); -if (!Imported) - return testing::AssertionFailure() << "Import failed, nullptr returned!"; - +if (!Imported) { + llvm::Error Err = Imported.takeError(); + return testing::AssertionFailure() + << "Import failed, error: \"" << Err << "\"!"; + llvm::consumeError(std::move(Err)); +} -return Verifier.match(Imported, WrapperMatcher); +return Verifier.match(*Imported, WrapperMatcher); } template @@ -260,7 +265,9 @@ EXPECT_TRUE(FoundDecl.size() == 1); const Decl *ToImport = selectFirst(DeclToImportID, FoundDecl); auto Imported = importNode(From, To, *ImporterRef, ToImport); - EXPECT_TRUE(Imported); + EXPECT_TRUE(static_cast(Imported)); + if (!Imported) +llvm::consumeError(Imported.takeError()); } // Find the declaration and import it. @@ -320,12 +327,22 @@ Decl *import(ASTUnit *ToAST, Decl *FromDecl) { lazyInitImporter(ToAST); - return Importer->Import(FromDecl); - } + if (auto ImportedOrErr = Importer->Import_New(FromDecl)) +return *ImportedOrErr; + else { +llvm::consumeError(ImportedOrErr.takeError()); +return nullptr; + } +} QualType import(ASTUnit *ToAST, QualType FromType) { lazyInitImporter(ToAST); - return Importer->Import(FromType); + if (auto ImportedOrErr = Importer->Import_New(FromType)) +return *ImportedOrErr; + else { +llvm::consumeError(ImportedOrErr.takeError()); +return QualType{}; + } } }; Index: lib/Frontend/ASTMerge.cpp === --- lib/Frontend/ASTMerge.cpp +++ lib/Frontend/ASTMerge.cpp @@ -65,11 +65,13 @@ if (II->isStr("__va_list_tag") || II->isStr("__builtin_va_list")) continue; - Decl *ToD = Importer.Import(D); + llvm::Expected ToDOrError = Importer.Import_New(D); - if (ToD) { -DeclGroupRef DGR(ToD); + if (ToDOrError) { +DeclGroupRef DGR(*ToDOrError); CI.getASTConsumer().HandleTopLevelDecl(DGR); + } else { +llvm::consumeError(ToDOrError.takeError()); } } } Index: lib/CrossTU/CrossTranslationUnit.cpp === --- lib/CrossTU/CrossTranslationUnit.cpp +++ lib/CrossTU/CrossTranslationUnit.cpp @@ -245,11 +245,28 @@ llvm::Expected CrossTranslationUnitContext::importDefinition(const FunctionDecl *FD) { - ASTImporter = getOrCreateASTImporter(FD->getASTContext()); - auto *ToDecl = - cast(Importer.Import(const_cast(FD))); - assert(ToDecl->hasBody()); assert(FD->hasBody() && "Functions already imported