Is this an existing warning in another compiler? Is it finding bugs? How does this interact with virtual functions? (what if I'm overriding a non-void non-noreturn function with a noreturn function?)<br><br><div>On Sun Jan 05 2014 at 2:18:43 PM, Michael Bao <<a href="mailto:mike.h.bao@gmail.com">mike.h.bao@gmail.com</a>> wrote:</div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">  Rebased off Revision 198572.<br>
<br>
  - Reword diagnostic to avoid double negative<br>
  - Pass in -std=c11 to the C test.<br>
  - Put [[noreturn]] attribute in front of function decl in C++ tests.<br>
<br>
<a href="http://llvm-reviews.chandlerc.com/D2507" target="_blank">http://llvm-reviews.chandlerc.<u></u>com/D2507</a><br>
<br>
CHANGE SINCE LAST DIFF<br>
  <a href="http://llvm-reviews.chandlerc.com/D2507?vs=6345&id=6353#toc" target="_blank">http://llvm-reviews.chandlerc.<u></u>com/D2507?vs=6345&id=6353#toc</a><br>
<br>
Files:<br>
  include/clang/Basic/<u></u>DiagnosticSemaKinds.td<br>
  lib/Sema/SemaDecl.cpp<br>
  test/Sema/warn-noreturn-<u></u>return-type.c<br>
  test/SemaCXX/warn-noreturn-<u></u>return-type.cpp<br>
<br>
Index: include/clang/Basic/<u></u>DiagnosticSemaKinds.td<br>
==============================<u></u>==============================<u></u>=======<br>
--- include/clang/Basic/<u></u>DiagnosticSemaKinds.td<br>
+++ include/clang/Basic/<u></u>DiagnosticSemaKinds.td<br>
@@ -6459,6 +6459,9 @@<br>
 def warn_falloff_noreturn_function : Warning<<br>
   "function declared 'noreturn' should not return">,<br>
   InGroup<InvalidNoreturn>;<br>
+def warn_noreturn_function_has_<u></u>nonvoid_type : Warning<<br>
+  "function %0 declared 'noreturn' should have a 'void' return type">,<br>
+  InGroup<InvalidNoreturn>;<br>
 def err_noreturn_block_has_return_<u></u>expr : Error<<br>
   "block declared 'noreturn' should not return">;<br>
 def err_noreturn_missing_on_first_<u></u>decl : Error<<br>
Index: lib/Sema/SemaDecl.cpp<br>
==============================<u></u>==============================<u></u>=======<br>
--- lib/Sema/SemaDecl.cpp<br>
+++ lib/Sema/SemaDecl.cpp<br>
@@ -7391,6 +7391,9 @@<br>
     AddToScope = false;<br>
   }<br>
<br>
+  if (NewFD->isNoReturn() && !NewFD->getResultType()-><u></u>isVoidType())<br>
+    Diag(NewFD->getLocation(), diag::warn_noreturn_function_<u></u>has_nonvoid_type)<br>
+      << NewFD;<br>
   return NewFD;<br>
 }<br>
<br>
Index: test/Sema/warn-noreturn-<u></u>return-type.c<br>
==============================<u></u>==============================<u></u>=======<br>
--- test/Sema/warn-noreturn-<u></u>return-type.c<br>
+++ test/Sema/warn-noreturn-<u></u>return-type.c<br>
@@ -0,0 +1,12 @@<br>
+// RUN: %clang_cc1 %s -fsyntax-only -verify -Winvalid-noreturn -std=c11<br>
+__attribute__((noreturn)) void test1();<br>
+<br>
+__attribute__((noreturn)) int test2(); // expected-warning{{function 'test2' declared 'noreturn' should have a 'void' return type}}<br>
+<br>
+__attribute__((noreturn)) float test3(); // expected-warning{{function 'test3' declared 'noreturn' should have a 'void' return type}}<br>
+<br>
+_Noreturn void test4();<br>
+<br>
+_Noreturn int test5(); // expected-warning{{function 'test5' declared 'noreturn' should have a 'void' return type}}<br>
+<br>
+_Noreturn float test6(); // expected-warning{{function 'test6' declared 'noreturn' should have a 'void' return type}}<br>
Index: test/SemaCXX/warn-noreturn-<u></u>return-type.cpp<br>
==============================<u></u>==============================<u></u>=======<br>
--- test/SemaCXX/warn-noreturn-<u></u>return-type.cpp<br>
+++ test/SemaCXX/warn-noreturn-<u></u>return-type.cpp<br>
@@ -0,0 +1,6 @@<br>
+// RUN: %clang_cc1 %s -fsyntax-only -verify -Winvalid-noreturn -std=c++11<br>
+[[noreturn]] void test1();<br>
+<br>
+[[noreturn]] int test2(); // expected-warning{{function 'test2' declared 'noreturn' should have a 'void' return type}}<br>
+<br>
+[[noreturn]] float test3(); // expected-warning{{function 'test3' declared 'noreturn' should have a 'void' return type}}<br>
______________________________<u></u>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/cfe-commits</a><br>
</blockquote>