diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-01-30 22:05:38 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-01-30 22:05:38 +0000 |
| commit | 40f08ebece6064c8aa705eca9cc32cd0e1534006 (patch) | |
| tree | 81c741266759cd64155e3608eef8d0d95b073972 /clang/lib/Sema/SemaChecking.cpp | |
| parent | 0115b0879c617da4a222002fd7018417209457e5 (diff) | |
| download | bcm5719-llvm-40f08ebece6064c8aa705eca9cc32cd0e1534006.tar.gz bcm5719-llvm-40f08ebece6064c8aa705eca9cc32cd0e1534006.zip | |
Don't produce a 'returning reference to local' warning if a lambda returns a
reference (or pointer) to a variable from the closure object or from the
surrounding function scope.
llvm-svn: 200494
Diffstat (limited to 'clang/lib/Sema/SemaChecking.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index ee0e6702e0f..053ab2d620c 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -4136,6 +4136,10 @@ static Expr *EvalAddr(Expr *E, SmallVectorImpl<DeclRefExpr *> &refVars, case Stmt::DeclRefExprClass: { DeclRefExpr *DR = cast<DeclRefExpr>(E); + // If we leave the immediate function, the lifetime isn't about to end. + if (DR->refersToEnclosingLocal()) + return 0; + if (VarDecl *V = dyn_cast<VarDecl>(DR->getDecl())) // If this is a reference variable, follow through to the expression that // it points to. @@ -4292,6 +4296,10 @@ do { // local storage within the function, and if so, return the expression. DeclRefExpr *DR = cast<DeclRefExpr>(E); + // If we leave the immediate function, the lifetime isn't about to end. + if (DR->refersToEnclosingLocal()) + return 0; + if (VarDecl *V = dyn_cast<VarDecl>(DR->getDecl())) { // Check if it refers to itself, e.g. "int& i = i;". if (V == ParentDecl) |

