Rename RelationalExpression to BinaryExpression.

Match the more common usage for the expression type.

Bug: tint:37
Change-Id: Ia5d48a0444742ec4e304ea1036e499b3d7cad682
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/18981
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
diff --git a/src/reader/wgsl/parser_impl.cc b/src/reader/wgsl/parser_impl.cc
index dcc7229..5f86f56 100644
--- a/src/reader/wgsl/parser_impl.cc
+++ b/src/reader/wgsl/parser_impl.cc
@@ -19,6 +19,7 @@
 
 #include "src/ast/array_accessor_expression.h"
 #include "src/ast/as_expression.h"
+#include "src/ast/binary_expression.h"
 #include "src/ast/binding_decoration.h"
 #include "src/ast/bool_literal.h"
 #include "src/ast/break_statement.h"
@@ -38,7 +39,6 @@
 #include "src/ast/location_decoration.h"
 #include "src/ast/member_accessor_expression.h"
 #include "src/ast/nop_statement.h"
-#include "src/ast/relational_expression.h"
 #include "src/ast/return_statement.h"
 #include "src/ast/scalar_constructor_expression.h"
 #include "src/ast/set_decoration.h"
@@ -2633,13 +2633,13 @@
     std::unique_ptr<ast::Expression> lhs) {
   auto t = peek();
 
-  ast::Relation relation = ast::Relation::kNone;
+  ast::BinaryOp op = ast::BinaryOp::kNone;
   if (t.IsStar())
-    relation = ast::Relation::kMultiply;
+    op = ast::BinaryOp::kMultiply;
   else if (t.IsForwardSlash())
-    relation = ast::Relation::kDivide;
+    op = ast::BinaryOp::kDivide;
   else if (t.IsMod())
-    relation = ast::Relation::kModulo;
+    op = ast::BinaryOp::kModulo;
   else
     return lhs;
 
@@ -2654,8 +2654,8 @@
     set_error(peek(), "unable to parse right side of " + name + " expression");
     return nullptr;
   }
-  return multiplicative_expr(std::make_unique<ast::RelationalExpression>(
-      source, relation, std::move(lhs), std::move(rhs)));
+  return multiplicative_expr(std::make_unique<ast::BinaryExpression>(
+      source, op, std::move(lhs), std::move(rhs)));
 }
 
 // multiplicative_expression
@@ -2678,11 +2678,11 @@
     std::unique_ptr<ast::Expression> lhs) {
   auto t = peek();
 
-  ast::Relation relation = ast::Relation::kNone;
+  ast::BinaryOp op = ast::BinaryOp::kNone;
   if (t.IsPlus())
-    relation = ast::Relation::kAdd;
+    op = ast::BinaryOp::kAdd;
   else if (t.IsMinus())
-    relation = ast::Relation::kSubtract;
+    op = ast::BinaryOp::kSubtract;
   else
     return lhs;
 
@@ -2696,8 +2696,8 @@
     set_error(peek(), "unable to parse right side of + expression");
     return nullptr;
   }
-  return additive_expr(std::make_unique<ast::RelationalExpression>(
-      source, relation, std::move(lhs), std::move(rhs)));
+  return additive_expr(std::make_unique<ast::BinaryExpression>(
+      source, op, std::move(lhs), std::move(rhs)));
 }
 
 // additive_expression
@@ -2725,22 +2725,22 @@
   auto t3 = peek(2);
 
   auto name = "";
-  ast::Relation relation = ast::Relation::kNone;
+  ast::BinaryOp op = ast::BinaryOp::kNone;
   if (t.IsLessThan() && t2.IsLessThan()) {
     next();  // Consume the t peek
     next();  // Consume the t2 peek
-    relation = ast::Relation::kShiftLeft;
+    op = ast::BinaryOp::kShiftLeft;
     name = "<<";
   } else if (t.IsGreaterThan() && t2.IsGreaterThan() && t3.IsGreaterThan()) {
     next();  // Consume the t peek
     next();  // Consume the t2 peek
     next();  // Consume the t3 peek
-    relation = ast::Relation::kShiftRightArith;
+    op = ast::BinaryOp::kShiftRightArith;
     name = ">>>";
   } else if (t.IsGreaterThan() && t2.IsGreaterThan()) {
     next();  // Consume the t peek
     next();  // Consume the t2 peek
-    relation = ast::Relation::kShiftRight;
+    op = ast::BinaryOp::kShiftRight;
     name = ">>";
   } else {
     return lhs;
@@ -2754,8 +2754,8 @@
                           " expression");
     return nullptr;
   }
-  return shift_expr(std::make_unique<ast::RelationalExpression>(
-      source, relation, std::move(lhs), std::move(rhs)));
+  return shift_expr(std::make_unique<ast::BinaryExpression>(
+      source, op, std::move(lhs), std::move(rhs)));
 }
 
 // shift_expression
@@ -2779,15 +2779,15 @@
 std::unique_ptr<ast::Expression> ParserImpl::relational_expr(
     std::unique_ptr<ast::Expression> lhs) {
   auto t = peek();
-  ast::Relation relation = ast::Relation::kNone;
+  ast::BinaryOp op = ast::BinaryOp::kNone;
   if (t.IsLessThan())
-    relation = ast::Relation::kLessThan;
+    op = ast::BinaryOp::kLessThan;
   else if (t.IsGreaterThan())
-    relation = ast::Relation::kGreaterThan;
+    op = ast::BinaryOp::kGreaterThan;
   else if (t.IsLessThanEqual())
-    relation = ast::Relation::kLessThanEqual;
+    op = ast::BinaryOp::kLessThanEqual;
   else if (t.IsGreaterThanEqual())
-    relation = ast::Relation::kGreaterThanEqual;
+    op = ast::BinaryOp::kGreaterThanEqual;
   else
     return lhs;
 
@@ -2802,8 +2802,8 @@
     set_error(peek(), "unable to parse right side of " + name + " expression");
     return nullptr;
   }
-  return relational_expr(std::make_unique<ast::RelationalExpression>(
-      source, relation, std::move(lhs), std::move(rhs)));
+  return relational_expr(std::make_unique<ast::BinaryExpression>(
+      source, op, std::move(lhs), std::move(rhs)));
 }
 
 // relational_expression
@@ -2825,11 +2825,11 @@
 std::unique_ptr<ast::Expression> ParserImpl::equality_expr(
     std::unique_ptr<ast::Expression> lhs) {
   auto t = peek();
-  ast::Relation relation = ast::Relation::kNone;
+  ast::BinaryOp op = ast::BinaryOp::kNone;
   if (t.IsEqualEqual())
-    relation = ast::Relation::kEqual;
+    op = ast::BinaryOp::kEqual;
   else if (t.IsNotEqual())
-    relation = ast::Relation::kNotEqual;
+    op = ast::BinaryOp::kNotEqual;
   else
     return lhs;
 
@@ -2844,8 +2844,8 @@
     set_error(peek(), "unable to parse right side of " + name + " expression");
     return nullptr;
   }
-  return equality_expr(std::make_unique<ast::RelationalExpression>(
-      source, relation, std::move(lhs), std::move(rhs)));
+  return equality_expr(std::make_unique<ast::BinaryExpression>(
+      source, op, std::move(lhs), std::move(rhs)));
 }
 
 // equality_expression
@@ -2879,8 +2879,8 @@
     set_error(peek(), "unable to parse right side of & expression");
     return nullptr;
   }
-  return and_expr(std::make_unique<ast::RelationalExpression>(
-      source, ast::Relation::kAnd, std::move(lhs), std::move(rhs)));
+  return and_expr(std::make_unique<ast::BinaryExpression>(
+      source, ast::BinaryOp::kAnd, std::move(lhs), std::move(rhs)));
 }
 
 // and_expression
@@ -2914,8 +2914,8 @@
     set_error(peek(), "unable to parse right side of ^ expression");
     return nullptr;
   }
-  return exclusive_or_expr(std::make_unique<ast::RelationalExpression>(
-      source, ast::Relation::kXor, std::move(lhs), std::move(rhs)));
+  return exclusive_or_expr(std::make_unique<ast::BinaryExpression>(
+      source, ast::BinaryOp::kXor, std::move(lhs), std::move(rhs)));
 }
 
 // exclusive_or_expression
@@ -2949,8 +2949,8 @@
     set_error(peek(), "unable to parse right side of | expression");
     return nullptr;
   }
-  return inclusive_or_expr(std::make_unique<ast::RelationalExpression>(
-      source, ast::Relation::kOr, std::move(lhs), std::move(rhs)));
+  return inclusive_or_expr(std::make_unique<ast::BinaryExpression>(
+      source, ast::BinaryOp::kOr, std::move(lhs), std::move(rhs)));
 }
 
 // inclusive_or_expression
@@ -2984,8 +2984,8 @@
     set_error(peek(), "unable to parse right side of && expression");
     return nullptr;
   }
-  return logical_and_expr(std::make_unique<ast::RelationalExpression>(
-      source, ast::Relation::kLogicalAnd, std::move(lhs), std::move(rhs)));
+  return logical_and_expr(std::make_unique<ast::BinaryExpression>(
+      source, ast::BinaryOp::kLogicalAnd, std::move(lhs), std::move(rhs)));
 }
 
 // logical_and_expression
@@ -3019,8 +3019,8 @@
     set_error(peek(), "unable to parse right side of || expression");
     return nullptr;
   }
-  return logical_or_expr(std::make_unique<ast::RelationalExpression>(
-      source, ast::Relation::kLogicalOr, std::move(lhs), std::move(rhs)));
+  return logical_or_expr(std::make_unique<ast::BinaryExpression>(
+      source, ast::BinaryOp::kLogicalOr, std::move(lhs), std::move(rhs)));
 }
 
 // logical_or_expression
diff --git a/src/reader/wgsl/parser_impl_additive_expression_test.cc b/src/reader/wgsl/parser_impl_additive_expression_test.cc
index db4b4a2..38d92ea 100644
--- a/src/reader/wgsl/parser_impl_additive_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_additive_expression_test.cc
@@ -13,9 +13,9 @@
 // limitations under the License.
 
 #include "gtest/gtest.h"
+#include "src/ast/binary_expression.h"
 #include "src/ast/bool_literal.h"
 #include "src/ast/identifier_expression.h"
-#include "src/ast/relational_expression.h"
 #include "src/ast/scalar_constructor_expression.h"
 #include "src/reader/wgsl/parser_impl.h"
 #include "src/reader/wgsl/parser_impl_test_helper.h"
@@ -31,9 +31,9 @@
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
 
-  ASSERT_TRUE(e->IsRelational());
-  auto rel = e->AsRelational();
-  EXPECT_EQ(ast::Relation::kAdd, rel->relation());
+  ASSERT_TRUE(e->IsBinary());
+  auto rel = e->AsBinary();
+  EXPECT_EQ(ast::BinaryOp::kAdd, rel->op());
 
   ASSERT_TRUE(rel->lhs()->IsIdentifier());
   auto ident = rel->lhs()->AsIdentifier();
@@ -53,9 +53,9 @@
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
 
-  ASSERT_TRUE(e->IsRelational());
-  auto rel = e->AsRelational();
-  EXPECT_EQ(ast::Relation::kSubtract, rel->relation());
+  ASSERT_TRUE(e->IsBinary());
+  auto rel = e->AsBinary();
+  EXPECT_EQ(ast::BinaryOp::kSubtract, rel->op());
 
   ASSERT_TRUE(rel->lhs()->IsIdentifier());
   auto ident = rel->lhs()->AsIdentifier();
diff --git a/src/reader/wgsl/parser_impl_and_expression_test.cc b/src/reader/wgsl/parser_impl_and_expression_test.cc
index 4f55afe..49ef84a 100644
--- a/src/reader/wgsl/parser_impl_and_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_and_expression_test.cc
@@ -13,9 +13,9 @@
 // limitations under the License.
 
 #include "gtest/gtest.h"
+#include "src/ast/binary_expression.h"
 #include "src/ast/bool_literal.h"
 #include "src/ast/identifier_expression.h"
-#include "src/ast/relational_expression.h"
 #include "src/ast/scalar_constructor_expression.h"
 #include "src/reader/wgsl/parser_impl.h"
 #include "src/reader/wgsl/parser_impl_test_helper.h"
@@ -31,9 +31,9 @@
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
 
-  ASSERT_TRUE(e->IsRelational());
-  auto rel = e->AsRelational();
-  EXPECT_EQ(ast::Relation::kAnd, rel->relation());
+  ASSERT_TRUE(e->IsBinary());
+  auto rel = e->AsBinary();
+  EXPECT_EQ(ast::BinaryOp::kAnd, rel->op());
 
   ASSERT_TRUE(rel->lhs()->IsIdentifier());
   auto ident = rel->lhs()->AsIdentifier();
diff --git a/src/reader/wgsl/parser_impl_argument_expression_list_test.cc b/src/reader/wgsl/parser_impl_argument_expression_list_test.cc
index 3155ee8..650ff96 100644
--- a/src/reader/wgsl/parser_impl_argument_expression_list_test.cc
+++ b/src/reader/wgsl/parser_impl_argument_expression_list_test.cc
@@ -45,7 +45,7 @@
   ASSERT_EQ(e.size(), 3);
   ASSERT_TRUE(e[0]->IsIdentifier());
   ASSERT_TRUE(e[1]->IsConstructor());
-  ASSERT_TRUE(e[2]->IsRelational());
+  ASSERT_TRUE(e[2]->IsBinary());
 }
 
 TEST_F(ParserImplTest, ArgumentExpressionList_HandlesMissingExpression) {
diff --git a/src/reader/wgsl/parser_impl_break_stmt_test.cc b/src/reader/wgsl/parser_impl_break_stmt_test.cc
index df1b901..688c5b8 100644
--- a/src/reader/wgsl/parser_impl_break_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_break_stmt_test.cc
@@ -42,7 +42,7 @@
   ASSERT_TRUE(e->IsBreak());
   EXPECT_EQ(e->condition(), ast::StatementCondition::kIf);
   ASSERT_NE(e->conditional(), nullptr);
-  EXPECT_TRUE(e->conditional()->IsRelational());
+  EXPECT_TRUE(e->conditional()->IsBinary());
 }
 
 TEST_F(ParserImplTest, BreakStmt_WithUnless) {
@@ -53,7 +53,7 @@
   ASSERT_TRUE(e->IsBreak());
   EXPECT_EQ(e->condition(), ast::StatementCondition::kUnless);
   ASSERT_NE(e->conditional(), nullptr);
-  EXPECT_TRUE(e->conditional()->IsRelational());
+  EXPECT_TRUE(e->conditional()->IsBinary());
 }
 
 TEST_F(ParserImplTest, BreakStmt_InvalidRHS) {
diff --git a/src/reader/wgsl/parser_impl_continue_stmt_test.cc b/src/reader/wgsl/parser_impl_continue_stmt_test.cc
index db2171d..f1e05c2 100644
--- a/src/reader/wgsl/parser_impl_continue_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_continue_stmt_test.cc
@@ -42,7 +42,7 @@
   ASSERT_TRUE(e->IsContinue());
   EXPECT_EQ(e->condition(), ast::StatementCondition::kIf);
   ASSERT_NE(e->conditional(), nullptr);
-  EXPECT_TRUE(e->conditional()->IsRelational());
+  EXPECT_TRUE(e->conditional()->IsBinary());
 }
 
 TEST_F(ParserImplTest, ContinueStmt_WithUnless) {
@@ -53,7 +53,7 @@
   ASSERT_TRUE(e->IsContinue());
   EXPECT_EQ(e->condition(), ast::StatementCondition::kUnless);
   ASSERT_NE(e->conditional(), nullptr);
-  EXPECT_TRUE(e->conditional()->IsRelational());
+  EXPECT_TRUE(e->conditional()->IsBinary());
 }
 
 TEST_F(ParserImplTest, ContinueStmt_InvalidRHS) {
diff --git a/src/reader/wgsl/parser_impl_elseif_stmt_test.cc b/src/reader/wgsl/parser_impl_elseif_stmt_test.cc
index e5b5f52..147b3d4 100644
--- a/src/reader/wgsl/parser_impl_elseif_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_elseif_stmt_test.cc
@@ -30,7 +30,7 @@
 
   ASSERT_TRUE(e[0]->IsElse());
   ASSERT_NE(e[0]->condition(), nullptr);
-  ASSERT_TRUE(e[0]->condition()->IsRelational());
+  ASSERT_TRUE(e[0]->condition()->IsBinary());
   EXPECT_EQ(e[0]->body().size(), 2);
 }
 
@@ -42,7 +42,7 @@
 
   ASSERT_TRUE(e[0]->IsElse());
   ASSERT_NE(e[0]->condition(), nullptr);
-  ASSERT_TRUE(e[0]->condition()->IsRelational());
+  ASSERT_TRUE(e[0]->condition()->IsBinary());
   EXPECT_EQ(e[0]->body().size(), 2);
 
   ASSERT_TRUE(e[1]->IsElse());
diff --git a/src/reader/wgsl/parser_impl_equality_expression_test.cc b/src/reader/wgsl/parser_impl_equality_expression_test.cc
index 7193229..39a83b6 100644
--- a/src/reader/wgsl/parser_impl_equality_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_equality_expression_test.cc
@@ -13,9 +13,9 @@
 // limitations under the License.
 
 #include "gtest/gtest.h"
+#include "src/ast/binary_expression.h"
 #include "src/ast/bool_literal.h"
 #include "src/ast/identifier_expression.h"
-#include "src/ast/relational_expression.h"
 #include "src/ast/scalar_constructor_expression.h"
 #include "src/reader/wgsl/parser_impl.h"
 #include "src/reader/wgsl/parser_impl_test_helper.h"
@@ -31,9 +31,9 @@
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
 
-  ASSERT_TRUE(e->IsRelational());
-  auto rel = e->AsRelational();
-  EXPECT_EQ(ast::Relation::kEqual, rel->relation());
+  ASSERT_TRUE(e->IsBinary());
+  auto rel = e->AsBinary();
+  EXPECT_EQ(ast::BinaryOp::kEqual, rel->op());
 
   ASSERT_TRUE(rel->lhs()->IsIdentifier());
   auto ident = rel->lhs()->AsIdentifier();
@@ -53,9 +53,9 @@
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
 
-  ASSERT_TRUE(e->IsRelational());
-  auto rel = e->AsRelational();
-  EXPECT_EQ(ast::Relation::kNotEqual, rel->relation());
+  ASSERT_TRUE(e->IsBinary());
+  auto rel = e->AsBinary();
+  EXPECT_EQ(ast::BinaryOp::kNotEqual, rel->op());
 
   ASSERT_TRUE(rel->lhs()->IsIdentifier());
   auto ident = rel->lhs()->AsIdentifier();
diff --git a/src/reader/wgsl/parser_impl_exclusive_or_expression_test.cc b/src/reader/wgsl/parser_impl_exclusive_or_expression_test.cc
index 626a9ac..bb4d21b 100644
--- a/src/reader/wgsl/parser_impl_exclusive_or_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_exclusive_or_expression_test.cc
@@ -13,9 +13,9 @@
 // limitations under the License.
 
 #include "gtest/gtest.h"
+#include "src/ast/binary_expression.h"
 #include "src/ast/bool_literal.h"
 #include "src/ast/identifier_expression.h"
-#include "src/ast/relational_expression.h"
 #include "src/ast/scalar_constructor_expression.h"
 #include "src/reader/wgsl/parser_impl.h"
 #include "src/reader/wgsl/parser_impl_test_helper.h"
@@ -31,9 +31,9 @@
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
 
-  ASSERT_TRUE(e->IsRelational());
-  auto rel = e->AsRelational();
-  EXPECT_EQ(ast::Relation::kXor, rel->relation());
+  ASSERT_TRUE(e->IsBinary());
+  auto rel = e->AsBinary();
+  EXPECT_EQ(ast::BinaryOp::kXor, rel->op());
 
   ASSERT_TRUE(rel->lhs()->IsIdentifier());
   auto ident = rel->lhs()->AsIdentifier();
diff --git a/src/reader/wgsl/parser_impl_if_stmt_test.cc b/src/reader/wgsl/parser_impl_if_stmt_test.cc
index 43dcecc..40a6661 100644
--- a/src/reader/wgsl/parser_impl_if_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_if_stmt_test.cc
@@ -31,7 +31,7 @@
 
   ASSERT_TRUE(e->IsIf());
   ASSERT_NE(e->condition(), nullptr);
-  ASSERT_TRUE(e->condition()->IsRelational());
+  ASSERT_TRUE(e->condition()->IsBinary());
   EXPECT_EQ(e->body().size(), 2);
   EXPECT_EQ(e->else_statements().size(), 0);
   EXPECT_EQ(e->premerge().size(), 0);
@@ -45,7 +45,7 @@
 
   ASSERT_TRUE(e->IsIf());
   ASSERT_NE(e->condition(), nullptr);
-  ASSERT_TRUE(e->condition()->IsRelational());
+  ASSERT_TRUE(e->condition()->IsBinary());
   EXPECT_EQ(e->body().size(), 2);
 
   ASSERT_EQ(e->else_statements().size(), 2);
@@ -72,7 +72,7 @@
 
   ASSERT_TRUE(e->IsIf());
   ASSERT_NE(e->condition(), nullptr);
-  ASSERT_TRUE(e->condition()->IsRelational());
+  ASSERT_TRUE(e->condition()->IsBinary());
   EXPECT_EQ(e->body().size(), 2);
 
   ASSERT_EQ(e->else_statements().size(), 1);
diff --git a/src/reader/wgsl/parser_impl_inclusive_or_expression_test.cc b/src/reader/wgsl/parser_impl_inclusive_or_expression_test.cc
index 4bd9c44..bbbe778 100644
--- a/src/reader/wgsl/parser_impl_inclusive_or_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_inclusive_or_expression_test.cc
@@ -13,9 +13,9 @@
 // limitations under the License.
 
 #include "gtest/gtest.h"
+#include "src/ast/binary_expression.h"
 #include "src/ast/bool_literal.h"
 #include "src/ast/identifier_expression.h"
-#include "src/ast/relational_expression.h"
 #include "src/ast/scalar_constructor_expression.h"
 #include "src/reader/wgsl/parser_impl.h"
 #include "src/reader/wgsl/parser_impl_test_helper.h"
@@ -31,9 +31,9 @@
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
 
-  ASSERT_TRUE(e->IsRelational());
-  auto rel = e->AsRelational();
-  EXPECT_EQ(ast::Relation::kOr, rel->relation());
+  ASSERT_TRUE(e->IsBinary());
+  auto rel = e->AsBinary();
+  EXPECT_EQ(ast::BinaryOp::kOr, rel->op());
 
   ASSERT_TRUE(rel->lhs()->IsIdentifier());
   auto ident = rel->lhs()->AsIdentifier();
diff --git a/src/reader/wgsl/parser_impl_logical_and_expression_test.cc b/src/reader/wgsl/parser_impl_logical_and_expression_test.cc
index 9483649..9c7029e 100644
--- a/src/reader/wgsl/parser_impl_logical_and_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_logical_and_expression_test.cc
@@ -13,9 +13,9 @@
 // limitations under the License.
 
 #include "gtest/gtest.h"
+#include "src/ast/binary_expression.h"
 #include "src/ast/bool_literal.h"
 #include "src/ast/identifier_expression.h"
-#include "src/ast/relational_expression.h"
 #include "src/ast/scalar_constructor_expression.h"
 #include "src/reader/wgsl/parser_impl.h"
 #include "src/reader/wgsl/parser_impl_test_helper.h"
@@ -31,9 +31,9 @@
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
 
-  ASSERT_TRUE(e->IsRelational());
-  auto rel = e->AsRelational();
-  EXPECT_EQ(ast::Relation::kLogicalAnd, rel->relation());
+  ASSERT_TRUE(e->IsBinary());
+  auto rel = e->AsBinary();
+  EXPECT_EQ(ast::BinaryOp::kLogicalAnd, rel->op());
 
   ASSERT_TRUE(rel->lhs()->IsIdentifier());
   auto ident = rel->lhs()->AsIdentifier();
diff --git a/src/reader/wgsl/parser_impl_logical_or_expression_test.cc b/src/reader/wgsl/parser_impl_logical_or_expression_test.cc
index 3fb303a..bc19f61 100644
--- a/src/reader/wgsl/parser_impl_logical_or_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_logical_or_expression_test.cc
@@ -13,9 +13,9 @@
 // limitations under the License.
 
 #include "gtest/gtest.h"
+#include "src/ast/binary_expression.h"
 #include "src/ast/bool_literal.h"
 #include "src/ast/identifier_expression.h"
-#include "src/ast/relational_expression.h"
 #include "src/ast/scalar_constructor_expression.h"
 #include "src/reader/wgsl/parser_impl.h"
 #include "src/reader/wgsl/parser_impl_test_helper.h"
@@ -31,9 +31,9 @@
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
 
-  ASSERT_TRUE(e->IsRelational());
-  auto rel = e->AsRelational();
-  EXPECT_EQ(ast::Relation::kLogicalOr, rel->relation());
+  ASSERT_TRUE(e->IsBinary());
+  auto rel = e->AsBinary();
+  EXPECT_EQ(ast::BinaryOp::kLogicalOr, rel->op());
 
   ASSERT_TRUE(rel->lhs()->IsIdentifier());
   auto ident = rel->lhs()->AsIdentifier();
diff --git a/src/reader/wgsl/parser_impl_multiplicative_expression_test.cc b/src/reader/wgsl/parser_impl_multiplicative_expression_test.cc
index 9d6e2f7..cba8fc1 100644
--- a/src/reader/wgsl/parser_impl_multiplicative_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_multiplicative_expression_test.cc
@@ -13,9 +13,9 @@
 // limitations under the License.
 
 #include "gtest/gtest.h"
+#include "src/ast/binary_expression.h"
 #include "src/ast/bool_literal.h"
 #include "src/ast/identifier_expression.h"
-#include "src/ast/relational_expression.h"
 #include "src/ast/scalar_constructor_expression.h"
 #include "src/reader/wgsl/parser_impl.h"
 #include "src/reader/wgsl/parser_impl_test_helper.h"
@@ -31,9 +31,9 @@
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
 
-  ASSERT_TRUE(e->IsRelational());
-  auto rel = e->AsRelational();
-  EXPECT_EQ(ast::Relation::kMultiply, rel->relation());
+  ASSERT_TRUE(e->IsBinary());
+  auto rel = e->AsBinary();
+  EXPECT_EQ(ast::BinaryOp::kMultiply, rel->op());
 
   ASSERT_TRUE(rel->lhs()->IsIdentifier());
   auto ident = rel->lhs()->AsIdentifier();
@@ -53,9 +53,9 @@
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
 
-  ASSERT_TRUE(e->IsRelational());
-  auto rel = e->AsRelational();
-  EXPECT_EQ(ast::Relation::kDivide, rel->relation());
+  ASSERT_TRUE(e->IsBinary());
+  auto rel = e->AsBinary();
+  EXPECT_EQ(ast::BinaryOp::kDivide, rel->op());
 
   ASSERT_TRUE(rel->lhs()->IsIdentifier());
   auto ident = rel->lhs()->AsIdentifier();
@@ -75,9 +75,9 @@
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
 
-  ASSERT_TRUE(e->IsRelational());
-  auto rel = e->AsRelational();
-  EXPECT_EQ(ast::Relation::kModulo, rel->relation());
+  ASSERT_TRUE(e->IsBinary());
+  auto rel = e->AsBinary();
+  EXPECT_EQ(ast::BinaryOp::kModulo, rel->op());
 
   ASSERT_TRUE(rel->lhs()->IsIdentifier());
   auto ident = rel->lhs()->AsIdentifier();
diff --git a/src/reader/wgsl/parser_impl_paren_rhs_stmt_test.cc b/src/reader/wgsl/parser_impl_paren_rhs_stmt_test.cc
index 2955815..fde1394 100644
--- a/src/reader/wgsl/parser_impl_paren_rhs_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_paren_rhs_stmt_test.cc
@@ -26,7 +26,7 @@
   auto e = p->paren_rhs_stmt();
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
-  ASSERT_TRUE(e->IsRelational());
+  ASSERT_TRUE(e->IsBinary());
 }
 
 TEST_F(ParserImplTest, ParenRhsStmt_MissingLeftParen) {
diff --git a/src/reader/wgsl/parser_impl_postfix_expression_test.cc b/src/reader/wgsl/parser_impl_postfix_expression_test.cc
index a9c63e9..66380cb 100644
--- a/src/reader/wgsl/parser_impl_postfix_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_postfix_expression_test.cc
@@ -65,7 +65,7 @@
   ASSERT_EQ(ident->name().size(), 1);
   EXPECT_EQ(ident->name()[0], "a");
 
-  ASSERT_TRUE(ary->idx_expr()->IsRelational());
+  ASSERT_TRUE(ary->idx_expr()->IsBinary());
 }
 
 TEST_F(ParserImplTest, PostfixExpression_Array_MissingIndex) {
@@ -127,7 +127,7 @@
   EXPECT_EQ(c->params().size(), 3);
   EXPECT_TRUE(c->params()[0]->IsConstructor());
   EXPECT_TRUE(c->params()[1]->IsIdentifier());
-  EXPECT_TRUE(c->params()[2]->IsRelational());
+  EXPECT_TRUE(c->params()[2]->IsBinary());
 }
 
 TEST_F(ParserImplTest, PostfixExpression_Call_InvalidArg) {
diff --git a/src/reader/wgsl/parser_impl_primary_expression_test.cc b/src/reader/wgsl/parser_impl_primary_expression_test.cc
index 0ce6138..ae0c9c3 100644
--- a/src/reader/wgsl/parser_impl_primary_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_primary_expression_test.cc
@@ -153,7 +153,7 @@
   auto e = p->primary_expression();
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
-  ASSERT_TRUE(e->IsRelational());
+  ASSERT_TRUE(e->IsBinary());
 }
 
 TEST_F(ParserImplTest, PrimaryExpression_ParenExpr_MissingRightParen) {
diff --git a/src/reader/wgsl/parser_impl_relational_expression_test.cc b/src/reader/wgsl/parser_impl_relational_expression_test.cc
index 5673535..1b4ab29 100644
--- a/src/reader/wgsl/parser_impl_relational_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_relational_expression_test.cc
@@ -13,9 +13,9 @@
 // limitations under the License.
 
 #include "gtest/gtest.h"
+#include "src/ast/binary_expression.h"
 #include "src/ast/bool_literal.h"
 #include "src/ast/identifier_expression.h"
-#include "src/ast/relational_expression.h"
 #include "src/ast/scalar_constructor_expression.h"
 #include "src/reader/wgsl/parser_impl.h"
 #include "src/reader/wgsl/parser_impl_test_helper.h"
@@ -31,9 +31,9 @@
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
 
-  ASSERT_TRUE(e->IsRelational());
-  auto rel = e->AsRelational();
-  EXPECT_EQ(ast::Relation::kLessThan, rel->relation());
+  ASSERT_TRUE(e->IsBinary());
+  auto rel = e->AsBinary();
+  EXPECT_EQ(ast::BinaryOp::kLessThan, rel->op());
 
   ASSERT_TRUE(rel->lhs()->IsIdentifier());
   auto ident = rel->lhs()->AsIdentifier();
@@ -53,9 +53,9 @@
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
 
-  ASSERT_TRUE(e->IsRelational());
-  auto rel = e->AsRelational();
-  EXPECT_EQ(ast::Relation::kGreaterThan, rel->relation());
+  ASSERT_TRUE(e->IsBinary());
+  auto rel = e->AsBinary();
+  EXPECT_EQ(ast::BinaryOp::kGreaterThan, rel->op());
 
   ASSERT_TRUE(rel->lhs()->IsIdentifier());
   auto ident = rel->lhs()->AsIdentifier();
@@ -75,9 +75,9 @@
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
 
-  ASSERT_TRUE(e->IsRelational());
-  auto rel = e->AsRelational();
-  EXPECT_EQ(ast::Relation::kLessThanEqual, rel->relation());
+  ASSERT_TRUE(e->IsBinary());
+  auto rel = e->AsBinary();
+  EXPECT_EQ(ast::BinaryOp::kLessThanEqual, rel->op());
 
   ASSERT_TRUE(rel->lhs()->IsIdentifier());
   auto ident = rel->lhs()->AsIdentifier();
@@ -97,9 +97,9 @@
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
 
-  ASSERT_TRUE(e->IsRelational());
-  auto rel = e->AsRelational();
-  EXPECT_EQ(ast::Relation::kGreaterThanEqual, rel->relation());
+  ASSERT_TRUE(e->IsBinary());
+  auto rel = e->AsBinary();
+  EXPECT_EQ(ast::BinaryOp::kGreaterThanEqual, rel->op());
 
   ASSERT_TRUE(rel->lhs()->IsIdentifier());
   auto ident = rel->lhs()->AsIdentifier();
diff --git a/src/reader/wgsl/parser_impl_shift_expression_test.cc b/src/reader/wgsl/parser_impl_shift_expression_test.cc
index 76f5270..60c99ad 100644
--- a/src/reader/wgsl/parser_impl_shift_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_shift_expression_test.cc
@@ -13,9 +13,9 @@
 // limitations under the License.
 
 #include "gtest/gtest.h"
+#include "src/ast/binary_expression.h"
 #include "src/ast/bool_literal.h"
 #include "src/ast/identifier_expression.h"
-#include "src/ast/relational_expression.h"
 #include "src/ast/scalar_constructor_expression.h"
 #include "src/reader/wgsl/parser_impl.h"
 #include "src/reader/wgsl/parser_impl_test_helper.h"
@@ -31,9 +31,9 @@
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
 
-  ASSERT_TRUE(e->IsRelational());
-  auto rel = e->AsRelational();
-  EXPECT_EQ(ast::Relation::kShiftLeft, rel->relation());
+  ASSERT_TRUE(e->IsBinary());
+  auto rel = e->AsBinary();
+  EXPECT_EQ(ast::BinaryOp::kShiftLeft, rel->op());
 
   ASSERT_TRUE(rel->lhs()->IsIdentifier());
   auto ident = rel->lhs()->AsIdentifier();
@@ -53,9 +53,9 @@
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
 
-  ASSERT_TRUE(e->IsRelational());
-  auto rel = e->AsRelational();
-  EXPECT_EQ(ast::Relation::kShiftRight, rel->relation());
+  ASSERT_TRUE(e->IsBinary());
+  auto rel = e->AsBinary();
+  EXPECT_EQ(ast::BinaryOp::kShiftRight, rel->op());
 
   ASSERT_TRUE(rel->lhs()->IsIdentifier());
   auto ident = rel->lhs()->AsIdentifier();
@@ -75,9 +75,9 @@
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
 
-  ASSERT_TRUE(e->IsRelational());
-  auto rel = e->AsRelational();
-  EXPECT_EQ(ast::Relation::kShiftRightArith, rel->relation());
+  ASSERT_TRUE(e->IsBinary());
+  auto rel = e->AsBinary();
+  EXPECT_EQ(ast::BinaryOp::kShiftRightArith, rel->op());
 
   ASSERT_TRUE(rel->lhs()->IsIdentifier());
   auto ident = rel->lhs()->AsIdentifier();
diff --git a/src/reader/wgsl/parser_impl_statement_test.cc b/src/reader/wgsl/parser_impl_statement_test.cc
index bc047f3..25a1017 100644
--- a/src/reader/wgsl/parser_impl_statement_test.cc
+++ b/src/reader/wgsl/parser_impl_statement_test.cc
@@ -58,7 +58,7 @@
   ASSERT_TRUE(e->IsReturn());
   auto ret = e->AsReturn();
   ASSERT_NE(ret->value(), nullptr);
-  EXPECT_TRUE(ret->value()->IsRelational());
+  EXPECT_TRUE(ret->value()->IsBinary());
 }
 
 TEST_F(ParserImplTest, Statement_Return_MissingSemi) {