Hi,

On 10 Jul 2013, at 14:58, "O. Hartmann" <ohart...@zedat.fu-berlin.de> wrote:

> 
> Whe I try to compile the sources of a port in spe (devel/pocl), which
> is now out as RC6, I receive this error shown below:
> 
> [...]
> ../vecmathlib/pocl/../vec_sse_double1.h:451:38: error:
> conversion from 'int' to 'boolvec_t' (aka 'boolvec<real_t, size>') is
> ambiguous boolvec_t isinf() const { return std::isinf(v); }
> ^~~~~~~~~~~~~ ../vecmathlib/pocl/../vec_sse_double1.h:75:5: note:
> candidate constructor boolvec(bvector_t x): v(x) {}
>    ^
> ../vecmathlib/pocl/../vec_sse_double1.h:76:5: note: candidate
> constructor boolvec(bool a): v(a) {}
> [...]
> 
> Compilation is performed on the most recent CURRENT with CLANG 3.3 and
> devel/llvm (which is obviously stuck with 3.2 for now) and option
> switches -std=c++11 -stdlib=libc++.
> 
> As I was told, in standard C++11, isnan(), isinf() and fellows now
> should return "bool", not int as this seems obviously the case as the
> error documents and I was able to check with a small program.
> 
> Is this a bug in FreeBSD's implementation of libc++? Or am I doing
> something wrong?
> 
> I'm new to C++/C++11.
> 
> 
> Some advice or explanation could be helpful.

I believe that this is also causing some failures in the libc++ test suite and 
is due to some interaction between our headers and the libc++ headers, but I 
don't see where it is.

Our isnan implementation is a really ugly macro that looks like this:

#define>isnan(x)                                        \
    ((sizeof (x) == sizeof (float)) ? __isnanf(x)       \
    : (sizeof (x) == sizeof (double)) ? isnan(x)        \
    : __isnanl(x))


The definition in the libc++ cmath header is:

#ifdef isnan

template <class _A1>
_LIBCPP_ALWAYS_INLINE
bool
__libcpp_isnan(_A1 __x) _NOEXCEPT
{
    return isnan(__x);
}

#undef isnan

This should work correctly.

However...

I wonder if you are including math.h instead of <cmath>?  That would show the 
result that you appear to be seeing, which looks like the result of using the 
isnan() macro rather than the isnan() function.  If you have included <cmath> 
then the isnan() macro will have been defined.

David

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to