svn commit: r246880 - in head: lib/libsm libexec/mail.local libexec/smrsh share/mk usr.bin/vacation usr.sbin/sendmail

Giorgos Keramidas keramida at ceid.upatras.gr
Tue Apr 16 14:34:35 UTC 2013


On Tue, 16 Apr 2013 15:44:36 +0200, Dimitry Andric <dim at FreeBSD.org> wrote:
> On 2013-04-16 13:28, Bruce Evans wrote:
>> Extending the example a little gives the answer to my question:
>>
>> @ #include <stdbool.h>
>> @
>> @ typedef void vb(bool first);
>> @
>> @ vb foo;
>> @ void bar(vb *p);
>> @
>> @ void
>> @ foo(first)
>> @ 	bool first;
>> @ {
>> @ 	bar(foo);
>> @ }
>>
>> @ z.c:10:7: warning: promoted type 'int' of K&R function parameter is
>> not compatible with the parameter type 'bool' declared in a previous
>> prototype [-Wknr-promoted-parameter]
>> @         bool first;
>> @              ^
>> @ z.c:5:4: note: previous declaration is here
>> @ vb foo;
>> @    ^
>> @ z.c:12:6: warning: incompatible pointer types passing 'void ()' to parameter of type 'vb *' (aka 'void (*)(bool)') [-Wincompatible-pointer-types]
>> @         bar(foo);
>> @             ^~~
>> @ z.c:6:14: note: passing argument to parameter 'p' here
>> @ void bar(vb *p);
>> @              ^
>> @ 2 warnings generated.
>>
>> Apparently clang ignores the mismatched prototype after printing a warning
>> about it, and also throws away the type info that it learns by compiling
>> the K&R function, so it is left with only 'void ()' for the type.
>
> Yes, this is basically what happens.  The actual definition of the
> function overrides the prototype, if it comes before the invocation.
>
> For example, in the original problem case, the warning could also be
> worked around by moving the getsasldata() definition to below
> attemptauth(), where it is invoked.  This still counts as cheating,
> though. :-)

And that's precisely why other functions, like esmtp_check() do not have
the same problem, even though they have exactly the same signature and
they are used in the same way!



More information about the svn-src-head mailing list