================
@@ -765,92 +764,119 @@ Interpreter::Visit(const BooleanLiteralNode *node) {
 }
 
 llvm::Expected<CastKind>
-Interpreter::VerifyCastType(lldb::ValueObjectSP operand, CompilerType op_type,
-                            CompilerType target_type, int location) {
+Interpreter::VerifyArithmeticCast(CompilerType source_type,
+                                  CompilerType target_type, int location) {
+  if (source_type.IsPointerType() || source_type.IsNullPtrType()) {
+    // Cast from pointer to float/double is not allowed.
+    if (target_type.IsFloat()) {
+      std::string errMsg = llvm::formatv("Cast from {0} to {1} is not allowed",
+                                         source_type.TypeDescription(),
+                                         target_type.TypeDescription());
+      return llvm::make_error<DILDiagnosticError>(
+          m_expr, std::move(errMsg), location,
+          source_type.TypeDescription().length());
+    }
 
-  if (target_type.IsScalarType()) {
-    if (op_type.IsPointerType() || op_type.IsNullPtrType()) {
-      // Cast from pointer to float/double is not allowed.
-      if (target_type.IsFloat()) {
-        std::string errMsg = llvm::formatv(
-            "Cast from {0} to {1} is not allowed", op_type.TypeDescription(),
-            target_type.TypeDescription());
-        return llvm::make_error<DILDiagnosticError>(
-            m_expr, std::move(errMsg), location,
-            op_type.TypeDescription().length());
-      }
-      // Casting pointer to bool is valid. Otherwise check if the result type
-      // is at least as big as the pointer size.
-      uint64_t type_byte_size = 0;
-      uint64_t rhs_type_byte_size = 0;
-      if (auto temp = target_type.GetByteSize(m_exe_ctx_scope.get()))
-        type_byte_size = *temp;
-      if (auto temp = op_type.GetByteSize(m_exe_ctx_scope.get()))
-        rhs_type_byte_size = *temp;
-      if (!target_type.IsBoolean() && type_byte_size < rhs_type_byte_size) {
-        std::string errMsg = llvm::formatv(
-            "cast from pointer to smaller type {0} loses information",
-            target_type.TypeDescription());
-        return llvm::make_error<DILDiagnosticError>(
-            m_expr, std::move(errMsg), location,
-            op_type.TypeDescription().length());
-      }
-    } else if (!op_type.IsScalarType() && !op_type.IsEnumerationType()) {
-      // Otherwise accept only arithmetic types and enums.
-      std::string errMsg = llvm::formatv(
-          "cannot convert {0} to {1} without a conversion operator",
-          op_type.TypeDescription(), target_type.TypeDescription());
+    // Casting from pointer to bool is always valid.
+    if (target_type.IsBoolean())
+      return CastKind::eArithmetic;
+
+    // Otherwise check if the result type is at least as big as the pointer
+    // size.
+    uint64_t type_byte_size = 0;
+    uint64_t rhs_type_byte_size = 0;
+    if (auto temp = target_type.GetByteSize(m_exe_ctx_scope.get())) {
+      type_byte_size = *temp;
+    } else {
+      std::string errMsg = llvm::formatv("unable to get byte size for type 
{0}",
+                                         target_type.TypeDescription());
+      return llvm::make_error<DILDiagnosticError>(
+          m_expr, std::move(errMsg), location,
+          target_type.TypeDescription().length());
+    }
 
+    if (auto temp = source_type.GetByteSize(m_exe_ctx_scope.get())) {
+      rhs_type_byte_size = *temp;
+    } else {
+      std::string errMsg = llvm::formatv("unable to get byte size for type 
{0}",
+                                         source_type.TypeDescription());
+      return llvm::make_error<DILDiagnosticError>(
+          m_expr, std::move(errMsg), location,
+          source_type.TypeDescription().length());
+    }
+
+    if (type_byte_size < rhs_type_byte_size) {
+      std::string errMsg = llvm::formatv(
+          "cast from pointer to smaller type {0} loses information",
+          target_type.TypeDescription());
       return llvm::make_error<DILDiagnosticError>(
           m_expr, std::move(errMsg), location,
-          op_type.TypeDescription().length());
+          source_type.TypeDescription().length());
     }
-    return CastKind::eArithmetic;
+  } else if (!source_type.IsScalarType() && !source_type.IsEnumerationType()) {
+    // Otherwise accept only arithmetic types and enums.
+    std::string errMsg = llvm::formatv("cannot convert {0} to {1}",
+                                       source_type.TypeDescription(),
+                                       target_type.TypeDescription());
+
+    return llvm::make_error<DILDiagnosticError>(
+        m_expr, std::move(errMsg), location,
+        source_type.TypeDescription().length());
   }
----------------
Michael137 wrote:

I would move this check up just after the `IsBoolean` check. That way we don't 
mix it with the byte-size checks, which we don't need to do for non-scalar 
types.

https://github.com/llvm/llvm-project/pull/170332
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to