[PATCH] D76128: [AST] Correct the CXXOperatorCallExpr source range.
Haojian Wu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 16 09:15:29 PDT 2020
This revision was automatically updated to reflect the committed changes.
Closed by commit rG8a593e29ab9b: [AST] Correct the CXXOperatorCallExpr source range. (authored by hokein).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D76128/new/
https://reviews.llvm.org/D76128
Files:
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
Index: clang/lib/AST/ExprCXX.cpp
===================================================================
--- clang/lib/AST/ExprCXX.cpp
+++ clang/lib/AST/ExprCXX.cpp
@@ -637,7 +637,7 @@
// 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) {
Index: clang-tools-extra/clangd/unittests/XRefsTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/XRefsTests.cpp
+++ clang-tools-extra/clangd/unittests/XRefsTests.cpp
@@ -452,6 +452,14 @@
}
)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]] {};
Index: clang-tools-extra/clangd/unittests/SelectionTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/SelectionTests.cpp
+++ clang-tools-extra/clangd/unittests/SelectionTests.cpp
@@ -380,6 +380,14 @@
{"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);
Index: clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp
+++ clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp
@@ -649,9 +649,14 @@
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());
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D76128.250581.patch
Type: text/x-patch
Size: 2981 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200316/1fe544b6/attachment-0001.bin>
More information about the cfe-commits
mailing list