diff options
author | Ted Kremenek <kremenek@apple.com> | 2010-09-02 01:12:13 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2010-09-02 01:12:13 +0000 |
commit | a423e81a4d04b7c1882d2787d1189cbc14540c16 (patch) | |
tree | f96dad066049f1ac8537bb8cb94a800b37bae947 /lib/Sema/SemaChecking.cpp | |
parent | 621a2f36af707747d70b8103bda6f65237fce899 (diff) |
Enhance return-stack-address check (in Sema) to handle fields that themselves are references. (Fixes PR 7999; fix by Chandler Carruth).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@112792 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaChecking.cpp')
-rw-r--r-- | lib/Sema/SemaChecking.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index caef9fb9ed..a0b4b988db 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -2029,10 +2029,15 @@ do { MemberExpr *M = cast<MemberExpr>(E); // Check for indirect access. We only want direct field accesses. - if (!M->isArrow()) - return EvalVal(M->getBase()); - else + if (M->isArrow()) + return NULL; + + // Check whether the member type is itself a reference, in which case + // we're not going to refer to the member, but to what the member refers to. + if (M->getMemberDecl()->getType()->isReferenceType()) return NULL; + + return EvalVal(M->getBase()); } // Everything else: we simply don't reason about them. |