Subject: Re: bogus CC warning?
To: Aidan Cully <aidan@kublai.com>
From: None <seebs@plethora.net>
List: tech-toolchain
Date: 04/11/1999 02:05:57
In message <19990411023835.A580@xanadu.kublai.com>, Aidan Cully writes:
>(I know this belongs on tech-toolchain, but I'm not subscribed their, so
>please Cc: me in all replies.. Thanks.)
Okay. This is an egcs thing; it has more complicated warnings for
type clashes.
>> #include <string.h>
>> #include <stdio.h>
>>
>> typedef unsigned char array[256];
>> void proto(const array *string, array *string2);
>>
>> int main(int argc, char *argv[])
>> {
>> array str1, str2;
>> proto(&str1, &str2);
>> test.c:13: warning: passing arg 1 of `proto' from incompatible pointer type
Okay, let's see what the types are.
'str1' is 'array', so &str1 is 'array *'. This is not the same as
'const array *'. However, normally, that wouldn't be a problem, or I'm too
tired to think straight. (This is not atypical; you can generally get a
fair amount of bloodshed by bringing up the interactions of const, typedef,
and default promotions in front of three or four C people.)
>> void proto(string, string2)
>> const array *string;
>> array *string2;
>> {
>> if (string == string2)
>> test.c:22: warning: comparison of distinct pointer types lacks a cast
This is the same thing.
>> return;
>> proto(string2, string2);
>> test.c:24: warning: passing arg 1 of `proto' from incompatible pointer type
And, once again, same thing.
>> }
>I was able to build a patch that fixed this, if it is, indeed, a bug..
>(I don't have any C-references, and I don't feel like looking through
>one even if I did.) Can someone in the know please confirm with me
>that this behaviour _is_ a bug, and not defined C behaviour?
It is not forbidden to emit additional diagnostic messages. I would generally
consider it a bad thing for a program to consider 'const foo' and 'foo'
incompatible types. (Note, however, that 'pointer to const foo' and 'pointer
to foo' really are separate types.)
I'm *thinking* this warning is misleading - and yet, it only happens in
the case that confuses me. ;-) If I have a function declared as taking
a const argument, and pass it a non-const-qualified thing, no complaints.
So, I'm not sure why we're getting the warning that we are.
>And that
>the attached patch (which I installed on my system to get kerberos
>building again) is correct? In particular, I'm not sure that in all
>the instances that comptypes gets called that type1 is always the lhs
>and type2 is always the rhs..
Can't help you at all on this one.
-s