Using built-in specs. Target: mingw32 Configured with: ../gcc-4.3.3/configure --prefix=/mingw --build=mingw32 --enable-languages=c,ada,c++,fortran,objc,obj-c++ --with-bugurl=http://www.tdragon.net/recentgcc/bugs.php --disable-nls --disable-win32-registry --enable-libgomp --disable-werror --enable-threads --disable-symvers --enable-cxx-flags='-fno-function-sections -fno-data-sections' --enable-fully-dynamic-string --enable-version-specific-runtime-libs --enable-sjlj-exceptions --with-pkgversion='4.3.3-tdm-1 mingw32' Thread model: win32 gcc version 4.3.3 (4.3.3-tdm-1 mingw32) The following code produces an incorrect diagnostic "warning: left shift count >= width of type" template <unsigned M, unsigned N> unsigned frob(unsigned q) { if(M > N) return (q << (M-N)); else return (q << (N-M)); } int main() { return frob<3,2> (7U); } This happens at -O0 and -O3, with default warnings. Since I compile with -Werror, this is a minor pain (although it can be worked around easily). Since M and N are template parameters, is it possible for flow analysis to deduce that this is can not actually happen? (The code on which this is based comes from a routine converting between fixed point numbers with different radix position).
*** This bug has been marked as a duplicate of 4210 ***