================ @@ -3829,10 +3829,40 @@ bool LLParser::parseValID(ValID &ID, PerFunctionState *PFS, Type *ExpectedTy) { ID.APSIntVal = Lex.getAPSIntVal(); ID.Kind = ValID::t_APSInt; break; - case lltok::APFloat: + case lltok::APFloat: { + assert(ExpectedTy && "Need type to parse float values"); ID.APFloatVal = Lex.getAPFloatVal(); ID.Kind = ValID::t_APFloat; break; + } + case lltok::FloatLiteral: { + assert(ExpectedTy && "Need type to parse float values"); + if (!ExpectedTy->isFloatingPointTy()) + return error(ID.Loc, "floating point constant invalid for type"); + ID.APFloatVal = APFloat(ExpectedTy->getFltSemantics()); + auto Except = ID.APFloatVal.convertFromString( + Lex.getStrVal(), RoundingMode::NearestTiesToEven); + assert(Except && "Invalid float strings should be caught by the lexer"); + // Forbid overflowing and underflowing literals, but permit inexact + // literals. Underflow is thrown when the result is denormal, so to allow + // denormals, only reject underflowing literals that resulted in a zero. + if (*Except & APFloat::opOverflow) + return error(ID.Loc, "floating point constant overflowed type"); + if ((*Except & APFloat::opUnderflow) && ID.APFloatVal.isZero()) + return error(ID.Loc, "floating point constant underflowed type"); + ID.Kind = ValID::t_APFloat; + break; + } + case lltok::FloatHexLiteral: { + assert(ExpectedTy && "Need type to parse float values"); + auto &Semantics = ExpectedTy->getFltSemantics(); ---------------- mshockwave wrote:
nit: `const auto &` https://github.com/llvm/llvm-project/pull/121838 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits