On Fri, Dec 06, 2024 at 11:15:20AM -0800, Linus Torvalds wrote: > On Fri, 6 Dec 2024 at 11:07, David Laight <David.Laight@xxxxxxxxxx> wrote: > > > > I'm missing the compiler version and options to generate the error. > > Just -Wall with most recent gcc versions seems to do it. At least I > can repro it with gcc-14.2.1 and something silly like this: > > $ cat t.c > int fn(int a) { return (a<<2)?1:2; } > $ gcc -Wall -S t.c > t.c: In function 'fn': > t.c:1:26: warning: '<<' in boolean context, did you mean '<'? > [-Wint-in-bool-context] > > > Does a '+ 0' help? "(var << 2) + 0 ? 0 : 0" > > Yeah, that actually works. > > And "+0" is nice in that it should work in any context. I've already used "+0" to shut certain warnings, I don't really remember which one, but also remember it was OK everywhere I needed. Another trick I've been using to shut up the compiler is a cast via typeof and an intermediary variable: #define shut_up(expr) \ ({ \ typeof(expr) _expr_ = expr; \ _expr_; \ }) int fn1(int a) { return shut_up(a << 2) ? 1 : 2; } int fn2(int a) { return (a << 2) ? 1 : 2; } $ gcc -Wall -S t2.c t2.c: In function 'fn2': t2.c:15:19: warning: '<<' in boolean context, did you mean '<'? [-Wint-in-bool-context] 15 | return (a << 2) ? 1 : 2; | ~~~^~~~~ See ? It only complains on fn2() but not fn1(). Similarly I found it to be quite portable (at least I don't remember seeing it fail on me). It produces the exact same code, except at -O0 where it does really create a local variable. Willy