http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54570
--- Comment #9 from Richard Biener <rguenth at gcc dot gnu.org> 2012-10-26 10:32:53 UTC --- Note that attributes on __builtin_object_size are wrong - it is marked as pure which means that struct A { char a[4]; int i; } x; __builtin_object_size (&x, 1) == __builtin_object_size (&x.a[0], 1) this only does not "break" as we fold the individual object size calls to (different) constants before checking whether they are equivalent calls. Same effect if it were const instead of pure.