Author: Haojian Wu Date: 2020-03-16T16:51:10+01:00 New Revision: 8a593e29ab9b2799ded3d85a8110d51d4283f128
URL: https://github.com/llvm/llvm-project/commit/8a593e29ab9b2799ded3d85a8110d51d4283f128 DIFF: https://github.com/llvm/llvm-project/commit/8a593e29ab9b2799ded3d85a8110d51d4283f128.diff LOG: [AST] Correct the CXXOperatorCallExpr source range. Summary: Previously, the range for "->" CXXOperatorCallExpr is the range of the class object (not including the operator!), e.g. "[[vector_ptr]]->size()". This patch includes the range of the operator, which fixes the issue where clangd doesn't go to the overloaded operator "->" definition. Reviewers: sammccall Reviewed By: sammccall Subscribers: ilya-biryukov, jkorous, arphaman, kadircet, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D76128 Added: Modified: clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp clang-tools-extra/clangd/unittests/SelectionTests.cpp clang-tools-extra/clangd/unittests/XRefsTests.cpp clang/lib/AST/ExprCXX.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp b/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp index cbec56fbf7a5..fefa56ae5ef5 100644 --- a/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp @@ -649,9 +649,14 @@ StringRef LoopConvertCheck::getContainerString(ASTContext *Context, const ForStmt *Loop, const Expr *ContainerExpr) { StringRef ContainerString; - if (isa<CXXThisExpr>(ContainerExpr->IgnoreParenImpCasts())) { + ContainerExpr = ContainerExpr->IgnoreParenImpCasts(); + if (isa<CXXThisExpr>(ContainerExpr)) { ContainerString = "this"; } else { + // For CXXOperatorCallExpr (e.g. vector_ptr->size()), its first argument is + // the class object (vector_ptr) we are targeting. + if (const auto* E = dyn_cast<CXXOperatorCallExpr>(ContainerExpr)) + ContainerExpr = E->getArg(0); ContainerString = getStringFromRange(Context->getSourceManager(), Context->getLangOpts(), ContainerExpr->getSourceRange()); diff --git a/clang-tools-extra/clangd/unittests/SelectionTests.cpp b/clang-tools-extra/clangd/unittests/SelectionTests.cpp index 7316dea42bd2..e1c873a22b13 100644 --- a/clang-tools-extra/clangd/unittests/SelectionTests.cpp +++ b/clang-tools-extra/clangd/unittests/SelectionTests.cpp @@ -380,6 +380,14 @@ TEST(SelectionTest, CommonAncestor) { {"struct foo { [[^~foo()]]; };", "CXXDestructorDecl"}, // FIXME: The following to should be class itself instead. {"struct foo { [[fo^o(){}]] };", "CXXConstructorDecl"}, + + {R"cpp( + struct S1 { void f(); }; + struct S2 { S1 * operator->(); }; + void test(S2 s2) { + s2[[-^>]]f(); + } + )cpp", "DeclRefExpr"} // DeclRefExpr to the "operator->" method. }; for (const Case &C : Cases) { Annotations Test(C.Code); diff --git a/clang-tools-extra/clangd/unittests/XRefsTests.cpp b/clang-tools-extra/clangd/unittests/XRefsTests.cpp index d387fd219a08..1e687fd109e3 100644 --- a/clang-tools-extra/clangd/unittests/XRefsTests.cpp +++ b/clang-tools-extra/clangd/unittests/XRefsTests.cpp @@ -452,6 +452,14 @@ TEST(LocateSymbol, All) { } )cpp", + R"cpp( + struct S1 { void f(); }; + struct S2 { S1 * $decl[[operator]]->(); }; + void test(S2 s2) { + s2-^>f(); + } + )cpp", + R"cpp(// Declaration of explicit template specialization template <typename T> struct $decl[[Foo]] {}; diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp index 69db80f452aa..b507afd6551d 100644 --- a/clang/lib/AST/ExprCXX.cpp +++ b/clang/lib/AST/ExprCXX.cpp @@ -637,7 +637,7 @@ SourceRange CXXOperatorCallExpr::getSourceRangeImpl() const { // Postfix operator return SourceRange(getArg(0)->getBeginLoc(), getOperatorLoc()); } else if (Kind == OO_Arrow) { - return getArg(0)->getSourceRange(); + return SourceRange(getArg(0)->getBeginLoc(), getOperatorLoc()); } else if (Kind == OO_Call) { return SourceRange(getArg(0)->getBeginLoc(), getRParenLoc()); } else if (Kind == OO_Subscript) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits