Replace Type::(Is|As)Void with Castable

Change-Id: If8a27c69c91a968a40a982c02b9fcaf9481e60b7
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/34275
Reviewed-by: dan sinclair <dsinclair@chromium.org>
This commit is contained in:
Ben Clayton 2020-11-30 23:30:58 +00:00
parent 8a083ce9c8
commit 16ec1bb626
13 changed files with 26 additions and 52 deletions

View File

@ -66,10 +66,6 @@ Type* Type::UnwrapAll() {
return UnwrapIfNeeded()->UnwrapPtrIfNeeded()->UnwrapIfNeeded(); return UnwrapIfNeeded()->UnwrapPtrIfNeeded()->UnwrapIfNeeded();
} }
bool Type::IsVoid() const {
return false;
}
uint64_t Type::MinBufferBindingSize(MemoryLayout) const { uint64_t Type::MinBufferBindingSize(MemoryLayout) const {
return 0; return 0;
} }
@ -124,16 +120,6 @@ bool Type::is_integer_scalar_or_vector() {
return is_unsigned_scalar_or_vector() || is_signed_scalar_or_vector(); return is_unsigned_scalar_or_vector() || is_signed_scalar_or_vector();
} }
const VoidType* Type::AsVoid() const {
assert(IsVoid());
return static_cast<const VoidType*>(this);
}
VoidType* Type::AsVoid() {
assert(IsVoid());
return static_cast<VoidType*>(this);
}
} // namespace type } // namespace type
} // namespace ast } // namespace ast
} // namespace tint } // namespace tint

View File

