Author: nlopes
Date: Tue Dec 22 17:59:52 2009
New Revision: 91946

URL: http://llvm.org/viewvc/llvm-project?rev=91946&view=rev
Log:
warn when attribute warn_unused_result is applied to void functions.
while at it, remove an outdated FIXME

Modified:
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/Sema/SemaDeclAttr.cpp
    cfe/trunk/test/Sema/unused-expr.c

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

==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Tue Dec 22 17:59:52 
2009
@@ -682,6 +682,8 @@
 def warn_attribute_ignored : Warning<"%0 attribute ignored">;
 def warn_attribute_precede_definition : Warning<
   "attribute declaration must precede definition">;
+def warn_attribute_void_function : Warning<
+  "attribute %0 cannot be applied to functions without return value">;
 def warn_attribute_weak_on_field : Warning<
   "__weak attribute cannot be specified on a field declaration">;
 def warn_attribute_weak_on_local : Warning<

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

==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Tue Dec 22 17:59:52 2009
@@ -730,13 +730,18 @@
     return;
   }
 
-  // TODO: could also be applied to methods?
   if (!isFunctionOrMethod(D)) {
     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
       << Attr.getName() << 0 /*function*/;
     return;
   }
 
+  if (getFunctionType(D)->getResultType()->isVoidType()) {
+    S.Diag(Attr.getLoc(), diag::warn_attribute_void_function)
+      << Attr.getName();
+    return;
+  }
+
   D->addAttr(::new (S.Context) WarnUnusedResultAttr());
 }
 

Modified: cfe/trunk/test/Sema/unused-expr.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/unused-expr.c?rev=91946&r1=91945&r2=91946&view=diff

==============================================================================
--- cfe/trunk/test/Sema/unused-expr.c (original)
+++ cfe/trunk/test/Sema/unused-expr.c Tue Dec 22 17:59:52 2009
@@ -87,17 +87,19 @@
 int t6() {
   if (fn1() < 0 || fn2(2,1) < 0 || fn3(2) < 0)  // no warnings
     return -1;
-  
+
   fn1();  // expected-warning {{ignoring return value of function declared 
with warn_unused_result attribute}}
   fn2(92, 21);  // expected-warning {{ignoring return value of function 
declared with pure attribute}}
   fn3(42);  // expected-warning {{ignoring return value of function declared 
with const attribute}}
   return 0;
 }
 
-int t7 __attribute__ ((warn_unused_result)); // expected-warning {{warning: 
'warn_unused_result' attribute only applies to function types}}
+int t7 __attribute__ ((warn_unused_result)); // expected-warning 
{{'warn_unused_result' attribute only applies to function types}}
 
 // PR4010
 int (*fn4)(void) __attribute__ ((warn_unused_result));
 void t8() {
   fn4(); // expected-warning {{ignoring return value of function declared with 
warn_unused_result attribute}}
 }
+
+void t9() __attribute__((warn_unused_result)); // expected-warning {{attribute 
'warn_unused_result' cannot be applied to functions without return value}}


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to