1 | // RUN: %check_clang_tidy %s bugprone-assignment-in-if-condition %t |
2 | |
3 | void f(int arg) { |
4 | int f = 3; |
5 | if ((f = arg) || (f == (arg + 1))) |
6 | // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: an assignment within an 'if' condition is bug-prone [bugprone-assignment-in-if-condition] |
7 | { |
8 | f = 5; |
9 | } |
10 | } |
11 | |
12 | void f1(int arg) { |
13 | int f = 3; |
14 | if ((f == arg) || (f = (arg + 1))) |
15 | // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: an assignment within an 'if' condition is bug-prone [bugprone-assignment-in-if-condition] |
16 | { |
17 | f = 5; |
18 | } |
19 | } |
20 | |
21 | void f2(int arg) { |
22 | int f = 3; |
23 | if (f = arg) |
24 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: an assignment within an 'if' condition is bug-prone [bugprone-assignment-in-if-condition] |
25 | { |
26 | f = 5; |
27 | } |
28 | } |
29 | |
30 | volatile int v = 32; |
31 | |
32 | void f3(int arg) { |
33 | int f = 3; |
34 | if ((f == arg) || ((arg + 6 < f) && (f = v))) |
35 | // CHECK-MESSAGES: :[[@LINE-1]]:42: warning: an assignment within an 'if' condition is bug-prone [bugprone-assignment-in-if-condition] |
36 | { |
37 | f = 5; |
38 | } |
39 | } |
40 | |
41 | void f4(int arg) { |
42 | int f = 3; |
43 | if ((f == arg) || ((arg + 6 < f) && ((f = v) || (f < 8)))) |
44 | // CHECK-MESSAGES: :[[@LINE-1]]:43: warning: an assignment within an 'if' condition is bug-prone [bugprone-assignment-in-if-condition] |
45 | { |
46 | f = 5; |
47 | } else if ((arg + 8 < f) && ((f = v) || (f < 8))) |
48 | // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: an assignment within an 'if' condition is bug-prone [bugprone-assignment-in-if-condition] |
49 | { |
50 | f = 6; |
51 | } |
52 | } |
53 | |
54 | class BrokenOperator { |
55 | public: |
56 | int d = 0; |
57 | int operator=(const int &val) { |
58 | d = val + 1; |
59 | return d; |
60 | } |
61 | }; |
62 | |
63 | void f5(int arg) { |
64 | BrokenOperator bo; |
65 | int f = 3; |
66 | bo = f; |
67 | if (bo.d == 3) { |
68 | f = 6; |
69 | } |
70 | if (bo = 3) |
71 | // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: an assignment within an 'if' condition is bug-prone [bugprone-assignment-in-if-condition] |
72 | { |
73 | f = 7; |
74 | } |
75 | if ((arg == 3) || (bo = 6)) |
76 | // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: an assignment within an 'if' condition is bug-prone [bugprone-assignment-in-if-condition] |
77 | { |
78 | f = 8; |
79 | } |
80 | v = f; |
81 | } |
82 | |
83 | // Tests that shouldn't trigger warnings. |
84 | void awesome_f2(int arg) { |
85 | int f = 3; |
86 | if ((f == arg) || (f == (arg + 1))) { |
87 | f = 5; |
88 | } |
89 | } |
90 | |
91 | void awesome_f3(int arg) { |
92 | int f = 3; |
93 | if (f == arg) { |
94 | f = 5; |
95 | } |
96 | } |
97 | |
98 | void awesome_f4(int arg) { |
99 | int f = 3; |
100 | if ((f == arg) || ((arg + 6 < f) && ((f == v) || (f < 8)))) { |
101 | f = 5; |
102 | } |
103 | } |
104 | |
105 | template <typename Func> bool exec(Func F) { return F(); } |
106 | |
107 | void lambda_if() { |
108 | int X; |
109 | if ([&X] { |
110 | X = 5; |
111 | return true; |
112 | }()) { |
113 | } |
114 | |
115 | if (exec(F: [&] { |
116 | X = 5; |
117 | return true; |
118 | })) { |
119 | } |
120 | } |
121 | |