This is the mail archive of the
mailing list for the GCC project.
Re: Strange C++ function pointer test
- From: Jonathan Wakely <jwakely dot gcc at gmail dot com>
- To: "gcc at gcc dot gnu dot org" <gcc at gcc dot gnu dot org>
- Cc: Dominik Vogt <vogt at linux dot vnet dot ibm dot com>, Andreas Krebbel <krebbel at linux dot vnet dot ibm dot com>
- Date: Thu, 31 Dec 2015 10:11:55 +0000
- Subject: Re: Strange C++ function pointer test
- Authentication-results: sourceware.org; auth=none
- References: <20151231094918 dot GA12885 at linux dot vnet dot ibm dot com> <alpine dot DEB dot 2 dot 20 dot 1512311055290 dot 17945 at laptop-mg dot saclay dot inria dot fr>
On 31 December 2015 at 09:57, Marc Glisse wrote:
> On Thu, 31 Dec 2015, Dominik Vogt wrote:
>> This snippet ist from the Plumhall 2014 xvs test suite:
>> #if CXX03 || CXX11 || CXX14
>> static float (*p1_)(float) = abs;
>> checkthat(__LINE__, p1_ != 0);
>> (With the testsuite specific macros doing the obvious). abs() is
>> declared as:
>> int abs(int j)
>> Am I missing some odd C++ feature or is that part of the test just
>> plain wrong? I don't know where to look in the C++ standard; is
Try searching the library clauses (17 to 30) for "abs". You'll find
the answer in 26.8 [c.math].
>> this supposed to compile (with or without a warning?) or generate
>> an error or is it just undefined?
>> error: invalid conversion from âint (*)(int) throw ()â to âfloat
>> (*)(float)â [-fpermissive]
>> (Of course even with -fpermissive this won't work because (at
>> least on my platform) ints are passed in different registers than
> There are other overloads of 'abs' declared in math.h / cmath (only in
> namespace std in the second case, and there are bugs (or standard issues)
> about having them in the global namespace for the first one).
That's not quite accurate, C++11 was altered slightly to reflect reality.
<cmath> is required to declare std::abs and it's unspecified whether
it also declares it as ::abs.
<math.h> is required to declare ::abs and it's unspecified whether it
also declares it as std::abs.