diff --git a/clang-tools-extra/clangd/ClangdServer.h b/clang-tools-extra/clangd/ClangdServer.h --- a/clang-tools-extra/clangd/ClangdServer.h +++ b/clang-tools-extra/clangd/ClangdServer.h @@ -128,11 +128,13 @@ /// enabled. ClangTidyOptionsBuilder GetClangTidyOptions; - /// If true, turn on the `-frecovery-ast` clang flag. - bool BuildRecoveryAST = true; + /// If true, force -frecovery-ast flag. + /// If false, respect the value in clang. + bool BuildRecoveryAST = false; - /// If true, turn on the `-frecovery-ast-type` clang flag. - bool PreserveRecoveryASTType = true; + /// If true, force -frecovery-ast-type flag. + /// If false, respect the value in clang. + bool PreserveRecoveryASTType = false; /// Clangd's workspace root. Relevant for "workspace" operations not bound /// to a particular file. diff --git a/clang-tools-extra/clangd/Compiler.cpp b/clang-tools-extra/clangd/Compiler.cpp --- a/clang-tools-extra/clangd/Compiler.cpp +++ b/clang-tools-extra/clangd/Compiler.cpp @@ -81,11 +81,11 @@ // Don't crash on `#pragma clang __debug parser_crash` CI->getPreprocessorOpts().DisablePragmaDebugCrash = true; - // Recovery expression currently only works for C++. - if (CI->getLangOpts()->CPlusPlus) { - CI->getLangOpts()->RecoveryAST = Inputs.Opts.BuildRecoveryAST; - CI->getLangOpts()->RecoveryASTType = Inputs.Opts.PreserveRecoveryASTType; - } + if (Inputs.Opts.BuildRecoveryAST) + CI->getLangOpts()->RecoveryAST = true; + if (Inputs.Opts.PreserveRecoveryASTType) + CI->getLangOpts()->RecoveryASTType = true; + return CI; } diff --git a/clang-tools-extra/clangd/tool/ClangdMain.cpp b/clang-tools-extra/clangd/tool/ClangdMain.cpp --- a/clang-tools-extra/clangd/tool/ClangdMain.cpp +++ b/clang-tools-extra/clangd/tool/ClangdMain.cpp @@ -310,7 +310,7 @@ opt RecoveryAST{ "recovery-ast", cat(Features), - desc("Preserve expressions in AST for broken code (C++ only)."), + desc("Preserve expressions in AST for broken code."), init(ClangdServer::Options().BuildRecoveryAST), }; diff --git a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp --- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp +++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp @@ -111,8 +111,6 @@ MockFS FS; auto Inputs = TU.inputs(FS); - Inputs.Opts.BuildRecoveryAST = true; - Inputs.Opts.PreserveRecoveryASTType = true; IgnoreDiagnostics Diags; auto CI = buildCompilerInvocation(Inputs, Diags); if (!CI) { @@ -1100,8 +1098,6 @@ MockFS FS; auto Inputs = TU.inputs(FS); Inputs.Index = Index.get(); - Inputs.Opts.BuildRecoveryAST = true; - Inputs.Opts.PreserveRecoveryASTType = true; IgnoreDiagnostics Diags; auto CI = buildCompilerInvocation(Inputs, Diags); if (!CI) { diff --git a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp --- a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp +++ b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp @@ -148,6 +148,17 @@ EXPECT_DECLS("LabelStmt", "label:"); } +TEST_F(TargetDeclTest, RecoveryForC) { + Flags = {"-xc", "-Xclang", "-frecovery-ast"}; + Code = R"cpp( + // error-ok: testing behavior on broken code + // int f(); + int f(int); + int x = [[f]](); + )cpp"; + EXPECT_DECLS("DeclRefExpr", "int f(int)"); +} + TEST_F(TargetDeclTest, Recovery) { Code = R"cpp( // error-ok: testing behavior on broken code diff --git a/clang-tools-extra/clangd/unittests/TestTU.cpp b/clang-tools-extra/clangd/unittests/TestTU.cpp --- a/clang-tools-extra/clangd/unittests/TestTU.cpp +++ b/clang-tools-extra/clangd/unittests/TestTU.cpp @@ -59,8 +59,6 @@ FS.OverlayRealFileSystemForModules = true; Inputs.TFS = &FS; Inputs.Opts = ParseOptions(); - Inputs.Opts.BuildRecoveryAST = true; - Inputs.Opts.PreserveRecoveryASTType = true; Inputs.Opts.ClangTidyOpts.Checks = ClangTidyChecks; Inputs.Opts.ClangTidyOpts.WarningsAsErrors = ClangTidyWarningsAsErrors; Inputs.Index = ExternalIndex;