Remove conditional break/continue.

This CL removes the conditional forms of the break and continue
statements as they are no longer in the WGSL spec.

Change-Id: I46224d6cb5ce706cfc95d35ab0a4eea46abf62a9
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/22580
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
diff --git a/BUILD.gn b/BUILD.gn
index 28606b1..162f7a1 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -278,8 +278,6 @@
     "src/ast/sint_literal.h",
     "src/ast/statement.cc",
     "src/ast/statement.h",
-    "src/ast/statement_condition.cc",
-    "src/ast/statement_condition.h",
     "src/ast/storage_class.cc",
     "src/ast/storage_class.h",
     "src/ast/struct.cc",
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 7f2f274..e848119 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -115,8 +115,6 @@
   ast/sint_literal.h
   ast/statement.cc
   ast/statement.h
-  ast/statement_condition.cc
-  ast/statement_condition.h
   ast/storage_class.cc
   ast/storage_class.h
   ast/struct_decoration.cc
diff --git a/src/ast/break_statement.cc b/src/ast/break_statement.cc
index a1dda43..db543d3 100644
--- a/src/ast/break_statement.cc
+++ b/src/ast/break_statement.cc
@@ -21,19 +21,6 @@
 
 BreakStatement::BreakStatement(const Source& source) : Statement(source) {}
 
-BreakStatement::BreakStatement(StatementCondition condition,
-                               std::unique_ptr<Expression> conditional)
-    : Statement(),
-      condition_(condition),
-      conditional_(std::move(conditional)) {}
-
-BreakStatement::BreakStatement(const Source& source,
-                               StatementCondition condition,
-                               std::unique_ptr<Expression> conditional)
-    : Statement(source),
-      condition_(condition),
-      conditional_(std::move(conditional)) {}
-
 BreakStatement::BreakStatement(BreakStatement&&) = default;
 
 BreakStatement::~BreakStatement() = default;
@@ -43,26 +30,12 @@
 }
 
 bool BreakStatement::IsValid() const {
-  if (condition_ == StatementCondition::kNone)
-    return conditional_ == nullptr;
-
-  return conditional_ != nullptr && conditional_->IsValid();
+  return true;
 }
 
 void BreakStatement::to_str(std::ostream& out, size_t indent) const {
   make_indent(out, indent);
-  out << "Break{";
-
-  if (condition_ != StatementCondition::kNone) {
-    out << std::endl;
-
-    make_indent(out, indent + 2);
-    out << condition_ << std::endl;
-    conditional_->to_str(out, indent + 2);
-
-    make_indent(out, indent);
-  }
-  out << "}" << std::endl;
+  out << "Break{}" << std::endl;
 }
 
 }  // namespace ast
diff --git a/src/ast/break_statement.h b/src/ast/break_statement.h
index 4a720de..f29d5fc 100644
--- a/src/ast/break_statement.h
+++ b/src/ast/break_statement.h
@@ -15,12 +15,7 @@
 #ifndef SRC_AST_BREAK_STATEMENT_H_
 #define SRC_AST_BREAK_STATEMENT_H_
 
-#include <memory>
-#include <utility>
-
-#include "src/ast/expression.h"
 #include "src/ast/statement.h"
-#include "src/ast/statement_condition.h"
 
 namespace tint {
 namespace ast {
@@ -33,36 +28,10 @@
   /// Constructor
   /// @param source the break statement source
   explicit BreakStatement(const Source& source);
-  /// Constructor
-  /// @param condition the condition type
-  /// @param conditional the condition expression
-  BreakStatement(StatementCondition condition,
-                 std::unique_ptr<Expression> conditional);
-  /// Constructor
-  /// @param source the break statement source
-  /// @param condition the condition type
-  /// @param conditional the condition expression
-  BreakStatement(const Source& source,
-                 StatementCondition condition,
-                 std::unique_ptr<Expression> conditional);
   /// Move constructor
   BreakStatement(BreakStatement&&);
   ~BreakStatement() override;
 
-  /// Sets the condition type
-  /// @param condition the condition type
-  void set_condition(StatementCondition condition) { condition_ = condition; }
-  /// @returns the condition type
-  StatementCondition condition() const { return condition_; }
-
-  /// Sets the conditional expression
-  /// @param conditional the conditional expression
-  void set_conditional(std::unique_ptr<Expression> conditional) {
-    conditional_ = std::move(conditional);
-  }
-  /// @returns the conditional expression
-  Expression* conditional() const { return conditional_.get(); }
-
   /// @returns true if this is an break statement
   bool IsBreak() const override;
 
@@ -76,9 +45,6 @@
 
  private:
   BreakStatement(const BreakStatement&) = delete;
-
-  StatementCondition condition_ = StatementCondition::kNone;
-  std::unique_ptr<Expression> conditional_;
 };
 
 }  // namespace ast
diff --git a/src/ast/break_statement_test.cc b/src/ast/break_statement_test.cc
index 49df1ba..4e39386 100644
--- a/src/ast/break_statement_test.cc
+++ b/src/ast/break_statement_test.cc
@@ -15,8 +15,6 @@
 #include "src/ast/break_statement.h"
 
 #include "gtest/gtest.h"
-#include "src/ast/identifier_expression.h"
-#include "src/ast/statement_condition.h"
 
 namespace tint {
 namespace ast {
@@ -24,21 +22,6 @@
 
 using BreakStatementTest = testing::Test;
 
-TEST_F(BreakStatementTest, Creation) {
-  BreakStatement stmt;
-  EXPECT_EQ(stmt.condition(), StatementCondition::kNone);
-  EXPECT_EQ(stmt.conditional(), nullptr);
-}
-
-TEST_F(BreakStatementTest, CreationWithConditional) {
-  auto expr = std::make_unique<IdentifierExpression>("expr");
-  auto* expr_ptr = expr.get();
-
-  BreakStatement stmt(StatementCondition::kIf, std::move(expr));
-  EXPECT_EQ(stmt.condition(), StatementCondition::kIf);
-  EXPECT_EQ(stmt.conditional(), expr_ptr);
-}
-
 TEST_F(BreakStatementTest, Creation_WithSource) {
   BreakStatement stmt(Source{20, 2});
   auto src = stmt.source();
@@ -46,51 +29,17 @@
   EXPECT_EQ(src.column, 2u);
 }
 
-TEST_F(BreakStatementTest, Creation_WithSourceAndCondition) {
-  auto expr = std::make_unique<IdentifierExpression>("expr");
-
-  BreakStatement stmt(Source{20, 2}, StatementCondition::kUnless,
-                      std::move(expr));
-  auto src = stmt.source();
-  EXPECT_EQ(src.line, 20u);
-  EXPECT_EQ(src.column, 2u);
-}
-
 TEST_F(BreakStatementTest, IsBreak) {
   BreakStatement stmt;
   EXPECT_TRUE(stmt.IsBreak());
 }
 
-TEST_F(BreakStatementTest, IsValid_WithoutCondition) {
+TEST_F(BreakStatementTest, IsValid) {
   BreakStatement stmt;
   EXPECT_TRUE(stmt.IsValid());
 }
 
-TEST_F(BreakStatementTest, IsValid_WithCondition) {
-  auto expr = std::make_unique<IdentifierExpression>("expr");
-  BreakStatement stmt(StatementCondition::kIf, std::move(expr));
-  EXPECT_TRUE(stmt.IsValid());
-}
-
-TEST_F(BreakStatementTest, IsValid_WithConditionAndConditionNone) {
-  auto expr = std::make_unique<IdentifierExpression>("expr");
-  BreakStatement stmt(StatementCondition::kNone, std::move(expr));
-  EXPECT_FALSE(stmt.IsValid());
-}
-
-TEST_F(BreakStatementTest, IsValid_WithCondition_MissingConditional) {
-  BreakStatement stmt;
-  stmt.set_condition(StatementCondition::kIf);
-  EXPECT_FALSE(stmt.IsValid());
-}
-
-TEST_F(BreakStatementTest, IsValid_InvalidConditional) {
-  auto expr = std::make_unique<IdentifierExpression>("");
-  BreakStatement stmt(StatementCondition::kIf, std::move(expr));
-  EXPECT_FALSE(stmt.IsValid());
-}
-
-TEST_F(BreakStatementTest, ToStr_WithoutCondition) {
+TEST_F(BreakStatementTest, ToStr) {
   BreakStatement stmt;
   std::ostringstream out;
   stmt.to_str(out, 2);
@@ -98,18 +47,6 @@
 )");
 }
 
-TEST_F(BreakStatementTest, ToStr_WithCondition) {
-  auto expr = std::make_unique<IdentifierExpression>("expr");
-  BreakStatement stmt(StatementCondition::kUnless, std::move(expr));
-  std::ostringstream out;
-  stmt.to_str(out, 2);
-  EXPECT_EQ(out.str(), R"(  Break{
-    unless
-    Identifier{expr}
-  }
-)");
-}
-
 }  // namespace
 }  // namespace ast
 }  // namespace tint
diff --git a/src/ast/continue_statement.cc b/src/ast/continue_statement.cc
index 6ef2f81..efc17d9 100644
--- a/src/ast/continue_statement.cc
+++ b/src/ast/continue_statement.cc
@@ -22,19 +22,6 @@
 ContinueStatement::ContinueStatement(const Source& source)
     : Statement(source) {}
 
-ContinueStatement::ContinueStatement(StatementCondition condition,
-                                     std::unique_ptr<Expression> conditional)
-    : Statement(),
-      condition_(condition),
-      conditional_(std::move(conditional)) {}
-
-ContinueStatement::ContinueStatement(const Source& source,
-                                     StatementCondition condition,
-                                     std::unique_ptr<Expression> conditional)
-    : Statement(source),
-      condition_(condition),
-      conditional_(std::move(conditional)) {}
-
 ContinueStatement::ContinueStatement(ContinueStatement&&) = default;
 
 ContinueStatement::~ContinueStatement() = default;
@@ -44,26 +31,12 @@
 }
 
 bool ContinueStatement::IsValid() const {
-  if (condition_ == StatementCondition::kNone)
-    return conditional_ == nullptr;
-
-  return conditional_ && conditional_->IsValid();
+  return true;
 }
 
 void ContinueStatement::to_str(std::ostream& out, size_t indent) const {
   make_indent(out, indent);
-  out << "Continue{";
-
-  if (condition_ != StatementCondition::kNone) {
-    out << std::endl;
-
-    make_indent(out, indent + 2);
-    out << condition_ << std::endl;
-    conditional_->to_str(out, indent + 2);
-
-    make_indent(out, indent);
-  }
-  out << "}" << std::endl;
+  out << "Continue{}" << std::endl;
 }
 
 }  // namespace ast
diff --git a/src/ast/continue_statement.h b/src/ast/continue_statement.h
index f06df2f..866917b 100644
--- a/src/ast/continue_statement.h
+++ b/src/ast/continue_statement.h
@@ -18,9 +18,7 @@
 #include <memory>
 #include <utility>
 
-#include "src/ast/expression.h"
 #include "src/ast/statement.h"
-#include "src/ast/statement_condition.h"
 
 namespace tint {
 namespace ast {
@@ -33,36 +31,10 @@
   /// Constructor
   /// @param source the continue statement source
   explicit ContinueStatement(const Source& source);
-  /// Constructor
-  /// @param condition the condition type
-  /// @param conditional the condition expression
-  ContinueStatement(StatementCondition condition,
-                    std::unique_ptr<Expression> conditional);
-  /// Constructor
-  /// @param source the continue statement source
-  /// @param condition the condition type
-  /// @param conditional the condition expression
-  ContinueStatement(const Source& source,
-                    StatementCondition condition,
-                    std::unique_ptr<Expression> conditional);
   /// Move constructor
   ContinueStatement(ContinueStatement&&);
   ~ContinueStatement() override;
 
-  /// Sets the condition type
-  /// @param condition the condition type
-  void set_condition(StatementCondition condition) { condition_ = condition; }
-  /// @returns the condition type
-  StatementCondition condition() const { return condition_; }
-
-  /// Sets the conditional expression
-  /// @param conditional the conditional expression
-  void set_conditional(std::unique_ptr<Expression> conditional) {
-    conditional_ = std::move(conditional);
-  }
-  /// @returns the conditional expression
-  Expression* conditional() const { return conditional_.get(); }
-
   /// @returns true if this is an continue statement
   bool IsContinue() const override;
 
@@ -76,9 +48,6 @@
 
  private:
   ContinueStatement(const ContinueStatement&) = delete;
-
-  StatementCondition condition_ = StatementCondition::kNone;
-  std::unique_ptr<Expression> conditional_;
 };
 
 }  // namespace ast
diff --git a/src/ast/continue_statement_test.cc b/src/ast/continue_statement_test.cc
index 10026bd..4ba18e9 100644
--- a/src/ast/continue_statement_test.cc
+++ b/src/ast/continue_statement_test.cc
@@ -15,8 +15,6 @@
 #include "src/ast/continue_statement.h"
 
 #include "gtest/gtest.h"
-#include "src/ast/identifier_expression.h"
-#include "src/ast/statement_condition.h"
 
 namespace tint {
 namespace ast {
@@ -24,21 +22,6 @@
 
 using ContinueStatementTest = testing::Test;
 
-TEST_F(ContinueStatementTest, Creation) {
-  ContinueStatement stmt;
-  EXPECT_EQ(stmt.condition(), StatementCondition::kNone);
-  EXPECT_EQ(stmt.conditional(), nullptr);
-}
-
-TEST_F(ContinueStatementTest, CreationWithConditional) {
-  auto expr = std::make_unique<IdentifierExpression>("expr");
-  auto* expr_ptr = expr.get();
-
-  ContinueStatement stmt(StatementCondition::kIf, std::move(expr));
-  EXPECT_EQ(stmt.condition(), StatementCondition::kIf);
-  EXPECT_EQ(stmt.conditional(), expr_ptr);
-}
-
 TEST_F(ContinueStatementTest, Creation_WithSource) {
   ContinueStatement stmt(Source{20, 2});
   auto src = stmt.source();
@@ -46,51 +29,17 @@
   EXPECT_EQ(src.column, 2u);
 }
 
-TEST_F(ContinueStatementTest, Creation_WithSourceAndCondition) {
-  auto expr = std::make_unique<IdentifierExpression>("expr");
-
-  ContinueStatement stmt(Source{20, 2}, StatementCondition::kUnless,
-                         std::move(expr));
-  auto src = stmt.source();
-  EXPECT_EQ(src.line, 20u);
-  EXPECT_EQ(src.column, 2u);
-}
-
 TEST_F(ContinueStatementTest, IsContinue) {
   ContinueStatement stmt;
   EXPECT_TRUE(stmt.IsContinue());
 }
 
-TEST_F(ContinueStatementTest, IsValid_WithoutCondition) {
+TEST_F(ContinueStatementTest, IsValid) {
   ContinueStatement stmt;
   EXPECT_TRUE(stmt.IsValid());
 }
 
-TEST_F(ContinueStatementTest, IsValid_WithCondition) {
-  auto expr = std::make_unique<IdentifierExpression>("expr");
-  ContinueStatement stmt(StatementCondition::kIf, std::move(expr));
-  EXPECT_TRUE(stmt.IsValid());
-}
-
-TEST_F(ContinueStatementTest, IsValid_InvalidConditional) {
-  auto expr = std::make_unique<IdentifierExpression>("");
-  ContinueStatement stmt(StatementCondition::kIf, std::move(expr));
-  EXPECT_FALSE(stmt.IsValid());
-}
-
-TEST_F(ContinueStatementTest, IsValid_NoneConditionWithConditional) {
-  auto expr = std::make_unique<IdentifierExpression>("expr");
-  ContinueStatement stmt(StatementCondition::kNone, std::move(expr));
-  EXPECT_FALSE(stmt.IsValid());
-}
-
-TEST_F(ContinueStatementTest, IsValid_WithCondition_MissingConditional) {
-  ContinueStatement stmt;
-  stmt.set_condition(StatementCondition::kIf);
-  EXPECT_FALSE(stmt.IsValid());
-}
-
-TEST_F(ContinueStatementTest, ToStr_WithoutCondition) {
+TEST_F(ContinueStatementTest, ToStr) {
   ContinueStatement stmt;
   std::ostringstream out;
   stmt.to_str(out, 2);
@@ -98,18 +47,6 @@
 )");
 }
 
-TEST_F(ContinueStatementTest, ToStr_WithCondition) {
-  auto expr = std::make_unique<IdentifierExpression>("expr");
-  ContinueStatement stmt(StatementCondition::kUnless, std::move(expr));
-  std::ostringstream out;
-  stmt.to_str(out, 2);
-  EXPECT_EQ(out.str(), R"(  Continue{
-    unless
-    Identifier{expr}
-  }
-)");
-}
-
 }  // namespace
 }  // namespace ast
 }  // namespace tint
