Quuxplusone added a comment. > Can we either emit that [`a &= foo()`] as a suggestion if the code looks like > `a = a & foo()`? Or simply not emit a warning?
The problem is that if `a` is boolean, then `a = a & something` is 99% for sure a typo — 99% of the time, the programmer meant `a = a && something`. So any compiler suggestion or fixit that blindly "doubles down" on the non-short-circuiting behavior is a bad idea. https://quuxplusone.github.io/blog/2020/09/02/wparentheses/ is relevant. One proper way to silence the warning //without// short-circuiting would be `a = int(a) & something` — this indicates that you really do want integer bitwise-ANDing, not boolean. Alternatively, and probably best, just declare `a` as an integer variable to begin with. Of course the compiler cannot recommend this if `something` isn't strictly zero or one. But in that case you might already have a bug: int error_returning_func() { return 2; } int main() { bool t = true; t = t && error_returning_func(); assert(t); // still true t = t & error_returning_func(); assert(!t); // now it's false } So typo'ing `&` for `&&` doesn't just turn off short-circuiting — it can also mess up the runtime value stored in the bool. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D108003/new/ https://reviews.llvm.org/D108003 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits