//===-- CompilerTests.cpp -------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "Compiler.h" #include "TestTU.h" #include "clang/Frontend/DependencyOutputOptions.h" #include "clang/Frontend/FrontendOptions.h" #include "clang/Lex/PreprocessorOptions.h" #include "gmock/gmock.h" #include "gtest/gtest.h" namespace clang { namespace clangd { namespace { using testing::IsEmpty; TEST(BuildCompilerInvocation, DropsPCH) { MockFS FS; IgnoreDiagnostics Diags; TestTU TU; TU.AdditionalFiles["test.h.pch"] = ""; TU.ExtraArgs = {"-include-pch", "test.h.pch"}; EXPECT_THAT(buildCompilerInvocation(TU.inputs(FS), Diags) ->getPreprocessorOpts() .ImplicitPCHInclude, IsEmpty()); // Transparent include translation TU.ExtraArgs = {"-include", "test.h"}; EXPECT_THAT(buildCompilerInvocation(TU.inputs(FS), Diags) ->getPreprocessorOpts() .ImplicitPCHInclude, IsEmpty()); // CL mode parsing. TU.AdditionalFiles["test.pch"] = ""; TU.ExtraArgs = {"--driver-mode=cl"}; TU.ExtraArgs.push_back("/Yutest.h"); EXPECT_THAT(buildCompilerInvocation(TU.inputs(FS), Diags) ->getPreprocessorOpts() .ImplicitPCHInclude, IsEmpty()); EXPECT_THAT(buildCompilerInvocation(TU.inputs(FS), Diags) ->getPreprocessorOpts() .PCHThroughHeader, IsEmpty()); } TEST(BuildCompilerInvocation, PragmaDebugCrash) { TestTU TU = TestTU::withCode("#pragma clang __debug parser_crash"); TU.build(); // no-crash } TEST(BuildCompilerInvocation, DropsShowIncludes) { MockFS FS; IgnoreDiagnostics Diags; TestTU TU; TU.ExtraArgs = {"-Xclang", "--show-includes"}; EXPECT_THAT(buildCompilerInvocation(TU.inputs(FS), Diags) ->getDependencyOutputOpts() .ShowIncludesDest, ShowIncludesDestination::None); TU.ExtraArgs = {"/showIncludes", "--driver-mode=cl"}; EXPECT_THAT(buildCompilerInvocation(TU.inputs(FS), Diags) ->getDependencyOutputOpts() .ShowIncludesDest, ShowIncludesDestination::None); TU.ExtraArgs = {"/showIncludes:user", "--driver-mode=cl"}; EXPECT_THAT(buildCompilerInvocation(TU.inputs(FS), Diags) ->getDependencyOutputOpts() .ShowIncludesDest, ShowIncludesDestination::None); } TEST(BuildCompilerInvocation, DropsPlugins) { MockFS FS; IgnoreDiagnostics Diags; TestTU TU; TU.ExtraArgs = {"-Xclang", "-load", "-Xclang", "plugins.so", "-Xclang", "-plugin", "-Xclang", "my_plugin", "-Xclang", "-plugin-arg-my_plugin", "-Xclang", "foo=bar", "-Xclang", "-add-plugin", "-Xclang", "my_plugin2"}; auto Opts = buildCompilerInvocation(TU.inputs(FS), Diags)->getFrontendOpts(); EXPECT_THAT(Opts.Plugins, IsEmpty()); EXPECT_THAT(Opts.PluginArgs, IsEmpty()); EXPECT_THAT(Opts.AddPluginActions, IsEmpty()); EXPECT_EQ(Opts.ProgramAction, frontend::ActionKind::ParseSyntaxOnly); EXPECT_TRUE(Opts.ActionName.empty()); } TEST(BuildCompilerInvocation, EmptyArgs) { MockFS FS; IgnoreDiagnostics Diags; TestTU TU; auto Inputs = TU.inputs(FS); Inputs.CompileCommand.CommandLine.clear(); // No crash. EXPECT_EQ(buildCompilerInvocation(Inputs, Diags), nullptr); } } // namespace } // namespace clangd } // namespace clang