diff --git a/clang-tools-extra/clangd/ParsedAST.cpp b/clang-tools-extra/clangd/ParsedAST.cpp --- a/clang-tools-extra/clangd/ParsedAST.cpp +++ b/clang-tools-extra/clangd/ParsedAST.cpp @@ -256,6 +256,9 @@ // Recovery expression currently only works for C++. if (CI->getLangOpts()->CPlusPlus) CI->getLangOpts()->RecoveryAST = Opts.BuildRecoveryAST; + // This is on-by-default in windows to allow parsing SDK headers, but it + // breaks many features. Disable it for the main-file (not preamble). + CI->getLangOpts()->DelayedTemplateParsing = false; StoreDiags ASTDiags; std::string Content = std::string(Buffer->getBuffer()); diff --git a/clang-tools-extra/clangd/unittests/ParsedASTTests.cpp b/clang-tools-extra/clangd/unittests/ParsedASTTests.cpp --- a/clang-tools-extra/clangd/unittests/ParsedASTTests.cpp +++ b/clang-tools-extra/clangd/unittests/ParsedASTTests.cpp @@ -175,6 +175,17 @@ AllOf(DeclNamed("foo"), WithTemplateArgs(""))})); } +TEST(ParsedASTTest, IgnoresDelayedTemplateParsing) { + auto TU = TestTU::withCode(R"cpp( + template void xxx() { + int yyy = 0; + } + )cpp"); + TU.ExtraArgs.push_back("-fdelayed-template-parsing"); + auto AST = TU.build(); + EXPECT_EQ(Decl::Var, findUnqualifiedDecl(AST, "yyy").getKind()); +} + TEST(ParsedASTTest, TokensAfterPreamble) { TestTU TU; TU.AdditionalFiles["foo.h"] = R"(