This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Strange C++ function pointer test

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.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]