nridge created this revision. nridge added reviewers: hokein, kadircet. Herald added a subscriber: arphaman. Herald added a project: All. nridge requested review of this revision. Herald added subscribers: cfe-commits, MaskRay, ilya-biryukov. Herald added a project: clang-tools-extra.
The previous behaviour is to try to parse such files, and in some cases assert or hang in components that don't expect these forms of input, like TokenBuffer. Fixes https://github.com/llvm/llvm-project/issues/62090 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D149236 Files: clang-tools-extra/clangd/ParsedAST.cpp clang-tools-extra/clangd/unittests/ParsedASTTests.cpp Index: clang-tools-extra/clangd/unittests/ParsedASTTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/ParsedASTTests.cpp +++ clang-tools-extra/clangd/unittests/ParsedASTTests.cpp @@ -16,6 +16,7 @@ #include "../../clang-tidy/ClangTidyModuleRegistry.h" #include "AST.h" #include "Annotations.h" +#include "CompileCommands.h" #include "Compiler.h" #include "Diagnostics.h" #include "Headers.h" @@ -846,6 +847,39 @@ pragmaTrivia(" End"))); } +TEST(ParsedASTTest, GracefulFailureOnAssemblyFile) { + std::string Filename = "TestTU.S"; + std::string Code = R"S( +main: + # test comment + bx lr + )S"; + + // The rest is a simplified version of TestTU::build(). + // Don't call TestTU::build() itself because it would assert on + // failure to build an AST. + MockFS FS; + std::string FullFilename = testPath(Filename); + FS.Files[FullFilename] = Code; + ParseInputs Inputs; + auto &Argv = Inputs.CompileCommand.CommandLine; + Argv = {"clang"}; + Argv.push_back(FullFilename); + auto Mangler = CommandMangler::forTests(); + Mangler(Inputs.CompileCommand, FullFilename); + Inputs.CompileCommand.Filename = FullFilename; + Inputs.CompileCommand.Directory = testRoot(); + Inputs.Contents = Code; + Inputs.TFS = &FS; + StoreDiags Diags; + auto CI = buildCompilerInvocation(Inputs, Diags); + assert(CI && "Failed to build compilation invocation."); + auto AST = ParsedAST::build(FullFilename, Inputs, std::move(CI), {}, nullptr); + + EXPECT_FALSE(AST.has_value()) + << "Should not try to build AST for assembly source file"; +} + } // namespace } // namespace clangd } // namespace clang Index: clang-tools-extra/clangd/ParsedAST.cpp =================================================================== --- clang-tools-extra/clangd/ParsedAST.cpp +++ clang-tools-extra/clangd/ParsedAST.cpp @@ -354,6 +354,15 @@ VFS = Preamble->StatCache->getConsumingFS(std::move(VFS)); assert(CI); + + if (CI->getFrontendOpts().Inputs.size() > 0) { + auto Lang = CI->getFrontendOpts().Inputs[0].getKind().getLanguage(); + if (Lang == Language::Asm || Lang == Language::LLVM_IR) { + elog("Clangd does not support assembly or IR source files"); + return std::nullopt; + } + } + // Command-line parsing sets DisableFree to true by default, but we don't want // to leak memory in clangd. CI->getFrontendOpts().DisableFree = false;
Index: clang-tools-extra/clangd/unittests/ParsedASTTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/ParsedASTTests.cpp +++ clang-tools-extra/clangd/unittests/ParsedASTTests.cpp @@ -16,6 +16,7 @@ #include "../../clang-tidy/ClangTidyModuleRegistry.h" #include "AST.h" #include "Annotations.h" +#include "CompileCommands.h" #include "Compiler.h" #include "Diagnostics.h" #include "Headers.h" @@ -846,6 +847,39 @@ pragmaTrivia(" End"))); } +TEST(ParsedASTTest, GracefulFailureOnAssemblyFile) { + std::string Filename = "TestTU.S"; + std::string Code = R"S( +main: + # test comment + bx lr + )S"; + + // The rest is a simplified version of TestTU::build(). + // Don't call TestTU::build() itself because it would assert on + // failure to build an AST. + MockFS FS; + std::string FullFilename = testPath(Filename); + FS.Files[FullFilename] = Code; + ParseInputs Inputs; + auto &Argv = Inputs.CompileCommand.CommandLine; + Argv = {"clang"}; + Argv.push_back(FullFilename); + auto Mangler = CommandMangler::forTests(); + Mangler(Inputs.CompileCommand, FullFilename); + Inputs.CompileCommand.Filename = FullFilename; + Inputs.CompileCommand.Directory = testRoot(); + Inputs.Contents = Code; + Inputs.TFS = &FS; + StoreDiags Diags; + auto CI = buildCompilerInvocation(Inputs, Diags); + assert(CI && "Failed to build compilation invocation."); + auto AST = ParsedAST::build(FullFilename, Inputs, std::move(CI), {}, nullptr); + + EXPECT_FALSE(AST.has_value()) + << "Should not try to build AST for assembly source file"; +} + } // namespace } // namespace clangd } // namespace clang Index: clang-tools-extra/clangd/ParsedAST.cpp =================================================================== --- clang-tools-extra/clangd/ParsedAST.cpp +++ clang-tools-extra/clangd/ParsedAST.cpp @@ -354,6 +354,15 @@ VFS = Preamble->StatCache->getConsumingFS(std::move(VFS)); assert(CI); + + if (CI->getFrontendOpts().Inputs.size() > 0) { + auto Lang = CI->getFrontendOpts().Inputs[0].getKind().getLanguage(); + if (Lang == Language::Asm || Lang == Language::LLVM_IR) { + elog("Clangd does not support assembly or IR source files"); + return std::nullopt; + } + } + // Command-line parsing sets DisableFree to true by default, but we don't want // to leak memory in clangd. CI->getFrontendOpts().DisableFree = false;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits