Explorar o código

Teach the parser to not crash on the spaceship `<=>` operator. (#3494)

This remains structurally valid although we don't use this operator or
have a design for it, this at least fixes a fuzzer-found crash.

---------

Co-authored-by: josh11b <josh11b@users.noreply.github.com>
Chandler Carruth %!s(int64=2) %!d(string=hai) anos
pai
achega
6037b11e90

+ 1 - 0
toolchain/parse/node_kind.def

@@ -543,6 +543,7 @@ CARBON_PARSE_NODE_KIND_CHILD_COUNT(InfixOperator, 2,
                                    CARBON_TOKEN(GreaterGreaterEqual)
                                    CARBON_TOKEN(Less)
                                    CARBON_TOKEN(LessEqual)
+                                   CARBON_TOKEN(LessEqualGreater)
                                    CARBON_TOKEN(LessLess)
                                    CARBON_TOKEN(LessLessEqual)
                                    CARBON_TOKEN(Minus)

+ 25 - 0
toolchain/parse/testdata/operators/spaceship.carbon

@@ -0,0 +1,25 @@
+// 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() {
+  a <=> b;
+}
+
+// CHECK:STDOUT: - filename: spaceship.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: 'IdentifierNameExpr', text: 'a'},
+// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'b'},
+// CHECK:STDOUT:         {kind: 'InfixOperator', text: '<=>', subtree_size: 3},
+// CHECK:STDOUT:       {kind: 'ExprStatement', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'FunctionDefinition', text: '}', subtree_size: 10},
+// CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
+// CHECK:STDOUT:   ]