http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47504

           Summary: some constexpr calculations erroneously overflow when
                    using negative numbers
           Product: gcc
           Version: 4.6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: yacw...@gmail.com
            Target: x86_64-unknown-linux-gnu


Created attachment 23148
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=23148
overflow.cpp

Easiest to describe via code:

overflow.cpp
=================================================
char constexpr sub(char arg)
  { return char(arg - char(1)); }

int main()
  { static char constexpr m = sub(-1); }
=================================================
g++ overflow.cpp --std=c++0x
=================================================
overflow.cpp: In function ‘int main()’:
overflow.cpp:5:36: error: overflow in constant expression [-fpermissive]

This is simply attempting to subtract 1 from -1, using "char"s.
I cannot see any reason why this should trigger an overflow error.
I have attempted to cast every intermediate state to char to avoid any
unintended casts.
The code is as simple as I could get it while still triggering the seemingly
erroneous overflow.

Compiles OK using int instead of char. (int can still erroneously overflow in
other circumstances, though. Would examples be useful?).
Compiles OK using 1 instead of -1.
Compiles OK using a literal -1 instead of a parameter.
Compiles OK if main()::m isn't constexpr.

Attached source code, but it's probably easier to just copy/paste the above.


SPECS:
gcc: version 4.6.0 2010-12-30 (experimental) (svn = 168358)
 - manually patched by
(http://gcc.gnu.org/ml/gcc-patches/2007-04/msg00620.html)
 - patch shouldn't have any effect here.
ubuntu: 10.10 (64 bit)
intel: core2 duo

Are any other specs relevant here, such as GMP. (Note: my GMP is the standard
one).


I searched other constexpr bugs here - AFAIK none appear to be about overflow.

Reply via email to