]> granicus.if.org Git - clang/commitdiff
Don't lifetime-extend or track lifetime problems through the LHS of '->*'.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 24 Jul 2018 21:18:30 +0000 (21:18 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 24 Jul 2018 21:18:30 +0000 (21:18 +0000)
Fixes a false-positive warning found by selfhost.

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

lib/AST/Expr.cpp
test/SemaCXX/return-stack-addr.cpp

index 3d11619ec424d67a2ff6ce0e5700cb91b5ac8de6..7e652b778b80cf7878ce0d800cbfab2f68b82877 100644 (file)
@@ -108,7 +108,7 @@ const Expr *Expr::skipRValueSubobjectAdjustments(
         }
       }
     } else if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
-      if (BO->isPtrMemOp()) {
+      if (BO->getOpcode() == BO_PtrMemD) {
         assert(BO->getRHS()->isRValue());
         E = BO->getLHS();
         const MemberPointerType *MPT =
index a5f84adf0b46c08dd49b00804782ac96e2150d57..08aaa749b4e34fc48dac1fd6756e009540848391 100644 (file)
@@ -157,3 +157,9 @@ void ret_from_lambda() {
   (void) [&]() -> int& { int &a = b; return a; };
   (void) [=]() mutable -> int& { int &a = b; return a; };
 }
+
+namespace mem_ptr {
+  struct X {};
+  int X::*f();
+  int &r(X *p) { return p->*f(); }
+}