From 2467539800aa1d896b5214fcc29597d7aee2f126 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Mon, 14 Nov 2016 14:46:48 +0000 Subject: [PATCH] [clang-move] Fix an incorrect range for the functions whose returned value is a macro Summary: Fix an incorrect range for the functions whose returned value is a macro (e.g. `bool`). This incorrect range can lead to modifications of an unexpected file where the macro is in. We should use expansion location instead of spelling location. Reviewers: ioeric Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D26609 llvm-svn: 286833 --- clang-tools-extra/clang-move/ClangMove.cpp | 4 ++-- .../unittests/clang-move/ClangMoveTests.cpp | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/clang-tools-extra/clang-move/ClangMove.cpp b/clang-tools-extra/clang-move/ClangMove.cpp index 59c5fda..9b5bd03 100644 --- a/clang-tools-extra/clang-move/ClangMove.cpp +++ b/clang-tools-extra/clang-move/ClangMove.cpp @@ -227,8 +227,8 @@ getLocForEndOfDecl(const clang::Decl *D, const SourceManager *SM, clang::CharSourceRange GetFullRange(const clang::SourceManager *SM, const clang::Decl *D, const clang::LangOptions &options = clang::LangOptions()) { - clang::SourceRange Full = D->getSourceRange(); - Full.setEnd(getLocForEndOfDecl(D, SM)); + clang::SourceRange Full(SM->getExpansionLoc(D->getLocStart()), + getLocForEndOfDecl(D, SM)); // Expand to comments that are associated with the Decl. if (const auto *Comment = D->getASTContext().getRawCommentForDeclNoCache(D)) { if (SM->isBeforeInTranslationUnit(Full.getEnd(), Comment->getLocEnd())) diff --git a/clang-tools-extra/unittests/clang-move/ClangMoveTests.cpp b/clang-tools-extra/unittests/clang-move/ClangMoveTests.cpp index fa055b7..1cf8fb7 100644 --- a/clang-tools-extra/unittests/clang-move/ClangMoveTests.cpp +++ b/clang-tools-extra/unittests/clang-move/ClangMoveTests.cpp @@ -337,6 +337,24 @@ TEST(ClangMove, DontMoveAll) { } } +TEST(ClangMove, MacroInFunction) { + const char TestHeader[] = "#define INT int\n" + "class A {\npublic:\n int f();\n};\n" + "class B {};\n"; + const char TestCode[] = "#include \"foo.h\"\n" + "INT A::f() { return 0; }\n"; + const char ExpectedNewCode[] = "#include \"new_foo.h\"\n\n" + "INT A::f() { return 0; }\n"; + move::ClangMoveTool::MoveDefinitionSpec Spec; + Spec.Names.push_back("A"); + Spec.OldHeader = "foo.h"; + Spec.OldCC = "foo.cc"; + Spec.NewHeader = "new_foo.h"; + Spec.NewCC = "new_foo.cc"; + auto Results = runClangMoveOnCode(Spec, TestHeader, TestCode); + EXPECT_EQ(ExpectedNewCode, Results[Spec.NewCC]); +} + } // namespace } // namespce move } // namespace clang -- 2.7.4