reader/spirv: Add bool operator to TypedExpression Use this to check that type and expr are both not nullptr. Cleans up the random mix of checking `expr`, `type` or both. Change-Id: I84eb4a16e0dc22e18d6868f62c0314effe9858a2 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/51184 Commit-Queue: Ben Clayton <bclayton@google.com> Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/reader/spirv/function.cc b/src/reader/spirv/function.cc index 3bb750c..805fc56 100644 --- a/src/reader/spirv/function.cc +++ b/src/reader/spirv/function.cc
@@ -2662,7 +2662,7 @@ const auto selector_id = branch->GetSingleWordInOperand(0); // Generate the code for the selector. auto selector = MakeExpression(selector_id); - if (!selector.expr) { + if (!selector) { return false; } // First, push the statement block for the entire switch. @@ -2800,7 +2800,7 @@ return true; case SpvOpReturnValue: { auto value = MakeExpression(terminator.GetSingleWordInOperand(0)); - if (!value.expr) { + if (!value) { return false; } AddStatement(create<ast::ReturnStatement>(Source{}, value.expr)); @@ -3114,7 +3114,7 @@ for (auto assignment : block_info.phi_assignments) { const auto var_name = GetDefInfo(assignment.phi_id)->phi_var; auto expr = MakeExpression(assignment.value); - if (!expr.expr) { + if (!expr) { return false; } AddStatement(create<ast::AssignmentStatement>( @@ -3132,7 +3132,7 @@ bool FunctionEmitter::EmitConstDefinition( const spvtools::opt::Instruction& inst, TypedExpression ast_expr) { - if (!ast_expr.expr) { + if (!ast_expr) { return false; } auto* ast_const = parser_impl_.MakeVariable( @@ -3242,7 +3242,7 @@ } TypedExpression rhs = MakeExpression(value_id); - if (!rhs.expr) { + if (!rhs) { return false; } @@ -3279,7 +3279,7 @@ // Handle an ordinary store as an assignment. auto lhs = MakeExpression(ptr_id); - if (!lhs.expr) { + if (!lhs) { return false; } @@ -3339,7 +3339,7 @@ break; } auto expr = MakeExpression(ptr_id); - if (!expr.expr) { + if (!expr) { return false; } @@ -3383,7 +3383,7 @@ return true; } auto expr = MakeExpression(value_id); - if (!expr.type || !expr.expr) { + if (!expr) { return false; } expr.type = RemapStorageClass(expr.type, result_id); @@ -3456,7 +3456,7 @@ const spvtools::opt::Instruction& inst, uint32_t operand_index) { auto expr = this->MakeExpression(inst.GetSingleWordInOperand(operand_index)); - if (!expr.expr) { + if (!expr) { return {}; } return parser_impl_.RectifyOperandSignedness(inst, std::move(expr)); @@ -3790,7 +3790,7 @@ // walking down into composites. The Tint AST represents this as // ever-deeper nested indexing expressions. Start off with an expression // for the base, and then bury that inside nested indexing expressions. - if (!current_expr.expr) { + if (!current_expr) { current_expr = MakeOperand(inst, 0); } const auto constants = constant_mgr_->GetOperandConstants(&inst); @@ -4091,7 +4091,7 @@ const auto index = inst.GetSingleWordInOperand(i); if (index < vec0_len) { auto expr = MakeExpression(vec0_id); - if (!expr.expr) { + if (!expr) { return {}; } values.emplace_back(create<ast::MemberAccessorExpression>( @@ -4100,7 +4100,7 @@ const auto sub_index = index - vec0_len; TINT_ASSERT(sub_index < kMaxVectorLen); auto expr = MakeExpression(vec1_id); - if (!expr.expr) { + if (!expr) { return {}; } values.emplace_back(create<ast::MemberAccessorExpression>( @@ -4424,7 +4424,7 @@ const auto opcode = inst.opcode(); auto* requested_type = parser_impl_.ConvertType(inst.type_id()); auto arg_expr = MakeOperand(inst, 0); - if (!arg_expr.expr || !arg_expr.type) { + if (!arg_expr) { return {}; } @@ -5039,7 +5039,7 @@ // The coordinates parameter is always in position 1. TypedExpression raw_coords(MakeOperand(inst, 1)); - if (!raw_coords.type) { + if (!raw_coords) { return {}; } const Texture* texture_type = GetImageType(*image); @@ -5192,7 +5192,7 @@ } TypedExpression FunctionEmitter::ToI32(TypedExpression value) { - if (!value.type || value.type->Is<I32>()) { + if (!value || value.type->Is<I32>()) { return value; } return {ty_.I32(), @@ -5201,7 +5201,7 @@ } TypedExpression FunctionEmitter::ToSignedIfUnsigned(TypedExpression value) { - if (!value.type || !value.type->IsUnsignedScalarOrVector()) { + if (!value || !value.type->IsUnsignedScalarOrVector()) { return value; } if (auto* vec_type = value.type->As<Vector>()) { @@ -5237,7 +5237,7 @@ auto* member_ident = create<ast::IdentifierExpression>( Source{}, builder_.Symbols().Register(field_name)); auto member_expr = MakeExpression(struct_ptr_id); - if (!member_expr.expr) { + if (!member_expr) { return {}; } auto* member_access = create<ast::MemberAccessorExpression>( @@ -5382,7 +5382,7 @@ // The left-hand side of the assignment *looks* like a decomposition. TypedExpression lhs = MakeCompositeValueDecomposition(inst, seed_expr, inst.type_id(), 2); - if (!lhs.expr) { + if (!lhs) { return false; }
diff --git a/src/reader/spirv/parser_impl.cc b/src/reader/spirv/parser_impl.cc index 30d833c..7f3ae37 100644 --- a/src/reader/spirv/parser_impl.cc +++ b/src/reader/spirv/parser_impl.cc
@@ -1673,7 +1673,7 @@ // No conversion is required, assuming our tables are complete. return std::move(expr); } - if (!expr.expr) { + if (!expr) { Fail() << "internal error: RectifyOperandSignedness given a null expr\n"; return {}; }
diff --git a/src/reader/spirv/parser_impl.h b/src/reader/spirv/parser_impl.h index 09807a1..9f3e336 100644 --- a/src/reader/spirv/parser_impl.h +++ b/src/reader/spirv/parser_impl.h
@@ -67,15 +67,18 @@ /// Copy constructor TypedExpression(const TypedExpression&); - /// Assignment operator - /// @returns this TypedExpression - TypedExpression& operator=(const TypedExpression&); - /// Constructor /// @param type_in the type of the expression /// @param expr_in the expression TypedExpression(const Type* type_in, ast::Expression* expr_in); + /// Assignment operator + /// @returns this TypedExpression + TypedExpression& operator=(const TypedExpression&); + + /// @returns true if both type and expr are not nullptr + operator bool() const { return type && expr; } + /// The type Type const* type = nullptr; /// The expression