Quantcast
Channel: Active questions tagged gcc - Stack Overflow
Viewing all articles
Browse latest Browse all 22057

Why is the result type of a sum of two unsigned integers different in Clang and GCC

$
0
0

I am writing some low level code for my emulator which involves a lot of 16 and 8 bit unsigned integers. I enabled -Wconversion warning in my project and all warnings are considered as errors (-Werror).

Consider this code snippet:

#include <cstdint>int main (){    uint16_t a = 4;    uint16_t b = 6;    uint16_t c = a + b;}

Until GCC 9.3 with -std=c++17 -Wconversion -Werror as compilation flags, gives the following error:

<source>: In function 'int main()':<source>:7:20: error: conversion from 'int' to 'uint16_t' {aka 'short unsigned int'} may change value [-Werror=conversion]    7 |     uint16_t c = a + b;      |                  ~~^~~

But the same code does not give this error for GCC 10.1, and for any compiler version of Clang (Tested it until Clang 5.0.0). Link to compiler explorer.

So my questions are the following:

  • IMO, addition of two unsigned ints should not be implicitly converted to an int. Or is my assumption wrong?
  • Why Clang and GCC(until 9.3) produce different results? Does the standard stipulate any constraints on this operation or is it up to the compiler vendor to decide?
  • What changed in GCC 10.1? Why is this error not popping up for GCC 10.1?

Viewing all articles
Browse latest Browse all 22057

Trending Articles