Strange C++ function pointer test
Dominik Vogt
vogt@linux.vnet.ibm.com
Thu Dec 31 11:36:00 GMT 2015
On Thu, Dec 31, 2015 at 10:11:55AM +0000, Jonathan Wakely wrote:
> 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);
> >> #endif
> >>
> >> (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
> >> floats.)
> >
> >
> > 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.
(*abs should be in <cstdlib> or <stdlib.h>).
I see. abs and ::abs are the same in this case, and std::abs
refers to the "double" variant, so that does not compile either.
The minimal failing program is
-- abs.C --
#include <stdlib.h>
static float (*p1_)(float) = abs;
-- abs.C --
G++-6.0.0, Glibc-2.20 on S390x, compiled with
$ g++ -std=c++11 abs.C
The test program from the xvs suite includes stdlib.h and math.h,
but not cstdlib, cmath (or ctgmath). It's not clear to me which
headers g++ includes automatically, but this seems to be correct
behaviour, or is it not? Does it depend on the Glibc version?
Ciao
Dominik ^_^ ^_^
--
Dominik Vogt
IBM Germany
More information about the Gcc
mailing list