[cfe-commits] [PATCH] Improve diagnostic for -Wmissing-noreturn

Chandler Carruth chandlerc at google.com
Sat Aug 27 16:24:33 PDT 2011

On Sat, Aug 27, 2011 at 4:00 PM, Joerg Sonnenberger <joerg at britannica.bec.de
> wrote:

> Hi all,
> attached patch tries to make the -Wmissing-noreturn message a bit more
> useful. Often enough, the function in question has the prototype in a
> separate file, so it avoids work knowing the name in advance. I'm not
> sure whether it is better to print the plain name or the full diagnostic
> string, so I'm going with the latter for now.

I note that there are no tests updated in this patch... if we're going to
touch this warning, we should add some good test coverage for it.

A couple of comments on the patch:

Index: include/clang/Basic/DiagnosticSemaKinds.td
--- include/clang/Basic/DiagnosticSemaKinds.td (revision 138705)
+++ include/clang/Basic/DiagnosticSemaKinds.td (working copy)
@@ -236,7 +236,7 @@
 def err_falloff_nonvoid_block : Error<
   "control reaches end of non-void block">;
 def warn_suggest_noreturn_function : Warning<
-  "function could be attribute 'noreturn'">,
+  "function '%0' could be attribute 'noreturn'">,

This wording is awkward. Maybe "could be marked with the 'noreturn'
attribute"? "could be marked with attribute 'noreturn'"? Essentially,
'attribute' doesn't seem like a good verb here. ;]

   InGroup<DiagGroup<"missing-noreturn">>, DefaultIgnore;
 def warn_suggest_noreturn_block : Warning<
   "block could be attribute 'noreturn'">,
Index: lib/Sema/AnalysisBasedWarnings.cpp
--- lib/Sema/AnalysisBasedWarnings.cpp (revision 138705)
+++ lib/Sema/AnalysisBasedWarnings.cpp (working copy)
@@ -376,9 +376,17 @@
       case NeverFallThroughOrReturn:
-        if (ReturnsVoid && !HasNoReturn &&
-          S.Diag(Compound->getLBracLoc(),
-                 CD.diag_NeverFallThroughOrReturn);
+        if (ReturnsVoid && !HasNoReturn &&
CD.diag_NeverFallThroughOrReturn) {
+          if (const FunctionDecl *FC = dyn_cast<FunctionDecl>(D)) {

FC? not FD?

+            std::string str;
+            FC->getNameForDiagnostic(str, S.Context.PrintingPolicy, true);

I'm surprised this is necessary. Naively I would expect simply "<< FC" below
to end up calling this exact function for us. Does that not work?

+            S.Diag(Compound->getLBracLoc(),
+                   CD.diag_NeverFallThroughOrReturn) << str;
+          } else {
+            S.Diag(Compound->getLBracLoc(),
+                   CD.diag_NeverFallThroughOrReturn);

This will likely crash... we need to provide *something* for the name in all
of the cases where we emit this diagnostic. Testing would be especially good
here. =D
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20110827/815d39b8/attachment.html>

More information about the cfe-commits mailing list