- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The following code fails to link when using icpc 14.0.0 and boost 1.54 or 1.53:
[cpp]
#include <boost/lexical_cast.hpp>
#include <string>
int main()
{
const float f(0.123f);
boost::lexical_cast<std::string>(f);
return 0;
}
[/cpp]
Commmand line:
icpc -std=c++11 -I boost_1_54_0/ icpc_14_builtin_signbit_failure.cpp
Output:
/tmp/icpcZV9IvT.o: In function `main':
icpc_14_builtin_signbit_failure.cpp:(.text+0x65): undefined reference to `__builtin_signbit'
icpc_14_builtin_signbit_failure.cpp:(.text+0xa8): undefined reference to `__builtin_signbit'
It compiles fine if -std=c++11 is not specified. It also compiles fine with icpc 13.1.3 and -std=c++11 defined.
I have attached a file with the complete source for reproduction.
This is a showstopper for upgrading to the new compilers.
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks for the report, (and the test case!) DPD200295115 is tracking the issue.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Is there any workaround I can employ while we wait for the fix/update? Downgrading my boost to an earlier version is not an option for me.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
As a workaround, can you change your source program to use double instead of float?
const double df(0.123f);
boost::lexical_cast<std::string>(df);
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Succeed using c++11 string conversion as a workaround. Thanks.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Was this fixed with the new release 14.0.1 ?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I have verified that this not work with 14.0.1 either. I tried to include the cmath header both before and after the other headers, but the error is still the same.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The fix isn't available yet. (the compiler issue is that __builtin_signbit is available for double, but not float). Are you able to use the workaround where you change the type from float to double?
const double d(0.123f);
boost::lexical_cast<:STRING>(d);
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks for the reply. I'm aware of this workaround, but it will require a significant amount of work for an issue that will go away (hopefully soon). I'll wait for a new update before moving to a new version of the compiler.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
This bug is still not fixed in 14.0.2.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I can confirm this is still a problem in
Version 14.0.2.144 Build 20140120
undefined reference to `__builtin_signbit' showed up
in the compile of qtwebkit Qt 5.2.1
qtwebkit/Source/WTF/wtf/MediaTime.cpp
Luckily the workaround from MathExtras.h for SOLARIS can be
easily applied in this case.
Change the two instances of signbit to copysign
from
return std::signbit(floatTime) ? negativeInfiniteTime() : positiveInfiniteTime();
to
return (std::copysign(1.0, floatTime) < 0) ? negativeInfiniteTime() : positiveInfiniteTime();
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I'm affected by the same issue, it's also triggered by other boost routines like the floating point classification.
As a workaround, I tried to implement a custom builtin using:
bool sb (float f) asm ("__builtin_signbit"); bool sb (float f) { return f >= 0.0f; }
Which resolves the linker errors, but the function is not called at runtime (incorrect calling convention, maybe?)
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
This was fixed on 2/7/2014 so it should be fixed in the next 14.0 update. Sorry for the inconvenience.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page