On 10/30/2013 08:34 AM, Ondřej Bílka wrote: >> > The reasons of adding builtins is performance. Without that one can > write a simple template to generically check overflows like > > template <class C> class overflow { > public: > C val; > overflow <C> operator + (overflow <C> &y) { > overflow <C> ret; > if (val > 0 && y.val > 0 && val + y.val < val) > throw std::overflow_error(); > /* ... */ > ret.val = val + y.val; > return ret; > } > /* ... */ > };
How is that going to work? The compiler can simply eliminate this line: if (val > 0 && y.val > 0 && val + y.val < val) throw std::overflow_error(); because it knows that the guard is always false. I suppose it could be compiled with -fwrapv. Andrew.