aboutsummaryrefslogtreecommitdiff
path: root/Sema/SemaChecking.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2007-08-27 16:39:17 +0000
committerTed Kremenek <kremenek@apple.com>2007-08-27 16:39:17 +0000
commit96eabe0838ccd1d5a5d24a648b932763cdf3fa31 (patch)
tree310920ccf5d607c28ba7e933869d0df34eeae5a5 /Sema/SemaChecking.cpp
parent9cff1a9ac25f2b1386d3157e8daa0b219573d6a6 (diff)
Updated checker for "return of address of stack variable" to look for
implicit casts from T to T& at the topmost part of the return-value expression. This checking may be needed within EvalAddr later on. We'll wait until test cases show this kind of logic is necessary (as more C++ features are implemented in clang). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41493 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'Sema/SemaChecking.cpp')
-rw-r--r--Sema/SemaChecking.cpp10
1 files changed, 6 insertions, 4 deletions
diff --git a/Sema/SemaChecking.cpp b/Sema/SemaChecking.cpp
index e03507b796..c027fa794c 100644
--- a/Sema/SemaChecking.cpp
+++ b/Sema/SemaChecking.cpp
@@ -410,10 +410,12 @@ Sema::CheckReturnStackAddr(Expr *RetValExp, QualType lhsType,
}
// Perform checking for stack values returned by reference.
else if (lhsType->isReferenceType()) {
- if (DeclRefExpr *DR = EvalVal(RetValExp))
- Diag(DR->getLocStart(), diag::warn_ret_stack_ref,
- DR->getDecl()->getIdentifier()->getName(),
- RetValExp->getSourceRange());
+ // Check for an implicit cast to a reference.
+ if (ImplicitCastExpr *I = dyn_cast<ImplicitCastExpr>(RetValExp))
+ if (DeclRefExpr *DR = EvalVal(I->getSubExpr()))
+ Diag(DR->getLocStart(), diag::warn_ret_stack_ref,
+ DR->getDecl()->getIdentifier()->getName(),
+ RetValExp->getSourceRange());
}
}