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

Dimitry Andric dim at FreeBSD.org
Tue Apr 16 13:44:42 UTC 2013


On 2013-04-16 13:28, Bruce Evans wrote:
> On Tue, 16 Apr 2013, Dimitry Andric wrote:
>> On 2013-04-16 06:19, Γιώργος Κεραμίδας wrote:
...
>>> : cc -O2 -pipe  -I/usr/src/usr.sbin/sendmail/../../contrib/sendmail/src
>>> -I/usr/src/usr.sbin/sendmail/../../contrib/sendmail/include -I. -DNEWDB
>>> -DNIS -DTCPWRAPPERS -DMAP_REGEX -DDNSMAP -DNETINET6 -DSTARTTLS -D_FFR_TLS_1
>>> -I/usr/local/include -DSASL=20126 -std=gnu99 -Qunused-arguments
>>> -fstack-protector -Wsystem-headers -Wno-pointer-sign -Wno-empty-body
>>> -Wno-string-plus-int -Wno-tautological-compare -Wno-unused-value
>>> -Wno-parentheses-equality -Wno-unused-function -Wno-conversion -Wno-switch
>>> -Wno-switch-enum -Wno-knr-promoted-parameter -Wno-parentheses -c
>>> /usr/src/usr.sbin/sendmail/../../contrib/sendmail/src/usersmtp.c
>>> : /usr/src/usr.sbin/sendmail/../../contrib/sendmail/src/usersmtp.c:1797:50:
>>> warning: incompatible pointer types passing 'void ()' to parameter of type
>>> 'void (*)(char *, bool, MAILER *, struct
>>> :       mailer_con_info *, ENVELOPE *)' [-Wincompatible-pointer-types]
>>> :         smtpresult = reply(m, mci, e, TimeOuts.to_auth, getsasldata,
>>> NULL,
>>> :                                                         ^~~~~~~~~~~
...
> stdbool is certainly incompatible with simple use of __P(()), but why does
> the error message say that the function type is 'void ()', and why doesn't
> it say that the prototype doesn't match the function?

Because we pass -Wno-knr-promoted-parameter to suppress the warning.
Before clang grew this flag, we had to set NO_WERROR to make it
non-fatal.


...
> 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. :-)



More information about the svn-src-all mailing list