https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85777
--- Comment #14 from Vincent Lefèvre <vincent-gcc at vinc17 dot net> --- (In reply to Vincent Lefèvre from comment #1) > I've cleaned up the testcase: > > int d; > int h(void); > void e(void) > { > int f[2]; > int g = 0; > if (d) > g++; > if (d == 1) > f[g++] = 2; > (void) (f[0] || (g && h())); > } [...] > but > > cventin% gcc-snapshot -Werror=uninitialized -Werror=maybe-uninitialized -O2 > -c file.c -fsanitize=undefined > cventin% I now get a warning/error as expected: file.c: In function ‘e’: file.c:11:12: error: ‘f[0]’ may be used uninitialized in this function [-Werror=maybe-uninitialized] 11 | (void) (f[0] || (g && h())); | ~^~~ cc1: some warnings being treated as errors with gcc-10 (Debian 10-20200304-1) 10.0.1 20200304 (experimental) [master revision 0b0908c1f27:cb0a7e0ca53:94f7d7ec6ebef49a50da777fd71db3d03ee03aa0]. But here's a new testcase: int foo1 (void); int foo2 (int); int bar (void) { int i; auto void cf (int *t) { foo2 (i); } int t __attribute__ ((cleanup (cf))); t = 0; if (foo1 ()) i = foo1 (); i = ! foo1 () || i; foo2 (i); return 0; } What's strange is that if I change the line i = ! foo1 () || i; to i = foo1 () || i; (i.e. if I just remove the "!", though this shouldn't change anything since GCC does not have any knowledge on what foo1 returns), I get an error as expected: uninit-test.c: In function ‘bar’: uninit-test.c:15:15: error: ‘FRAME.1.i’ may be used uninitialized in this function [-Werror=maybe-uninitialized] 15 | i = foo1 () || i; | ~~~~~~~~^~~~ cc1: some warnings being treated as errors