diff options
-rw-r--r-- | clang/include/clang/Basic/DiagnosticKinds.def | 4 | ||||
-rw-r--r-- | clang/lib/Sema/SemaStmt.cpp | 15 | ||||
-rw-r--r-- | clang/test/Parser/objc-try-catch-1.m | 2 | ||||
-rw-r--r-- | clang/test/Sema/function-return.c | 10 | ||||
-rw-r--r-- | clang/test/Sema/function.c | 7 | ||||
-rw-r--r-- | clang/test/Sema/implicit-decl.c | 2 |
6 files changed, 20 insertions, 20 deletions
diff --git a/clang/include/clang/Basic/DiagnosticKinds.def b/clang/include/clang/Basic/DiagnosticKinds.def index 1417b8acbde..38d084fc99c 100644 --- a/clang/include/clang/Basic/DiagnosticKinds.def +++ b/clang/include/clang/Basic/DiagnosticKinds.def @@ -1597,8 +1597,10 @@ DIAG(warn_return_missing_expr, WARNING, "non-void %select{function|method}1 %0 should return a value") DIAG(ext_return_missing_expr, EXTENSION, "non-void %select{function|method}1 %0 should return a value") -DIAG(ext_return_has_expr, EXTENSION, +DIAG(ext_return_has_expr, EXTWARN, "void %select{function|method}1 %0 should not return a value") +DIAG(ext_return_has_void_expr, EXTENSION, + "void %select{function|method}1 %0 should not return void expression") DIAG(err_shufflevector_non_vector, ERROR, "first two arguments to __builtin_shufflevector must be vectors") diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index 21f897f639b..0604470c1dc 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -759,13 +759,14 @@ Sema::ActOnReturnStmt(SourceLocation ReturnLoc, ExprTy *rex) { if (FnRetType->isVoidType()) { if (RetValExp) {// C99 6.8.6.4p1 (ext_ since GCC warns) - if (FunctionDecl *FD = getCurFunctionDecl()) - Diag(ReturnLoc, diag::ext_return_has_expr) - << FD->getIdentifier() << 0/*function*/<< RetValExp->getSourceRange(); - else - Diag(ReturnLoc, diag::ext_return_has_expr) - << getCurMethodDecl()->getDeclName() << 1 /*method*/ - << RetValExp->getSourceRange(); + unsigned D = diag::ext_return_has_expr; + if (RetValExp->getType()->isVoidType()) + D = diag::ext_return_has_void_expr; + NamedDecl *CurDecl = getCurFunctionOrMethodDecl(); + + Diag(ReturnLoc, D) + << CurDecl->getDeclName() << isa<ObjCMethodDecl>(CurDecl) + << RetValExp->getSourceRange(); } return new ReturnStmt(ReturnLoc, RetValExp); } diff --git a/clang/test/Parser/objc-try-catch-1.m b/clang/test/Parser/objc-try-catch-1.m index d8264fabbe3..2e3c5b14a33 100644 --- a/clang/test/Parser/objc-try-catch-1.m +++ b/clang/test/Parser/objc-try-catch-1.m @@ -60,6 +60,6 @@ void noTwoTokenLookAheadRequiresABitOfFancyFootworkInTheParser() { @try { // Do something } @catch (...) {} - return 0; + return; } diff --git a/clang/test/Sema/function-return.c b/clang/test/Sema/function-return.c deleted file mode 100644 index 8af074e0a0e..00000000000 --- a/clang/test/Sema/function-return.c +++ /dev/null @@ -1,10 +0,0 @@ -// RUN: clang %s -fsyntax-only -verify -pedantic -// PR2790 - -void f1() { - return 0; // expected-warning {{void function 'f1' should not return a value}} -} - -int f2() { - return; // expected-warning {{non-void function 'f2' should return a value}} -} diff --git a/clang/test/Sema/function.c b/clang/test/Sema/function.c index f2aa8d92162..de970a09b35 100644 --- a/clang/test/Sema/function.c +++ b/clang/test/Sema/function.c @@ -32,3 +32,10 @@ void t11(){t10(1);} // PR3208 void t12(int) {} // expected-error{{parameter name omitted}} +// PR2790 +void t13() { + return 0; // expected-warning {{void function 't13' should not return a value}} +} +int t14() { + return; // expected-warning {{non-void function 't14' should return a value}} +} diff --git a/clang/test/Sema/implicit-decl.c b/clang/test/Sema/implicit-decl.c index 099cf9d20ea..91f5dd103f6 100644 --- a/clang/test/Sema/implicit-decl.c +++ b/clang/test/Sema/implicit-decl.c @@ -9,7 +9,7 @@ void func() { int32_t compCount = 0; if (_CFCalendarDecomposeAbsoluteTimeV(compDesc, vector, compCount)) { // expected-note {{previous implicit declaration is here}} } - return ((void *)0); + return ((void *)0); // expected-warning {{void function 'func' should not return a value}} } Boolean _CFCalendarDecomposeAbsoluteTimeV(const char *componentDesc, int32_t **vector, int32_t count) { // expected-error{{conflicting types for '_CFCalendarDecomposeAbsoluteTimeV'}} return 0; |