mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 20:06:05 +00:00
[Diagnostics] Try to improve warning message for -Wreturn-type
Summary: I agree with https://easyaspi314.github.io/gcc-vs-clang.html?fbclid=IwAR1VA0qxiWVUusOQUv5z7JESS7ZpeJy-UqAI5mnJscofGLqXcqeErIUB2gU, current warning message is not very good. We should try to improve it.. Reviewers: rsmith, aaron.ballman, easyaspi314 Reviewed By: aaron.ballman Subscribers: arphaman, Quuxplusone, mehdi_amini, hiraditya, cfe-commits, llvm-commits Tags: #clang, #llvm Differential Revision: https://reviews.llvm.org/D69762
This commit is contained in:
parent
9434360401
commit
1da13237a4
@ -575,21 +575,22 @@ def err_thread_non_global : Error<
|
||||
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<ReturnType>;
|
||||
def warn_falloff_nonvoid_function : Warning<
|
||||
"control reaches end of non-void function">,
|
||||
"non-void function does not return a value">,
|
||||
InGroup<ReturnType>;
|
||||
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<ReturnType>;
|
||||
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<ReturnType>;
|
||||
def warn_suggest_noreturn_function : Warning<
|
||||
"%select{function|method}0 %1 could be declared with attribute 'noreturn'">,
|
||||
@ -6858,10 +6859,10 @@ let CategoryName = "Lambda Issue" in {
|
||||
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<ReturnType>;
|
||||
def warn_falloff_nonvoid_lambda : Warning<
|
||||
"control reaches end of non-void lambda">,
|
||||
"non-void lambda does not return a value">,
|
||||
InGroup<ReturnType>;
|
||||
def err_access_lambda_capture : Error<
|
||||
// The ERRORs represent other special members that aren't constructors, in
|
||||
|
@ -235,7 +235,7 @@ public:
|
||||
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();
|
||||
|
@ -5,5 +5,5 @@ int foo() {
|
||||
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}}
|
||||
|
||||
|
@ -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}}
|
||||
|
@ -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
|
||||
|
@ -29,7 +29,7 @@ int f0() {}
|
||||
// CHECK: <key>column</key>
|
||||
// CHECK: <integer>11</integer>
|
||||
// CHECK: <key>message</key>
|
||||
// CHECK: <string>control reaches end of non-void function</string>
|
||||
// CHECK: <string>non-void function does not return a value</string>
|
||||
// CHECK: </dict>
|
||||
// CHECK: </array>
|
||||
// CHECK: </dict>
|
||||
|
@ -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
|
||||
|
@ -9,10 +9,10 @@ int *bar(float *f) { return f; }
|
||||
// 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:
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -12,11 +12,11 @@ typedef struct my_struct_type *my_struct_ref;
|
||||
|
||||
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;
|
||||
|
||||
|
@ -20,8 +20,8 @@ class ArrayBuffer {
|
||||
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
|
||||
|
@ -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}}
|
||||
}
|
||||
|
@ -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}}
|
||||
}
|
||||
|
@ -6,4 +6,4 @@ void* allocate(long size);
|
||||
|
||||
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}}
|
||||
|
@ -17,7 +17,7 @@ void test0() {
|
||||
}
|
||||
|
||||
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 test2() {
|
||||
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 unknown_nohalt() {
|
||||
|
||||
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 test9() {
|
||||
|
||||
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 test13() {
|
||||
|
||||
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 @@ int test20() {
|
||||
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 test21() {
|
||||
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 @@ int test23() {
|
||||
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 test25() {
|
||||
|
||||
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 @@ void test33() {
|
||||
|
||||
// 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 @@ int PR19074_positive(int x) {
|
||||
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 @@ int return_statement_expression() {
|
||||
});
|
||||
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")
|
||||
|
@ -10,7 +10,7 @@ namespace test5 {
|
||||
|
||||
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();
|
||||
|
@ -88,12 +88,12 @@ float test1() { co_await a; }
|
||||
|
||||
int test2() {
|
||||
co_await a;
|
||||
} // expected-warning {{control reaches end of coroutine; which is undefined behavior because the promise type 'std::experimental::coroutine_traits<int>::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<int, bool>::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 @@ int test4() {
|
||||
|
||||
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 @@ VoidTagReturnVoid test9(bool b) {
|
||||
|
||||
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}}
|
||||
|
@ -26,7 +26,7 @@ namespace abort_struct_complex_cfgs {
|
||||
}
|
||||
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 @@ namespace abort_struct_complex_cfgs {
|
||||
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 @@ namespace abort_struct_complex_cfgs {
|
||||
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 @@ template <PR9412_MatchType type> int PR9412_t() {
|
||||
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<PR9412_Exact>(); // expected-note {{in instantiation of function template specialization 'PR9412_t<PR9412_Exact>' requested here}}
|
||||
@ -165,7 +165,7 @@ int testTernaryStaticallyConditionalNoretrunOnTrue() {
|
||||
|
||||
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 testTernaryStaticallyConditionalNoretrunOnFalse() {
|
||||
|
||||
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 testStaticallyExecutedLogicalAndBranch() {
|
||||
|
||||
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 @@ namespace LambdaVsTemporaryDtor {
|
||||
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 @@ namespace LambdaVsTemporaryDtor {
|
||||
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;
|
||||
|
@ -91,7 +91,7 @@ void rdar8875247_aux();
|
||||
|
||||
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();
|
||||
|
@ -15,8 +15,8 @@ class ArrayBuffer {
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user