]> granicus.if.org Git - clang/commitdiff
Enhance getImplicitObjectArgument to look through ->*.
authorJordan Rose <jordan_rose@apple.com>
Fri, 3 Aug 2012 23:08:39 +0000 (23:08 +0000)
committerJordan Rose <jordan_rose@apple.com>
Fri, 3 Aug 2012 23:08:39 +0000 (23:08 +0000)
This only applies in the case where ->* is not overloaded, since it
specifically looks for BinaryOperator and not CXXOperatorCallExpr.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@161275 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ExprCXX.cpp
test/Analysis/misc-ps-cxx0x.cpp

index fc52649b9c1b24be86304c8c1f3b329e7f6b71e6..3d52e4a51149d5ba057d5eb05988beef4930bcb1 100644 (file)
@@ -434,9 +434,12 @@ SourceRange CXXOperatorCallExpr::getSourceRangeImpl() const {
 }
 
 Expr *CXXMemberCallExpr::getImplicitObjectArgument() const {
-  if (const MemberExpr *MemExpr = 
-        dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
+  const Expr *Callee = getCallee()->IgnoreParens();
+  if (const MemberExpr *MemExpr = dyn_cast<MemberExpr>(Callee))
     return MemExpr->getBase();
+  if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(Callee))
+    if (BO->getOpcode() == BO_PtrMemD || BO->getOpcode() == BO_PtrMemI)
+      return BO->getLHS();
 
   // FIXME: Will eventually need to cope with member pointers.
   return 0;
index e1c78ed072361f0d7d162f92c17b7778c11b8bac..8e31c8db8c9c5ab92a2844960c91e73d15cf9569 100644 (file)
@@ -109,3 +109,10 @@ void test_ic_null(TestInstanceCall *p) {
     p->foo(); // expected-warning {{Called C++ object pointer is null}}
 }
 
+void test_ic_member_ptr() {
+  TestInstanceCall *p = 0;
+  typedef void (TestInstanceCall::*IC_Ptr)();
+  IC_Ptr bar = &TestInstanceCall::foo;
+  (p->*bar)(); // expected-warning {{Called C++ object pointer is null}}
+}
+