[cfe-commits] r85576 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaChecking.cpp test/Sema/statements.c

Chris Lattner sabre at nondot.org
Thu Oct 29 21:02:04 PDT 2009


Author: lattner
Date: Thu Oct 29 23:01:58 2009
New Revision: 85576

URL: http://llvm.org/viewvc/llvm-project?rev=85576&view=rev
Log:
warn about returning the address of a label.

Modified:
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/Sema/SemaChecking.cpp
    cfe/trunk/test/Sema/statements.c

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=85576&r1=85575&r2=85576&view=diff

==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Oct 29 23:01:58 2009
@@ -2140,6 +2140,10 @@
   "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_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<

Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=85576&r1=85575&r2=85576&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
+++ cfe/trunk/lib/Sema/SemaChecking.cpp Thu Oct 29 23:01:58 2009
@@ -1272,10 +1272,15 @@
     // 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

Modified: cfe/trunk/test/Sema/statements.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/statements.c?rev=85576&r1=85575&r2=85576&view=diff

==============================================================================
--- cfe/trunk/test/Sema/statements.c (original)
+++ cfe/trunk/test/Sema/statements.c Thu Oct 29 23:01:58 2009
@@ -27,3 +27,9 @@
 void test9(const void *P) {
   __builtin_prefetch(P);
 }
+
+
+void *test10() { 
+bar:
+  return &&bar;  // expected-warning {{returning address of label, which is local}}
+}





More information about the cfe-commits mailing list