]> granicus.if.org Git - clang/commitdiff
warn about returning the address of a label.
authorChris Lattner <sabre@nondot.org>
Fri, 30 Oct 2009 04:01:58 +0000 (04:01 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 30 Oct 2009 04:01:58 +0000 (04:01 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@85576 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaChecking.cpp
test/Sema/statements.c

index 1ce4d91a17c95aee5387cde5f3d72a90fad72816..00723a3af9f09612ee571e3ed8b6be529ff39ecf 100644 (file)
@@ -2140,6 +2140,10 @@ def warn_ret_stack_addr : Warning<
   "address of stack memory associated with local variable %0 returned">;
 def warn_ret_stack_ref : Warning<
   "reference to stack memory associated with local variable %0 returned">;
+def warn_ret_addr_label : Warning<
+  "returning address of label, which is local">;
+def err_ret_local_block : Error<
+  "returning block that lives on the local stack">;
 
 
 // For non-floating point, expressions of the form x == x or x != x
@@ -2163,8 +2167,6 @@ def err_return_in_block_expression : Error<
 def err_block_returns_array : Error<
   "block declared as returning an array">;
 
-def err_ret_local_block : Error<
-  "returning block that lives on the local stack">;
 
 // CFString checking
 def err_cfstring_literal_not_string_constant : Error<
index b7ccedec709ab7d100ebfff48dcc6c3a291a1e84..38b6ebeefab957a02cdb3626618d2272735e5110 100644 (file)
@@ -1272,10 +1272,15 @@ Sema::CheckReturnStackAddr(Expr *RetValExp, QualType lhsType,
     // Skip over implicit cast expressions when checking for block expressions.
     RetValExp = RetValExp->IgnoreParenCasts();
 
-    if (BlockExpr *C = dyn_cast_or_null<BlockExpr>(RetValExp))
+    if (BlockExpr *C = dyn_cast<BlockExpr>(RetValExp))
       if (C->hasBlockDeclRefExprs())
         Diag(C->getLocStart(), diag::err_ret_local_block)
           << C->getSourceRange();
+    
+    if (AddrLabelExpr *ALE = dyn_cast<AddrLabelExpr>(RetValExp))
+      Diag(ALE->getLocStart(), diag::warn_ret_addr_label)
+        << ALE->getSourceRange();
+    
   } else if (lhsType->isReferenceType()) {
     // Perform checking for stack values returned by reference.
     // Check for a reference to the stack
index 9a71a403700d38b0f4b8ed24a071c845d56051f6..8eac052a25c7b5fe4b673faa6a6fb59b50240e29 100644 (file)
@@ -27,3 +27,9 @@ int test8[({10;})]; // expected-error {{statement expression not allowed at file
 void test9(const void *P) {
   __builtin_prefetch(P);
 }
+
+
+void *test10() { 
+bar:
+  return &&bar;  // expected-warning {{returning address of label, which is local}}
+}