diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -575,21 +575,22 @@ def err_thread_unsupported : Error< "thread-local storage is not supported for the current target">; +// FIXME: Combine fallout warnings to just one warning. def warn_maybe_falloff_nonvoid_function : Warning< - "control may reach end of non-void function">, + "non-void function does not return a value in all control paths">, InGroup; def warn_falloff_nonvoid_function : Warning< - "control reaches end of non-void function">, + "non-void function does not return a value">, InGroup; def err_maybe_falloff_nonvoid_block : Error< - "control may reach end of non-void block">; + "non-void block does not return a value in all control paths">; def err_falloff_nonvoid_block : Error< - "control reaches end of non-void block">; + "non-void block does not return a value">; def warn_maybe_falloff_nonvoid_coroutine : Warning< - "control may reach end of coroutine; which is undefined behavior because the promise type %0 does not declare 'return_void()'">, + "non-void coroutine does not return a value in all control paths">, InGroup; def warn_falloff_nonvoid_coroutine : Warning< - "control reaches end of coroutine; which is undefined behavior because the promise type %0 does not declare 'return_void()'">, + "non-void coroutine does not return a value">, InGroup; def warn_suggest_noreturn_function : Warning< "%select{function|method}0 %1 could be declared with attribute 'noreturn'">, @@ -6858,10 +6859,10 @@ def err_noreturn_lambda_has_return_expr : Error< "lambda declared 'noreturn' should not return">; def warn_maybe_falloff_nonvoid_lambda : Warning< - "control may reach end of non-void lambda">, + "non-void lambda does not return a value in all control paths">, InGroup; def warn_falloff_nonvoid_lambda : Warning< - "control reaches end of non-void lambda">, + "non-void lambda does not return a value">, InGroup; def err_access_lambda_capture : Error< // The ERRORs represent other special members that aren't constructors, in diff --git a/clang/test/Analysis/const-method-call.cpp b/clang/test/Analysis/const-method-call.cpp --- a/clang/test/Analysis/const-method-call.cpp +++ b/clang/test/Analysis/const-method-call.cpp @@ -235,7 +235,7 @@ void constMemberFunction() const; }; -HasConstMemberFunction hasNoReturn() { } // expected-warning {{control reaches end of non-void function}} +HasConstMemberFunction hasNoReturn() { } // expected-warning {{non-void function does not return a value}} void testUnknownWithConstMemberFunction() { hasNoReturn().constMemberFunction(); diff --git a/clang/test/Analysis/structured_bindings.cpp b/clang/test/Analysis/structured_bindings.cpp --- a/clang/test/Analysis/structured_bindings.cpp +++ b/clang/test/Analysis/structured_bindings.cpp @@ -5,5 +5,5 @@ auto[a] = s{1}; // FIXME: proper modelling if (a) { } -} // expected-warning{{control reaches end of non-void function}} +} // expected-warning{{non-void function does not return a value}} diff --git a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p5.cpp b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p5.cpp --- a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p5.cpp +++ b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p5.cpp @@ -3,7 +3,7 @@ // An attribute-specifier-seq in a lambda-declarator appertains to the // type of the corresponding function call operator. void test_attributes() { - auto nrl = [](int x) -> int { if (x > 0) return x; }; // expected-warning{{control may reach end of non-void lambda}} + auto nrl = [](int x) -> int { if (x > 0) return x; }; // expected-warning{{on-void lambda does not return a value in all control paths}} // FIXME: GCC accepts the [[gnu::noreturn]] attribute here. auto nrl2 = []() [[gnu::noreturn]] { return; }; // expected-warning{{attribute 'noreturn' ignored}} diff --git a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p7.cpp b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p7.cpp --- a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p7.cpp +++ b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p7.cpp @@ -2,7 +2,7 @@ // Check that analysis-based warnings work in lambda bodies. void analysis_based_warnings() { - (void)[]() -> int { }; // expected-warning{{control reaches end of non-void lambda}} + (void)[]() -> int { }; // expected-warning{{non-void lambda does not return a value}} } // Check that we get the right types of captured variables (the diff --git a/clang/test/Driver/cc-log-diagnostics.c b/clang/test/Driver/cc-log-diagnostics.c --- a/clang/test/Driver/cc-log-diagnostics.c +++ b/clang/test/Driver/cc-log-diagnostics.c @@ -29,7 +29,7 @@ // CHECK: column // CHECK: 11 // CHECK: message -// CHECK: control reaches end of non-void function +// CHECK: non-void function does not return a value // CHECK: // CHECK: // CHECK: diff --git a/clang/test/Frontend/absolute-paths.c b/clang/test/Frontend/absolute-paths.c --- a/clang/test/Frontend/absolute-paths.c +++ b/clang/test/Frontend/absolute-paths.c @@ -7,11 +7,11 @@ // directory in the path. // NORMAL: SystemHeaderPrefix // ABSOLUTE-NOT: SystemHeaderPrefix -// CHECK: warning: control reaches end of non-void function +// CHECK: warning: non-void function does not return a value // For files which don't exist, just print the filename. #line 123 "non-existant.c" int g() {} -// NORMAL: non-existant.c:123:10: warning: control reaches end of non-void function -// ABSOLUTE: non-existant.c:123:10: warning: control reaches end of non-void function +// NORMAL: non-existant.c:123:10: warning: non-void function does not return a value +// ABSOLUTE: non-existant.c:123:10: warning: non-void function does not return a value diff --git a/clang/test/Index/warning-flags.c b/clang/test/Index/warning-flags.c --- a/clang/test/Index/warning-flags.c +++ b/clang/test/Index/warning-flags.c @@ -9,10 +9,10 @@ // RUN: c-index-test -test-load-source-reparse 5 all -w %s 2>&1 | FileCheck -check-prefix=NOWARNINGS %s // RUN: c-index-test -test-load-source all -w -O4 %s 2>&1 | FileCheck -check-prefix=NOWARNINGS %s -// CHECK-BOTH-WARNINGS: warning: control reaches end of non-void function +// CHECK-BOTH-WARNINGS: warning: non-void function does not return a value // CHECK-BOTH-WARNINGS: warning: incompatible pointer types returning 'float *' from a function with result type 'int *' -// CHECK-SECOND-WARNING-NOT:control reaches end of non-void +// CHECK-SECOND-WARNING-NOT:non-void function does not return a value // CHECK-SECOND-WARNING: warning: incompatible pointer types returning 'float *' from a function with result type 'int *' // NOWARNINGS-NOT: warning: diff --git a/clang/test/Misc/serialized-diags-stable.c b/clang/test/Misc/serialized-diags-stable.c --- a/clang/test/Misc/serialized-diags-stable.c +++ b/clang/test/Misc/serialized-diags-stable.c @@ -5,7 +5,7 @@ // RUN: c-index-test -read-diagnostics %S/Inputs/serialized-diags-stable.dia 2>&1 | FileCheck %s int foo() { - // CHECK: serialized-diags-stable.c:[[@LINE+2]]:1: warning: control reaches end of non-void function [-Wreturn-type] [Semantic Issue] + // CHECK: serialized-diags-stable.c:[[@LINE+2]]:1: warning: non-void function does not return a value [-Wreturn-type] [Semantic Issue] // CHECK-NEXT: Number FIXITs = 0 } diff --git a/clang/test/Modules/redecl-merge.m b/clang/test/Modules/redecl-merge.m --- a/clang/test/Modules/redecl-merge.m +++ b/clang/test/Modules/redecl-merge.m @@ -12,11 +12,11 @@ int *call_eventually_noreturn(void) { eventually_noreturn(); -} // expected-warning{{control reaches end of non-void function}} +} // expected-warning{{non-void function does not return a value}} int *call_eventually_noreturn2(void) { eventually_noreturn2(); -} // expected-warning{{control reaches end of non-void function}} +} // expected-warning{{non-void function does not return a value}} @import redecl_merge_right; diff --git a/clang/test/PCH/late-parsed-instantiations.cpp b/clang/test/PCH/late-parsed-instantiations.cpp --- a/clang/test/PCH/late-parsed-instantiations.cpp +++ b/clang/test/PCH/late-parsed-instantiations.cpp @@ -20,8 +20,8 @@ char data() { visit([](auto buffer) -> char { // expected-note {{in instantiation}} buffer->data(); - }); // expected-warning {{control reaches end of non-void lambda}} - } // expected-warning {{control reaches end of non-void function}} + }); // expected-warning {{non-void lambda does not return a value}} + } // expected-warning {{non-void function does not return a value}} }; #else diff --git a/clang/test/Sema/block-return-1.c b/clang/test/Sema/block-return-1.c --- a/clang/test/Sema/block-return-1.c +++ b/clang/test/Sema/block-return-1.c @@ -2,5 +2,5 @@ int j; void foo() { - ^ (void) { if (j) return 1; }(); // expected-error {{control may reach end of non-void block}} + ^ (void) { if (j) return 1; }(); // expected-error {{non-void block does not return a value in all control paths}} } diff --git a/clang/test/Sema/block-return-3.c b/clang/test/Sema/block-return-3.c --- a/clang/test/Sema/block-return-3.c +++ b/clang/test/Sema/block-return-3.c @@ -1,5 +1,5 @@ // RUN: %clang_cc1 -fsyntax-only %s -verify -fblocks void foo() { - ^ int (void) { }(); // expected-error {{control reaches end of non-void block}} + ^ int (void) { }(); // expected-error {{non-void block does not return a value}} } diff --git a/clang/test/Sema/freemain.c b/clang/test/Sema/freemain.c --- a/clang/test/Sema/freemain.c +++ b/clang/test/Sema/freemain.c @@ -6,4 +6,4 @@ void* main(void* context, long size) { if (context) return allocate(size); -} // expected-warning {{control may reach end of non-void function}} +} // expected-warning {{non-void function does not return a value in all control paths}} diff --git a/clang/test/Sema/return.c b/clang/test/Sema/return.c --- a/clang/test/Sema/return.c +++ b/clang/test/Sema/return.c @@ -17,7 +17,7 @@ } int test1() { -} // expected-warning {{control reaches end of non-void function}} +} // expected-warning {{non-void function does not return a value}} int test2() { a: goto a; @@ -26,7 +26,7 @@ int test3() { goto a; a: ; -} // expected-warning {{control reaches end of non-void function}} +} // expected-warning {{non-void function does not return a value}} void halt() { @@ -54,11 +54,11 @@ int test7() { unknown(); -} // expected-warning {{control reaches end of non-void function}} +} // expected-warning {{non-void function does not return a value}} int test8() { (void)(1 + unknown()); -} // expected-warning {{control reaches end of non-void function}} +} // expected-warning {{non-void function does not return a value}} int halt3() __attribute__((noreturn)); @@ -68,11 +68,11 @@ int test10() { (void)(unknown() || halt3()); -} // expected-warning {{control may reach end of non-void function}} +} // expected-warning {{non-void function does not return a value in all control paths}} int test11() { (void)(unknown() && halt3()); -} // expected-warning {{control may reach end of non-void function}} +} // expected-warning {{non-void function does not return a value in all control paths}} int test12() { (void)(halt3() || unknown()); @@ -84,27 +84,27 @@ int test14() { (void)(1 || unknown()); -} // expected-warning {{control reaches end of non-void function}} +} // expected-warning {{non-void function does not return a value}} int test15() { (void)(0 || unknown()); -} // expected-warning {{control reaches end of non-void function}} +} // expected-warning {{non-void function does not return a value}} int test16() { (void)(0 && unknown()); -} // expected-warning {{control reaches end of non-void function}} +} // expected-warning {{non-void function does not return a value}} int test17() { (void)(1 && unknown()); -} // expected-warning {{control reaches end of non-void function}} +} // expected-warning {{non-void function does not return a value}} int test18() { (void)(unknown_nohalt() && halt3()); -} // expected-warning {{control may reach end of non-void function}} +} // expected-warning {{non-void function does not return a value in all control paths}} int test19() { (void)(unknown_nohalt() && unknown()); -} // expected-warning {{control reaches end of non-void function}} +} // expected-warning {{non-void function does not return a value}} int test20() { int i; @@ -112,7 +112,7 @@ return 0; else if (0) return 2; -} // expected-warning {{control may reach end of non-void function}} +} // expected-warning {{non-void function does not return a value in all control paths}} int test21() { int i; @@ -125,7 +125,7 @@ int test22() { int i; switch (i) default: ; -} // expected-warning {{control reaches end of non-void function}} +} // expected-warning {{non-void function does not return a value}} int test23() { int i; @@ -135,7 +135,7 @@ case 2: return 2; } -} // expected-warning {{control may reach end of non-void function}} +} // expected-warning {{non-void function does not return a value in all control paths}} int test24() { int i; @@ -155,7 +155,7 @@ int test26() { 0 ? halt3() : unknown(); -} // expected-warning {{control reaches end of non-void function}} +} // expected-warning {{non-void function does not return a value}} int j; void (*fptr)() __attribute__((noreturn)); @@ -231,19 +231,19 @@ // Test that 'static inline' functions are only analyzed for CFG-based warnings // when they are used. -static inline int si_has_missing_return() {} // expected-warning{{control reaches end of non-void function}} -static inline int si_has_missing_return_2() {}; // expected-warning{{control reaches end of non-void function}} +static inline int si_has_missing_return() {} // expected-warning{{non-void function does not return a value}} +static inline int si_has_missing_return_2() {}; // expected-warning{{non-void function does not return a value}} static inline int si_forward(); static inline int si_has_missing_return_3(int x) { if (x) return si_has_missing_return_3(x+1); -} // expected-warning{{control may reach end of non-void function}} +} // expected-warning{{non-void function does not return a value in all control paths}} int test_static_inline(int x) { si_forward(); return x ? si_has_missing_return_2() : si_has_missing_return_3(x); } -static inline int si_forward() {} // expected-warning{{control reaches end of non-void function}} +static inline int si_forward() {} // expected-warning{{non-void function does not return a value}} // Test warnings on ignored qualifiers on return types. const int ignored_c_quals(); // expected-warning{{'const' type qualifier on return type has no effect}} @@ -319,7 +319,7 @@ default: break; } -} // expected-warning {{control may reach end of non-void function}} +} // expected-warning {{non-void function does not return a value in all control paths}} // sizeof(long) test. int sizeof_long() { @@ -338,4 +338,4 @@ }); else return 0; -} // no-warning (used to be "control may reach end of non-void function") +} // no-warning (used to be "non-void function does not return a value in all control paths") diff --git a/clang/test/SemaCXX/attr-noreturn.cpp b/clang/test/SemaCXX/attr-noreturn.cpp --- a/clang/test/SemaCXX/attr-noreturn.cpp +++ b/clang/test/SemaCXX/attr-noreturn.cpp @@ -10,7 +10,7 @@ int &test1() { a.nofail(); - } // expected-warning {{control reaches end of non-void function}} + } // expected-warning {{non-void function does not return a value}} int &test2() { a.fail(); diff --git a/clang/test/SemaCXX/coreturn.cpp b/clang/test/SemaCXX/coreturn.cpp --- a/clang/test/SemaCXX/coreturn.cpp +++ b/clang/test/SemaCXX/coreturn.cpp @@ -88,12 +88,12 @@ int test2() { co_await a; -} // expected-warning {{control reaches end of coroutine; which is undefined behavior because the promise type 'std::experimental::coroutine_traits::promise_type' (aka 'promise_int') does not declare 'return_void()'}} +} // expected-warning {{non-void coroutine does not return a value}} int test2a(bool b) { if (b) co_return 42; -} // expected-warning {{control may reach end of coroutine; which is undefined behavior because the promise type 'std::experimental::coroutine_traits::promise_type' (aka 'promise_int') does not declare 'return_void()'}} +} // expected-warning {{non-void coroutine does not return a value in all control paths}} int test3() { co_await a; @@ -107,12 +107,12 @@ void test5(int) { co_await a; -} // expected-warning {{control reaches end of coroutine; which is undefined behavior because}} +} // expected-warning {{non-void coroutine does not return a value}} void test6(int x) { if (x) co_return 42; -} // expected-warning {{control may reach end of coroutine; which is undefined behavior because}} +} // expected-warning {{non-void coroutine does not return a value in all control paths}} void test7(int y) { if (y) @@ -132,9 +132,9 @@ VoidTagReturnValue test10() { co_await a; -} // expected-warning {{control reaches end of coroutine}} +} // expected-warning {{non-void coroutine does not return a value}} VoidTagReturnValue test11(bool b) { if (b) co_return 42; -} // expected-warning {{control may reach end of coroutine}} +} // expected-warning {{non-void coroutine does not return a value in all control paths}} diff --git a/clang/test/SemaCXX/return-noreturn.cpp b/clang/test/SemaCXX/return-noreturn.cpp --- a/clang/test/SemaCXX/return-noreturn.cpp +++ b/clang/test/SemaCXX/return-noreturn.cpp @@ -26,7 +26,7 @@ } int f2_positive(int x) { switch (x) { default: ; } - } // expected-warning {{control reaches end of non-void function}} + } // expected-warning {{non-void function does not return a value}} int f3(int x) { switch (x) { default: { pr6884_abort_struct(); } } } @@ -46,7 +46,7 @@ pr6884_abort_struct *p = new pr6884_abort_struct(); delete p; } - } // expected-warning {{control reaches end of non-void function}} + } // expected-warning {{non-void function does not return a value}} // Test that these constructs work even when extraneous blocks are created // before and after the switch due to implicit destructors. @@ -61,7 +61,7 @@ int g2_positive(int x) { other o; switch (x) { default: ; } - } // expected-warning {{control reaches end of non-void function}} + } // expected-warning {{non-void function does not return a value}} int g3(int x) { other o; switch (x) { default: { pr6884_abort_struct(); } } @@ -140,7 +140,7 @@ default: break; } -} // expected-warning {{control reaches end of non-void function}} +} // expected-warning {{non-void function does not return a value}} void PR9412_f() { PR9412_t(); // expected-note {{in instantiation of function template specialization 'PR9412_t' requested here}} @@ -165,7 +165,7 @@ int testTernaryStaticallyConditionalRetrunOnTrue() { true ? Return() : NoReturn(); -} // expected-warning {{control reaches end of non-void function}} +} // expected-warning {{non-void function does not return a value}} int testTernaryStaticallyConditionalNoretrunOnFalse() { false ? Return() : NoReturn(); @@ -173,23 +173,23 @@ int testTernaryStaticallyConditionalRetrunOnFalse() { false ? NoReturn() : Return(); -} // expected-warning {{control reaches end of non-void function}} +} // expected-warning {{non-void function does not return a value}} int testTernaryConditionalNoreturnTrueBranch(bool value) { value ? (NoReturn() || NoReturn()) : Return(); -} // expected-warning {{control may reach end of non-void function}} +} // expected-warning {{non-void function does not return a value in all control paths}} int testTernaryConditionalNoreturnFalseBranch(bool value) { value ? Return() : (NoReturn() || NoReturn()); -} // expected-warning {{control may reach end of non-void function}} +} // expected-warning {{non-void function does not return a value in all control paths}} int testConditionallyExecutedComplexTernaryTrueBranch(bool value) { value || (true ? NoReturn() : true); -} // expected-warning {{control may reach end of non-void function}} +} // expected-warning {{non-void function does not return a value in all control paths}} int testConditionallyExecutedComplexTernaryFalseBranch(bool value) { value || (false ? true : NoReturn()); -} // expected-warning {{control may reach end of non-void function}} +} // expected-warning {{non-void function does not return a value in all control paths}} int testStaticallyExecutedLogicalOrBranch() { false || NoReturn(); @@ -201,19 +201,19 @@ int testStaticallySkippedLogicalOrBranch() { true || NoReturn(); -} // expected-warning {{control reaches end of non-void function}} +} // expected-warning {{non-void function does not return a value}} int testStaticallySkppedLogicalAndBranch() { false && NoReturn(); -} // expected-warning {{control reaches end of non-void function}} +} // expected-warning {{non-void function does not return a value}} int testConditionallyExecutedComplexLogicalBranch(bool value) { value || (true && NoReturn()); -} // expected-warning {{control may reach end of non-void function}} +} // expected-warning {{non-void function does not return a value in all control paths}} int testConditionallyExecutedComplexLogicalBranch2(bool value) { (true && value) || (true && NoReturn()); -} // expected-warning {{control may reach end of non-void function}} +} // expected-warning {{non-void function does not return a value in all control paths}} int testConditionallyExecutedComplexLogicalBranch3(bool value) { (false && (Return() || true)) || (true && NoReturn()); @@ -236,7 +236,7 @@ int bar() { X work([](){ Fatal(); }); foo(); - } // expected-warning {{control reaches end of non-void function}} + } // expected-warning {{non-void function does not return a value}} int baz() { FatalCopy fc; @@ -250,12 +250,12 @@ int functionTryBlock1(int s) try { return 0; } catch (...) { -} // expected-warning {{control may reach end of non-void function}} +} // expected-warning {{non-void function does not return a value in all control paths}} int functionTryBlock2(int s) try { } catch (...) { return 0; -} // expected-warning {{control may reach end of non-void function}} +} // expected-warning {{non-void function does not return a value in all control paths}} int functionTryBlock3(int s) try { return 0; diff --git a/clang/test/SemaCXX/warn-missing-noreturn.cpp b/clang/test/SemaCXX/warn-missing-noreturn.cpp --- a/clang/test/SemaCXX/warn-missing-noreturn.cpp +++ b/clang/test/SemaCXX/warn-missing-noreturn.cpp @@ -91,7 +91,7 @@ int rdar8875247_test() { rdar8875247 f; -} // expected-warning{{control reaches end of non-void function}} +} // expected-warning{{non-void function does not return a value}} struct rdar8875247_B { rdar8875247_B(); diff --git a/clang/test/SemaTemplate/late-parsing-eager-instantiation.cpp b/clang/test/SemaTemplate/late-parsing-eager-instantiation.cpp --- a/clang/test/SemaTemplate/late-parsing-eager-instantiation.cpp +++ b/clang/test/SemaTemplate/late-parsing-eager-instantiation.cpp @@ -15,8 +15,8 @@ char data() { visit([](auto buffer) -> char { // expected-note {{in instantiation}} buffer->data(); - }); // expected-warning {{control reaches end of non-void lambda}} - } // expected-warning {{control reaches end of non-void function}} + }); // expected-warning {{non-void lambda does not return a value}} + } // expected-warning {{non-void function does not return a value}} }; // pr34185