ast: Use IdentifierExpression for call targets
They are always identifiers, and this removes unnecessary type casting
from usages of CallExpression::func().
Change-Id: I7a11dc10658abab578395e20ad830cd5bc5a5b71
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/51960
Auto-Submit: James Price <jrprice@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/ast/call_expression.cc b/src/ast/call_expression.cc
index 0ac44bf..e63b41f 100644
--- a/src/ast/call_expression.cc
+++ b/src/ast/call_expression.cc
@@ -23,7 +23,7 @@
CallExpression::CallExpression(ProgramID program_id,
const Source& source,
- Expression* func,
+ IdentifierExpression* func,
ExpressionList params)
: Base(program_id, source), func_(func), params_(params) {
TINT_ASSERT(func_);
diff --git a/src/ast/call_expression.h b/src/ast/call_expression.h
index c366d91..54d9711 100644
--- a/src/ast/call_expression.h
+++ b/src/ast/call_expression.h
@@ -20,6 +20,9 @@
namespace tint {
namespace ast {
+// Forward declarations.
+class IdentifierExpression;
+
/// A call expression
class CallExpression : public Castable<CallExpression, Expression> {
public:
@@ -30,14 +33,14 @@
/// @param params the parameters
CallExpression(ProgramID program_id,
const Source& source,
- Expression* func,
+ IdentifierExpression* func,
ExpressionList params);
/// Move constructor
CallExpression(CallExpression&&);
~CallExpression() override;
/// @returns the func
- Expression* func() const { return func_; }
+ IdentifierExpression* func() const { return func_; }
/// @returns the parameters
const ExpressionList& params() const { return params_; }
@@ -58,7 +61,7 @@
private:
CallExpression(const CallExpression&) = delete;
- Expression* const func_;
+ IdentifierExpression* const func_;
ExpressionList const params_;
};
diff --git a/src/reader/wgsl/parser_impl_call_stmt_test.cc b/src/reader/wgsl/parser_impl_call_stmt_test.cc
index ec41195..28dc2c8 100644
--- a/src/reader/wgsl/parser_impl_call_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_call_stmt_test.cc
@@ -31,9 +31,7 @@
ASSERT_TRUE(e->Is<ast::CallStatement>());
auto* c = e->As<ast::CallStatement>()->expr();
- ASSERT_TRUE(c->func()->Is<ast::IdentifierExpression>());
- auto* ident = c->func()->As<ast::IdentifierExpression>();
- EXPECT_EQ(ident->symbol(), p->builder().Symbols().Get("a"));
+ EXPECT_EQ(c->func()->symbol(), p->builder().Symbols().Get("a"));
EXPECT_EQ(c->params().size(), 0u);
}
@@ -49,9 +47,7 @@
ASSERT_TRUE(e->Is<ast::CallStatement>());
auto* c = e->As<ast::CallStatement>()->expr();
- ASSERT_TRUE(c->func()->Is<ast::IdentifierExpression>());
- auto* ident = c->func()->As<ast::IdentifierExpression>();
- EXPECT_EQ(ident->symbol(), p->builder().Symbols().Get("a"));
+ EXPECT_EQ(c->func()->symbol(), p->builder().Symbols().Get("a"));
EXPECT_EQ(c->params().size(), 3u);
EXPECT_TRUE(c->params()[0]->Is<ast::ConstructorExpression>());
@@ -70,9 +66,7 @@
ASSERT_TRUE(e->Is<ast::CallStatement>());
auto* c = e->As<ast::CallStatement>()->expr();
- ASSERT_TRUE(c->func()->Is<ast::IdentifierExpression>());
- auto* ident = c->func()->As<ast::IdentifierExpression>();
- EXPECT_EQ(ident->symbol(), p->builder().Symbols().Get("a"));
+ EXPECT_EQ(c->func()->symbol(), p->builder().Symbols().Get("a"));
EXPECT_EQ(c->params().size(), 2u);
EXPECT_TRUE(c->params()[0]->Is<ast::ConstructorExpression>());
diff --git a/src/reader/wgsl/parser_impl_singular_expression_test.cc b/src/reader/wgsl/parser_impl_singular_expression_test.cc
index d74d1bf..ee73c87 100644
--- a/src/reader/wgsl/parser_impl_singular_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_singular_expression_test.cc
@@ -100,9 +100,7 @@
ASSERT_TRUE(e->Is<ast::CallExpression>());
auto* c = e->As<ast::CallExpression>();
- ASSERT_TRUE(c->func()->Is<ast::IdentifierExpression>());
- auto* func = c->func()->As<ast::IdentifierExpression>();
- EXPECT_EQ(func->symbol(), p->builder().Symbols().Get("a"));
+ EXPECT_EQ(c->func()->symbol(), p->builder().Symbols().Get("a"));
EXPECT_EQ(c->params().size(), 0u);
}
@@ -118,9 +116,7 @@
ASSERT_TRUE(e->Is<ast::CallExpression>());
auto* c = e->As<ast::CallExpression>();
- ASSERT_TRUE(c->func()->Is<ast::IdentifierExpression>());
- auto* func = c->func()->As<ast::IdentifierExpression>();
- EXPECT_EQ(func->symbol(), p->builder().Symbols().Get("test"));
+ EXPECT_EQ(c->func()->symbol(), p->builder().Symbols().Get("test"));
EXPECT_EQ(c->params().size(), 3u);
EXPECT_TRUE(c->params()[0]->Is<ast::ConstructorExpression>());
diff --git a/src/resolver/resolver.cc b/src/resolver/resolver.cc
index e63800f..757da88 100644
--- a/src/resolver/resolver.cc
+++ b/src/resolver/resolver.cc
@@ -1626,16 +1626,8 @@
return false;
}
- // The expression has to be an identifier as you can't store function
- // pointers but, if it isn't we'll just use the normal result determination
- // to be on the safe side.
Mark(call->func());
- auto* ident = call->func()->As<ast::IdentifierExpression>();
- if (!ident) {
- diagnostics_.add_error("call target is not an identifier", call->source());
- return false;
- }
-
+ auto* ident = call->func();
auto name = builder_->Symbols().NameFor(ident->symbol());
auto intrinsic_type = sem::ParseIntrinsicType(name);
diff --git a/src/transform/renamer.cc b/src/transform/renamer.cc
index 9cd9abd..d1371b2 100644
--- a/src/transform/renamer.cc
+++ b/src/transform/renamer.cc
@@ -871,7 +871,7 @@
continue;
}
if (sem->Target()->Is<sem::Intrinsic>()) {
- preserve.emplace(call->func()->As<ast::IdentifierExpression>());
+ preserve.emplace(call->func());
}
}
}
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index 5a3621b..1c2d3f0 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -461,13 +461,8 @@
bool GeneratorImpl::EmitCall(std::ostream& pre,
std::ostream& out,
ast::CallExpression* expr) {
- auto* ident = expr->func()->As<ast::IdentifierExpression>();
- if (ident == nullptr) {
- diagnostics_.add_error("invalid function name");
- return 0;
- }
-
const auto& params = expr->params();
+ auto* ident = expr->func();
auto* call = builder_.Sem().Get(expr);
auto* target = call->Target();
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index e569945..ed64bf9 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -319,13 +319,7 @@
}
bool GeneratorImpl::EmitCall(ast::CallExpression* expr) {
- auto* ident = expr->func()->As<ast::IdentifierExpression>();
-
- if (ident == nullptr) {
- diagnostics_.add_error("invalid function name");
- return 0;
- }
-
+ auto* ident = expr->func();
auto* call = program_->Sem().Get(expr);
if (auto* intrinsic = call->Target()->As<sem::Intrinsic>()) {
if (intrinsic->IsTexture()) {
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index e10bab5..a7af47f 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -1892,13 +1892,7 @@
}
uint32_t Builder::GenerateCallExpression(ast::CallExpression* expr) {
- auto* ident = expr->func()->As<ast::IdentifierExpression>();
-
- if (ident == nullptr) {
- error_ = "invalid function name";
- return 0;
- }
-
+ auto* ident = expr->func();
auto* call = builder_.Sem().Get(expr);
auto* target = call->Target();
if (auto* intrinsic = target->As<sem::Intrinsic>()) {