kousikk created this revision. kousikk added a reviewer: arphaman. Herald added subscribers: cfe-commits, dexonsmith. Herald added a project: clang.
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. For example: #define foo(x) x+7 #define bar(a,b) \ #a \ foo(b) should result in "#a <https://reviews.llvm.org/tag/spam_1/> foo(b)", but actually results in "#afoo(b)" (which is invalid). Fixing it by keeping last but one space. I am confident that keeping the space is the right fix, although I'm not sure if I've done it in the right way :) Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D67635 Files: clang/lib/Lex/DependencyDirectivesSourceMinimizer.cpp clang/unittests/Lex/DependencyDirectivesSourceMinimizerTest.cpp Index: clang/unittests/Lex/DependencyDirectivesSourceMinimizerTest.cpp =================================================================== --- clang/unittests/Lex/DependencyDirectivesSourceMinimizerTest.cpp +++ clang/unittests/Lex/DependencyDirectivesSourceMinimizerTest.cpp @@ -157,19 +157,19 @@ 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 @@ " 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,19 @@ " 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<char, 128> 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 +225,7 @@ " 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 +238,7 @@ " 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) { Index: clang/lib/Lex/DependencyDirectivesSourceMinimizer.cpp =================================================================== --- clang/lib/Lex/DependencyDirectivesSourceMinimizer.cpp +++ clang/lib/Lex/DependencyDirectivesSourceMinimizer.cpp @@ -246,9 +246,12 @@ 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) {
Index: clang/unittests/Lex/DependencyDirectivesSourceMinimizerTest.cpp =================================================================== --- clang/unittests/Lex/DependencyDirectivesSourceMinimizerTest.cpp +++ clang/unittests/Lex/DependencyDirectivesSourceMinimizerTest.cpp @@ -157,19 +157,19 @@ 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 @@ " 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,19 @@ " 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<char, 128> 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 +225,7 @@ " 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 +238,7 @@ " 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) { Index: clang/lib/Lex/DependencyDirectivesSourceMinimizer.cpp =================================================================== --- clang/lib/Lex/DependencyDirectivesSourceMinimizer.cpp +++ clang/lib/Lex/DependencyDirectivesSourceMinimizer.cpp @@ -246,9 +246,12 @@ 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) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits