Downgrade an error about "return in a no-return function" from being

an error to being a warning that defaults to error.  If you want this to
be a warning, you have to explicitly pass -Winvalid-noreturn to clang to
map it back to a warning.

llvm-svn: 72669
This commit is contained in:
Chris Lattner 2009-05-31 19:32:13 +00:00
parent c1c2c68945
commit 6e127a6d86
3 changed files with 12 additions and 7 deletions

View File

@ -1736,8 +1736,9 @@ def ext_return_has_expr : ExtWarn<
InGroup<ReturnType>; InGroup<ReturnType>;
def ext_return_has_void_expr : Extension< def ext_return_has_void_expr : Extension<
"void %select{function|method}1 %0 should not return void expression">; "void %select{function|method}1 %0 should not return void expression">;
def err_noreturn_function_has_return_expr : Error< def warn_noreturn_function_has_return_expr : Warning<
"function %0 declared 'noreturn' should not return">; "function %0 declared 'noreturn' should not return">, DefaultError,
InGroup<DiagGroup<"invalid-noreturn">>;
def err_noreturn_block_has_return_expr : Error< def err_noreturn_block_has_return_expr : Error<
"block declared 'noreturn' should not return">; "block declared 'noreturn' should not return">;
def err_block_on_nonlocal : Error< def err_block_on_nonlocal : Error<

View File

@ -834,11 +834,9 @@ Sema::ActOnReturnStmt(SourceLocation ReturnLoc, FullExprArg rex) {
QualType FnRetType; QualType FnRetType;
if (const FunctionDecl *FD = getCurFunctionDecl()) { if (const FunctionDecl *FD = getCurFunctionDecl()) {
FnRetType = FD->getResultType(); FnRetType = FD->getResultType();
if (FD->hasAttr<NoReturnAttr>()) { if (FD->hasAttr<NoReturnAttr>())
Diag(ReturnLoc, diag::err_noreturn_function_has_return_expr) Diag(ReturnLoc, diag::warn_noreturn_function_has_return_expr)
<< getCurFunctionOrMethodDecl()->getDeclName(); << getCurFunctionOrMethodDecl()->getDeclName();
return StmtError();
}
} else if (ObjCMethodDecl *MD = getCurMethodDecl()) } else if (ObjCMethodDecl *MD = getCurMethodDecl())
FnRetType = MD->getResultType(); FnRetType = MD->getResultType();
else // If we don't have a function/method context, bail. else // If we don't have a function/method context, bail.

View File

@ -14,8 +14,14 @@ int g0 __attribute__((noreturn)); // expected-warning {{'noreturn' attribute onl
int f2() __attribute__((noreturn(1, 2))); // expected-error {{attribute requires 0 argument(s)}} int f2() __attribute__((noreturn(1, 2))); // expected-error {{attribute requires 0 argument(s)}}
void f3() __attribute__((noreturn)); void f3() __attribute__((noreturn));
void f3() { void f3() {
return; // expected-error {{function 'f3' declared 'noreturn' should not return}} return; // expected-error {{function 'f3' declared 'noreturn' should not return}}
} }
#pragma clang diagnostic warning "-Winvalid-noreturn"
void f4() __attribute__((noreturn));
void f4() {
return; // expected-warning {{function 'f4' declared 'noreturn' should not return}}
}