From 6fc00ecd33ec55917563f11a0f2e61388b0d0078 Mon Sep 17 00:00:00 2001 From: Alex Lorenz Date: Thu, 19 Sep 2019 22:39:24 +0000 Subject: Fix for stringized function-macro args continued across lines In case of certain #define'd macros, there's a space just before line continuation that the minimized-source lexer was missing to include, resulting in invalid stringize. Patch by: kousikk (Kousik Kumar) Differential Revision: https://reviews.llvm.org/D67635 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@372360 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Lex/DependencyDirectivesSourceMinimizer.cpp | 7 ++++-- .../DependencyDirectivesSourceMinimizerTest.cpp | 26 +++++++++++++++------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/lib/Lex/DependencyDirectivesSourceMinimizer.cpp b/lib/Lex/DependencyDirectivesSourceMinimizer.cpp index 0a0656699a..2a3c88251b 100644 --- a/lib/Lex/DependencyDirectivesSourceMinimizer.cpp +++ b/lib/Lex/DependencyDirectivesSourceMinimizer.cpp @@ -246,9 +246,12 @@ static void skipToNewlineRaw(const char *&First, const char *const End) { static const char *reverseOverSpaces(const char *First, const char *Last) { assert(First <= Last); - while (First != Last && isHorizontalWhitespace(Last[-1])) + const char *PrevLast = Last; + while (First != Last && isHorizontalWhitespace(Last[-1])) { + PrevLast = Last; --Last; - return Last; + } + return PrevLast; } static void skipLineComment(const char *&First, const char *const End) { diff --git a/unittests/Lex/DependencyDirectivesSourceMinimizerTest.cpp b/unittests/Lex/DependencyDirectivesSourceMinimizerTest.cpp index 530519573a..c00c160977 100644 --- a/unittests/Lex/DependencyDirectivesSourceMinimizerTest.cpp +++ b/unittests/Lex/DependencyDirectivesSourceMinimizerTest.cpp @@ -157,19 +157,19 @@ TEST(MinimizeSourceToDependencyDirectivesTest, DefineHorizontalWhitespace) { ASSERT_FALSE(minimizeSourceToDependencyDirectives( "#define MACRO(\t)\tcon \t tent\t", Out)); - EXPECT_STREQ("#define MACRO() con \t tent\n", Out.data()); + EXPECT_STREQ("#define MACRO() con \t tent\t\n", Out.data()); ASSERT_FALSE(minimizeSourceToDependencyDirectives( "#define MACRO(\f)\fcon \f tent\f", Out)); - EXPECT_STREQ("#define MACRO() con \f tent\n", Out.data()); + EXPECT_STREQ("#define MACRO() con \f tent\f\n", Out.data()); ASSERT_FALSE(minimizeSourceToDependencyDirectives( "#define MACRO(\v)\vcon \v tent\v", Out)); - EXPECT_STREQ("#define MACRO() con \v tent\n", Out.data()); + EXPECT_STREQ("#define MACRO() con \v tent\v\n", Out.data()); ASSERT_FALSE(minimizeSourceToDependencyDirectives( "#define MACRO \t\v\f\v\t con\f\t\vtent\v\f \v", Out)); - EXPECT_STREQ("#define MACRO con\f\t\vtent\n", Out.data()); + EXPECT_STREQ("#define MACRO con\f\t\vtent\v\n", Out.data()); } TEST(MinimizeSourceToDependencyDirectivesTest, DefineMultilineArgs) { @@ -187,7 +187,7 @@ TEST(MinimizeSourceToDependencyDirectivesTest, DefineMultilineArgs) { " call((a), \\\n" " (b))", Out)); - EXPECT_STREQ("#define MACRO(a,b) call((a),(b))\n", Out.data()); + EXPECT_STREQ("#define MACRO(a,b) call((a), (b))\n", Out.data()); } TEST(MinimizeSourceToDependencyDirectivesTest, @@ -200,7 +200,17 @@ TEST(MinimizeSourceToDependencyDirectivesTest, " call((a), \\\r" " (b))", Out)); - EXPECT_STREQ("#define MACRO(a,b) call((a),(b))\n", Out.data()); + EXPECT_STREQ("#define MACRO(a,b) call((a), (b))\n", Out.data()); +} + +TEST(MinimizeSourceToDependencyDirectivesTest, DefineMultilineArgsStringize) { + SmallVector Out; + + ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define MACRO(a,b) \\\n" + " #a \\\n" + " #b", + Out)); + EXPECT_STREQ("#define MACRO(a,b) #a #b\n", Out.data()); } TEST(MinimizeSourceToDependencyDirectivesTest, @@ -213,7 +223,7 @@ TEST(MinimizeSourceToDependencyDirectivesTest, " call((a), \\\r\n" " (b))", Out)); - EXPECT_STREQ("#define MACRO(a,b) call((a),(b))\n", Out.data()); + EXPECT_STREQ("#define MACRO(a,b) call((a), (b))\n", Out.data()); } TEST(MinimizeSourceToDependencyDirectivesTest, @@ -226,7 +236,7 @@ TEST(MinimizeSourceToDependencyDirectivesTest, " call((a), \\\n\r" " (b))", Out)); - EXPECT_STREQ("#define MACRO(a,b) call((a),(b))\n", Out.data()); + EXPECT_STREQ("#define MACRO(a,b) call((a), (b))\n", Out.data()); } TEST(MinimizeSourceToDependencyDirectivesTest, DefineNumber) { -- cgit v1.2.1