Boost logo

Boost :

Subject: Re: [boost] [polygon] compiled in MSVC8 successfully, but long long type gives runtime errors.
From: Steven Watanabe (watanabesj_at_[hidden])
Date: 2009-07-07 17:57:37


Simonson, Lucanus J wrote:
> All code compiles and generally passes my unit tests in MSVC8.
> It turns out that making the enable_if a default argument impacts regular overloading of functions and that adding a unique type into the enable_if logic to make all instantiations unique was a more reliable way to work around the compiler bugs.
> I ran into a problem where boost::long_long_type isn't able to convert correctly to double. In the code below the return type of square_euclidean_distance is long long because I need twice as many bits to store the result of a multiply.
> euclidean_distance(const rectangle_type& lvalue, const rectangle_type_2& rvalue) {
> double val = (double)square_euclidean_distance(lvalue, rvalue);
> return sqrt(val);
> }
> It fails a runtime check stating that val is left unitialized and in the debugger I can see that the value is indeed uninitialized. My question for any experts is why is this code failing?
> I looking into the dissasembly and it looks like long long is 64 bit emulated in software in my 32 bit windows environment compiling with MSVC8. I couldn't find anywhere the conversion from long long to double, and it seems that it is just silently failing to provide it, leaving me with uninitialized data.
> In MSVC8 BOOST_HAS_LONG_LONG is defined and I'm using the boost::long_long_type the way it was suggested that I should.

I don't think this is related to the use of long long since the following
program works okay.

#include <iostream>

int main() {
    long long x = 1.0;
    double d = x;
    std::cout << x << std::endl;

I seem to recall seeing a problem like this before when
overload resolution doesn't quite work.
Perhaps you remember this thread?
I think I had similar runtime weirdness in some
of the tests that I ran.

In Christ,
Steven Watanabe

Boost list run by bdawes at, gregod at, cpdaniel at, john at