Przeglądaj źródła

Handle missing condition in `while` (#3578)

Geoff Romer 2 lat temu
rodzic
commit
214d7b991d

+ 4 - 2
toolchain/parse/node_kind.def

@@ -404,8 +404,10 @@ CARBON_PARSE_NODE_KIND_BRACKET(IfStatement, IfCondition, If)
 //   WhileCondition
 //   _external_: CodeBlock
 // WhileStatement
-CARBON_PARSE_NODE_KIND_CHILD_COUNT(WhileConditionStart, 0, OpenParen)
-CARBON_PARSE_NODE_KIND_BRACKET(WhileCondition, WhileConditionStart, CloseParen)
+CARBON_PARSE_NODE_KIND_CHILD_COUNT(WhileConditionStart, 0,
+                                   CARBON_IF_VALID(OpenParen))
+CARBON_PARSE_NODE_KIND_BRACKET(WhileCondition, WhileConditionStart,
+                               CARBON_IF_VALID(CloseParen))
 CARBON_PARSE_NODE_KIND_CHILD_COUNT(WhileStatement, 2, While)
 
 // Index expressions, such as `a[1]`:

+ 31 - 0
toolchain/parse/testdata/while/fail_missing_cond.carbon

@@ -0,0 +1,31 @@
+// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
+// Exceptions. See /LICENSE for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+// AUTOUPDATE
+
+fn F() {
+  // CHECK:STDERR: fail_missing_cond.carbon:[[@LINE+3]]:9: ERROR: Expected `(` after `while`.
+  // CHECK:STDERR:   while {
+  // CHECK:STDERR:         ^
+  while {
+  }
+}
+
+// CHECK:STDOUT: - filename: fail_missing_cond.carbon
+// CHECK:STDOUT:   parse_tree: [
+// CHECK:STDOUT:     {kind: 'FileStart', text: ''},
+// CHECK:STDOUT:         {kind: 'FunctionIntroducer', text: 'fn'},
+// CHECK:STDOUT:         {kind: 'IdentifierName', text: 'F'},
+// CHECK:STDOUT:           {kind: 'TuplePatternStart', text: '('},
+// CHECK:STDOUT:         {kind: 'TuplePattern', text: ')', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'FunctionDefinitionStart', text: '{', subtree_size: 5},
+// CHECK:STDOUT:           {kind: 'WhileConditionStart', text: 'while', has_error: yes},
+// CHECK:STDOUT:           {kind: 'InvalidParse', text: '{', has_error: yes},
+// CHECK:STDOUT:         {kind: 'WhileCondition', text: 'while', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:           {kind: 'CodeBlockStart', text: '{'},
+// CHECK:STDOUT:         {kind: 'CodeBlock', text: '}', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'WhileStatement', text: 'while', subtree_size: 6},
+// CHECK:STDOUT:     {kind: 'FunctionDefinition', text: '}', subtree_size: 12},
+// CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
+// CHECK:STDOUT:   ]