1// RUN: %check_clang_tidy %s readability-avoid-return-with-void-value %t
2// RUN: %check_clang_tidy -check-suffixes=,INCLUDE-MACROS %s readability-avoid-return-with-void-value %t \
3// RUN: -- -config="{CheckOptions: [{key: readability-avoid-return-with-void-value.IgnoreMacros, value: false}]}" \
4// RUN: --
5// RUN: %check_clang_tidy -check-suffixes=LENIENT %s readability-avoid-return-with-void-value %t \
6// RUN: -- -config="{CheckOptions: [{key: readability-avoid-return-with-void-value.StrictMode, value: false}]}" \
7// RUN: --
8
9void f1();
10
11void f2() {
12 return f1();
13 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: return statement within a void function should not have a specified return value [readability-avoid-return-with-void-value]
14 // CHECK-MESSAGES-LENIENT: :[[@LINE-2]]:5: warning: return statement within a void function should not have a specified return value [readability-avoid-return-with-void-value]
15 // CHECK-FIXES: f1();
16}
17
18void f3(bool b) {
19 if (b) return f1();
20 // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: return statement within a void function should not have a specified return value [readability-avoid-return-with-void-value]
21 // CHECK-FIXES: if (b) { f1(); return;
22 // CHECK-NEXT: }
23 return f2();
24 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: return statement within a void function should not have a specified return value [readability-avoid-return-with-void-value]
25 // CHECK-MESSAGES-LENIENT: :[[@LINE-2]]:5: warning: return statement within a void function should not have a specified return value [readability-avoid-return-with-void-value]
26 // CHECK-FIXES: f2();
27 // CHECK-FIXES-LENIENT: f2();
28}
29
30template<class T>
31T f4() {}
32
33void f5() {
34 { return f4<void>(); }
35 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: return statement within a void function should not have a specified return value [readability-avoid-return-with-void-value]
36 // CHECK-MESSAGES-LENIENT: :[[@LINE-2]]:7: warning: return statement within a void function should not have a specified return value [readability-avoid-return-with-void-value]
37 // CHECK-FIXES: { f4<void>(); return; }
38 // CHECK-FIXES-LENIENT: { f4<void>(); return; }
39}
40
41void f6() { return; }
42
43int f7() { return 1; }
44
45int f8() { return f7(); }
46
47void f9() {
48 return (void)f7();
49 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: return statement within a void function should not have a specified return value [readability-avoid-return-with-void-value]
50 // CHECK-MESSAGES-LENIENT: :[[@LINE-2]]:5: warning: return statement within a void function should not have a specified return value [readability-avoid-return-with-void-value]
51 // CHECK-FIXES: (void)f7();
52 // CHECK-FIXES-LENIENT: (void)f7();
53}
54
55#define RETURN_VOID return (void)1
56
57void f10() {
58 RETURN_VOID;
59 // CHECK-MESSAGES-INCLUDE-MACROS: :[[@LINE-1]]:5: warning: return statement within a void function should not have a specified return value [readability-avoid-return-with-void-value]
60}
61
62template <typename A>
63struct C {
64 C(A) {}
65};
66
67template <class T>
68C<T> f11() { return {}; }
69
70using VOID = void;
71
72VOID f12();
73
74VOID f13() {
75 return f12();
76 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: return statement within a void function should not have a specified return value [readability-avoid-return-with-void-value]
77 // CHECK-MESSAGES-LENIENT: :[[@LINE-2]]:5: warning: return statement within a void function should not have a specified return value [readability-avoid-return-with-void-value]
78 // CHECK-FIXES: f12(); return;
79 // CHECK-FIXES-LENIENT: f12(); return;
80 (void)1;
81}
82
83void f14() {
84 return /* comment */ f1() /* comment */ ;
85 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: return statement within a void function should not have a specified return value [readability-avoid-return-with-void-value]
86 // CHECK-MESSAGES-LENIENT: :[[@LINE-2]]:5: warning: return statement within a void function should not have a specified return value [readability-avoid-return-with-void-value]
87 // CHECK-FIXES: /* comment */ f1() /* comment */ ; return;
88 // CHECK-FIXES-LENIENT: /* comment */ f1() /* comment */ ; return;
89 (void)1;
90}
91
92void f15() {
93 return/*comment*/f1()/*comment*/;//comment
94 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: return statement within a void function should not have a specified return value [readability-avoid-return-with-void-value]
95 // CHECK-MESSAGES-LENIENT: :[[@LINE-2]]:5: warning: return statement within a void function should not have a specified return value [readability-avoid-return-with-void-value]
96 // CHECK-FIXES: /*comment*/f1()/*comment*/; return;//comment
97 // CHECK-FIXES-LENIENT: /*comment*/f1()/*comment*/; return;//comment
98 (void)1;
99}
100
101void f16(bool b) {
102 if (b) return f1();
103 // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: return statement within a void function should not have a specified return value [readability-avoid-return-with-void-value]
104 // CHECK-FIXES: if (b) { f1(); return;
105 // CHECK-NEXT: }
106 else return f2();
107 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: return statement within a void function should not have a specified return value [readability-avoid-return-with-void-value]
108 // CHECK-FIXES: else { f2(); return;
109 // CHECK-NEXT: }
110}
111

source code of clang-tools-extra/test/clang-tidy/checkers/readability/avoid-return-with-void-value.cpp