From b72826c431bd3b730de4ab5bab28f2af7a4e4feb Mon Sep 17 00:00:00 2001 From: Jon Ross-Perkins Date: Wed, 28 Aug 2024 11:41:36 -0700 Subject: [PATCH] Fix parse to use the error tracking consumer for has_errors_. (#4261) This is how we are setting has_errors_ in other stages; this should only make parse consistent. Fixes #4259 --- toolchain/parse/context.cpp | 9 --------- toolchain/parse/parse.cpp | 4 +++- ...bon => fail_infix_uneven_space_before.carbon} | 8 ++++---- ...ix_space.carbon => fail_postfix_space.carbon} | 8 ++++---- ...on => fail_postfix_space_before_comma.carbon} | 8 ++++---- ....carbon => fail_postfix_space_in_call.carbon} | 8 ++++---- ...bon => fail_postfix_space_surrounding.carbon} | 8 ++++---- ...x_repeat.carbon => fail_prefix_repeat.carbon} | 8 ++++---- ...fix_space.carbon => fail_prefix_space.carbon} | 8 ++++---- ... fail_prefix_uneven_space_with_assign.carbon} | 8 ++++---- ..._star_minus.carbon => fail_star_minus.carbon} | 8 ++++---- ...er_star_star.carbon => fail_star_star.carbon} | 8 ++++---- toolchain/parse/tree.h | 16 +++++++++------- 13 files changed, 52 insertions(+), 57 deletions(-) rename toolchain/parse/testdata/operators/{recover_infix_uneven_space_before.carbon => fail_infix_uneven_space_before.carbon} (77%) rename toolchain/parse/testdata/operators/{recover_postfix_space.carbon => fail_postfix_space.carbon} (78%) rename toolchain/parse/testdata/operators/{recover_postfix_space_before_comma.carbon => fail_postfix_space_before_comma.carbon} (80%) rename toolchain/parse/testdata/operators/{recover_postfix_space_in_call.carbon => fail_postfix_space_in_call.carbon} (79%) rename toolchain/parse/testdata/operators/{recover_postfix_space_surrounding.carbon => fail_postfix_space_surrounding.carbon} (75%) rename toolchain/parse/testdata/operators/{recover_prefix_repeat.carbon => fail_prefix_repeat.carbon} (81%) rename toolchain/parse/testdata/operators/{recover_prefix_space.carbon => fail_prefix_space.carbon} (78%) rename toolchain/parse/testdata/operators/{recover_prefix_uneven_space_with_assign.carbon => fail_prefix_uneven_space_with_assign.carbon} (74%) rename toolchain/parse/testdata/operators/{recover_star_minus.carbon => fail_star_minus.carbon} (84%) rename toolchain/parse/testdata/operators/{recover_star_star.carbon => fail_star_star.carbon} (81%) diff --git a/toolchain/parse/context.cpp b/toolchain/parse/context.cpp index b886a0169b74..661c6153c7fb 100644 --- a/toolchain/parse/context.cpp +++ b/toolchain/parse/context.cpp @@ -69,17 +69,11 @@ Context::Context(Tree& tree, Lex::TokenizedBuffer& tokens, auto Context::AddLeafNode(NodeKind kind, Lex::TokenIndex token, bool has_error) -> void { tree_->node_impls_.push_back(Tree::NodeImpl(kind, has_error, token)); - if (has_error) { - tree_->has_errors_ = true; - } } auto Context::AddNode(NodeKind kind, Lex::TokenIndex token, bool has_error) -> void { tree_->node_impls_.push_back(Tree::NodeImpl(kind, has_error, token)); - if (has_error) { - tree_->has_errors_ = true; - } } auto Context::ReplacePlaceholderNode(int32_t position, NodeKind kind, @@ -92,9 +86,6 @@ auto Context::ReplacePlaceholderNode(int32_t position, NodeKind kind, node_impl->kind = kind; node_impl->has_error = has_error; node_impl->token = token; - if (has_error) { - tree_->has_errors_ = true; - } } auto Context::ConsumeAndAddOpenParen(Lex::TokenIndex default_token, diff --git a/toolchain/parse/parse.cpp b/toolchain/parse/parse.cpp index 8a1a546de785..df13a0890e64 100644 --- a/toolchain/parse/parse.cpp +++ b/toolchain/parse/parse.cpp @@ -20,7 +20,8 @@ auto HandleInvalid(Context& context) -> void { auto Parse(Lex::TokenizedBuffer& tokens, DiagnosticConsumer& consumer, llvm::raw_ostream* vlog_stream) -> Tree { Lex::TokenDiagnosticConverter converter(&tokens); - Lex::TokenDiagnosticEmitter emitter(converter, consumer); + ErrorTrackingDiagnosticConsumer err_tracker(consumer); + Lex::TokenDiagnosticEmitter emitter(converter, err_tracker); // Delegate to the parser. Tree tree(tokens); @@ -44,6 +45,7 @@ auto Parse(Lex::TokenizedBuffer& tokens, DiagnosticConsumer& consumer, } context.AddLeafNode(NodeKind::FileEnd, *context.position()); + tree.set_has_errors(err_tracker.seen_error()); if (auto verify = tree.Verify(); !verify.ok()) { // TODO: This is temporarily printing to stderr directly during development. diff --git a/toolchain/parse/testdata/operators/recover_infix_uneven_space_before.carbon b/toolchain/parse/testdata/operators/fail_infix_uneven_space_before.carbon similarity index 77% rename from toolchain/parse/testdata/operators/recover_infix_uneven_space_before.carbon rename to toolchain/parse/testdata/operators/fail_infix_uneven_space_before.carbon index 958850989a30..3ef371f7b301 100644 --- a/toolchain/parse/testdata/operators/recover_infix_uneven_space_before.carbon +++ b/toolchain/parse/testdata/operators/fail_infix_uneven_space_before.carbon @@ -4,16 +4,16 @@ // // AUTOUPDATE // TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/operators/recover_infix_uneven_space_before.carbon +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/operators/fail_infix_uneven_space_before.carbon // TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/operators/recover_infix_uneven_space_before.carbon +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/operators/fail_infix_uneven_space_before.carbon -// CHECK:STDERR: recover_infix_uneven_space_before.carbon:[[@LINE+3]]:15: ERROR: Whitespace missing after binary operator. +// CHECK:STDERR: fail_infix_uneven_space_before.carbon:[[@LINE+3]]:15: ERROR: Whitespace missing after binary operator. // CHECK:STDERR: var n: i8 = n *n; // CHECK:STDERR: ^ var n: i8 = n *n; -// CHECK:STDOUT: - filename: recover_infix_uneven_space_before.carbon +// CHECK:STDOUT: - filename: fail_infix_uneven_space_before.carbon // CHECK:STDOUT: parse_tree: [ // CHECK:STDOUT: {kind: 'FileStart', text: ''}, // CHECK:STDOUT: {kind: 'VariableIntroducer', text: 'var'}, diff --git a/toolchain/parse/testdata/operators/recover_postfix_space.carbon b/toolchain/parse/testdata/operators/fail_postfix_space.carbon similarity index 78% rename from toolchain/parse/testdata/operators/recover_postfix_space.carbon rename to toolchain/parse/testdata/operators/fail_postfix_space.carbon index 401664f8e97d..b7b02435ce3b 100644 --- a/toolchain/parse/testdata/operators/recover_postfix_space.carbon +++ b/toolchain/parse/testdata/operators/fail_postfix_space.carbon @@ -4,16 +4,16 @@ // // AUTOUPDATE // TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/operators/recover_postfix_space.carbon +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/operators/fail_postfix_space.carbon // TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/operators/recover_postfix_space.carbon +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/operators/fail_postfix_space.carbon -// CHECK:STDERR: recover_postfix_space.carbon:[[@LINE+3]]:18: ERROR: Whitespace is not allowed before this unary operator. +// CHECK:STDERR: fail_postfix_space.carbon:[[@LINE+3]]:18: ERROR: Whitespace is not allowed before this unary operator. // CHECK:STDERR: var v: type = i8 *; // CHECK:STDERR: ^ var v: type = i8 *; -// CHECK:STDOUT: - filename: recover_postfix_space.carbon +// CHECK:STDOUT: - filename: fail_postfix_space.carbon // CHECK:STDOUT: parse_tree: [ // CHECK:STDOUT: {kind: 'FileStart', text: ''}, // CHECK:STDOUT: {kind: 'VariableIntroducer', text: 'var'}, diff --git a/toolchain/parse/testdata/operators/recover_postfix_space_before_comma.carbon b/toolchain/parse/testdata/operators/fail_postfix_space_before_comma.carbon similarity index 80% rename from toolchain/parse/testdata/operators/recover_postfix_space_before_comma.carbon rename to toolchain/parse/testdata/operators/fail_postfix_space_before_comma.carbon index 77a575c0b43f..96378673ecbe 100644 --- a/toolchain/parse/testdata/operators/recover_postfix_space_before_comma.carbon +++ b/toolchain/parse/testdata/operators/fail_postfix_space_before_comma.carbon @@ -4,16 +4,16 @@ // // AUTOUPDATE // TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/operators/recover_postfix_space_before_comma.carbon +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/operators/fail_postfix_space_before_comma.carbon // TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/operators/recover_postfix_space_before_comma.carbon +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/operators/fail_postfix_space_before_comma.carbon -// CHECK:STDERR: recover_postfix_space_before_comma.carbon:[[@LINE+3]]:18: ERROR: Whitespace is not allowed before this unary operator. +// CHECK:STDERR: fail_postfix_space_before_comma.carbon:[[@LINE+3]]:18: ERROR: Whitespace is not allowed before this unary operator. // CHECK:STDERR: var n: i8 = F(i8 *, 0); // CHECK:STDERR: ^ var n: i8 = F(i8 *, 0); -// CHECK:STDOUT: - filename: recover_postfix_space_before_comma.carbon +// CHECK:STDOUT: - filename: fail_postfix_space_before_comma.carbon // CHECK:STDOUT: parse_tree: [ // CHECK:STDOUT: {kind: 'FileStart', text: ''}, // CHECK:STDOUT: {kind: 'VariableIntroducer', text: 'var'}, diff --git a/toolchain/parse/testdata/operators/recover_postfix_space_in_call.carbon b/toolchain/parse/testdata/operators/fail_postfix_space_in_call.carbon similarity index 79% rename from toolchain/parse/testdata/operators/recover_postfix_space_in_call.carbon rename to toolchain/parse/testdata/operators/fail_postfix_space_in_call.carbon index 4575d606ada9..2cd0004a4f6d 100644 --- a/toolchain/parse/testdata/operators/recover_postfix_space_in_call.carbon +++ b/toolchain/parse/testdata/operators/fail_postfix_space_in_call.carbon @@ -4,16 +4,16 @@ // // AUTOUPDATE // TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/operators/recover_postfix_space_in_call.carbon +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/operators/fail_postfix_space_in_call.carbon // TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/operators/recover_postfix_space_in_call.carbon +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/operators/fail_postfix_space_in_call.carbon -// CHECK:STDERR: recover_postfix_space_in_call.carbon:[[@LINE+3]]:18: ERROR: Whitespace is not allowed before this unary operator. +// CHECK:STDERR: fail_postfix_space_in_call.carbon:[[@LINE+3]]:18: ERROR: Whitespace is not allowed before this unary operator. // CHECK:STDERR: var n: i8 = F(i8 *); // CHECK:STDERR: ^ var n: i8 = F(i8 *); -// CHECK:STDOUT: - filename: recover_postfix_space_in_call.carbon +// CHECK:STDOUT: - filename: fail_postfix_space_in_call.carbon // CHECK:STDOUT: parse_tree: [ // CHECK:STDOUT: {kind: 'FileStart', text: ''}, // CHECK:STDOUT: {kind: 'VariableIntroducer', text: 'var'}, diff --git a/toolchain/parse/testdata/operators/recover_postfix_space_surrounding.carbon b/toolchain/parse/testdata/operators/fail_postfix_space_surrounding.carbon similarity index 75% rename from toolchain/parse/testdata/operators/recover_postfix_space_surrounding.carbon rename to toolchain/parse/testdata/operators/fail_postfix_space_surrounding.carbon index 2184989833ac..e3ba50e910d3 100644 --- a/toolchain/parse/testdata/operators/recover_postfix_space_surrounding.carbon +++ b/toolchain/parse/testdata/operators/fail_postfix_space_surrounding.carbon @@ -4,16 +4,16 @@ // // AUTOUPDATE // TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/operators/recover_postfix_space_surrounding.carbon +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/operators/fail_postfix_space_surrounding.carbon // TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/operators/recover_postfix_space_surrounding.carbon +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/operators/fail_postfix_space_surrounding.carbon -// CHECK:STDERR: recover_postfix_space_surrounding.carbon:[[@LINE+3]]:18: ERROR: Whitespace is not allowed before this unary operator. +// CHECK:STDERR: fail_postfix_space_surrounding.carbon:[[@LINE+3]]:18: ERROR: Whitespace is not allowed before this unary operator. // CHECK:STDERR: var v: type = i8 * ; // CHECK:STDERR: ^ var v: type = i8 * ; -// CHECK:STDOUT: - filename: recover_postfix_space_surrounding.carbon +// CHECK:STDOUT: - filename: fail_postfix_space_surrounding.carbon // CHECK:STDOUT: parse_tree: [ // CHECK:STDOUT: {kind: 'FileStart', text: ''}, // CHECK:STDOUT: {kind: 'VariableIntroducer', text: 'var'}, diff --git a/toolchain/parse/testdata/operators/recover_prefix_repeat.carbon b/toolchain/parse/testdata/operators/fail_prefix_repeat.carbon similarity index 81% rename from toolchain/parse/testdata/operators/recover_prefix_repeat.carbon rename to toolchain/parse/testdata/operators/fail_prefix_repeat.carbon index de4fd99f875b..470218e2c6a5 100644 --- a/toolchain/parse/testdata/operators/recover_prefix_repeat.carbon +++ b/toolchain/parse/testdata/operators/fail_prefix_repeat.carbon @@ -4,17 +4,17 @@ // // AUTOUPDATE // TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/operators/recover_prefix_repeat.carbon +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/operators/fail_prefix_repeat.carbon // TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/operators/recover_prefix_repeat.carbon +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/operators/fail_prefix_repeat.carbon -// CHECK:STDERR: recover_prefix_repeat.carbon:[[@LINE+3]]:17: ERROR: Parentheses are required around this unary `const` operator. +// CHECK:STDERR: fail_prefix_repeat.carbon:[[@LINE+3]]:17: ERROR: Parentheses are required around this unary `const` operator. // CHECK:STDERR: fn F() -> const const i32* { // CHECK:STDERR: ^~~~~ fn F() -> const const i32* { } -// CHECK:STDOUT: - filename: recover_prefix_repeat.carbon +// CHECK:STDOUT: - filename: fail_prefix_repeat.carbon // CHECK:STDOUT: parse_tree: [ // CHECK:STDOUT: {kind: 'FileStart', text: ''}, // CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'}, diff --git a/toolchain/parse/testdata/operators/recover_prefix_space.carbon b/toolchain/parse/testdata/operators/fail_prefix_space.carbon similarity index 78% rename from toolchain/parse/testdata/operators/recover_prefix_space.carbon rename to toolchain/parse/testdata/operators/fail_prefix_space.carbon index 4e4555438b4b..1aa603f273b0 100644 --- a/toolchain/parse/testdata/operators/recover_prefix_space.carbon +++ b/toolchain/parse/testdata/operators/fail_prefix_space.carbon @@ -4,16 +4,16 @@ // // AUTOUPDATE // TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/operators/recover_prefix_space.carbon +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/operators/fail_prefix_space.carbon // TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/operators/recover_prefix_space.carbon +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/operators/fail_prefix_space.carbon -// CHECK:STDERR: recover_prefix_space.carbon:[[@LINE+3]]:13: ERROR: Whitespace is not allowed after this unary operator. +// CHECK:STDERR: fail_prefix_space.carbon:[[@LINE+3]]:13: ERROR: Whitespace is not allowed after this unary operator. // CHECK:STDERR: var n: i8 = - n; // CHECK:STDERR: ^ var n: i8 = - n; -// CHECK:STDOUT: - filename: recover_prefix_space.carbon +// CHECK:STDOUT: - filename: fail_prefix_space.carbon // CHECK:STDOUT: parse_tree: [ // CHECK:STDOUT: {kind: 'FileStart', text: ''}, // CHECK:STDOUT: {kind: 'VariableIntroducer', text: 'var'}, diff --git a/toolchain/parse/testdata/operators/recover_prefix_uneven_space_with_assign.carbon b/toolchain/parse/testdata/operators/fail_prefix_uneven_space_with_assign.carbon similarity index 74% rename from toolchain/parse/testdata/operators/recover_prefix_uneven_space_with_assign.carbon rename to toolchain/parse/testdata/operators/fail_prefix_uneven_space_with_assign.carbon index 5547c1dfcf01..149eb9451816 100644 --- a/toolchain/parse/testdata/operators/recover_prefix_uneven_space_with_assign.carbon +++ b/toolchain/parse/testdata/operators/fail_prefix_uneven_space_with_assign.carbon @@ -4,16 +4,16 @@ // // AUTOUPDATE // TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/operators/recover_prefix_uneven_space_with_assign.carbon +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/operators/fail_prefix_uneven_space_with_assign.carbon // TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/operators/recover_prefix_uneven_space_with_assign.carbon +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/operators/fail_prefix_uneven_space_with_assign.carbon -// CHECK:STDERR: recover_prefix_uneven_space_with_assign.carbon:[[@LINE+3]]:12: ERROR: Whitespace is not allowed after this unary operator. +// CHECK:STDERR: fail_prefix_uneven_space_with_assign.carbon:[[@LINE+3]]:12: ERROR: Whitespace is not allowed after this unary operator. // CHECK:STDERR: var n: i8 =- n; // CHECK:STDERR: ^ var n: i8 =- n; -// CHECK:STDOUT: - filename: recover_prefix_uneven_space_with_assign.carbon +// CHECK:STDOUT: - filename: fail_prefix_uneven_space_with_assign.carbon // CHECK:STDOUT: parse_tree: [ // CHECK:STDOUT: {kind: 'FileStart', text: ''}, // CHECK:STDOUT: {kind: 'VariableIntroducer', text: 'var'}, diff --git a/toolchain/parse/testdata/operators/recover_star_minus.carbon b/toolchain/parse/testdata/operators/fail_star_minus.carbon similarity index 84% rename from toolchain/parse/testdata/operators/recover_star_minus.carbon rename to toolchain/parse/testdata/operators/fail_star_minus.carbon index 7ef1152bb5de..8c1dc6aa698a 100644 --- a/toolchain/parse/testdata/operators/recover_star_minus.carbon +++ b/toolchain/parse/testdata/operators/fail_star_minus.carbon @@ -4,21 +4,21 @@ // // AUTOUPDATE // TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/operators/recover_star_minus.carbon +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/operators/fail_star_minus.carbon // TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/operators/recover_star_minus.carbon +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/operators/fail_star_minus.carbon // TODO: There are two possible fixes that would make this expression legal: // `n * -n` and `n* - n`. The parser doesn't realize that the first fix is // available because it has already accepted that first part of the expression, // so it is recovering by using the second option, but the diagnostic should // ideally offer (or consider) both fixes as alternatives. -// CHECK:STDERR: recover_star_minus.carbon:[[@LINE+3]]:16: ERROR: Whitespace missing after binary operator. +// CHECK:STDERR: fail_star_minus.carbon:[[@LINE+3]]:16: ERROR: Whitespace missing after binary operator. // CHECK:STDERR: var n: i8 = n* -n; // CHECK:STDERR: ^ var n: i8 = n* -n; -// CHECK:STDOUT: - filename: recover_star_minus.carbon +// CHECK:STDOUT: - filename: fail_star_minus.carbon // CHECK:STDOUT: parse_tree: [ // CHECK:STDOUT: {kind: 'FileStart', text: ''}, // CHECK:STDOUT: {kind: 'VariableIntroducer', text: 'var'}, diff --git a/toolchain/parse/testdata/operators/recover_star_star.carbon b/toolchain/parse/testdata/operators/fail_star_star.carbon similarity index 81% rename from toolchain/parse/testdata/operators/recover_star_star.carbon rename to toolchain/parse/testdata/operators/fail_star_star.carbon index dc198f7af1ea..8703d2596ad7 100644 --- a/toolchain/parse/testdata/operators/recover_star_star.carbon +++ b/toolchain/parse/testdata/operators/fail_star_star.carbon @@ -4,16 +4,16 @@ // // AUTOUPDATE // TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/operators/recover_star_star.carbon +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/operators/fail_star_star.carbon // TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/operators/recover_star_star.carbon +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/operators/fail_star_star.carbon -// CHECK:STDERR: recover_star_star.carbon:[[@LINE+3]]:16: ERROR: Whitespace missing after binary operator. +// CHECK:STDERR: fail_star_star.carbon:[[@LINE+3]]:16: ERROR: Whitespace missing after binary operator. // CHECK:STDERR: var n: i8 = n* *p; // CHECK:STDERR: ^ var n: i8 = n* *p; -// CHECK:STDOUT: - filename: recover_star_star.carbon +// CHECK:STDOUT: - filename: fail_star_star.carbon // CHECK:STDOUT: parse_tree: [ // CHECK:STDOUT: {kind: 'FileStart', text: ''}, // CHECK:STDOUT: {kind: 'VariableIntroducer', text: 'var'}, diff --git a/toolchain/parse/tree.h b/toolchain/parse/tree.h index 3815a6bcbfd5..eec245109eec 100644 --- a/toolchain/parse/tree.h +++ b/toolchain/parse/tree.h @@ -103,9 +103,10 @@ class Tree : public Printable { node_impls_.reserve(tokens_->expected_parse_tree_size()); } - // Tests whether there are any errors in the parse tree. auto has_errors() const -> bool { return has_errors_; } + auto set_has_errors(bool has_errors) -> void { has_errors_ = has_errors; } + // Returns the number of nodes in this parse tree. auto size() const -> int { return node_impls_.size(); } @@ -242,14 +243,15 @@ class Tree : public Printable { Lex::TokenizedBuffer* tokens_; - // Indicates if any errors were encountered while parsing. + // True if any lowering-blocking issues were encountered while parsing. Trees + // are expected to still be structurally valid for checking. // // This doesn't indicate how much of the tree is structurally accurate with - // respect to the grammar. That can be identified by looking at the `HasError` - // flag for a given node (see above for details). This simply indicates that - // some errors were encountered somewhere. A key implication is that when this - // is true we do *not* have the expected 1:1 mapping between tokens and parsed - // nodes as some tokens may have been skipped. + // respect to the grammar. That can be identified by looking at + // `node_has_error` (see above for details). This simply indicates that some + // errors were encountered somewhere. A key implication is that when this is + // true we do *not* enforce the expected 1:1 mapping between tokens and parsed + // nodes, because some tokens may have been skipped. bool has_errors_ = false; std::optional packaging_decl_;