135d867a7SKadir Cetinkaya //===-- CompilerTests.cpp -------------------------------------------------===//
235d867a7SKadir Cetinkaya //
335d867a7SKadir Cetinkaya // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
435d867a7SKadir Cetinkaya // See https://llvm.org/LICENSE.txt for license information.
535d867a7SKadir Cetinkaya // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
635d867a7SKadir Cetinkaya //
735d867a7SKadir Cetinkaya //===----------------------------------------------------------------------===//
835d867a7SKadir Cetinkaya
935d867a7SKadir Cetinkaya #include "Compiler.h"
1035d867a7SKadir Cetinkaya #include "TestTU.h"
110a3c7960SKadir Cetinkaya #include "clang/Frontend/DependencyOutputOptions.h"
120a3c7960SKadir Cetinkaya #include "clang/Frontend/FrontendOptions.h"
1335d867a7SKadir Cetinkaya #include "clang/Lex/PreprocessorOptions.h"
1435d867a7SKadir Cetinkaya #include "gmock/gmock.h"
1535d867a7SKadir Cetinkaya #include "gtest/gtest.h"
1635d867a7SKadir Cetinkaya
1735d867a7SKadir Cetinkaya namespace clang {
1835d867a7SKadir Cetinkaya namespace clangd {
1935d867a7SKadir Cetinkaya namespace {
2035d867a7SKadir Cetinkaya
2135d867a7SKadir Cetinkaya using testing::IsEmpty;
2235d867a7SKadir Cetinkaya
TEST(BuildCompilerInvocation,DropsPCH)2335d867a7SKadir Cetinkaya TEST(BuildCompilerInvocation, DropsPCH) {
240628705eSKadir Cetinkaya MockFS FS;
2535d867a7SKadir Cetinkaya IgnoreDiagnostics Diags;
2635d867a7SKadir Cetinkaya TestTU TU;
2735d867a7SKadir Cetinkaya TU.AdditionalFiles["test.h.pch"] = "";
2835d867a7SKadir Cetinkaya
2935d867a7SKadir Cetinkaya TU.ExtraArgs = {"-include-pch", "test.h.pch"};
30f693ce4aSKadir Cetinkaya EXPECT_THAT(buildCompilerInvocation(TU.inputs(FS), Diags)
3135d867a7SKadir Cetinkaya ->getPreprocessorOpts()
3235d867a7SKadir Cetinkaya .ImplicitPCHInclude,
3335d867a7SKadir Cetinkaya IsEmpty());
3435d867a7SKadir Cetinkaya
3535d867a7SKadir Cetinkaya // Transparent include translation
3635d867a7SKadir Cetinkaya TU.ExtraArgs = {"-include", "test.h"};
37f693ce4aSKadir Cetinkaya EXPECT_THAT(buildCompilerInvocation(TU.inputs(FS), Diags)
3835d867a7SKadir Cetinkaya ->getPreprocessorOpts()
3935d867a7SKadir Cetinkaya .ImplicitPCHInclude,
4035d867a7SKadir Cetinkaya IsEmpty());
4135d867a7SKadir Cetinkaya
4235d867a7SKadir Cetinkaya // CL mode parsing.
4335d867a7SKadir Cetinkaya TU.AdditionalFiles["test.pch"] = "";
4435d867a7SKadir Cetinkaya TU.ExtraArgs = {"--driver-mode=cl"};
4535d867a7SKadir Cetinkaya TU.ExtraArgs.push_back("/Yutest.h");
46f693ce4aSKadir Cetinkaya EXPECT_THAT(buildCompilerInvocation(TU.inputs(FS), Diags)
4735d867a7SKadir Cetinkaya ->getPreprocessorOpts()
4835d867a7SKadir Cetinkaya .ImplicitPCHInclude,
4935d867a7SKadir Cetinkaya IsEmpty());
50f693ce4aSKadir Cetinkaya EXPECT_THAT(buildCompilerInvocation(TU.inputs(FS), Diags)
5135d867a7SKadir Cetinkaya ->getPreprocessorOpts()
5235d867a7SKadir Cetinkaya .PCHThroughHeader,
5335d867a7SKadir Cetinkaya IsEmpty());
5435d867a7SKadir Cetinkaya }
5535d867a7SKadir Cetinkaya
TEST(BuildCompilerInvocation,PragmaDebugCrash)5644573982SAleksandr Platonov TEST(BuildCompilerInvocation, PragmaDebugCrash) {
5744573982SAleksandr Platonov TestTU TU = TestTU::withCode("#pragma clang __debug parser_crash");
5844573982SAleksandr Platonov TU.build(); // no-crash
5944573982SAleksandr Platonov }
6044573982SAleksandr Platonov
TEST(BuildCompilerInvocation,DropsShowIncludes)610a3c7960SKadir Cetinkaya TEST(BuildCompilerInvocation, DropsShowIncludes) {
620a3c7960SKadir Cetinkaya MockFS FS;
630a3c7960SKadir Cetinkaya IgnoreDiagnostics Diags;
640a3c7960SKadir Cetinkaya TestTU TU;
650a3c7960SKadir Cetinkaya
660a3c7960SKadir Cetinkaya TU.ExtraArgs = {"-Xclang", "--show-includes"};
670a3c7960SKadir Cetinkaya EXPECT_THAT(buildCompilerInvocation(TU.inputs(FS), Diags)
680a3c7960SKadir Cetinkaya ->getDependencyOutputOpts()
690a3c7960SKadir Cetinkaya .ShowIncludesDest,
700a3c7960SKadir Cetinkaya ShowIncludesDestination::None);
710a3c7960SKadir Cetinkaya
720a3c7960SKadir Cetinkaya TU.ExtraArgs = {"/showIncludes", "--driver-mode=cl"};
730a3c7960SKadir Cetinkaya EXPECT_THAT(buildCompilerInvocation(TU.inputs(FS), Diags)
740a3c7960SKadir Cetinkaya ->getDependencyOutputOpts()
750a3c7960SKadir Cetinkaya .ShowIncludesDest,
760a3c7960SKadir Cetinkaya ShowIncludesDestination::None);
770a3c7960SKadir Cetinkaya
780a3c7960SKadir Cetinkaya TU.ExtraArgs = {"/showIncludes:user", "--driver-mode=cl"};
790a3c7960SKadir Cetinkaya EXPECT_THAT(buildCompilerInvocation(TU.inputs(FS), Diags)
800a3c7960SKadir Cetinkaya ->getDependencyOutputOpts()
810a3c7960SKadir Cetinkaya .ShowIncludesDest,
820a3c7960SKadir Cetinkaya ShowIncludesDestination::None);
830a3c7960SKadir Cetinkaya }
840a3c7960SKadir Cetinkaya
TEST(BuildCompilerInvocation,DropsPlugins)850a3c7960SKadir Cetinkaya TEST(BuildCompilerInvocation, DropsPlugins) {
860a3c7960SKadir Cetinkaya MockFS FS;
870a3c7960SKadir Cetinkaya IgnoreDiagnostics Diags;
880a3c7960SKadir Cetinkaya TestTU TU;
890a3c7960SKadir Cetinkaya
900a3c7960SKadir Cetinkaya TU.ExtraArgs = {"-Xclang", "-load",
910a3c7960SKadir Cetinkaya "-Xclang", "plugins.so",
920a3c7960SKadir Cetinkaya "-Xclang", "-plugin",
930a3c7960SKadir Cetinkaya "-Xclang", "my_plugin",
940a3c7960SKadir Cetinkaya "-Xclang", "-plugin-arg-my_plugin",
950a3c7960SKadir Cetinkaya "-Xclang", "foo=bar",
960a3c7960SKadir Cetinkaya "-Xclang", "-add-plugin",
970a3c7960SKadir Cetinkaya "-Xclang", "my_plugin2"};
980a3c7960SKadir Cetinkaya auto Opts = buildCompilerInvocation(TU.inputs(FS), Diags)->getFrontendOpts();
990a3c7960SKadir Cetinkaya EXPECT_THAT(Opts.Plugins, IsEmpty());
1000a3c7960SKadir Cetinkaya EXPECT_THAT(Opts.PluginArgs, IsEmpty());
1010a3c7960SKadir Cetinkaya EXPECT_THAT(Opts.AddPluginActions, IsEmpty());
1020a3c7960SKadir Cetinkaya EXPECT_EQ(Opts.ProgramAction, frontend::ActionKind::ParseSyntaxOnly);
1030a3c7960SKadir Cetinkaya EXPECT_TRUE(Opts.ActionName.empty());
1040a3c7960SKadir Cetinkaya }
105*444a5f30SKadir Cetinkaya
TEST(BuildCompilerInvocation,EmptyArgs)106*444a5f30SKadir Cetinkaya TEST(BuildCompilerInvocation, EmptyArgs) {
107*444a5f30SKadir Cetinkaya MockFS FS;
108*444a5f30SKadir Cetinkaya IgnoreDiagnostics Diags;
109*444a5f30SKadir Cetinkaya TestTU TU;
110*444a5f30SKadir Cetinkaya auto Inputs = TU.inputs(FS);
111*444a5f30SKadir Cetinkaya Inputs.CompileCommand.CommandLine.clear();
112*444a5f30SKadir Cetinkaya
113*444a5f30SKadir Cetinkaya // No crash.
114*444a5f30SKadir Cetinkaya EXPECT_EQ(buildCompilerInvocation(Inputs, Diags), nullptr);
115*444a5f30SKadir Cetinkaya }
11635d867a7SKadir Cetinkaya } // namespace
11735d867a7SKadir Cetinkaya } // namespace clangd
11835d867a7SKadir Cetinkaya } // namespace clang
119