diff --git a/clang/include/clang/CrossTU/CrossTranslationUnit.h b/clang/include/clang/CrossTU/CrossTranslationUnit.h index d9f9c51fccd9c..b419b9be67cb9 100644 --- a/clang/include/clang/CrossTU/CrossTranslationUnit.h +++ b/clang/include/clang/CrossTU/CrossTranslationUnit.h @@ -38,7 +38,6 @@ class TranslationUnitDecl; namespace cross_tu { enum class index_error_code { - success = 0, unspecified = 1, missing_index_file, invalid_index_format, @@ -254,7 +253,6 @@ class CrossTranslationUnitContext { /// In case of on-demand parsing, the invocations for parsing the source /// files is stored. llvm::Optional InvocationList; - index_error_code PreviousParsingResult = index_error_code::success; }; /// Maintain number of AST loads and check for reaching the load limit. diff --git a/clang/lib/CrossTU/CrossTranslationUnit.cpp b/clang/lib/CrossTU/CrossTranslationUnit.cpp index adee55304c871..640538cae3bbc 100644 --- a/clang/lib/CrossTU/CrossTranslationUnit.cpp +++ b/clang/lib/CrossTU/CrossTranslationUnit.cpp @@ -92,10 +92,6 @@ class IndexErrorCategory : public std::error_category { std::string message(int Condition) const override { switch (static_cast(Condition)) { - case index_error_code::success: - // There should not be a success error. Jump to unreachable directly. - // Add this case to make the compiler stop complaining. - break; case index_error_code::unspecified: return "An unknown error has occurred."; case index_error_code::missing_index_file: @@ -671,15 +667,12 @@ llvm::Error CrossTranslationUnitContext::ASTLoader::lazyInitInvocationList() { /// Lazily initialize the invocation list member used for on-demand parsing. if (InvocationList) return llvm::Error::success(); - if (index_error_code::success != PreviousParsingResult) - return llvm::make_error(PreviousParsingResult); llvm::ErrorOr> FileContent = llvm::MemoryBuffer::getFile(InvocationListFilePath); - if (!FileContent) { - PreviousParsingResult = index_error_code::invocation_list_file_not_found; - return llvm::make_error(PreviousParsingResult); - } + if (!FileContent) + return llvm::make_error( + index_error_code::invocation_list_file_not_found); std::unique_ptr ContentBuffer = std::move(*FileContent); assert(ContentBuffer && "If no error was produced after loading, the pointer " "should not be nullptr."); @@ -687,13 +680,8 @@ llvm::Error CrossTranslationUnitContext::ASTLoader::lazyInitInvocationList() { llvm::Expected ExpectedInvocationList = parseInvocationList(ContentBuffer->getBuffer(), PathStyle); - // Handle the error to store the code for next call to this function. - if (!ExpectedInvocationList) { - llvm::handleAllErrors( - ExpectedInvocationList.takeError(), - [&](const IndexError &E) { PreviousParsingResult = E.getCode(); }); - return llvm::make_error(PreviousParsingResult); - } + if (!ExpectedInvocationList) + return ExpectedInvocationList.takeError(); InvocationList = *ExpectedInvocationList; diff --git a/clang/test/Analysis/ctu-on-demand-parsing-multiple-invocation-list-parsing.cpp b/clang/test/Analysis/ctu-on-demand-parsing-multiple-invocation-list-parsing.cpp deleted file mode 100644 index 7121a798e3c27..0000000000000 --- a/clang/test/Analysis/ctu-on-demand-parsing-multiple-invocation-list-parsing.cpp +++ /dev/null @@ -1,56 +0,0 @@ -// RUN: rm -rf %t -// RUN: mkdir -p %t - -// RUN: %host_cxx %s -fPIC -shared -o %t/mock_open.so - -// RUN: echo "void bar(); void foo() { bar(); bar(); }" > %t/trigger.c -// RUN: echo "void bar() {}" > %t/importee.c -// RUN: echo '[{"directory":"%t", "command":"cc -c %t/importee.c", "file": "%t/importee.c"}]' > %t/compile_commands.json -// RUN: %clang_extdef_map -p %t "%t/importee.c" > %t/externalDefMap.txt - -// Add an empty invocation list to make the on-demand parsing fail and load it again. -// RUN: echo '' > %t/invocations.yaml - -// RUN: cd %t && \ -// RUN: LD_PRELOAD=%t/mock_open.so \ -// RUN: %clang_cc1 -fsyntax-only -analyze \ -// RUN: -analyzer-checker=core \ -// RUN: -analyzer-config experimental-enable-naive-ctu-analysis=true \ -// RUN: -analyzer-config ctu-dir=. \ -// RUN: -analyzer-config ctu-invocation-list=invocations.yaml \ -// RUN: %t/trigger.c | FileCheck %s - -// REQUIRES: shell, system-linux - -// CHECK: {{Opening file invocations.yaml: 1}} -// CHECK-NOT: {{Opening file invocations.yaml: 2}} - -#define _GNU_SOURCE 1 -#include -#include - -#include -#include -#include -using namespace std; - -extern "C" int open(const char *name, int flag, ...) { - // Log how many times the invocation list is opened. - if ("invocations.yaml" == string(name)) { - static unsigned N = 0; - cout << "Opening file invocations.yaml: " << ++N << endl; - } - - // The original open function will be called to open the files. - using open_t = int (*)(const char *, int, mode_t); - static open_t o_open = nullptr; - if (!o_open) - o_open = reinterpret_cast(dlsym(RTLD_NEXT, "open")); - assert(o_open && "Cannot find function `open'."); - - va_list vl; - va_start(vl, flag); - auto mode = va_arg(vl, mode_t); - va_end(vl); - return o_open(name, flag, mode); -}