diff --git a/src/ast/fallthrough_statement.h b/src/ast/fallthrough_statement.h
index a165b3a..7579e49 100644
--- a/src/ast/fallthrough_statement.h
+++ b/src/ast/fallthrough_statement.h
@@ -15,9 +15,7 @@
 #ifndef SRC_AST_FALLTHROUGH_STATEMENT_H_
 #define SRC_AST_FALLTHROUGH_STATEMENT_H_
 
-#include "src/ast/expression.h"
 #include "src/ast/statement.h"
-#include "src/ast/statement_condition.h"
 
 namespace tint {
 namespace ast {
diff --git a/src/ast/statement_condition.cc b/src/ast/statement_condition.cc
deleted file mode 100644
index dc2136f..0000000
--- a/src/ast/statement_condition.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2020 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "src/ast/statement_condition.h"
-
-namespace tint {
-namespace ast {
-
-std::ostream& operator<<(std::ostream& out, StatementCondition condition) {
-  switch (condition) {
-    case StatementCondition::kNone:
-      out << "none";
-      break;
-    case StatementCondition::kIf:
-      out << "if";
-      break;
-    case StatementCondition::kUnless:
-      out << "unless";
-      break;
-  }
-
-  return out;
-}
-
-}  // namespace ast
-}  // namespace tint
diff --git a/src/ast/statement_condition.h b/src/ast/statement_condition.h
deleted file mode 100644
index fa4149e..0000000
--- a/src/ast/statement_condition.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2020 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef SRC_AST_STATEMENT_CONDITION_H_
-#define SRC_AST_STATEMENT_CONDITION_H_
-
-#include <ostream>
-
-namespace tint {
-namespace ast {
-
-/// Type of  condition attached to a statement
-enum class StatementCondition { kNone = 0, kIf, kUnless };
-
-std::ostream& operator<<(std::ostream& out, StatementCondition condition);
-
-}  // namespace ast
-}  // namespace tint
-
-#endif  // SRC_AST_STATEMENT_CONDITION_H_
diff --git a/src/ast/switch_statement.h b/src/ast/switch_statement.h
index 29078cc..ba3f268 100644
--- a/src/ast/switch_statement.h
+++ b/src/ast/switch_statement.h
@@ -22,7 +22,6 @@
 #include "src/ast/expression.h"
 #include "src/ast/literal.h"
 #include "src/ast/statement.h"
-#include "src/ast/statement_condition.h"
 
 namespace tint {
 namespace ast {
diff --git a/src/reader/wgsl/parser_impl.cc b/src/reader/wgsl/parser_impl.cc
index 89edc77..eebea01 100644
--- a/src/reader/wgsl/parser_impl.cc
+++ b/src/reader/wgsl/parser_impl.cc
@@ -41,7 +41,6 @@
 #include "src/ast/scalar_constructor_expression.h"
 #include "src/ast/set_decoration.h"
 #include "src/ast/sint_literal.h"
-#include "src/ast/statement_condition.h"
 #include "src/ast/struct_member_offset_decoration.h"
 #include "src/ast/switch_statement.h"
 #include "src/ast/type/alias_type.h"
@@ -1943,73 +1942,25 @@
 }
 
 // break_stmt
-//   : BREAK ({IF | UNLESS} paren_rhs_stmt)?
+//   : BREAK
 std::unique_ptr<ast::BreakStatement> ParserImpl::break_stmt() {
   auto t = peek();
   if (!t.IsBreak())
     return nullptr;
 
-  auto source = t.source();
   next();  // Consume the peek
-
-  ast::StatementCondition condition = ast::StatementCondition::kNone;
-  std::unique_ptr<ast::Expression> conditional = nullptr;
-
-  t = peek();
-  if (t.IsIf() || t.IsUnless()) {
-    next();  // Consume the peek
-
-    if (t.IsIf())
-      condition = ast::StatementCondition::kIf;
-    else
-      condition = ast::StatementCondition::kUnless;
-
-    conditional = paren_rhs_stmt();
-    if (has_error())
-      return nullptr;
-    if (conditional == nullptr) {
-      set_error(peek(), "unable to parse conditional statement");
-      return nullptr;
-    }
-  }
-
-  return std::make_unique<ast::BreakStatement>(source, condition,
-                                               std::move(conditional));
+  return std::make_unique<ast::BreakStatement>(t.source());
 }
 
 // continue_stmt
-//   : CONTINUE ({IF | UNLESS} paren_rhs_stmt)?
+//   : CONTINUE
 std::unique_ptr<ast::ContinueStatement> ParserImpl::continue_stmt() {
   auto t = peek();
   if (!t.IsContinue())
     return nullptr;
 
-  auto source = t.source();
   next();  // Consume the peek
-
-  ast::StatementCondition condition = ast::StatementCondition::kNone;
-  std::unique_ptr<ast::Expression> conditional = nullptr;
-
-  t = peek();
-  if (t.IsIf() || t.IsUnless()) {
-    next();  // Consume the peek
-
-    if (t.IsIf())
-      condition = ast::StatementCondition::kIf;
-    else
-      condition = ast::StatementCondition::kUnless;
-
-    conditional = paren_rhs_stmt();
-    if (has_error())
-      return nullptr;
-    if (conditional == nullptr) {
-      set_error(peek(), "unable to parse conditional statement");
-      return nullptr;
-    }
-  }
-
-  return std::make_unique<ast::ContinueStatement>(source, condition,
-                                                  std::move(conditional));
+  return std::make_unique<ast::ContinueStatement>(t.source());
 }
 
 // continuing_stmt
diff --git a/src/reader/wgsl/parser_impl_break_stmt_test.cc b/src/reader/wgsl/parser_impl_break_stmt_test.cc
index 45ff183..4eba159 100644
--- a/src/reader/wgsl/parser_impl_break_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_break_stmt_test.cc
@@ -14,8 +14,6 @@
 
 #include "gtest/gtest.h"
 #include "src/ast/break_statement.h"
-#include "src/ast/return_statement.h"
-#include "src/ast/statement.h"
 #include "src/reader/wgsl/parser_impl.h"
 #include "src/reader/wgsl/parser_impl_test_helper.h"
 
@@ -30,46 +28,6 @@
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
   ASSERT_TRUE(e->IsBreak());
-  EXPECT_EQ(e->condition(), ast::StatementCondition::kNone);
-  EXPECT_EQ(e->conditional(), nullptr);
-}
-
-TEST_F(ParserImplTest, BreakStmt_WithIf) {
-  auto* p = parser("break if (a == b)");
-  auto e = p->break_stmt();
-  ASSERT_FALSE(p->has_error()) << p->error();
-  ASSERT_NE(e, nullptr);
-  ASSERT_TRUE(e->IsBreak());
-  EXPECT_EQ(e->condition(), ast::StatementCondition::kIf);
-  ASSERT_NE(e->conditional(), nullptr);
-  EXPECT_TRUE(e->conditional()->IsBinary());
-}
-
-TEST_F(ParserImplTest, BreakStmt_WithUnless) {
-  auto* p = parser("break unless (a == b)");
-  auto e = p->break_stmt();
-  ASSERT_FALSE(p->has_error()) << p->error();
-  ASSERT_NE(e, nullptr);
-  ASSERT_TRUE(e->IsBreak());
-  EXPECT_EQ(e->condition(), ast::StatementCondition::kUnless);
-  ASSERT_NE(e->conditional(), nullptr);
-  EXPECT_TRUE(e->conditional()->IsBinary());
-}
-
-TEST_F(ParserImplTest, BreakStmt_InvalidRHS) {
-  auto* p = parser("break if (a = b)");
-  auto e = p->break_stmt();
-  ASSERT_TRUE(p->has_error());
-  ASSERT_EQ(e, nullptr);
-  EXPECT_EQ(p->error(), "1:13: expected )");
-}
-
-TEST_F(ParserImplTest, BreakStmt_MissingRHS) {
-  auto* p = parser("break if");
-  auto e = p->break_stmt();
-  ASSERT_TRUE(p->has_error());
-  ASSERT_EQ(e, nullptr);
-  EXPECT_EQ(p->error(), "1:9: expected (");
 }
 
 }  // namespace
diff --git a/src/reader/wgsl/parser_impl_continue_stmt_test.cc b/src/reader/wgsl/parser_impl_continue_stmt_test.cc
index 9a7b6fa..8207e57 100644
--- a/src/reader/wgsl/parser_impl_continue_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_continue_stmt_test.cc
@@ -14,8 +14,6 @@
 
 #include "gtest/gtest.h"
 #include "src/ast/continue_statement.h"
-#include "src/ast/return_statement.h"
-#include "src/ast/statement.h"
 #include "src/reader/wgsl/parser_impl.h"
 #include "src/reader/wgsl/parser_impl_test_helper.h"
 
@@ -30,46 +28,6 @@
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e, nullptr);
   ASSERT_TRUE(e->IsContinue());
-  EXPECT_EQ(e->condition(), ast::StatementCondition::kNone);
-  EXPECT_EQ(e->conditional(), nullptr);
-}
-
-TEST_F(ParserImplTest, ContinueStmt_WithIf) {
-  auto* p = parser("continue if (a == b)");
-  auto e = p->continue_stmt();
-  ASSERT_FALSE(p->has_error()) << p->error();
-  ASSERT_NE(e, nullptr);
-  ASSERT_TRUE(e->IsContinue());
-  EXPECT_EQ(e->condition(), ast::StatementCondition::kIf);
-  ASSERT_NE(e->conditional(), nullptr);
-  EXPECT_TRUE(e->conditional()->IsBinary());
-}
-
-TEST_F(ParserImplTest, ContinueStmt_WithUnless) {
-  auto* p = parser("continue unless (a == b)");
-  auto e = p->continue_stmt();
-  ASSERT_FALSE(p->has_error()) << p->error();
-  ASSERT_NE(e, nullptr);
-  ASSERT_TRUE(e->IsContinue());
-  EXPECT_EQ(e->condition(), ast::StatementCondition::kUnless);
-  ASSERT_NE(e->conditional(), nullptr);
-  EXPECT_TRUE(e->conditional()->IsBinary());
-}
-
-TEST_F(ParserImplTest, ContinueStmt_InvalidRHS) {
-  auto* p = parser("continue if (a = b)");
-  auto e = p->continue_stmt();
-  ASSERT_TRUE(p->has_error());
-  ASSERT_EQ(e, nullptr);
-  EXPECT_EQ(p->error(), "1:16: expected )");
-}
-
-TEST_F(ParserImplTest, ContinueStmt_MissingRHS) {
-  auto* p = parser("continue if");
-  auto e = p->continue_stmt();
-  ASSERT_TRUE(p->has_error());
-  ASSERT_EQ(e, nullptr);
-  EXPECT_EQ(p->error(), "1:12: expected (");
 }
 
 }  // namespace
diff --git a/src/reader/wgsl/parser_impl_statement_test.cc b/src/reader/wgsl/parser_impl_statement_test.cc
index 1deaa12..5fc9339 100644
--- a/src/reader/wgsl/parser_impl_statement_test.cc
+++ b/src/reader/wgsl/parser_impl_statement_test.cc
@@ -197,20 +197,12 @@
   EXPECT_TRUE(e->IsBreak());
 }
 
-TEST_F(ParserImplTest, Statement_Break_Invalid) {
-  auto* p = parser("break if (a = b);");
-  auto e = p->statement();
-  ASSERT_TRUE(p->has_error());
-  ASSERT_EQ(e, nullptr);
-  EXPECT_EQ(p->error(), "1:13: expected )");
-}
-
 TEST_F(ParserImplTest, Statement_Break_MissingSemicolon) {
-  auto* p = parser("break if (a == b)");
+  auto* p = parser("break");
   auto e = p->statement();
   ASSERT_TRUE(p->has_error());
   ASSERT_EQ(e, nullptr);
-  EXPECT_EQ(p->error(), "1:18: missing ;");
+  EXPECT_EQ(p->error(), "1:6: missing ;");
 }
 
 TEST_F(ParserImplTest, Statement_Continue) {
@@ -221,20 +213,12 @@
   EXPECT_TRUE(e->IsContinue());
 }
 
-TEST_F(ParserImplTest, Statement_Continue_Invalid) {
-  auto* p = parser("continue if (a = b);");
-  auto e = p->statement();
-  ASSERT_TRUE(p->has_error());
-  ASSERT_EQ(e, nullptr);
-  EXPECT_EQ(p->error(), "1:16: expected )");
-}
-
 TEST_F(ParserImplTest, Statement_Continue_MissingSemicolon) {
-  auto* p = parser("continue if (a == b)");
+  auto* p = parser("continue");
   auto e = p->statement();
   ASSERT_TRUE(p->has_error());
   ASSERT_EQ(e, nullptr);
-  EXPECT_EQ(p->error(), "1:21: missing ;");
+  EXPECT_EQ(p->error(), "1:9: missing ;");
 }
 
 TEST_F(ParserImplTest, Statement_Kill) {
diff --git a/src/type_determiner.cc b/src/type_determiner.cc
index beddba4..8604d7b 100644
--- a/src/type_determiner.cc
+++ b/src/type_determiner.cc
@@ -159,16 +159,14 @@
     return DetermineResultType(a->lhs()) && DetermineResultType(a->rhs());
   }
   if (stmt->IsBreak()) {
-    auto* b = stmt->AsBreak();
-    return DetermineResultType(b->conditional());
+    return true;
   }
   if (stmt->IsCase()) {
     auto* c = stmt->AsCase();
     return DetermineStatements(c->body());
   }
   if (stmt->IsContinue()) {
-    auto* c = stmt->AsContinue();
-    return DetermineResultType(c->conditional());
+    return true;
   }
   if (stmt->IsElse()) {
     auto* e = stmt->AsElse();
diff --git a/src/type_determiner_test.cc b/src/type_determiner_test.cc
index 0b746a9..40090f5 100644
--- a/src/type_determiner_test.cc
+++ b/src/type_determiner_test.cc
@@ -129,26 +129,6 @@
   EXPECT_TRUE(rhs_ptr->result_type()->IsF32());
 }
 
-TEST_F(TypeDeterminerTest, Stmt_Break) {
-  ast::type::I32Type i32;
-
-  auto cond = std::make_unique<ast::ScalarConstructorExpression>(
-      std::make_unique<ast::SintLiteral>(&i32, 2));
-  auto* cond_ptr = cond.get();
-
-  ast::BreakStatement brk(ast::StatementCondition::kIf, std::move(cond));
-
-  EXPECT_TRUE(td()->DetermineResultType(&brk));
-  ASSERT_NE(cond_ptr->result_type(), nullptr);
-  EXPECT_TRUE(cond_ptr->result_type()->IsI32());
-}
-
-TEST_F(TypeDeterminerTest, Stmt_Break_WithoutCondition) {
-  ast::type::I32Type i32;
-  ast::BreakStatement brk;
-  EXPECT_TRUE(td()->DetermineResultType(&brk));
-}
-
 TEST_F(TypeDeterminerTest, Stmt_Case) {
   ast::type::I32Type i32;
   ast::type::F32Type f32;
@@ -176,26 +156,6 @@
   EXPECT_TRUE(rhs_ptr->result_type()->IsF32());
 }
 
-TEST_F(TypeDeterminerTest, Stmt_Continue) {
-  ast::type::I32Type i32;
-
-  auto cond = std::make_unique<ast::ScalarConstructorExpression>(
-      std::make_unique<ast::SintLiteral>(&i32, 2));
-  auto* cond_ptr = cond.get();
-
-  ast::ContinueStatement stmt(ast::StatementCondition::kIf, std::move(cond));
-
-  EXPECT_TRUE(td()->DetermineResultType(&stmt));
-  ASSERT_NE(cond_ptr->result_type(), nullptr);
-  EXPECT_TRUE(cond_ptr->result_type()->IsI32());
-}
-
-TEST_F(TypeDeterminerTest, Stmt_Continue_WithoutStatement) {
-  ast::type::I32Type i32;
-  ast::ContinueStatement stmt;
-  EXPECT_TRUE(td()->DetermineResultType(&stmt));
-}
-
 TEST_F(TypeDeterminerTest, Stmt_Else) {
   ast::type::I32Type i32;
   ast::type::F32Type f32;
diff --git a/src/writer/spirv/builder_if_test.cc b/src/writer/spirv/builder_if_test.cc
index 7818e5d..ceaff32 100644
--- a/src/writer/spirv/builder_if_test.cc
+++ b/src/writer/spirv/builder_if_test.cc
@@ -26,7 +26,6 @@
 #include "src/ast/return_statement.h"
 #include "src/ast/scalar_constructor_expression.h"
 #include "src/ast/sint_literal.h"
-#include "src/ast/statement_condition.h"
 #include "src/ast/type/bool_type.h"
 #include "src/ast/type/i32_type.h"
 #include "src/context.h"
@@ -488,67 +487,6 @@
 )");
 }
 
-// This is blocked on implementing conditional break
-TEST_F(BuilderTest, DISABLED_If_WithConditionalBreak) {
-  ast::type::BoolType bool_type;
-  // loop {
-  //   if (true) {
-  //     break if (false);
-  //   }
-  // }
-  auto cond_true = std::make_unique<ast::ScalarConstructorExpression>(
-      std::make_unique<ast::BoolLiteral>(&bool_type, true));
-  auto cond_false = std::make_unique<ast::ScalarConstructorExpression>(
-      std::make_unique<ast::BoolLiteral>(&bool_type, false));
-
-  ast::StatementList if_body;
-  if_body.push_back(std::make_unique<ast::BreakStatement>(
-      ast::StatementCondition::kIf, std::move(cond_false)));
-
-  auto if_stmt = std::make_unique<ast::IfStatement>(std::move(cond_true),
-                                                    std::move(if_body));
-
-  ast::StatementList loop_body;
-  loop_body.push_back(std::move(if_stmt));
-
-  ast::LoopStatement expr(std::move(loop_body), {});
-
-  Context ctx;
-  ast::Module mod;
-  TypeDeterminer td(&ctx, &mod);
-
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
-
-  Builder b(&mod);
-  b.push_function(Function{});
-
-  EXPECT_TRUE(b.GenerateLoopStatement(&expr)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.types()), R"(%5 = OpTypeBool
-%6 = OpConstantTrue %5
-%7 = OpConstantFalse %5
-)");
-  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
-            R"(OpBranch %1
-%1 = OpLabel
-OpLoopMerge %2 %3 None
-OpBranch %4
-%4 = OpLabel
-OpSelectionMerge %8 None
-OpBranchConditional %6 %9 %8
-%9 = OpLabel
-OpBranchConditional %7 %2 %8
-%8 = OpLabel
-OpBranch %3
-%3 = OpLabel
-OpBranch %1
-%2 = OpLabel
-)");
-}
-
-TEST_F(BuilderTest, DISABLED_If_WithElseConditionalBreak) {
-  FAIL();
-}
-
 TEST_F(BuilderTest, If_WithContinue) {
   ast::type::BoolType bool_type;
   // loop {
@@ -601,10 +539,6 @@
 )");
 }
 
-TEST_F(BuilderTest, DISABLED_If_WithConditionalContinue) {
-  FAIL();
-}
-
 TEST_F(BuilderTest, If_WithElseContinue) {
   ast::type::BoolType bool_type;
   // loop {
@@ -666,10 +600,6 @@
 )");
 }
 
-TEST_F(BuilderTest, DISABLED_If_WithElseConditionalContinue) {
-  FAIL();
-}
-
 TEST_F(BuilderTest, If_WithReturn) {
   ast::type::BoolType bool_type;
   // if (true) {
diff --git a/src/writer/spirv/builder_loop_test.cc b/src/writer/spirv/builder_loop_test.cc
index d5bfe5b..1071470 100644
--- a/src/writer/spirv/builder_loop_test.cc
+++ b/src/writer/spirv/builder_loop_test.cc
@@ -202,8 +202,6 @@
 )");
 }
 
-TEST_F(BuilderTest, DISABLED_Loop_WithConditionalContinue) {}
-
 TEST_F(BuilderTest, Loop_WithBreak) {
   // loop {
   //   break;
@@ -236,8 +234,6 @@
 )");
 }
 
-TEST_F(BuilderTest, DISABLED_Loop_WithConditionalBreak) {}
-
 }  // namespace
 }  // namespace spirv
 }  // namespace writer
diff --git a/src/writer/spirv/builder_switch_test.cc b/src/writer/spirv/builder_switch_test.cc
index 3637a92..d320235 100644
--- a/src/writer/spirv/builder_switch_test.cc
+++ b/src/writer/spirv/builder_switch_test.cc
@@ -472,16 +472,6 @@
   EXPECT_EQ(b.error(), "fallthrough of last case statement is disallowed");
 }
 
