C PATCH to rectify warning for character types (PR c/23087)

Martin Sebor msebor@gmail.com
Fri Jan 8 17:49:00 GMT 2016


On 01/07/2016 02:19 PM, Joseph Myers wrote:
> On Thu, 7 Jan 2016, Marek Polacek wrote:
>
>> This PR points out that we issue a wrong warning message when assigning
>> two pointers when one of them is plain char.  In that case, the compiler
>> currently says that pointer targets differ in signedness.  But that is
>> not correct; char is a separate type from (un)signed char and is not
>> compatible with either.  So we should instead say that the pointer types
>> are not compatible.
>>
>> This effectively means that I'm turning a -Wpointer-sign warning into
>> a -Wincompatible-pointer-types warning.  But -Wincompatible-pointer-types
>> is a warning that is enabled by default and -Wpointer-sign is enabled by
>> -Wpedantic || -Wall.  So with this, we'd be more verbose and would warn
>> by default on e.g. "unsigned char *p = "foo";."  Not sure if that is
>> desirable at this stage, so I'm leaning towards pushing this patch for
>> GCC7.
>
> I don't think it's desirable to raise the warning for this case under
> different conditions from the warning for other signedness cases.  The
> targets do differ in signedness - it's just that the difference is between
> "plain" and "signed" or "plain" and "unsigned", not between signed and
> unsigned.

I'm sorry Joseph but I don't quite follow this argument.  Plain
char is neither a signed [integer] type nor an unsigned [integer]
type, so it can never differ in signedness from any other type.

It seems to me that by the interpretation you suggest, converting
a signed int* to unsigned long* should be controlled by -Wpointer-
sign when int and long have the same representation, and by
-Wincompatible-pointer-types otherwise.  (Which is not what GCC
does.)

In my view, Marek's change makes perfect sense because it the most
closely reflects the properties of the type.

Martin



More information about the Gcc-patches mailing list