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

            Bug ID: 89807
           Summary: Incorrect -Wconversion warning when shifting uint32_t
                    with 24
           Product: gcc
           Version: 8.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: nbkolchin at gmail dot com
  Target Milestone: ---

https://godbolt.org/z/x2vI6l

Sample code:

#include <stdint.h>

int test(uint32_t v)
{
    uint8_t a = (v >> 24) & 0xFF; // ERROR: produces warning
    uint8_t a2 = v >> 24; // ERROR: produces warning
    uint8_t b = (v >> 16) & 0xFF; // OK 
    uint8_t c = (v >> 8) & 0xFF; // OK
    uint8_t d = v & 0xFF; // OK
    return a + a2 + b + c + d;
}

Compile with -Werror=conversion:

<source>: In function 'test':

<source>:5:17: error: conversion from 'uint32_t' {aka 'unsigned int'} to
'uint8_t' {aka 'unsigned char'} may change value [-Werror=conversion]

    5 |     uint8_t a = (v >> 24) & 0xFF;

      |                 ^

<source>:6:18: error: conversion from 'uint32_t' {aka 'unsigned int'} to
'uint8_t' {aka 'unsigned char'} may change value [-Werror=conversion]

    6 |     uint8_t a2 = v >> 24;

      |                  ^

cc1: some warnings being treated as errors

Compiler returned: 1

P.S. Clang compiles this code without warnings.

Reply via email to