@ -23,8 +23,6 @@ namespace tint {
namespace ast { namespace ast {
namespace type { namespace type {
class VoidType;
/// Supported memory layouts for calculating sizes /// Supported memory layouts for calculating sizes
enum class MemoryLayout { kUniformBuffer, kStorageBuffer }; enum class MemoryLayout { kUniformBuffer, kStorageBuffer };
@ -35,9 +33,6 @@ class Type : public Castable<Type> {
Type(Type&&); Type(Type&&);
~Type() override; ~Type() override;
/// @returns true if the type is a void type
virtual bool IsVoid() const;
/// @returns the name for this type. The |type_name| is unique over all types. /// @returns the name for this type. The |type_name| is unique over all types.
virtual std::string type_name() const = 0; virtual std::string type_name() const = 0;
@ -92,12 +87,6 @@ class Type : public Castable<Type> {
/// @returns true if this type is an integer scalar or vector /// @returns true if this type is an integer scalar or vector
bool is_integer_scalar_or_vector(); bool is_integer_scalar_or_vector();
/// @returns the type as a void type
const VoidType* AsVoid() const;
/// @returns the type as a void type
VoidType* AsVoid();
protected: protected:
Type(); Type();
}; };

View File

@ -24,10 +24,6 @@ VoidType::VoidType(VoidType&&) = default;
VoidType::~VoidType() = default; VoidType::~VoidType() = default;
bool VoidType::IsVoid() const {
return true;
}
std::string VoidType::type_name() const { std::string VoidType::type_name() const {
return "__void"; return "__void";
} }

View File

@ -32,9 +32,6 @@ class VoidType : public Castable<VoidType, Type> {
VoidType(VoidType&&); VoidType(VoidType&&);
~VoidType() override; ~VoidType() override;
/// @returns true if the type is a void type
bool IsVoid() const override;
/// @returns the name for this type /// @returns the name for this type
std::string type_name() const override; std::string type_name() const override;
}; };

View File

@ -59,6 +59,7 @@
#include "src/ast/type/type.h" #include "src/ast/type/type.h"
#include "src/ast/type/u32_type.h" #include "src/ast/type/u32_type.h"
#include "src/ast/type/vector_type.h" #include "src/ast/type/vector_type.h"
#include "src/ast/type/void_type.h"
#include "src/ast/type_constructor_expression.h" #include "src/ast/type_constructor_expression.h"
#include "src/ast/uint_literal.h" #include "src/ast/uint_literal.h"
#include "src/ast/unary_op.h" #include "src/ast/unary_op.h"
@ -3556,7 +3557,7 @@ bool FunctionEmitter::EmitFunctionCall(const spvtools::opt::Instruction& inst) {
<< inst.PrettyPrint(); << inst.PrettyPrint();
} }
if (result_type->IsVoid()) { if (result_type->Is<ast::type::VoidType>()) {
return nullptr != AddStatementForInstruction( return nullptr != AddStatementForInstruction(
create<ast::CallStatement>(call_expr), inst); create<ast::CallStatement>(call_expr), inst);
} }

View File

@ -28,6 +28,7 @@
#include "src/ast/type/type.h" #include "src/ast/type/type.h"
#include "src/ast/type/u32_type.h" #include "src/ast/type/u32_type.h"
#include "src/ast/type/vector_type.h" #include "src/ast/type/vector_type.h"
#include "src/ast/type/void_type.h"
#include "src/reader/spirv/parser_impl.h" #include "src/reader/spirv/parser_impl.h"
#include "src/reader/spirv/parser_impl_test_helper.h" #include "src/reader/spirv/parser_impl_test_helper.h"
#include "src/reader/spirv/spirv_tools_helpers_test.h" #include "src/reader/spirv/spirv_tools_helpers_test.h"
@ -91,7 +92,7 @@ TEST_F(SpvParserTest, ConvertType_Void) {
EXPECT_TRUE(p->BuildInternalModule()); EXPECT_TRUE(p->BuildInternalModule());
auto* type = p->ConvertType(1); auto* type = p->ConvertType(1);
EXPECT_TRUE(type->IsVoid()); EXPECT_TRUE(type->Is<ast::type::VoidType>());
EXPECT_TRUE(p->error().empty()); EXPECT_TRUE(p->error().empty());
} }
@ -845,7 +846,7 @@ TEST_F(SpvParserTest, ConvertType_Sampler_PretendVoid) {
EXPECT_TRUE(p->BuildInternalModule()); EXPECT_TRUE(p->BuildInternalModule());
auto* type = p->ConvertType(1); auto* type = p->ConvertType(1);
EXPECT_TRUE(type->IsVoid()); EXPECT_TRUE(type->Is<ast::type::VoidType>());
EXPECT_TRUE(p->error().empty()); EXPECT_TRUE(p->error().empty());
} }
@ -858,7 +859,7 @@ TEST_F(SpvParserTest, ConvertType_Image_PretendVoid) {
EXPECT_TRUE(p->BuildInternalModule()); EXPECT_TRUE(p->BuildInternalModule());
auto* type = p->ConvertType(1); auto* type = p->ConvertType(1);
EXPECT_TRUE(type->IsVoid()); EXPECT_TRUE(type->Is<ast::type::VoidType>());
EXPECT_TRUE(p->error().empty()); EXPECT_TRUE(p->error().empty());
} }
@ -871,7 +872,7 @@ TEST_F(SpvParserTest, ConvertType_SampledImage_PretendVoid) {
EXPECT_TRUE(p->BuildInternalModule()); EXPECT_TRUE(p->BuildInternalModule());
auto* type = p->ConvertType(1); auto* type = p->ConvertType(1);
EXPECT_TRUE(type->IsVoid()); EXPECT_TRUE(type->Is<ast::type::VoidType>());
EXPECT_TRUE(p->error().empty()); EXPECT_TRUE(p->error().empty());
} }

View File

