Lex/parse support for ->?, :?, and form literals (#6695)

See #5389 (pending) for the language design.
This commit is contained in:
Geoff Romer
2026-02-07 02:41:22 +00:00
committed by GitHub
parent 1382a8645a
commit 7938d9a8d0
31 changed files with 758 additions and 195 deletions
+61 -1
View File
@@ -148,7 +148,7 @@ fn F();
// --- fail_with_identifier_as_param.carbon
// CHECK:STDERR: fail_with_identifier_as_param.carbon:[[@LINE+4]]:11: error: expected `:` or `:!` in binding pattern [ExpectedBindingPattern]
// CHECK:STDERR: fail_with_identifier_as_param.carbon:[[@LINE+4]]:11: error: expected `:`, `:!`, or `:?` in binding pattern [ExpectedBindingPattern]
// CHECK:STDERR: fn foo(bar);
// CHECK:STDERR: ^
// CHECK:STDERR:
@@ -162,6 +162,16 @@ fn foo(bar);
// CHECK:STDERR:
fn (a tokens c d e f g h i j k l m n o p q r s t u v w x y z);
// --- form_parameter.carbon
fn FormParam(x:? Form);
fn ComplexFormParam(x:? X.Y(Z));
// --- return_form.carbon
fn SimpleReturnForm() ->? Form;
fn ComplexReturnForm() ->? X.Y(Z);
// CHECK:STDOUT: - filename: basic.carbon
// CHECK:STDOUT: parse_tree: [
// CHECK:STDOUT: {kind: 'FileStart', text: ''},
@@ -421,3 +431,53 @@ fn (a tokens c d e f g h i j k l m n o p q r s t u v w x y z);
// CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', has_error: yes, subtree_size: 3},
// CHECK:STDOUT: {kind: 'FileEnd', text: ''},
// CHECK:STDOUT: ]
// CHECK:STDOUT: - filename: form_parameter.carbon
// CHECK:STDOUT: parse_tree: [
// CHECK:STDOUT: {kind: 'FileStart', text: ''},
// CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
// CHECK:STDOUT: {kind: 'IdentifierNameBeforeParams', text: 'FormParam'},
// CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeParams', text: 'x'},
// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'Form'},
// CHECK:STDOUT: {kind: 'FormBindingPattern', text: ':?', subtree_size: 3},
// CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 5},
// CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 8},
// CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
// CHECK:STDOUT: {kind: 'IdentifierNameBeforeParams', text: 'ComplexFormParam'},
// CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeParams', text: 'x'},
// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'X'},
// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeParams', text: 'Y'},
// CHECK:STDOUT: {kind: 'MemberAccessExpr', text: '.', subtree_size: 3},
// CHECK:STDOUT: {kind: 'CallExprStart', text: '(', subtree_size: 4},
// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'Z'},
// CHECK:STDOUT: {kind: 'CallExpr', text: ')', subtree_size: 6},
// CHECK:STDOUT: {kind: 'FormBindingPattern', text: ':?', subtree_size: 8},
// CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 10},
// CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 13},
// CHECK:STDOUT: {kind: 'FileEnd', text: ''},
// CHECK:STDOUT: ]
// CHECK:STDOUT: - filename: return_form.carbon
// CHECK:STDOUT: parse_tree: [
// CHECK:STDOUT: {kind: 'FileStart', text: ''},
// CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
// CHECK:STDOUT: {kind: 'IdentifierNameBeforeParams', text: 'SimpleReturnForm'},
// CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
// CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'Form'},
// CHECK:STDOUT: {kind: 'ReturnForm', text: '->?', subtree_size: 2},
// CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 7},
// CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
// CHECK:STDOUT: {kind: 'IdentifierNameBeforeParams', text: 'ComplexReturnForm'},
// CHECK:STDOUT: {kind: 'ExplicitParamListStart', text: '('},
// CHECK:STDOUT: {kind: 'ExplicitParamList', text: ')', subtree_size: 2},
// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'X'},
// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeParams', text: 'Y'},
// CHECK:STDOUT: {kind: 'MemberAccessExpr', text: '.', subtree_size: 3},
// CHECK:STDOUT: {kind: 'CallExprStart', text: '(', subtree_size: 4},
// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'Z'},
// CHECK:STDOUT: {kind: 'CallExpr', text: ')', subtree_size: 6},
// CHECK:STDOUT: {kind: 'ReturnForm', text: '->?', subtree_size: 7},
// CHECK:STDOUT: {kind: 'FunctionDecl', text: ';', subtree_size: 12},
// CHECK:STDOUT: {kind: 'FileEnd', text: ''},
// CHECK:STDOUT: ]