------- Comment #4 from sylvain dot pion at sophia dot inria dot fr 2007-03-19 16:50 ------- (sorry I still can't create attachments)
-ftrapw makes the program work (no loop). Let me copy-paste here the non-preprocessed source files which show everything which is executed, while waiting for bugzilla to allow me to add the large pre-processed file. ----------------------------- #ifndef CGAL_MP_FLOAT_H #define CGAL_MP_FLOAT_H #include <vector> typedef short limb; // unused typedef int limb2; // unused struct MP_Float { typedef std::vector<short> V; typedef V::iterator iterator; // unused V v; int exp; // unused MP_Float(short i) : v(1) { v[0] = i; canonicalize(); } void remove_leading_zeros() { while ((!v.empty()) && (v.back() == 0)) v.pop_back(); } void remove_trailing_zeros() { if (v.empty() || (v.front() != 0)) return; V::iterator i = v.begin(); for (++i; *i == 0; ++i) ; //v.erase(v.begin(), i); } void canonicalize() { remove_leading_zeros(); remove_trailing_zeros(); } // replacing int by std::size_t appears to also fix the loop... int max_exp() const { return v.size(); } short of_exp(int i) const { if (i >= max_exp()) return 0; return v[i]; } }; // This union is used to convert an unsigned short to a short with // the same binary representation, without invoking implementation-defined // behavior (standard 4.7.3). union to_signed { unsigned short us; short s; }; inline void split(int l, short & high, short & low) { to_signed l2 = {l}; low = l2.s; high = (l - low) >> 16; } MP_Float operator_minus(const MP_Float &a, const MP_Float & b /* unused */) { int max_exp = std::max(a.max_exp(), b.max_exp()); MP_Float r(0); r.v.resize(2); for(int i = 0; i < max_exp ; ++i) { int tmp = r.v[i] + (a.of_exp(i) - b.of_exp(i)); split(tmp, r.v[i+1], r.v[i]); } r.canonicalize(); return r; } #endif // CGAL_MP_FLOAT_H // #include <CGAL/MP_Float_loop.h> #include <CGAL/number_type_basic_loop.h> // this one pulls up unrelated stuff but necessary for the bug to show up int main() { MP_Float a=2, b=1; MP_Float d= operator_minus(a, a); } ----------------------------- -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31268