mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-12 17:32:19 +00:00
[APFloat] Ensure that we can properly parse strings that do not have null terminators.
rdar://14323230 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185397 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f801b8fe7a
commit
b57770387a
@ -2481,7 +2481,14 @@ APFloat::convertFromDecimalString(StringRef str, roundingMode rounding_mode)
|
||||
42039/12655 < L < 28738/8651 [ numerator <= 65536 ]
|
||||
*/
|
||||
|
||||
if (decDigitValue(*D.firstSigDigit) >= 10U) {
|
||||
// Test if we have a zero number allowing for strings with no null terminators
|
||||
// and zero decimals with non-zero exponents.
|
||||
//
|
||||
// We computed firstSigDigit by ignoring all zeros and dots. Thus if
|
||||
// D->firstSigDigit equals str.end(), every digit must be a zero and there can
|
||||
// be at most one dot. On the other hand, if we have a zero with a non-zero
|
||||
// exponent, then we know that D.firstSigDigit will be non-numeric.
|
||||
if (decDigitValue(*D.firstSigDigit) >= 10U || D.firstSigDigit == str.end()) {
|
||||
category = fcZero;
|
||||
fs = opOK;
|
||||
|
||||
|
@ -538,6 +538,31 @@ TEST(APFloatTest, Zero) {
|
||||
EXPECT_TRUE(APFloat(-0.0).isNegative());
|
||||
}
|
||||
|
||||
TEST(APFloatTest, DecimalStringsWithoutNullTerminators) {
|
||||
// Make sure that we can parse strings without null terminators.
|
||||
// rdar://14323230.
|
||||
APFloat Val(APFloat::IEEEdouble);
|
||||
Val.convertFromString(StringRef("0.00", 3),
|
||||
llvm::APFloat::rmNearestTiesToEven);
|
||||
EXPECT_EQ(Val.convertToDouble(), 0.0);
|
||||
Val.convertFromString(StringRef("0.01", 3),
|
||||
llvm::APFloat::rmNearestTiesToEven);
|
||||
EXPECT_EQ(Val.convertToDouble(), 0.0);
|
||||
Val.convertFromString(StringRef("0.09", 3),
|
||||
llvm::APFloat::rmNearestTiesToEven);
|
||||
EXPECT_EQ(Val.convertToDouble(), 0.0);
|
||||
Val.convertFromString(StringRef("0.095", 4),
|
||||
llvm::APFloat::rmNearestTiesToEven);
|
||||
EXPECT_EQ(Val.convertToDouble(), 0.09);
|
||||
Val.convertFromString(StringRef("0.00e+3", 7),
|
||||
llvm::APFloat::rmNearestTiesToEven);
|
||||
EXPECT_EQ(Val.convertToDouble(), 0.00);
|
||||
Val.convertFromString(StringRef("0e+3", 4),
|
||||
llvm::APFloat::rmNearestTiesToEven);
|
||||
EXPECT_EQ(Val.convertToDouble(), 0.00);
|
||||
|
||||
}
|
||||
|
||||
TEST(APFloatTest, fromZeroDecimalString) {
|
||||
EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0").convertToDouble());
|
||||
EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0").convertToDouble());
|
||||
|
Loading…
x
Reference in New Issue
Block a user