Date: Sat, 2 Feb 2002 05:21:58 +1100 (EST) From: Bruce Evans <bde@zeta.org.au> To: "M. Warner Losh" <imp@village.org> Cc: <estabur@hotmail.com>, <arch@FreeBSD.ORG> Subject: Re: __P macro question Message-ID: <20020202045410.U4512-100000@gamplex.bde.org> In-Reply-To: <20020201.095230.12730857.imp@village.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, 1 Feb 2002, M. Warner Losh wrote:
> In message: <20020202012011.U3304-100000@gamplex.bde.org>
> Bruce Evans <bde@zeta.org.au> writes:
> : > Are you perhaps objecting to the type of the last parameter
> : > ("int format" vs "char format")? Please see Ansi Classic, chapter
> : > "3.5.4.3 Function declarators (including prototypes)", in particular
> : > page 69 lines 19-22. In C99, 6.7.5.3 paragraph #11 seems to apply
> : > similarly.
> :
> : Right. I don't trust anyone who is not familiar with this point to
> : globally remove __P.
>
> So do I qualify? We all know that the original poster of the comment
> didn't understand this subtlty. :-)
Better than the original poster :-). The original poster did md5 regression
checks which would help. I think the global changes should just stay away
from areas that can't be checked automatically.
> : People removing __P should also be familiar with the gcc conterpoint:
> :
> : void foo(char); /* Wrong; should be "void foo(int);". */
> : void foo(c) char c; {}
> :
> : gives undefined behaviour in Standard C, but gcc defines its behaviour
> : to be do-what-naive-programmer-expects. This is only safe provided the
> : wrong prototype for foo() is always in scope before foo() is called;
> : otherwise foo() is sometimes passed an int and sometimes a char, but
> : foo() expects to be passed either an int or a char depending on whether
> : the wrong prototype is in scope for the function body.
>
> Alternatively:
> void foo(char);
> void foo(char c) { }
> would be right. :-) I've already found three places where this didn't
> hold.
It's as right as the gcc rewriting of the function definition, but is a
semantic change and it should be checked carefully. gcc on i386's seems
to have stopped pessimizing it; gcc on i386's doesn't optimize it either
(for compatibility with binary interfaces suitable for K&R compilers :-(),
so there is some change of checking the change automatically.
> So what is the right style:
>
> 1) ^static void foo(char);
> 2) ^static<tab>void foo(char);
> 3) ^static void<tab>foo(char);
> 4) ^static<tab>void<tab>foo(char);
>
> Most of the tree I've looked at so far uses #1. I'm a little
> reluctant to change that part of things on this pass.
Most of it doesn't use static yet, and the KNF parts use:
^void<tab>foo __P((int));
I would just substitute away '<whitespace>__P((' and change '))' at
the end of the same lines as __P(( to to ')', and not touch any other
whitespace. Lines that don't match the simple regexp for this probably
have style problems, e.g., ones involving line breaks for long lines.
Bruce
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020202045410.U4512-100000>
