1 // RUN: %check_clang_tidy %s bugprone-assignment-in-if-condition %t
2
f(int arg)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
f1(int arg)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
f2(int arg)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
f3(int arg)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
f4(int arg)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;
operator =(const int & val)57 int operator=(const int &val) {
58 d = val + 1;
59 return d;
60 }
61 };
62
f5(int arg)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.
awesome_f2(int arg)84 void awesome_f2(int arg) {
85 int f = 3;
86 if ((f == arg) || (f == (arg + 1))) {
87 f = 5;
88 }
89 }
90
awesome_f3(int arg)91 void awesome_f3(int arg) {
92 int f = 3;
93 if (f == arg) {
94 f = 5;
95 }
96 }
97
awesome_f4(int arg)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
exec(Func F)105 template <typename Func> bool exec(Func F) { return F(); }
106
lambda_if()107 void lambda_if() {
108 int X;
109 if ([&X] {
110 X = 5;
111 return true;
112 }()) {
113 }
114
115 if (exec([&] {
116 X = 5;
117 return true;
118 })) {
119 }
120 }
121