From af7534f08496c118a8575a7adbbd5715a624e4a0 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Fri, 3 Sep 2010 00:25:02 +0000 Subject: [PATCH] Get rid of the "functions declared 'noreturn' should have a 'void' result type" warning. The rationale behind this is that it is normal for callback functions to have a non-void return type and it should still be possible to mark them noreturn. (JavaScriptCore is a good example of this). llvm-svn: 112918 --- clang/clang.xcodeproj/project.pbxproj | 7 +++++++ clang/include/clang/Basic/DiagnosticSemaKinds.td | 3 --- clang/lib/Sema/SemaType.cpp | 5 ----- clang/test/Analysis/misc-ps.m | 2 +- clang/test/Sema/attr-noreturn.c | 2 +- clang/test/Sema/block-return.c | 4 ++-- clang/test/Sema/return-noreturn.c | 4 ++-- clang/test/Sema/return.c | 2 +- clang/test/Sema/warn-unreachable.c | 2 +- clang/test/SemaCXX/attr-noreturn.cpp | 2 +- clang/test/SemaCXX/warn-unreachable.cpp | 4 ++-- 11 files changed, 18 insertions(+), 19 deletions(-) diff --git a/clang/clang.xcodeproj/project.pbxproj b/clang/clang.xcodeproj/project.pbxproj index 5e464fe7b3d1..def722b45e46 100644 --- a/clang/clang.xcodeproj/project.pbxproj +++ b/clang/clang.xcodeproj/project.pbxproj @@ -2039,7 +2039,14 @@ isa = PBXProject; buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "clang" */; compatibilityVersion = "Xcode 2.4"; + developmentRegion = English; hasScannedForEncodings = 1; + knownRegions = ( + English, + Japanese, + French, + German, + ); mainGroup = 08FB7794FE84155DC02AAC07 /* clang */; projectDirPath = ""; projectRoot = ""; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index d3fdb8050ba5..390d22560ee8 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -3145,9 +3145,6 @@ def ext_return_has_void_expr : Extension< def warn_noreturn_function_has_return_expr : Warning< "function %0 declared 'noreturn' should not return">, InGroup>; -def warn_noreturn_function_has_nonvoid_result : Warning< - "%select{functions|blocks}0 declared 'noreturn' should have a 'void' result type">, - InGroup>; def warn_falloff_noreturn_function : Warning< "function declared 'noreturn' should not return">, InGroup>; diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index bb2fb9903304..20c909a8ea43 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -1850,11 +1850,6 @@ bool ProcessFnAttr(Sema &S, QualType &Type, const AttributeList &Attr) { && !Type->isMemberFunctionPointerType()) return true; - if (!GetResultType(Type)->isVoidType()) { - S.Diag(Attr.getLoc(), diag::warn_noreturn_function_has_nonvoid_result) - << (Type->isBlockPointerType() ? /* blocks */ 1 : /* functions */ 0); - } - // Otherwise we can process right away. Type = S.Context.getNoReturnType(Type); return false; diff --git a/clang/test/Analysis/misc-ps.m b/clang/test/Analysis/misc-ps.m index 6727e7da3bba..4fbaa49c1168 100644 --- a/clang/test/Analysis/misc-ps.m +++ b/clang/test/Analysis/misc-ps.m @@ -323,7 +323,7 @@ int test_invalidate_by_ref() { // was the block containing the merge for '?', which would trigger an // assertion failure. int rdar_7027684_aux(); -int rdar_7027684_aux_2() __attribute__((noreturn)); // expected-warning{{functions declared 'noreturn' should have a 'void' result type}} +int rdar_7027684_aux_2() __attribute__((noreturn)); void rdar_7027684(int x, int y) { {}; // this empty compound statement is critical. (rdar_7027684_aux() ? rdar_7027684_aux_2() : (void) 0); diff --git a/clang/test/Sema/attr-noreturn.c b/clang/test/Sema/attr-noreturn.c index 927df7f41224..5333a2c13fc2 100644 --- a/clang/test/Sema/attr-noreturn.c +++ b/clang/test/Sema/attr-noreturn.c @@ -9,7 +9,7 @@ static void __attribute__((noreturn)) f0(void) { } // expected-warning {{function declared 'noreturn' should not return}} // On K&R -int f1() __attribute__((noreturn)); // expected-warning{{functions declared 'noreturn' should have a 'void' result type}} +int f1() __attribute__((noreturn)); int g0 __attribute__((noreturn)); // expected-warning {{'noreturn' only applies to function types; type here is 'int'}} diff --git a/clang/test/Sema/block-return.c b/clang/test/Sema/block-return.c index d40cef18d211..5a4ec010d3a2 100644 --- a/clang/test/Sema/block-return.c +++ b/clang/test/Sema/block-return.c @@ -100,10 +100,10 @@ int (*funcptr3[5])(long); int sz8 = sizeof(^int (*[5])(long) {return funcptr3;}); // expected-error {{block declared as returning an array}} void foo6() { - int (^b)(int) __attribute__((noreturn)); // expected-warning{{blocks declared 'noreturn' should have a 'void' result type}} + int (^b)(int) __attribute__((noreturn)); b = ^ (int i) __attribute__((noreturn)) { return 1; }; // expected-error {{block declared 'noreturn' should not return}} b(1); - int (^c)(void) __attribute__((noreturn)) = ^ __attribute__((noreturn)) { return 100; }; // expected-error {{block declared 'noreturn' should not return}} expected-warning{{blocks declared 'noreturn' should have a 'void' result type}} + int (^c)(void) __attribute__((noreturn)) = ^ __attribute__((noreturn)) { return 100; }; // expected-error {{block declared 'noreturn' should not return}} } diff --git a/clang/test/Sema/return-noreturn.c b/clang/test/Sema/return-noreturn.c index a7f4e6f21634..ff43754a4299 100644 --- a/clang/test/Sema/return-noreturn.c +++ b/clang/test/Sema/return-noreturn.c @@ -20,11 +20,11 @@ void test2_positive() { // This test case illustrates that we don't warn about the missing return // because the function is marked noreturn and there is an infinite loop. extern int foo_test_3(); -__attribute__((__noreturn__)) void* test3(int arg) { // expected-warning{{functions declared 'noreturn' should have a 'void' result type}} +__attribute__((__noreturn__)) void* test3(int arg) { while (1) foo_test_3(); } -__attribute__((__noreturn__)) void* test3_positive(int arg) { // expected-warning{{functions declared 'noreturn' should have a 'void' result type}} +__attribute__((__noreturn__)) void* test3_positive(int arg) { while (0) foo_test_3(); } // expected-warning{{function declared 'noreturn' should not return}} diff --git a/clang/test/Sema/return.c b/clang/test/Sema/return.c index af78b4105125..54c340634d39 100644 --- a/clang/test/Sema/return.c +++ b/clang/test/Sema/return.c @@ -60,7 +60,7 @@ int test8() { (void)(1 + unknown()); } // expected-warning {{control reaches end of non-void function}} -int halt3() __attribute__((noreturn)); // expected-warning{{functions declared 'noreturn' should have a 'void' result type}} +int halt3() __attribute__((noreturn)); int test9() { (void)(halt3() + unknown()); diff --git a/clang/test/Sema/warn-unreachable.c b/clang/test/Sema/warn-unreachable.c index 0d2efe95d663..10ed6961a556 100644 --- a/clang/test/Sema/warn-unreachable.c +++ b/clang/test/Sema/warn-unreachable.c @@ -1,6 +1,6 @@ // RUN: %clang %s -fsyntax-only -Xclang -verify -fblocks -Wunreachable-code -Wno-unused-value -int halt() __attribute__((noreturn)); // expected-warning{{functions declared 'noreturn' should have a 'void' result type}} +int halt() __attribute__((noreturn)); int live(); int dead(); diff --git a/clang/test/SemaCXX/attr-noreturn.cpp b/clang/test/SemaCXX/attr-noreturn.cpp index dbf73fbae8c1..b7d39992b8fb 100644 --- a/clang/test/SemaCXX/attr-noreturn.cpp +++ b/clang/test/SemaCXX/attr-noreturn.cpp @@ -31,7 +31,7 @@ void test_f3() { class xpto { - int blah() __attribute__((noreturn)); // expected-warning{{functions declared 'noreturn' should have a 'void' result type}} + int blah() __attribute__((noreturn)); }; int xpto::blah() { diff --git a/clang/test/SemaCXX/warn-unreachable.cpp b/clang/test/SemaCXX/warn-unreachable.cpp index 827dc48ce7c8..f5601cd2df08 100644 --- a/clang/test/SemaCXX/warn-unreachable.cpp +++ b/clang/test/SemaCXX/warn-unreachable.cpp @@ -1,6 +1,6 @@ // RUN: %clang_cc1 %s -fsyntax-only -verify -fblocks -Wunreachable-code -Wno-unused-value -int &halt() __attribute__((noreturn)); // expected-warning{{functions declared 'noreturn' should have a 'void' result type}} +int &halt() __attribute__((noreturn)); int &live(); int dead(); int liveti() throw(int); @@ -60,7 +60,7 @@ void test5() { struct S { int mem; } s; - S &foor() __attribute__((noreturn)); // expected-warning{{functions declared 'noreturn' should have a 'void' result type}} + S &foor() __attribute__((noreturn)); foor() .mem; // expected-warning {{will never be executed}} }