https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88401

            Bug ID: 88401
           Summary: -Wshift-overflow only works for const variables
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: skvadrik at gmail dot com
  Target Milestone: ---

Consider this program (1.cc):


#include <stdint.h>

void foo ()
{
  int32_t x = -32768;
  x << 31;

  const int32_t y = -32768;
  y << 31;
}


GCC detects shift overflow on y, but not on x:

$ g++ -c 1.cc -Wshift-overflow=2 --std=c++11 -O3
1.cc: In function ‘void foo()’:
1.cc:9:5: warning: result of ‘(-32768 << 31)’ requires 47 bits to represent,
but ‘int’ only has 32 bits [-Wshift-overflow=]
   y << 31;
   ~~^~~~~


It seems that very basic constant propagation would deduce x = -32768.

Reply via email to