Dmitry.Kozhevnikov created this revision. Dmitry.Kozhevnikov added reviewers: ilya-biryukov, sammccall. Herald added subscribers: cfe-commits, arphaman, jkorous.
By default, diagnostics are suppressed after a fatal error. Some fatal errors (notably, "file not found" for include directive) are common for incomplete code and we probably want to have further diagnostics anyway. Currently, this flag is optionally set by libclang (see CXTranslationUnit_KeepGoing option). There are also a bunch of related problems when AST is not fully built in presence of fatal errors (templates are not instantiated and include directives are not processed), I'll address these in separate patches. Repository: rCTE Clang Tools Extra https://reviews.llvm.org/D50455 Files: clangd/ClangdUnit.cpp clangd/Compiler.cpp test/clangd/missing-includes.test Index: test/clangd/missing-includes.test =================================================================== --- test/clangd/missing-includes.test +++ test/clangd/missing-includes.test @@ -0,0 +1,13 @@ +# RUN: clangd -lit-test < %s | FileCheck %s +{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{},"trace":"off"}} +--- +{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"test:///foo.c","languageId":"c","version":1,"text":"#include <a>\n#include <b>\nint x;\n#include <c>\n#include <d>\n"}}} +# CHECK: "method": "textDocument/publishDiagnostics", +# CHECK: "message": "'a' file not found", +# CHECK: "message": "'b' file not found", +# CHECK: "message": "'c' file not found", +# CHECK: "message": "'d' file not found", +--- +{"jsonrpc":"2.0","id":5,"method":"shutdown"} +--- +{"jsonrpc":"2.0","method":"exit"} Index: clangd/Compiler.cpp =================================================================== --- clangd/Compiler.cpp +++ clangd/Compiler.cpp @@ -63,6 +63,7 @@ auto Clang = llvm::make_unique<CompilerInstance>(PCHs); Clang->setInvocation(std::move(CI)); Clang->createDiagnostics(&DiagsClient, false); + Clang->getDiagnostics().setSuppressAfterFatalError(false); if (auto VFSWithRemapping = createVFSFromCompilerInvocation( Clang->getInvocation(), Clang->getDiagnostics(), VFS)) Index: clangd/ClangdUnit.cpp =================================================================== --- clangd/ClangdUnit.cpp +++ clangd/ClangdUnit.cpp @@ -328,6 +328,8 @@ // to read back. We rely on dynamic index for the comments instead. CI.getPreprocessorOpts().WriteCommentListToPCH = false; + PreambleDiagsEngine->setSuppressAfterFatalError(false); + CppFilePreambleCallbacks SerializedDeclsCollector(FileName, PreambleCallback); if (Inputs.FS->setCurrentWorkingDirectory(Inputs.CompileCommand.Directory)) { log("Couldn't set working directory when building the preamble.");
Index: test/clangd/missing-includes.test =================================================================== --- test/clangd/missing-includes.test +++ test/clangd/missing-includes.test @@ -0,0 +1,13 @@ +# RUN: clangd -lit-test < %s | FileCheck %s +{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{},"trace":"off"}} +--- +{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"test:///foo.c","languageId":"c","version":1,"text":"#include <a>\n#include <b>\nint x;\n#include <c>\n#include <d>\n"}}} +# CHECK: "method": "textDocument/publishDiagnostics", +# CHECK: "message": "'a' file not found", +# CHECK: "message": "'b' file not found", +# CHECK: "message": "'c' file not found", +# CHECK: "message": "'d' file not found", +--- +{"jsonrpc":"2.0","id":5,"method":"shutdown"} +--- +{"jsonrpc":"2.0","method":"exit"} Index: clangd/Compiler.cpp =================================================================== --- clangd/Compiler.cpp +++ clangd/Compiler.cpp @@ -63,6 +63,7 @@ auto Clang = llvm::make_unique<CompilerInstance>(PCHs); Clang->setInvocation(std::move(CI)); Clang->createDiagnostics(&DiagsClient, false); + Clang->getDiagnostics().setSuppressAfterFatalError(false); if (auto VFSWithRemapping = createVFSFromCompilerInvocation( Clang->getInvocation(), Clang->getDiagnostics(), VFS)) Index: clangd/ClangdUnit.cpp =================================================================== --- clangd/ClangdUnit.cpp +++ clangd/ClangdUnit.cpp @@ -328,6 +328,8 @@ // to read back. We rely on dynamic index for the comments instead. CI.getPreprocessorOpts().WriteCommentListToPCH = false; + PreambleDiagsEngine->setSuppressAfterFatalError(false); + CppFilePreambleCallbacks SerializedDeclsCollector(FileName, PreambleCallback); if (Inputs.FS->setCurrentWorkingDirectory(Inputs.CompileCommand.Directory)) { log("Couldn't set working directory when building the preamble.");
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits