summaryrefslogtreecommitdiffstats
path: root/clang/unittests/Lex
diff options
context:
space:
mode:
authorAlex Lorenz <arphaman@gmail.com>2019-10-08 22:42:44 +0000
committerAlex Lorenz <arphaman@gmail.com>2019-10-08 22:42:44 +0000
commita13f0da1d0bc32e5adfc62c0ba0d92b39192256c (patch)
treea839635a9657e07bf352c610987843f972f2df35 /clang/unittests/Lex
parent143f6b837790dd695c140c0cc6c5164ec54e0c0e (diff)
downloadbcm5719-llvm-a13f0da1d0bc32e5adfc62c0ba0d92b39192256c.tar.gz
bcm5719-llvm-a13f0da1d0bc32e5adfc62c0ba0d92b39192256c.zip
[clang-scan-deps] Improve string/character literal skipping
The existing string/character literal skipping code in the dependency directives source minimizer has two issues: - It doesn't stop the scanning when a newline is reached before the terminating character, unlike the lexer which considers the token to be done (even if it's invalid) at the end of the line. - It doesn't support whitespace between '\' and the newline when looking if the '\' is used as a line continuation character. This commit fixes both issues. Differential Revision: https://reviews.llvm.org/D68436 llvm-svn: 374127
Diffstat (limited to 'clang/unittests/Lex')
-rw-r--r--clang/unittests/Lex/DependencyDirectivesSourceMinimizerTest.cpp44
1 files changed, 44 insertions, 0 deletions
diff --git a/clang/unittests/Lex/DependencyDirectivesSourceMinimizerTest.cpp b/clang/unittests/Lex/DependencyDirectivesSourceMinimizerTest.cpp
index 5eb7d256a36..ed44cd86b3e 100644
--- a/clang/unittests/Lex/DependencyDirectivesSourceMinimizerTest.cpp
+++ b/clang/unittests/Lex/DependencyDirectivesSourceMinimizerTest.cpp
@@ -594,6 +594,50 @@ TEST(MinimizeSourceToDependencyDirectivesTest, PragmaOnce) {
EXPECT_STREQ("#pragma once\n#include <test.h>\n", Out.data());
}
+TEST(MinimizeSourceToDependencyDirectivesTest,
+ SkipLineStringCharLiteralsUntilNewline) {
+ SmallVector<char, 128> Out;
+
+ StringRef Source = R"(#if NEVER_ENABLED
+ #define why(fmt, ...) #error don't try me
+ #endif
+
+ void foo();
+)";
+ ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out));
+ EXPECT_STREQ(
+ "#if NEVER_ENABLED\n#define why(fmt,...) #error don't try me\n#endif\n",
+ Out.data());
+
+ Source = R"(#if NEVER_ENABLED
+ #define why(fmt, ...) "quote dropped
+ #endif
+
+ void foo();
+ )";
+ ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out));
+ EXPECT_STREQ(
+ "#if NEVER_ENABLED\n#define why(fmt,...) \"quote dropped\n#endif\n",
+ Out.data());
+}
+
+TEST(MinimizeSourceToDependencyDirectivesTest,
+ SupportWhitespaceBeforeLineContinuationInStringSkipping) {
+ SmallVector<char, 128> Out;
+
+ StringRef Source = "#define X '\\ \t\nx'\nvoid foo() {}";
+ ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out));
+ EXPECT_STREQ("#define X '\\ \t\nx'\n", Out.data());
+
+ Source = "#define X \"\\ \r\nx\"\nvoid foo() {}";
+ ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out));
+ EXPECT_STREQ("#define X \"\\ \r\nx\"\n", Out.data());
+
+ Source = "#define X \"\\ \r\nx\n#include <x>\n";
+ ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out));
+ EXPECT_STREQ("#define X \"\\ \r\nx\n#include <x>\n", Out.data());
+}
+
TEST(MinimizeSourceToDependencyDirectivesTest, CxxModules) {
SmallVector<char, 128> Out;
SmallVector<Token, 4> Tokens;
OpenPOWER on IntegriCloud