]> granicus.if.org Git - clang/commitdiff
warn when attribute warn_unused_result is applied to void functions.
authorNuno Lopes <nunoplopes@sapo.pt>
Tue, 22 Dec 2009 23:59:52 +0000 (23:59 +0000)
committerNuno Lopes <nunoplopes@sapo.pt>
Tue, 22 Dec 2009 23:59:52 +0000 (23:59 +0000)
while at it, remove an outdated FIXME

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91946 91177308-0d34-0410-b5e6-96231b3b80d8

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

index eece90b42a6fcc87183d82fc50e579ae65f48216..cd6f6894d9029ec50854023b1391412fb6684571 100644 (file)
@@ -682,6 +682,8 @@ def warn_redeclaration_without_attribute_prev_attribute_ignored : Warning<
 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<
index 718db0437f41f936105257a64fd97ba4e9df62db..e95f479bd8e84279ee91fbbcb821abc0feafb878 100644 (file)
@@ -730,13 +730,18 @@ static void HandleWarnUnusedResult(Decl *D, const AttributeList &Attr, Sema &S)
     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());
 }
 
index 284818dc58132225769ba533203b42781b956411..30f6aee26b408db129219f866f02006de206406d 100644 (file)
@@ -87,17 +87,19 @@ int fn3() __attribute__ ((const));
 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}}