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