https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62074
Bug ID: 62074 Summary: "right shift count >= width of type" warning on dead branch in template code Product: gcc Version: 4.10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: brooks at gcc dot gnu.org Consider the following code: ------------------cut here--------------------- typedef unsigned int uint32; template <uint32 offset> int foo(uint32 x) { if (offset <= 1) { return x << offset; } else { // this branch is dead for offset = 0, but it still generates a warning return (x << (offset - 1)) + (x >> (32 - offset)); } } int main(int argc, char** argv) { return foo<0>(argc); } ------------------cut here--------------------- As noted in the comment, the "else" branch is dead code for the offset=0 instantiation, but (at r213772 on trunk) we still generate warnings for the shifts that are out of range in the offset=0 case: $ /home/bmoses/gcc-archive/213772/bin/g++ b16825807.cc -o b16825807 b16825807.cc: In instantiation of ‘int foo(uint32) [with unsigned int offset = 0u; uint32 = unsigned int]’: b16825807.cc:15:21: required from here b16825807.cc:9:15: warning: left shift count >= width of type return (x << (offset - 1)) + ^ b16825807.cc:10:15: warning: right shift count >= width of type (x >> (32 - offset)); ^ (This is also present in the google/gcc-4_9 branch, and thus I suspect present on upstream 4.9.1 although I have not yet tested it.) Google bug: 16825807