CURRENT: CLANG 3.3 and -stad=c++11 and -stdlib=libc++: isnan()/isninf() oddity
O. Hartmann
ohartman at zedat.fu-berlin.de
Wed Jul 10 16:33:22 UTC 2013
On Wed, 10 Jul 2013 15:22:58 +0100
David Chisnall <theraven at FreeBSD.org> wrote:
> Hi,
>
> On 10 Jul 2013, at 14:58, "O. Hartmann" <ohartman at 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
>
Hi David,
thanks for the fast response.
The code I was told to check with is this:
#include <iostream>
#include <typeinfo>
#include <cmath>
int
main(void)
{
std::cout << typeid(isnan(1.0)).name() << "\n";
}
If I compile it with
c++ -o testme -std=c++11 -stdlib=libc++ source.cc
and run the binary, the result is "i" which I interpret as "INT".
My OS is at
FreeBSD 10.0-CURRENT #4 r253138: Wed Jul 10 09:52:16 CEST 2013
Oliver
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/freebsd-toolchain/attachments/20130710/3fc49dea/attachment.sig>
More information about the freebsd-toolchain
mailing list