Re: bool to size_t warning

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 28/08/2019 01:07, Martin Sebor wrote:
On 8/9/19 9:16 PM, Xi Ruoyao wrote:
On 2019-08-09 22:00 +0100, Jonny Grant wrote:

On 09/08/2019 21:55, Maksim Fomin wrote:
‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
On Friday, August 9, 2019 8:32 PM, Jonny Grant <jg@xxxxxxxx> wrote:

Hi
Looks like the bool can't be converted to size_t

Seems a shame it can't also convert to size_t

What is strange in the example below, is I change it only a single
conversion, or as follows, it compiles ok, so there must still be a
conversion?

Is this an issue worth reporting as a PR?

size_t i = a;
i += b;

The C spec states |true|which expands to the integer
constant|1|,|false|which expands to the integer constant|0|

#include<cstddef>

intmain()
{
boola = false;
boolb = true;
//size_t i = a;
size_t i = a + b;

returni;
}

#1 with x86-64 gcc (trunk)
<source>: In function 'int main()':

<source>:9:18: error: conversion to 'size_t' {aka 'long unsigned int'}
from 'int' may change the sign of the result [-Werror=sign-conversion]

      9 |     size_t i = a + b;

        |                ^

cc1plus: some warnings being treated as errors

Compiler returned: 1

Please include my email in any replies
Thanks, Jonny
1. You mention C language but use C++ compiler: #include<cstddef> and
'cc1plus'.

2. You can find answer in C++ language latest draft (
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/n4820.pdf)
[expr.add], [expr.arith.conv], [conv.prom].

TL;DR '+' promotes bools to signed integer which is not compatible with
size_t' {aka 'long unsigned int'}.

You can use  size_t i = a + (size_t)b.


Fair enough. It is a shame the C++ spec didn't allow them to be treated
as signed, or unsigned, they'll certainly never be negative anyway.

"signed bool" does not make sense, I think :).

The problem is that "-Wconversion" and "-Wsigned-conversion" really need some
improvement.

GCC does manage to avoid these warnings for constants that don't
become negative.  It also has enough information to avoid them in
cases when the promotion is from an unsigned type that's narrower
than int, such as unsigned char or unsigned short.  But it doesn't
consider the original type.  Clang implements the same
-Wsign-conversion warning but it doesn't issue it for this case.
I agree that it would make the GCC warning more useful if it
handled these cases gracefully as well.

I would suggest to open a bug.

Martin


Hi Martin

I created this PR

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

Thank you
Jonny



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux