Add type determination for call expressions.
This CL adds the type determination for call expressions.
Bug: tint:5
Change-Id: Ibe08f90ec3905dd1e2169f6e69d1d74943720819
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/18844
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/type_determiner.cc b/src/type_determiner.cc
index e51e1f0..f974bb0 100644
--- a/src/type_determiner.cc
+++ b/src/type_determiner.cc
@@ -20,6 +20,7 @@
#include "src/ast/as_expression.h"
#include "src/ast/assignment_statement.h"
#include "src/ast/break_statement.h"
+#include "src/ast/call_expression.h"
#include "src/ast/case_statement.h"
#include "src/ast/continue_statement.h"
#include "src/ast/else_statement.h"
@@ -39,10 +40,7 @@
namespace tint {
-TypeDeterminer::TypeDeterminer(Context* ctx) : ctx_(*ctx) {
- // TODO(dsinclair): Temporary usage to avoid compiler warning
- static_cast<void>(ctx_.type_mgr());
-}
+TypeDeterminer::TypeDeterminer(Context* ctx) : ctx_(*ctx) {}
TypeDeterminer::~TypeDeterminer() = default;
@@ -175,6 +173,15 @@
return false;
}
+bool TypeDeterminer::DetermineResultType(const ast::ExpressionList& exprs) {
+ for (const auto& expr : exprs) {
+ if (!DetermineResultType(expr.get())) {
+ return false;
+ }
+ }
+ return true;
+}
+
bool TypeDeterminer::DetermineResultType(ast::Expression* expr) {
// This is blindly called above, so in some cases the expression won't exist.
if (!expr) {
@@ -187,6 +194,9 @@
if (expr->IsAs()) {
return DetermineAs(expr->AsAs());
}
+ if (expr->IsCall()) {
+ return DetermineCall(expr->AsCall());
+ }
if (expr->IsConstructor()) {
return DetermineConstructor(expr->AsConstructor());
}
@@ -224,6 +234,17 @@
return true;
}
+bool TypeDeterminer::DetermineCall(ast::CallExpression* expr) {
+ if (!DetermineResultType(expr->func())) {
+ return false;
+ }
+ if (!DetermineResultType(expr->params())) {
+ return false;
+ }
+ expr->set_result_type(expr->func()->result_type());
+ return true;
+}
+
bool TypeDeterminer::DetermineConstructor(ast::ConstructorExpression* expr) {
if (expr->IsTypeConstructor()) {
expr->set_result_type(expr->AsTypeConstructor()->type());