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