diff --git a/clang-tools-extra/clangd/CodeComplete.cpp b/clang-tools-extra/clangd/CodeComplete.cpp --- a/clang-tools-extra/clangd/CodeComplete.cpp +++ b/clang-tools-extra/clangd/CodeComplete.cpp @@ -1072,6 +1072,10 @@ FrontendOpts.SkipFunctionBodies = true; // Disable typo correction in Sema. CI->getLangOpts()->SpellChecking = false; + // Code completion won't trigger in delayed template bodies. + // This is on-by-default in windows to allow parsing SDK headers; we're only + // disabling it for the main-file (not preamble). + CI->getLangOpts()->DelayedTemplateParsing = false; // Setup code completion. FrontendOpts.CodeCompleteOpts = Options; FrontendOpts.CodeCompletionAt.FileName = std::string(Input.FileName); 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 @@ -127,7 +127,6 @@ Annotations Test(Text); auto TU = TestTU::withCode(Test.code()); // To make sure our tests for completiopns inside templates work on Windows. - TU.ExtraArgs = {"-fno-delayed-template-parsing"}; TU.Filename = FilePath.str(); return completions(TU, Test.point(), std::move(IndexSymbols), std::move(Opts)); @@ -2660,6 +2659,20 @@ EXPECT_THAT(Signatures, Contains(Sig("x() -> auto"))); } +TEST(CompletionTest, DelayedTemplateParsing) { + Annotations Test(R"cpp( + int xxx; + template int foo() { return xx^; } + )cpp"); + auto TU = TestTU::withCode(Test.code()); + // Even though delayed-template-parsing is on, we will disable it to provide + // completion in templates. + TU.ExtraArgs.push_back("-fdelayed-template-parsing"); + + EXPECT_THAT(completions(TU, Test.point()).Completions, + Contains(Named("xxx"))); +} + TEST(CompletionTest, CompletionRange) { const char *WithRange = "auto x = [[abc]]^"; auto Completions = completions(WithRange);