kadircet created this revision. kadircet added a reviewer: hokein. Herald added a project: clang. Herald added a subscriber: cfe-commits. kadircet requested review of this revision.
This was resulting in inserting headers at bogus locations, see https://github.com/ycm-core/YouCompleteMe/issues/3736 for an example. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D85590 Files: clang/lib/Tooling/Inclusions/HeaderIncludes.cpp clang/unittests/Tooling/HeaderIncludesTest.cpp Index: clang/unittests/Tooling/HeaderIncludesTest.cpp =================================================================== --- clang/unittests/Tooling/HeaderIncludesTest.cpp +++ clang/unittests/Tooling/HeaderIncludesTest.cpp @@ -529,6 +529,18 @@ EXPECT_EQ(Expected, remove(Code, "\"b.h\"")); } +TEST_F(HeaderIncludesTest, FakeHeaderGuardIfnDef) { + std::string Code = "#ifndef A_H\n" + "#define A_H 1\n" + "#endif"; + std::string Expected = "#include \"b.h\"\n" + "#ifndef A_H\n" + "#define A_H 1\n" + "#endif"; + + EXPECT_EQ(Expected, insert(Code, "\"b.h\"")); +} + } // namespace } // namespace tooling } // namespace clang Index: clang/lib/Tooling/Inclusions/HeaderIncludes.cpp =================================================================== --- clang/lib/Tooling/Inclusions/HeaderIncludes.cpp +++ clang/lib/Tooling/Inclusions/HeaderIncludes.cpp @@ -100,7 +100,8 @@ [](const SourceManager &SM, Lexer &Lex, Token Tok) -> unsigned { if (checkAndConsumeDirectiveWithName(Lex, "ifndef", Tok)) { skipComments(Lex, Tok); - if (checkAndConsumeDirectiveWithName(Lex, "define", Tok)) + if (checkAndConsumeDirectiveWithName(Lex, "define", Tok) && + Tok.isAtStartOfLine()) return SM.getFileOffset(Tok.getLocation()); } return 0;
Index: clang/unittests/Tooling/HeaderIncludesTest.cpp =================================================================== --- clang/unittests/Tooling/HeaderIncludesTest.cpp +++ clang/unittests/Tooling/HeaderIncludesTest.cpp @@ -529,6 +529,18 @@ EXPECT_EQ(Expected, remove(Code, "\"b.h\"")); } +TEST_F(HeaderIncludesTest, FakeHeaderGuardIfnDef) { + std::string Code = "#ifndef A_H\n" + "#define A_H 1\n" + "#endif"; + std::string Expected = "#include \"b.h\"\n" + "#ifndef A_H\n" + "#define A_H 1\n" + "#endif"; + + EXPECT_EQ(Expected, insert(Code, "\"b.h\"")); +} + } // namespace } // namespace tooling } // namespace clang Index: clang/lib/Tooling/Inclusions/HeaderIncludes.cpp =================================================================== --- clang/lib/Tooling/Inclusions/HeaderIncludes.cpp +++ clang/lib/Tooling/Inclusions/HeaderIncludes.cpp @@ -100,7 +100,8 @@ [](const SourceManager &SM, Lexer &Lex, Token Tok) -> unsigned { if (checkAndConsumeDirectiveWithName(Lex, "ifndef", Tok)) { skipComments(Lex, Tok); - if (checkAndConsumeDirectiveWithName(Lex, "define", Tok)) + if (checkAndConsumeDirectiveWithName(Lex, "define", Tok) && + Tok.isAtStartOfLine()) return SM.getFileOffset(Tok.getLocation()); } return 0;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits