sepavloff added inline comments.

================
Comment at: clang/lib/AST/Interp/ByteCodeExprGen.cpp:607
+    if (*LT == PT_Float) {
+      if (!this->emitAddf(getRoundingMode(E), E))
+        return false;
----------------
As discussed previously, compound assign operator cannot be implemented with 
the same function as corresponding binary operator in general case.


================
Comment at: clang/lib/AST/Interp/Interp.h:1238
+  auto Status = F.convertToInteger(Result);
+  if constexpr (std::is_same_v<T, Boolean>) {
+    S.Stk.push<T>(T(Result));
----------------
Conversion to boolean can be made with `APFloat::isNonZero`. It would correctly 
handle all values including NaNs/Infs. `convertToInteger` may leave `Result` 
unchanged if `Status` is `invalid`.


================
Comment at: clang/lib/AST/Interp/Interp.h:1243
+    // T's bit width.
+    if (!T::canRepresent(Result)) {
+      const Expr *E = S.Current->getExpr(OpPC);
----------------
sepavloff wrote:
> `Integral::canRepresent` is suitable only for integral-to-intergal 
> conversions. With loss of precision the floating-point numbers can represent 
> wider range of integers.
I was wrong, this is float-to-integer conversion. Would it be easier to detect 
overflow (as well as other cases, like NaN) by checking that 
`Status==opInvalidOp && F.isFinite()`? 


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D134859/new/

https://reviews.llvm.org/D134859

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to