Skip to content

Commit 6a59007

Browse files
address comments
1 parent 94bcf6f commit 6a59007

File tree

4 files changed

+70
-77
lines changed

4 files changed

+70
-77
lines changed

mlir/lib/AsmParser/AsmParserImpl.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,9 +287,8 @@ class AsmParserImpl : public BaseT {
287287
APFloat &result) override {
288288
bool isNegative = parser.consumeIf(Token::minus);
289289
Token curTok = parser.getToken();
290-
auto emitErrorAtTok = [&]() { return emitError(curTok.getLoc(), ""); };
291290
FailureOr<APFloat> apResult =
292-
parseFloatFromLiteral(emitErrorAtTok, curTok, isNegative, semantics);
291+
parser.parseFloatFromLiteral(curTok, isNegative, semantics);
293292
if (failed(apResult))
294293
return failure();
295294
parser.consumeToken();

mlir/lib/AsmParser/AttributeParser.cpp

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -422,9 +422,8 @@ Attribute Parser::parseDecOrHexAttr(Type type, bool isNegative) {
422422
}
423423

424424
if (auto floatType = dyn_cast<FloatType>(type)) {
425-
auto emitErrorAtTok = [&]() { return emitError(tok.getLoc()); };
426425
FailureOr<APFloat> result = parseFloatFromIntegerLiteral(
427-
emitErrorAtTok, tok, isNegative, floatType.getFloatSemantics());
426+
tok, isNegative, floatType.getFloatSemantics());
428427
if (failed(result))
429428
return Attribute();
430429
return FloatAttr::get(floatType, *result);
@@ -658,9 +657,8 @@ TensorLiteralParser::getFloatAttrElements(SMLoc loc, FloatType eltTy,
658657
for (const auto &signAndToken : storage) {
659658
bool isNegative = signAndToken.first;
660659
const Token &token = signAndToken.second;
661-
auto emitErrorAtTok = [&]() { return p.emitError(token.getLoc()); };
662-
FailureOr<APFloat> result = parseFloatFromLiteral(
663-
emitErrorAtTok, token, isNegative, eltTy.getFloatSemantics());
660+
FailureOr<APFloat> result =
661+
p.parseFloatFromLiteral(token, isNegative, eltTy.getFloatSemantics());
664662
if (failed(result))
665663
return failure();
666664
floatValues.push_back(*result);
@@ -882,10 +880,8 @@ ParseResult DenseArrayElementParser::parseIntegerElement(Parser &p) {
882880
ParseResult DenseArrayElementParser::parseFloatElement(Parser &p) {
883881
bool isNegative = p.consumeIf(Token::minus);
884882
Token token = p.getToken();
885-
auto emitErrorAtTok = [&]() { return p.emitError(token.getLoc()); };
886-
FailureOr<APFloat> fromIntLit =
887-
parseFloatFromLiteral(emitErrorAtTok, token, isNegative,
888-
cast<FloatType>(type).getFloatSemantics());
883+
FailureOr<APFloat> fromIntLit = p.parseFloatFromLiteral(
884+
token, isNegative, cast<FloatType>(type).getFloatSemantics());
889885
if (failed(fromIntLit))
890886
return failure();
891887
p.consumeToken();

mlir/lib/AsmParser/Parser.cpp

Lines changed: 55 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -67,61 +67,6 @@
6767
using namespace mlir;
6868
using namespace mlir::detail;
6969

70-
/// Parse a floating point value from an integer literal token.
71-
FailureOr<APFloat> detail::parseFloatFromIntegerLiteral(
72-
function_ref<InFlightDiagnostic()> emitError, const Token &tok,
73-
bool isNegative, const llvm::fltSemantics &semantics) {
74-
StringRef spelling = tok.getSpelling();
75-
bool isHex = spelling.size() > 1 && spelling[1] == 'x';
76-
if (!isHex) {
77-
auto error = emitError();
78-
error << "unexpected decimal integer literal for a "
79-
"floating point value";
80-
error.attachNote() << "add a trailing dot to make the literal a float";
81-
return failure();
82-
}
83-
if (isNegative) {
84-
emitError() << "hexadecimal float literal should not have a "
85-
"leading minus";
86-
return failure();
87-
}
88-
89-
APInt intValue;
90-
tok.getSpelling().getAsInteger(isHex ? 0 : 10, intValue);
91-
auto typeSizeInBits = APFloat::semanticsSizeInBits(semantics);
92-
if (intValue.getActiveBits() > typeSizeInBits) {
93-
return emitError() << "hexadecimal float constant out of range for type";
94-
return failure();
95-
}
96-
97-
APInt truncatedValue(typeSizeInBits, intValue.getNumWords(),
98-
intValue.getRawData());
99-
return APFloat(semantics, truncatedValue);
100-
}
101-
102-
FailureOr<APFloat>
103-
detail::parseFloatFromLiteral(function_ref<InFlightDiagnostic()> emitError,
104-
const Token &tok, bool isNegative,
105-
const llvm::fltSemantics &semantics) {
106-
// Check for a floating point value.
107-
if (tok.is(Token::floatliteral)) {
108-
auto val = tok.getFloatingPointValue();
109-
if (!val)
110-
return emitError() << "floating point value too large";
111-
112-
APFloat result(isNegative ? -*val : *val);
113-
bool unused;
114-
result.convert(semantics, APFloat::rmNearestTiesToEven, &unused);
115-
return result;
116-
}
117-
118-
// Check for a hexadecimal float value.
119-
if (tok.is(Token::integer))
120-
return parseFloatFromIntegerLiteral(emitError, tok, isNegative, semantics);
121-
122-
return emitError() << "expected floating point literal";
123-
}
124-
12570
//===----------------------------------------------------------------------===//
12671
// CodeComplete
12772
//===----------------------------------------------------------------------===//
@@ -402,6 +347,61 @@ OptionalParseResult Parser::parseOptionalDecimalInteger(APInt &result) {
402347
return success();
403348
}
404349

350+
FailureOr<APFloat>
351+
Parser::parseFloatFromLiteral(const Token &tok, bool isNegative,
352+
const llvm::fltSemantics &semantics) {
353+
// Check for a floating point value.
354+
if (tok.is(Token::floatliteral)) {
355+
auto val = tok.getFloatingPointValue();
356+
if (!val)
357+
return emitError(tok.getLoc()) << "floating point value too large";
358+
359+
APFloat result(isNegative ? -*val : *val);
360+
bool unused;
361+
result.convert(semantics, APFloat::rmNearestTiesToEven, &unused);
362+
return result;
363+
}
364+
365+
// Check for a hexadecimal float value.
366+
if (tok.is(Token::integer))
367+
return parseFloatFromIntegerLiteral(tok, isNegative, semantics);
368+
369+
return emitError(tok.getLoc()) << "expected floating point literal";
370+
}
371+
372+
/// Parse a floating point value from an integer literal token.
373+
FailureOr<APFloat>
374+
Parser::parseFloatFromIntegerLiteral(const Token &tok, bool isNegative,
375+
const llvm::fltSemantics &semantics) {
376+
StringRef spelling = tok.getSpelling();
377+
bool isHex = spelling.size() > 1 && spelling[1] == 'x';
378+
if (!isHex) {
379+
auto error = emitError(tok.getLoc());
380+
error << "unexpected decimal integer literal for a "
381+
"floating point value";
382+
error.attachNote() << "add a trailing dot to make the literal a float";
383+
return failure();
384+
}
385+
if (isNegative) {
386+
emitError(tok.getLoc()) << "hexadecimal float literal should not have a "
387+
"leading minus";
388+
return failure();
389+
}
390+
391+
APInt intValue;
392+
tok.getSpelling().getAsInteger(isHex ? 0 : 10, intValue);
393+
auto typeSizeInBits = APFloat::semanticsSizeInBits(semantics);
394+
if (intValue.getActiveBits() > typeSizeInBits) {
395+
return emitError(tok.getLoc())
396+
<< "hexadecimal float constant out of range for type";
397+
return failure();
398+
}
399+
400+
APInt truncatedValue(typeSizeInBits, intValue.getNumWords(),
401+
intValue.getRawData());
402+
return APFloat(semantics, truncatedValue);
403+
}
404+
405405
ParseResult Parser::parseOptionalKeyword(StringRef *keyword) {
406406
// Check that the current token is a keyword.
407407
if (!isCurrentTokenAKeyword())

mlir/lib/AsmParser/Parser.h

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,6 @@
1616

1717
namespace mlir {
1818
namespace detail {
19-
/// Parse a floating point value from an integer literal token.
20-
FailureOr<APFloat>
21-
parseFloatFromIntegerLiteral(function_ref<InFlightDiagnostic()> emitError,
22-
const Token &tok, bool isNegative,
23-
const llvm::fltSemantics &semantics);
24-
25-
/// Parse a floating point value from a literal.
26-
FailureOr<APFloat>
27-
parseFloatFromLiteral(function_ref<InFlightDiagnostic()> emitError,
28-
const Token &tok, bool isNegative,
29-
const llvm::fltSemantics &semantics);
3019

3120
//===----------------------------------------------------------------------===//
3221
// Parser
@@ -163,6 +152,15 @@ class Parser {
163152
/// Parse an optional integer value only in decimal format from the stream.
164153
OptionalParseResult parseOptionalDecimalInteger(APInt &result);
165154

155+
/// Parse a floating point value from a literal.
156+
FailureOr<APFloat> parseFloatFromLiteral(const Token &tok, bool isNegative,
157+
const llvm::fltSemantics &semantics);
158+
159+
/// Parse a floating point value from an integer literal token.
160+
FailureOr<APFloat>
161+
parseFloatFromIntegerLiteral(const Token &tok, bool isNegative,
162+
const llvm::fltSemantics &semantics);
163+
166164
/// Returns true if the current token corresponds to a keyword.
167165
bool isCurrentTokenAKeyword() const {
168166
return getToken().isAny(Token::bare_identifier, Token::inttype) ||

0 commit comments

Comments
 (0)