Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 26 Feb 2009 22:02:28 +0100
From:      Christoph Mallon <christoph.mallon@gmx.de>
To:        Ed Schouten <ed@80386.nl>, hackers@FreeBSD.ORG
Subject:   Re: Renaming all symbols in libmp(3)
Message-ID:  <49A70364.1020707@gmx.de>
In-Reply-To: <49A70092.6030601@gmx.de>
References:  <20090226180756.GX19161@hoeg.nl>	<20090226204243.GA96251@zim.MIT.EDU> <49A70092.6030601@gmx.de>

next in thread | previous in thread | raw e-mail | index | archive | help
Christoph Mallon schrieb:
> David Schultz schrieb:
>> On Thu, Feb 26, 2009, Ed Schouten wrote:
>>> One of the reasons why we can't compile the base system yet, is because
>>> some applications in the base system (keyserv, newkey, chkey, libtelnet)
>>> won't compile, because a library they depend (libmp)on has a function
>>> called pow(). By default, LLVM has a built-in prototype of pow(),
>>> similar to GCC. Unlike GCC, LLVM raises a compiler error by default. The
>>> manual page also mentions this issue.
>>
>> I think most apps that used to use libmp have transitioned to
>> libgmp, so I don't have much of an opinion on this change...
>>
>> However, if the compiler as a builtin for the math.h-style pow()
>> function, and the builtin causes it to choke even when math.h
>> isn't #included, that's a bug in the compiler. The people who are
>> proposing that we make the base system LLVM-compatible should be
>> more forceful in insisting that LLVM be fixed. ;-) What do the LLVM
>> folks propose to do about all the (perfectly legal) programs out
>> there that have a variable called 'exp'?
> 
> No, it's invalid code to have a function named pow() in a hosted 
> environment which is not /The/ pow().
> Having a *local* variable named exp is fine, because this declaration 
> shadows the function. A *global* variable on the other hand is not allowed.

Just a hint, why you really mustn't use global names which are reserved 
by the standard:

double pow(double x, double y)
{
   abort();
}

int main(void)
{
   printf("%f\n", pow(10., 2.));
   return 0;
}


%gcc -w bla.c
%./a.out
100.000000
%

Yes, GCC does that and it's perfectly valid.



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