http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57555
Bug ID: 57555 Summary: Warning on negation of constexpr uint8_t being assigned to uint8_t Product: gcc Version: 4.7.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: megari at mbnet dot fi The following code produces a warning when it probably should not: $ cat constexprbug.cpp #include <cstdint> uint8_t foo() { static constexpr uint8_t foo = 0xff; uint8_t ret = ~foo; return ret; } uint8_t bar() { static constexpr uint8_t foo = 0x00; uint8_t ret = ~foo; return ret; } int main() { foo(); bar(); } $ g++ -std=c++11 -o constexprbug constexprbug.cpp constexprbug.cpp: In function ‘uint8_t foo()’: constexprbug.cpp:6:20: warning: large integer implicitly truncated to unsigned type [-Woverflow] $ gcc --version gcc (GCC) 4.7.2 20120921 (Red Hat 4.7.2-2) Copyright (C) 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. The curious thing is that only the function foo() produces the warning. Also, the variable needs to be constexpr for the warning to be emitted.