-// TODO(dsinclair): Implement when parsing is handled for multi-value
-// case labels.
-TEST_F(BuilderTest, DISABLED_Switch_CaseWithMulitpleLabels) {
-  // switch (a) {
-  //   case 1, 2, 3:
-  //     v = 1;
-  // }
-  FAIL();
-}
-
 TEST_F(BuilderTest, Switch_WithNestedBreak) {
   ast::type::I32Type i32;
   ast::type::BoolType bool_type;
diff --git a/src/writer/wgsl/generator_impl.cc b/src/writer/wgsl/generator_impl.cc
index f27f518..2316d17 100644
--- a/src/writer/wgsl/generator_impl.cc
+++ b/src/writer/wgsl/generator_impl.cc
@@ -691,28 +691,9 @@
   return true;
 }
 
-bool GeneratorImpl::EmitBreak(ast::BreakStatement* stmt) {
+bool GeneratorImpl::EmitBreak(ast::BreakStatement*) {
   make_indent();
-
-  out_ << "break";
-
-  if (stmt->condition() != ast::StatementCondition::kNone) {
-    out_ << " ";
-    if (stmt->condition() == ast::StatementCondition::kIf) {
-      out_ << "if";
-    } else {
-      out_ << "unless";
-    }
-
-    out_ << " (";
-    if (!EmitExpression(stmt->conditional())) {
-      return false;
-    }
-    out_ << ")";
-  }
-
-  out_ << ";" << std::endl;
-
+  out_ << "break;" << std::endl;
   return true;
 }
 
@@ -742,28 +723,9 @@
   return EmitStatementBlockAndNewline(stmt->body());
 }
 
-bool GeneratorImpl::EmitContinue(ast::ContinueStatement* stmt) {
+bool GeneratorImpl::EmitContinue(ast::ContinueStatement*) {
   make_indent();
-
-  out_ << "continue";
-
-  if (stmt->condition() != ast::StatementCondition::kNone) {
-    out_ << " ";
-    if (stmt->condition() == ast::StatementCondition::kIf) {
-      out_ << "if";
-    } else {
-      out_ << "unless";
-    }
-
-    out_ << " (";
-    if (!EmitExpression(stmt->conditional())) {
-      return false;
-    }
-    out_ << ")";
-  }
-
-  out_ << ";" << std::endl;
-
+  out_ << "continue;" << std::endl;
   return true;
 }
 
diff --git a/src/writer/wgsl/generator_impl_break_test.cc b/src/writer/wgsl/generator_impl_break_test.cc
index 556dcfe..7bcc8e8 100644
--- a/src/writer/wgsl/generator_impl_break_test.cc
+++ b/src/writer/wgsl/generator_impl_break_test.cc
@@ -17,7 +17,6 @@
 
 #include "gtest/gtest.h"
 #include "src/ast/break_statement.h"
-#include "src/ast/identifier_expression.h"
 #include "src/writer/wgsl/generator_impl.h"
 
 namespace tint {
@@ -37,28 +36,6 @@
   EXPECT_EQ(g.result(), "  break;\n");
 }
 
-TEST_F(GeneratorImplTest, Emit_BreakWithIf) {
-  auto expr = std::make_unique<ast::IdentifierExpression>("expr");
-  ast::BreakStatement b(ast::StatementCondition::kIf, std::move(expr));
-
-  GeneratorImpl g;
-  g.increment_indent();
-
-  ASSERT_TRUE(g.EmitStatement(&b)) << g.error();
-  EXPECT_EQ(g.result(), "  break if (expr);\n");
-}
-
-TEST_F(GeneratorImplTest, Emit_BreakWithUnless) {
-  auto expr = std::make_unique<ast::IdentifierExpression>("expr");
-  ast::BreakStatement b(ast::StatementCondition::kUnless, std::move(expr));
-
-  GeneratorImpl g;
-  g.increment_indent();
-
-  ASSERT_TRUE(g.EmitStatement(&b)) << g.error();
-  EXPECT_EQ(g.result(), "  break unless (expr);\n");
-}
-
 }  // namespace
 }  // namespace wgsl
 }  // namespace writer
diff --git a/src/writer/wgsl/generator_impl_continue_test.cc b/src/writer/wgsl/generator_impl_continue_test.cc
index cb5b81b..ffd5b93 100644
--- a/src/writer/wgsl/generator_impl_continue_test.cc
+++ b/src/writer/wgsl/generator_impl_continue_test.cc
@@ -17,7 +17,6 @@
 
 #include "gtest/gtest.h"
 #include "src/ast/continue_statement.h"
-#include "src/ast/identifier_expression.h"
 #include "src/writer/wgsl/generator_impl.h"
 
 namespace tint {
@@ -37,28 +36,6 @@
   EXPECT_EQ(g.result(), "  continue;\n");
 }
 
-TEST_F(GeneratorImplTest, Emit_ContinueWithIf) {
-  auto expr = std::make_unique<ast::IdentifierExpression>("expr");
-  ast::ContinueStatement c(ast::StatementCondition::kIf, std::move(expr));
-
-  GeneratorImpl g;
-  g.increment_indent();
-
-  ASSERT_TRUE(g.EmitStatement(&c)) << g.error();
-  EXPECT_EQ(g.result(), "  continue if (expr);\n");
-}
-
-TEST_F(GeneratorImplTest, Emit_ContinueWithUnless) {
-  auto expr = std::make_unique<ast::IdentifierExpression>("expr");
-  ast::ContinueStatement c(ast::StatementCondition::kUnless, std::move(expr));
-
-  GeneratorImpl g;
-  g.increment_indent();
-
-  ASSERT_TRUE(g.EmitStatement(&c)) << g.error();
-  EXPECT_EQ(g.result(), "  continue unless (expr);\n");
-}
-
 }  // namespace
 }  // namespace wgsl
 }  // namespace writer