@ -15,6 +15,7 @@
#include "gtest/gtest.h" #include "gtest/gtest.h"
#include "src/ast/function.h" #include "src/ast/function.h"
#include "src/ast/type/type.h" #include "src/ast/type/type.h"
#include "src/ast/type/void_type.h"
#include "src/ast/workgroup_decoration.h" #include "src/ast/workgroup_decoration.h"
#include "src/reader/wgsl/parser_impl.h" #include "src/reader/wgsl/parser_impl.h"
#include "src/reader/wgsl/parser_impl_test_helper.h" #include "src/reader/wgsl/parser_impl_test_helper.h"
@ -38,14 +39,14 @@ TEST_F(ParserImplTest, FunctionDecl) {
EXPECT_EQ(f->name(), "main"); EXPECT_EQ(f->name(), "main");
ASSERT_NE(f->return_type(), nullptr); ASSERT_NE(f->return_type(), nullptr);
EXPECT_TRUE(f->return_type()->IsVoid()); EXPECT_TRUE(f->return_type()->Is<ast::type::VoidType>());
ASSERT_EQ(f->params().size(), 2u); ASSERT_EQ(f->params().size(), 2u);
EXPECT_EQ(f->params()[0]->name(), "a"); EXPECT_EQ(f->params()[0]->name(), "a");
EXPECT_EQ(f->params()[1]->name(), "b"); EXPECT_EQ(f->params()[1]->name(), "b");
ASSERT_NE(f->return_type(), nullptr); ASSERT_NE(f->return_type(), nullptr);
EXPECT_TRUE(f->return_type()->IsVoid()); EXPECT_TRUE(f->return_type()->Is<ast::type::VoidType>());
auto* body = f->body(); auto* body = f->body();
ASSERT_EQ(body->size(), 1u); ASSERT_EQ(body->size(), 1u);
@ -66,10 +67,10 @@ TEST_F(ParserImplTest, FunctionDecl_DecorationList) {
EXPECT_EQ(f->name(), "main"); EXPECT_EQ(f->name(), "main");
ASSERT_NE(f->return_type(), nullptr); ASSERT_NE(f->return_type(), nullptr);
EXPECT_TRUE(f->return_type()->IsVoid()); EXPECT_TRUE(f->return_type()->Is<ast::type::VoidType>());
ASSERT_EQ(f->params().size(), 0u); ASSERT_EQ(f->params().size(), 0u);
ASSERT_NE(f->return_type(), nullptr); ASSERT_NE(f->return_type(), nullptr);
EXPECT_TRUE(f->return_type()->IsVoid()); EXPECT_TRUE(f->return_type()->Is<ast::type::VoidType>());
auto& decorations = f->decorations(); auto& decorations = f->decorations();
ASSERT_EQ(decorations.size(), 1u); ASSERT_EQ(decorations.size(), 1u);
@ -104,10 +105,10 @@ fn main() -> void { return; })");
EXPECT_EQ(f->name(), "main"); EXPECT_EQ(f->name(), "main");
ASSERT_NE(f->return_type(), nullptr); ASSERT_NE(f->return_type(), nullptr);
EXPECT_TRUE(f->return_type()->IsVoid()); EXPECT_TRUE(f->return_type()->Is<ast::type::VoidType>());
ASSERT_EQ(f->params().size(), 0u); ASSERT_EQ(f->params().size(), 0u);
ASSERT_NE(f->return_type(), nullptr); ASSERT_NE(f->return_type(), nullptr);
EXPECT_TRUE(f->return_type()->IsVoid()); EXPECT_TRUE(f->return_type()->Is<ast::type::VoidType>());
auto& decorations = f->decorations(); auto& decorations = f->decorations();
ASSERT_EQ(decorations.size(), 2u); ASSERT_EQ(decorations.size(), 2u);
@ -149,10 +150,10 @@ fn main() -> void { return; })");
EXPECT_EQ(f->name(), "main"); EXPECT_EQ(f->name(), "main");
ASSERT_NE(f->return_type(), nullptr); ASSERT_NE(f->return_type(), nullptr);
EXPECT_TRUE(f->return_type()->IsVoid()); EXPECT_TRUE(f->return_type()->Is<ast::type::VoidType>());
ASSERT_EQ(f->params().size(), 0u); ASSERT_EQ(f->params().size(), 0u);
ASSERT_NE(f->return_type(), nullptr); ASSERT_NE(f->return_type(), nullptr);
EXPECT_TRUE(f->return_type()->IsVoid()); EXPECT_TRUE(f->return_type()->Is<ast::type::VoidType>());
auto& decos = f->decorations(); auto& decos = f->decorations();
ASSERT_EQ(decos.size(), 2u); ASSERT_EQ(decos.size(), 2u);

View File

@ -15,6 +15,7 @@
#include "gtest/gtest.h" #include "gtest/gtest.h"
#include "src/ast/function.h" #include "src/ast/function.h"
#include "src/ast/type/type.h" #include "src/ast/type/type.h"
#include "src/ast/type/void_type.h"
#include "src/reader/wgsl/parser_impl.h" #include "src/reader/wgsl/parser_impl.h"
#include "src/reader/wgsl/parser_impl_test_helper.h" #include "src/reader/wgsl/parser_impl_test_helper.h"
@ -35,7 +36,7 @@ TEST_F(ParserImplTest, FunctionHeader) {
ASSERT_EQ(f->params().size(), 2u); ASSERT_EQ(f->params().size(), 2u);
EXPECT_EQ(f->params()[0]->name(), "a"); EXPECT_EQ(f->params()[0]->name(), "a");
EXPECT_EQ(f->params()[1]->name(), "b"); EXPECT_EQ(f->params()[1]->name(), "b");
EXPECT_TRUE(f->return_type()->IsVoid()); EXPECT_TRUE(f->return_type()->Is<ast::type::VoidType>());
} }
TEST_F(ParserImplTest, FunctionHeader_MissingIdent) { TEST_F(ParserImplTest, FunctionHeader_MissingIdent) {

View File

@ -166,7 +166,7 @@ bool ValidatorImpl::ValidateEntryPoint(const ast::FunctionList& funcs) {
return false; return false;
} }
if (!func->return_type()->IsVoid()) { if (!func->return_type()->Is<ast::type::VoidType>()) {
add_error( add_error(
func->source(), "v-0024", func->source(), "v-0024",
"Entry point function must return void: '" + func->name() + "'"); "Entry point function must return void: '" + func->name() + "'");
@ -205,7 +205,7 @@ bool ValidatorImpl::ValidateFunction(const ast::Function* func) {
} }
variable_stack_.pop_scope(); variable_stack_.pop_scope();
if (!current_function_->return_type()->IsVoid()) { if (!current_function_->return_type()->Is<ast::type::VoidType>()) {
if (!func->get_last_statement() || if (!func->get_last_statement() ||
!func->get_last_statement()->IsReturn()) { !func->get_last_statement()->IsReturn()) {
add_error(func->source(), "v-0002", add_error(func->source(), "v-0002",

View File

@ -51,6 +51,7 @@
#include "src/ast/type/texture_type.h" #include "src/ast/type/texture_type.h"
#include "src/ast/type/u32_type.h" #include "src/ast/type/u32_type.h"
#include "src/ast/type/vector_type.h" #include "src/ast/type/vector_type.h"
#include "src/ast/type/void_type.h"
#include "src/ast/uint_literal.h" #include "src/ast/uint_literal.h"
#include "src/ast/unary_op_expression.h" #include "src/ast/unary_op_expression.h"
#include "src/ast/variable_decl_statement.h" #include "src/ast/variable_decl_statement.h"
@ -2150,7 +2151,7 @@ bool GeneratorImpl::EmitType(std::ostream& out,
} }
out << ", " << size << ">"; out << ", " << size << ">";
} }
} else if (type->IsVoid()) { } else if (type->Is<ast::type::VoidType>()) {
out << "void"; out << "void";
} else { } else {
error_ = "unknown type in EmitType"; error_ = "unknown type in EmitType";

View File

@ -1918,7 +1918,7 @@ bool GeneratorImpl::EmitType(ast::type::Type* type, const std::string& name) {
return false; return false;
} }
out_ << vec->size(); out_ << vec->size();
} else if (type->IsVoid()) { } else if (type->Is<ast::type::VoidType>()) {
out_ << "void"; out_ << "void";
} else { } else {
error_ = "unknown type in EmitType: " + type->type_name(); error_ = "unknown type in EmitType: " + type->type_name();

View File

@ -2462,7 +2462,7 @@ uint32_t Builder::GenerateTypeIfNeeded(ast::type::Type* type) {
if (!GenerateVectorType(type->As<ast::type::VectorType>(), result)) { if (!GenerateVectorType(type->As<ast::type::VectorType>(), result)) {
return 0; return 0;
} }
} else if (type->IsVoid()) { } else if (type->Is<ast::type::VoidType>()) {
push_type(spv::Op::OpTypeVoid, {result}); push_type(spv::Op::OpTypeVoid, {result});
} else if (type->Is<ast::type::TextureType>()) { } else if (type->Is<ast::type::TextureType>()) {
if (!GenerateTextureType(type->As<ast::type::TextureType>(), result)) { if (!GenerateTextureType(type->As<ast::type::TextureType>(), result)) {

View File

@ -66,6 +66,7 @@
#include "src/ast/type/struct_type.h" #include "src/ast/type/struct_type.h"
#include "src/ast/type/u32_type.h" #include "src/ast/type/u32_type.h"
#include "src/ast/type/vector_type.h" #include "src/ast/type/vector_type.h"
#include "src/ast/type/void_type.h"
#include "src/ast/type_constructor_expression.h" #include "src/ast/type_constructor_expression.h"
#include "src/ast/uint_literal.h" #include "src/ast/uint_literal.h"
#include "src/ast/unary_op_expression.h" #include "src/ast/unary_op_expression.h"
@ -554,7 +555,7 @@ bool GeneratorImpl::EmitType(ast::type::Type* type) {
return false; return false;
} }
out_ << ">"; out_ << ">";
} else if (type->IsVoid()) { } else if (type->Is<ast::type::VoidType>()) {
out_ << "void"; out_ << "void";
} else { } else {
error_ = "unknown type in EmitType: " + type->type_name(); error_ = "unknown type in EmitType: " + type->type_name();