http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47679
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> 2011-02-10 16:29:18 UTC --- Changing boost slightly: template<class OptionalPointee> inline bool equal_pointees2 (OptionalPointee const& x, OptionalPointee const& y ) { - return (!x) != (!y) ? false : ( !x ? true : (*x) == (*y) ) ; + if (!x && !y) return true; + if (!x || !y) return false; + return (*x) == (*y); } makes the warning go away, then the predicate aware uninit analysis figures things out. But the generated code for this testcase is then 3 bytes longer (though, same number of insns).