mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-12 13:30:51 +00:00
Fix infinite recursion in ScaledNumber::toInt.
Patch from dexonsmith. The call to toInt() was calling compareTo() which in some cases would call back to toInt(), creating an infinite loop. Fixed by simplifying the logic in compareTo() to avoid the co-recursion. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236326 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a2dd41dead
commit
3c178d82ce
@ -670,14 +670,7 @@ public:
|
||||
return ScaledNumbers::compare(Digits, Scale, X.Digits, X.Scale);
|
||||
}
|
||||
int compareTo(uint64_t N) const {
|
||||
ScaledNumber Scaled = get(N);
|
||||
int Compare = compare(Scaled);
|
||||
if (Width == 64 || Compare != 0)
|
||||
return Compare;
|
||||
|
||||
// Check for precision loss. We know *this == RoundTrip.
|
||||
uint64_t RoundTrip = Scaled.template toInt<uint64_t>();
|
||||
return N == RoundTrip ? 0 : RoundTrip < N ? -1 : 1;
|
||||
return ScaledNumbers::compare<uint64_t>(Digits, Scale, N, 0);
|
||||
}
|
||||
int compareTo(int64_t N) const { return N < 0 ? 1 : compareTo(uint64_t(N)); }
|
||||
|
||||
|
@ -556,4 +556,9 @@ TEST(ScaledNumberHelpersTest, arithmeticOperators) {
|
||||
EXPECT_EQ(ScaledNumber<uint64_t>(1, 4), ScaledNumber<uint64_t>(1, 3) << 1);
|
||||
}
|
||||
|
||||
TEST(ScaledNumberHelpersTest, toIntBug) {
|
||||
ScaledNumber<uint32_t> n(1, 0);
|
||||
EXPECT_EQ(1u, (n * n).toInt<uint32_t>());
|
||||
}
|
||||
|
||||
} // end namespace
|
||||
|
Loading…
Reference in New Issue
Block a user