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
9 void f1();
10
f2()11 void 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
f3(bool b)18 void 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
30 template<class T>
f4()31 T f4() {}
32
f5()33 void 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
f6()41 void f6() { return; }
42
f7()43 int f7() { return 1; }
44
f8()45 int f8() { return f7(); }
46
f9()47 void 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
f10()57 void 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
62 template <typename A>
63 struct C {
CC64 C(A) {}
65 };
66
67 template <class T>
f11()68 C<T> f11() { return {}; }
69
70 using VOID = void;
71
72 VOID f12();
73
f13()74 VOID 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
f14()83 void 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
f15()92 void 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
f16(bool b)101 void 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