]> granicus.if.org Git - clang/commitdiff
Updated checker for "return of address of stack variable" to look for
authorTed Kremenek <kremenek@apple.com>
Mon, 27 Aug 2007 16:39:17 +0000 (16:39 +0000)
committerTed Kremenek <kremenek@apple.com>
Mon, 27 Aug 2007 16:39:17 +0000 (16:39 +0000)
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

Sema/SemaChecking.cpp

index e03507b79684b523da3dd301f2f14668caed296d..c027fa794c9cd17aad07f93b1bc36a86444df35f 100644 (file)
@@ -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());
   }
 }