summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang-tools-extra/clang-tidy/modernize/LoopConvertUtils.cpp5
-rw-r--r--clang-tools-extra/test/clang-tidy/modernize-loop-convert-basic.cpp11
2 files changed, 15 insertions, 1 deletions
diff --git a/clang-tools-extra/clang-tidy/modernize/LoopConvertUtils.cpp b/clang-tools-extra/clang-tidy/modernize/LoopConvertUtils.cpp
index 732d40bd604..f2e0f552180 100644
--- a/clang-tools-extra/clang-tidy/modernize/LoopConvertUtils.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/LoopConvertUtils.cpp
@@ -370,7 +370,10 @@ static bool isAliasDecl(const Decl *TheDecl, const VarDecl *IndexVar) {
case Stmt::CXXMemberCallExprClass: {
const auto *MemCall = cast<CXXMemberCallExpr>(Init);
- if (MemCall->getMethodDecl()->getName() == "at") {
+ // This check is needed because getMethodDecl can return nullptr if the
+ // callee is a member function pointer.
+ if (MemCall->getMethodDecl() &&
+ MemCall->getMethodDecl()->getName() == "at") {
assert(MemCall->getNumArgs() == 1);
return isIndexInSubscriptExpr(MemCall->getArg(0), IndexVar);
}
diff --git a/clang-tools-extra/test/clang-tidy/modernize-loop-convert-basic.cpp b/clang-tools-extra/test/clang-tidy/modernize-loop-convert-basic.cpp
index 9d3b211bd77..7f31a5f4ca4 100644
--- a/clang-tools-extra/test/clang-tidy/modernize-loop-convert-basic.cpp
+++ b/clang-tools-extra/test/clang-tidy/modernize-loop-convert-basic.cpp
@@ -156,6 +156,17 @@ void memberFunctionPointer() {
// CHECK-MESSAGES: :[[@LINE-2]]:3: warning: use range-based for loop instead
// CHECK-FIXES: for (auto & elem : mfpArr)
// CHECK-FIXES-NEXT: (v.*elem)();
+
+ struct Foo {
+ int (Val::*f)();
+ } foo[N];
+
+ for (int i = 0; i < N; ++i)
+ int r = (v.*(foo[i].f))();
+ // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: use range-based for loop instead
+ // CHECK-FIXES: for (auto & elem : foo)
+ // CHECK-FIXES-NEXT: int r = (v.*(elem.f))();
+
}
} // namespace Array
OpenPOWER on IntegriCloud