Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 30 Oct 2003 21:23:06 +1100 (EST)
From:      Bruce Evans <bde@zeta.org.au>
To:        Harti Brandt <brandt@fokus.fraunhofer.de>
Cc:        cvs-all@freebsd.org
Subject:   Re: cvs commit: src/usr.bin/chat Makefile
Message-ID:  <20031030211635.A4570@gamplex.bde.org>
In-Reply-To: <20031030101640.G79774@beagle.fokus.fraunhofer.de>
References:  <200310260449.h9Q4nwm9016893@repoman.freebsd.org> <20031026171515.P17272@gamplex.bde.org> <xzpu15w9rhk.fsf@dwp.des.no> <20031027152156.Y21211@gamplex.bde.org> <xzpbrs1afvz.fsf@dwp.des.no> <20031030082313.GA1649@cirb503493.alcatel.com.au> <20031030101640.G79774@beagle.fokus.fraunhofer.de>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 30 Oct 2003, Harti Brandt wrote:

> On Thu, 30 Oct 2003, Peter Jeremy wrote:
>
> PJ>On Tue, Oct 28, 2003 at 10:28:24PM +1100, Bruce Evans wrote:
> PJ>>Similarly for `return (log(3));`.  gcc doesn't do the log() inline, at
> PJ>>least on i386's with no options, but it knows to pass 3.0 and convert
> PJ>>the return value to int.
> PJ>
> PJ>It shouldn't.  If I write:
> PJ>	int foo(int x)
> PJ>	{
> PJ>		return (log(x));
> PJ>	}
> PJ>without explicitly declaring any prototype for log(), gcc should
> PJ>assume a declaration "int log(int);".  Arbitrarily deciding that
> PJ>the declaration should be "double log(double);" breaks K&R C and
> PJ>C90 programs.
> PJ>
> PJ>It seems that gcc is diverging more and more from the ISO standards.
>
> I brought up this topic on gcc-patches. The answer was the
> 5th paragraph of 7.1.3:
>
> "All identifiers with external linkage in any of the following subclauses
> (including the future library directions) are always reserved for use as
> identifiers with external linkage."
>
> This seems to mean that your above code snippet is not legal, because
> log() impicitly gets external linkage, but is reserved by the library.

Indeed.  I'm not sure if the above gives undefined behaviour, but it is
close to it.

> Having a static log() should be ok, but will trigger that anoying gcc
> shadow warning. Well, whether this makes sense or not is questionable.
> Warnings should warn you not only when you invoke undefined behaviour, but
> also when you do something dangerous. In
>
> static void
> log(int i)
> {
> ....
> }
>
> someone else later might remove the 'static' which then leads to undefined
> behaviour. So the gcc-people think they'd rather warn here.

My patch is supposed to give the warning if and only if there is no 'static'
(when <math.h> is not included).

> You are invited to take part in the discussions on the list.

ENOTIME :-).

Bruce



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20031030211635.A4570>