From a3fd11621951a8b1bf6a2ee2897228bcf05f1f51 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Tue, 24 Jul 2018 21:18:30 +0000 Subject: [PATCH] Don't lifetime-extend or track lifetime problems through the LHS of '->*'. Fixes a false-positive warning found by selfhost. llvm-svn: 337857 --- clang/lib/AST/Expr.cpp | 2 +- clang/test/SemaCXX/return-stack-addr.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 3d11619..7e652b7 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -108,7 +108,7 @@ const Expr *Expr::skipRValueSubobjectAdjustments( } } } else if (const BinaryOperator *BO = dyn_cast(E)) { - if (BO->isPtrMemOp()) { + if (BO->getOpcode() == BO_PtrMemD) { assert(BO->getRHS()->isRValue()); E = BO->getLHS(); const MemberPointerType *MPT = diff --git a/clang/test/SemaCXX/return-stack-addr.cpp b/clang/test/SemaCXX/return-stack-addr.cpp index a5f84ad..08aaa74 100644 --- a/clang/test/SemaCXX/return-stack-addr.cpp +++ b/clang/test/SemaCXX/return-stack-addr.cpp @@ -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(); } +} -- 2.7.4