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

            Bug ID: 70389
           Summary: uint_16t left shift with -Wconversion produces
                    incorrect warning
           Product: gcc
           Version: 4.8.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: bobgmeyers at muchomail dot com
  Target Milestone: ---

This code:

int
main(void){
  uint16_t x;

  x=5;
  do{
    x<<=1U;
    x++;
  }while(1);
}

The code obviously outputs nothing, but this is just an example of this bug
which happens in every case as described below.

with -Wconversion it produces:

warning: conversion to ‘uint16_t’ from ‘int’ may alter its value [-Wconversion]
     x<<=1U;

How on earth could x<<1U end up being an int? x isn't signed and 1U isn't
signed (and according to the spec, the type of 1U is not relevant to the type
of x<<1U). I tried uint32_t and the error went away, so it looks like a problem
with uint16_t. Right shift is also OK.

Might relate to:

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

Reply via email to