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.

Reply via email to