forked from OSchip/llvm-project
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:
parent
c1c2c68945
commit
6e127a6d86
|
@ -1736,8 +1736,9 @@ def ext_return_has_expr : ExtWarn<
|
|||
InGroup<ReturnType>;
|
||||
def ext_return_has_void_expr : Extension<
|
||||
"void %select{function|method}1 %0 should not return void expression">;
|
||||
def err_noreturn_function_has_return_expr : Error<
|
||||
"function %0 declared 'noreturn' should not return">;
|
||||
def warn_noreturn_function_has_return_expr : Warning<
|
||||
"function %0 declared 'noreturn' should not return">, DefaultError,
|
||||
InGroup<DiagGroup<"invalid-noreturn">>;
|
||||
def err_noreturn_block_has_return_expr : Error<
|
||||
"block declared 'noreturn' should not return">;
|
||||
def err_block_on_nonlocal : Error<
|
||||
|
|
|
@ -834,11 +834,9 @@ Sema::ActOnReturnStmt(SourceLocation ReturnLoc, FullExprArg rex) {
|
|||
QualType FnRetType;
|
||||
if (const FunctionDecl *FD = getCurFunctionDecl()) {
|
||||
FnRetType = FD->getResultType();
|
||||
if (FD->hasAttr<NoReturnAttr>()) {
|
||||
Diag(ReturnLoc, diag::err_noreturn_function_has_return_expr)
|
||||
if (FD->hasAttr<NoReturnAttr>())
|
||||
Diag(ReturnLoc, diag::warn_noreturn_function_has_return_expr)
|
||||
<< getCurFunctionOrMethodDecl()->getDeclName();
|
||||
return StmtError();
|
||||
}
|
||||
} else if (ObjCMethodDecl *MD = getCurMethodDecl())
|
||||
FnRetType = MD->getResultType();
|
||||
else // If we don't have a function/method context, bail.
|
||||
|
|
|
@ -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)}}
|
||||
|
||||
void f3() __attribute__((noreturn));
|
||||
|
||||
void f3() {
|
||||
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}}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue