[APFloat] Fix checked error assert failures

`APFLoat::convertFromString` returns `Expected` result, which must be
"checked" if the LLVM_ENABLE_ABI_BREAKING_CHECKS preprocessor flag is
set.
To mark an `Expected` result as "checked" we must consume the `Error`
within.
In many cases, we are only interested in knowing if an error occured,
without the need to examine the error info. This is achieved, easily,
with the `errorToBool()` API.
This commit is contained in:
Ehud Katz 2020-01-09 09:42:32 +02:00
parent 4e5c39e80b
commit 4b88f1f253
7 changed files with 20 additions and 17 deletions

View File

@ -566,7 +566,8 @@ namespace llvm {
///
/// If \p AllowInexact is false, the function will fail if the string
/// cannot be represented exactly. Otherwise, the function only fails
/// in case of an overflow or underflow.
/// in case of an overflow or underflow, or an invalid floating point
/// representation.
bool getAsDouble(double &Result, bool AllowInexact = true) const;
/// @}

View File

@ -3130,7 +3130,9 @@ bool AsmParser::parseRealValue(const fltSemantics &Semantics, APInt &Res) {
Value = APFloat::getNaN(Semantics, false, ~0);
else
return TokError("invalid floating point literal");
} else if (!Value.convertFromString(IDVal, APFloat::rmNearestTiesToEven))
} else if (errorToBool(
Value.convertFromString(IDVal, APFloat::rmNearestTiesToEven)
.takeError()))
return TokError("invalid floating point literal");
if (IsNeg)
Value.changeSign();

View File

@ -4518,9 +4518,8 @@ hash_code hash_value(const APFloat &Arg) {
APFloat::APFloat(const fltSemantics &Semantics, StringRef S)
: APFloat(Semantics) {
auto StatusOrErr = convertFromString(S, rmNearestTiesToEven);
if (!StatusOrErr) {
assert(false && "Invalid floating point representation");
}
assert(StatusOrErr && "Invalid floating point representation");
consumeError(StatusOrErr.takeError());
}
APFloat::opStatus APFloat::convert(const fltSemantics &ToSemantics,

View File

@ -588,13 +588,11 @@ bool StringRef::getAsInteger(unsigned Radix, APInt &Result) const {
bool StringRef::getAsDouble(double &Result, bool AllowInexact) const {
APFloat F(0.0);
auto ErrOrStatus = F.convertFromString(*this, APFloat::rmNearestTiesToEven);
if (!ErrOrStatus) {
assert(false && "Invalid floating point representation");
auto StatusOrErr = F.convertFromString(*this, APFloat::rmNearestTiesToEven);
if (errorToBool(StatusOrErr.takeError()))
return true;
}
APFloat::opStatus Status = *ErrOrStatus;
APFloat::opStatus Status = *StatusOrErr;
if (Status != APFloat::opOK) {
if (!AllowInexact || !(Status & APFloat::opInexact))
return true;

View File

@ -1223,7 +1223,7 @@ public:
APFloat RealVal(APFloat::IEEEdouble());
auto StatusOrErr =
RealVal.convertFromString(Desc->Repr, APFloat::rmTowardZero);
if (!StatusOrErr || *StatusOrErr != APFloat::opOK)
if (errorToBool(StatusOrErr.takeError()) || *StatusOrErr != APFloat::opOK)
llvm_unreachable("FP immediate is not exact");
if (getFPImm().bitwiseIsEqual(RealVal))
@ -2580,7 +2580,7 @@ AArch64AsmParser::tryParseFPImm(OperandVector &Operands) {
APFloat RealVal(APFloat::IEEEdouble());
auto StatusOrErr =
RealVal.convertFromString(Tok.getString(), APFloat::rmTowardZero);
if (!StatusOrErr) {
if (errorToBool(StatusOrErr.takeError())) {
TokError("invalid floating point representation");
return MatchOperand_ParseFail;
}

View File

@ -2363,7 +2363,7 @@ AMDGPUAsmParser::parseImm(OperandVector &Operands, bool HasSP3AbsModifier) {
APFloat RealVal(APFloat::IEEEdouble());
auto roundMode = APFloat::rmNearestTiesToEven;
if (!RealVal.convertFromString(Num, roundMode)) {
if (errorToBool(RealVal.convertFromString(Num, roundMode).takeError())) {
return MatchOperand_ParseFail;
}
if (Negate)

View File

@ -22,15 +22,18 @@ using namespace llvm;
static std::string convertToErrorFromString(StringRef Str) {
llvm::APFloat F(0.0);
auto ErrOrStatus =
auto StatusOrErr =
F.convertFromString(Str, llvm::APFloat::rmNearestTiesToEven);
EXPECT_TRUE(!ErrOrStatus);
return toString(ErrOrStatus.takeError());
EXPECT_TRUE(!StatusOrErr);
return toString(StatusOrErr.takeError());
}
static double convertToDoubleFromString(StringRef Str) {
llvm::APFloat F(0.0);
EXPECT_FALSE(!F.convertFromString(Str, llvm::APFloat::rmNearestTiesToEven));
auto StatusOrErr =
F.convertFromString(Str, llvm::APFloat::rmNearestTiesToEven);
EXPECT_FALSE(!StatusOrErr);
consumeError(StatusOrErr.takeError());
return F.convertToDouble();
}