From 6e127a6d86429e6de573ee10975f4b765095c841 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 31 May 2009 19:32:13 +0000 Subject: [PATCH] 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 --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 5 +++-- clang/lib/Sema/SemaStmt.cpp | 6 ++---- clang/test/Sema/attr-noreturn.c | 8 +++++++- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 732386fa140a..672e473678dd 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -1736,8 +1736,9 @@ def ext_return_has_expr : ExtWarn< InGroup; 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>; def err_noreturn_block_has_return_expr : Error< "block declared 'noreturn' should not return">; def err_block_on_nonlocal : Error< diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index 879d84e36c67..15262e9c3ac2 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -834,11 +834,9 @@ Sema::ActOnReturnStmt(SourceLocation ReturnLoc, FullExprArg rex) { QualType FnRetType; if (const FunctionDecl *FD = getCurFunctionDecl()) { FnRetType = FD->getResultType(); - if (FD->hasAttr()) { - Diag(ReturnLoc, diag::err_noreturn_function_has_return_expr) + if (FD->hasAttr()) + 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. diff --git a/clang/test/Sema/attr-noreturn.c b/clang/test/Sema/attr-noreturn.c index 1335c765b3d2..d1417f093ffb 100644 --- a/clang/test/Sema/attr-noreturn.c +++ b/clang/test/Sema/attr-noreturn.c @@ -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}} +} +