summaryrefslogtreecommitdiffstats
path: root/clang/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
commitd11e4608105b5cdd00d3e0f0cd83cd1765bab7f3 (patch)
tree685a5d5fb625c4840a884f78724e054fb2386bd0 /clang/Sema/SemaChecking.cpp
parent23bf38b8c55722a9aef71cea7155ae2ecec02676 (diff)
downloadbcm5719-llvm-d11e4608105b5cdd00d3e0f0cd83cd1765bab7f3.tar.gz
bcm5719-llvm-d11e4608105b5cdd00d3e0f0cd83cd1765bab7f3.zip
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). llvm-svn: 41493
Diffstat (limited to 'clang/Sema/SemaChecking.cpp')
-rw-r--r--clang/Sema/SemaChecking.cpp10
1 files changed, 6 insertions, 4 deletions
diff --git a/clang/Sema/SemaChecking.cpp b/clang/Sema/SemaChecking.cpp
index e03507b7968..c027fa794c9 100644
--- a/clang/Sema/SemaChecking.cpp
+++ b/clang/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());
}
}
OpenPOWER on IntegriCloud