[cfe-dev] libc++ std::isfinite() problem
Howard Hinnant
hhinnant at apple.com
Mon Jan 14 10:18:05 PST 2013
On Jan 14, 2013, at 12:46 PM, Kal Conley <kcconley at gmail.com> wrote:
> Am 1/14/13 6:01 PM, schrieb Howard Hinnant:
>> On Jan 14, 2013, at 11:58 AM, Kal Conley <kcconley at gmail.com>
>> wrote:
>>
>>
>>> Am 1/14/13 5:15 PM, schrieb Howard Hinnant:
>>>
>>>> On Jan 14, 2013, at 8:25 AM, Kal Conley <kcconley at gmail.com>
>>>> wrote:
>>>>
>>>>
>>>>> Hi,
>>>>> I am getting compile errors trying to compile code which tries to do
>>>>> something equivalent to std::isfinite((int)0). I get:
>>>>>
>>>>> test.cc:27:3: error: no matching function for call to 'isfinite'
>>>>> std::isfinite((int)0);
>>>>> ^~~~~~~~~~~~~
>>>>> /usr/bin/../lib/c++/v1/cmath:376:1: note: candidate template ignored:
>>>>> substitution failure [with _A1 = int]
>>>>> isfinite(_A1 __x)
>>>>>
>>>>> This compiles OK on all versions of libstdc++ that I have tried. Is
>>>>> libc++'s implementation correct here? Should it be relying on templates
>>>>> and only allowing specializations that satisfy std::is_floating_point?
>>>>>
>>>> This looks like a libc++ bug to me. Prior to Oct. 2010 libc++ was correct that std::isfinite should only accept floating point arguments. But two paragraphs were reordered in N3126 with the result that std::isfinite (and several other functions) should now accept integral arguments as well. I had not noticed the impact of this paragraph reordering until now.
>>>>
>>>> Howard
>>>>
>>>>
>>> Which paragraphs do you have in mind?
>>>
>> In http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3126.pdf
>>
>>
>> 26.8/p10 and the deleted paragraph after p11.
>>
>> Howard
>>
>>
> You mean "The classification/comparison functions behave the same as the C macros with the corresponding names defined in..." and since the C macros seem to accept integer types so should the c++ variants? Is it even defined behavior in the C standard to pass integers to these macros?
No. P11 bullet 2 now applies to isfinite, whereas previously it did not (due to isfinite et al. being moved above p11).
In C (even C11) isfinite still only accepts a floating point argument. So this is a pretty dubious extension of C in C++11 imho. But I will try to get it fixed asap.
Howard
More information about the cfe-dev
mailing list