diff --git a/toolchain/parser/parse_tree.cpp b/toolchain/parser/parse_tree.cpp index 6b642fb5764e..f6d5cfefb7af 100644 --- a/toolchain/parser/parse_tree.cpp +++ b/toolchain/parser/parse_tree.cpp @@ -25,8 +25,12 @@ auto ParseTree::Parse(TokenizedBuffer& tokens, DiagnosticConsumer& consumer, // Delegate to the parser. auto tree = Parser::Parse(tokens, emitter, vlog_stream); - auto verify_error = tree.Verify(); - CARBON_CHECK(!verify_error) << tree << *verify_error; + if (auto verify = tree.Verify(); !verify.ok()) { + if (vlog_stream) { + tree.Print(*vlog_stream); + } + CARBON_FATAL() << "Invalid tree returned by Parse(): " << verify.error(); + } return tree; } @@ -188,7 +192,7 @@ auto ParseTree::Print(llvm::raw_ostream& output, bool preorder) const -> void { output << "]\n"; } -auto ParseTree::Verify() const -> std::optional { +auto ParseTree::Verify() const -> ErrorOr { llvm::SmallVector nodes; // Traverse the tree in postorder. for (Node n : postorder()) { @@ -259,7 +263,7 @@ auto ParseTree::Verify() const -> std::optional { "TokenizedBuffer has {1} tokens.", node_impls_.size(), tokens_->size())); } - return std::nullopt; + return Success(); } auto ParseTree::PostorderIterator::Print(llvm::raw_ostream& output) const diff --git a/toolchain/parser/parse_tree.h b/toolchain/parser/parse_tree.h index 7ec2f43fa099..c340b0155317 100644 --- a/toolchain/parser/parse_tree.h +++ b/toolchain/parser/parse_tree.h @@ -146,7 +146,7 @@ class ParseTree { // This is primarily intended to be used as a // debugging aid. This routine doesn't directly CHECK so that it can be used // within a debugger. - [[nodiscard]] auto Verify() const -> std::optional; + [[nodiscard]] auto Verify() const -> ErrorOr; private: friend class Parser;