Skip to content

Commit

Permalink
[clang-scan-deps] Dependency directives source minimizer: handle #pra…
Browse files Browse the repository at this point in the history
…gma once

We should re-emit `#pragma once` to ensure the preprocessor will
still honor it when running on minimized sources.

Differential Revision: https://reviews.llvm.org/D64945

llvm-svn: 366509
  • Loading branch information
hyp committed Jul 18, 2019
1 parent db6cfe1 commit 4cd905b
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 1 deletion.
Expand Up @@ -38,6 +38,7 @@ enum TokenKind {
pp_undef,
pp_import,
pp_pragma_import,
pp_pragma_once,
pp_include_next,
pp_if,
pp_ifdef,
Expand Down
16 changes: 15 additions & 1 deletion clang/lib/Lex/DependencyDirectivesSourceMinimizer.cpp
Expand Up @@ -612,7 +612,21 @@ bool Minimizer::lexDefine(const char *&First, const char *const End) {

bool Minimizer::lexPragma(const char *&First, const char *const End) {
// #pragma.
if (!isNextIdentifier("clang", First, End)) {
skipWhitespace(First, End);
if (First == End || !isIdentifierHead(*First))
return false;

IdInfo FoundId = lexIdentifier(First, End);
First = FoundId.Last;
if (FoundId.Name == "once") {
// #pragma once
skipLine(First, End);
makeToken(pp_pragma_once);
append("#pragma once\n");
return false;
}

if (FoundId.Name != "clang") {
skipLine(First, End);
return false;
}
Expand Down
24 changes: 24 additions & 0 deletions clang/unittests/Lex/DependencyDirectivesSourceMinimizerTest.cpp
Expand Up @@ -544,4 +544,28 @@ int z = 128'78;
EXPECT_STREQ("#include <test.h>\n", Out.data());
}

TEST(MinimizeSourceToDependencyDirectivesTest, PragmaOnce) {
SmallVector<char, 128> Out;
SmallVector<Token, 4> Tokens;

StringRef Source = R"(// comment
#pragma once
// another comment
#include <test.h>
)";
ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out, Tokens));
EXPECT_STREQ("#pragma once\n#include <test.h>\n", Out.data());
ASSERT_EQ(Tokens.size(), 3u);
EXPECT_EQ(Tokens[0].K,
minimize_source_to_dependency_directives::pp_pragma_once);

Source = R"(// comment
#pragma once extra tokens
// another comment
#include <test.h>
)";
ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out));
EXPECT_STREQ("#pragma once\n#include <test.h>\n", Out.data());
}

} // end anonymous namespace

0 comments on commit 4cd905b

Please sign in to comment.