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