[PATCH] Warnings for NoReturn Functions
Michael Bao
mike.h.bao at gmail.com
Fri Jan 3 09:25:20 PST 2014
In response to Bug 10642 in Bugzilla (http://llvm.org/bugs/show_bug.cgi?id=10642). I've checked this against Revision 198291.
# Removed the warning about a 'return' statement in a 'noreturn' function if the 'return' statement is unreachable.
# Warn users if they have a non-void return type on a 'noreturn' function.
This is my first patch, let me know if there's anything I need to do :) Thanks!
http://llvm-reviews.chandlerc.com/D2506
Files:
lib/Sema/SemaStmt.cpp
lib/Sema/SemaDecl.cpp
include/clang/Basic/DiagnosticSemaKinds.td
Index: lib/Sema/SemaStmt.cpp
===================================================================
--- lib/Sema/SemaStmt.cpp
+++ lib/Sema/SemaStmt.cpp
@@ -2776,9 +2776,10 @@
QualType RelatedRetType;
if (const FunctionDecl *FD = getCurFunctionDecl()) {
FnRetType = FD->getResultType();
- if (FD->isNoReturn())
- Diag(ReturnLoc, diag::warn_noreturn_function_has_return_expr)
- << FD->getDeclName();
+ if (FD->isNoReturn()) {
+ DiagRuntimeBehavior(ReturnLoc, RetValExp,
+ PDiag(diag::warn_noreturn_function_has_return_expr) << FD->getDeclName());
+ }
} else if (ObjCMethodDecl *MD = getCurMethodDecl()) {
FnRetType = MD->getResultType();
if (MD->hasRelatedResultType() && MD->getClassInterface()) {
Index: lib/Sema/SemaDecl.cpp
===================================================================
--- lib/Sema/SemaDecl.cpp
+++ lib/Sema/SemaDecl.cpp
@@ -7392,6 +7392,10 @@
AddToScope = false;
}
+ if (NewFD->isNoReturn() && !NewFD->getResultType()->isVoidType()) {
+ Diag(NewFD->getLocation(), diag::warn_noreturn_function_has_nonvoid_type)
+ << NewFD->getDeclName();
+ }
return NewFD;
}
Index: include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- include/clang/Basic/DiagnosticSemaKinds.td
+++ include/clang/Basic/DiagnosticSemaKinds.td
@@ -6462,6 +6462,9 @@
def warn_falloff_noreturn_function : Warning<
"function declared 'noreturn' should not return">,
InGroup<InvalidNoreturn>;
+def warn_noreturn_function_has_nonvoid_type : Warning<
+ "function %0 declared 'noreturn' should have not have a non-void return type">,
+ InGroup<InvalidNoreturn>;
def err_noreturn_block_has_return_expr : Error<
"block declared 'noreturn' should not return">;
def err_noreturn_missing_on_first_decl : Error<
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D2506.1.patch
Type: text/x-patch
Size: 1827 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140103/07ad9795/attachment.bin>
More information about the cfe-commits
mailing list