On Tue, 16 Apr 2013 15:44:36 +0200, Dimitry Andric <d...@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!

_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to