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

Reply via email to