https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80346
Paolo Bonzini <bonzini at gnu dot org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |bonzini at gnu dot org --- Comment #4 from Paolo Bonzini <bonzini at gnu dot org> --- The beautified code should be something like this: #include <stddef.h> void *g_malloc0(size_t n) __attribute__((__alloc_size__(1))); void *g_malloc0_n(size_t n, size_t s) __attribute__((__alloc_size__(1, 2))); unsigned *f (int length) { int tables_nr = (length - 24) / sizeof(unsigned); if (tables_nr <= 0) return NULL; return (unsigned *) (__extension__ ({ size_t n = tables_nr; size_t s = sizeof (unsigned); void *p; if (s == 1) p = g_malloc0 (n); else if (__builtin_constant_p (n) && (s == 0 || n <= ((size_t)-1) / s)) p = g_malloc0 (n * s); else p = g_malloc0_n (n, s); p; })); } > __s is non-zero, and __n is equal to SIZE_MAX n is not constant at the g_malloc0_n call site, so I'm not sure what deduction can be made.