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

_______________________________________________
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