xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/bugprone/assignment-in-if-condition.cpp (revision 32d88239ae654239f16b516ee81ee9ff88b0ce07)
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