================
@@ -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

Reply via email to