mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-11-15 14:58:09 +00:00
Initial support for fn expressions. (#7893)
Support for `fn` expressions with the same feature set as `fn` declarations. In particular, there is no support for captures, positional parameters, `=>` bodies, or `auto` return types. Note that this results in two parse nodes for each `=>` token. That's a bug, but it matches the behavior of function declarations, and will be fixed in a follow-up change. Assisted-by: Gemini via Antigravity
This commit is contained in:
1 parent
66bf1415ac
commit
1b0a5709e6
24 files changed
+2015
-308
No files matched your search
+68
-44
@@ -13,6 +13,7 @@
|
||||
var a: auto = fn [T: type] (x: T) -> T { return x; };
|
||||
var b: auto = fn (x: i32) => x;
|
||||
var c: auto = fn { };
|
||||
var d: auto = fn (ref x: i32) ->? ref i32 { return x; };
|
||||
|
||||
// --- fail_unconsumed_lambda_introducer.carbon
|
||||
|
||||
@@ -74,27 +75,26 @@ fn G() {
|
||||
// CHECK:STDOUT: │ │ ╭─VarBindingPattern ':'
|
||||
// CHECK:STDOUT: │ ├─VariablePattern 'var'
|
||||
// CHECK:STDOUT: │ ├─VariableInitializer '='
|
||||
// CHECK:STDOUT: │ │ ╭─LambdaIntroducer 'fn'
|
||||
// CHECK:STDOUT: │ │ │ ╭─ImplicitParamListStart '['
|
||||
// CHECK:STDOUT: │ │ │ │ ╭─IdentifierNameNotBeforeSignature 'T'
|
||||
// CHECK:STDOUT: │ │ │ │ ├─BindingPatternTypeStart ':'
|
||||
// CHECK:STDOUT: │ │ │ │ ├─TypeTypeLiteral 'type'
|
||||
// CHECK:STDOUT: │ │ │ ├─LetBindingPattern ':'
|
||||
// CHECK:STDOUT: │ │ ├─ImplicitParamList ']'
|
||||
// CHECK:STDOUT: │ │ │ ╭─ExplicitParamListStart '('
|
||||
// CHECK:STDOUT: │ │ │ │ ╭─IdentifierNameNotBeforeSignature 'x'
|
||||
// CHECK:STDOUT: │ │ │ │ ├─BindingPatternTypeStart ':'
|
||||
// CHECK:STDOUT: │ │ │ │ ├─IdentifierNameExpr 'T'
|
||||
// CHECK:STDOUT: │ │ │ ├─LetBindingPattern ':'
|
||||
// CHECK:STDOUT: │ │ ├─ExplicitParamList ')'
|
||||
// CHECK:STDOUT: │ │ │ ╭─IdentifierNameExpr 'T'
|
||||
// CHECK:STDOUT: │ │ ├─ReturnType '->'
|
||||
// CHECK:STDOUT: │ │ │ ╭─CodeBlockStart '{'
|
||||
// CHECK:STDOUT: │ │ │ │ ╭─ReturnStatementStart 'return'
|
||||
// CHECK:STDOUT: │ │ │ │ ├─IdentifierNameExpr 'x'
|
||||
// CHECK:STDOUT: │ │ │ ├─ReturnStatement ';'
|
||||
// CHECK:STDOUT: │ │ ├─CodeBlock '}'
|
||||
// CHECK:STDOUT: │ ├─Lambda 'fn'
|
||||
// CHECK:STDOUT: │ │ ╭─LambdaIntroducer 'fn'
|
||||
// CHECK:STDOUT: │ │ │ ╭─ImplicitParamListStart '['
|
||||
// CHECK:STDOUT: │ │ │ │ ╭─IdentifierNameNotBeforeSignature 'T'
|
||||
// CHECK:STDOUT: │ │ │ │ ├─CompileTimeBindingPatternTypeStart ':'
|
||||
// CHECK:STDOUT: │ │ │ │ ├─TypeTypeLiteral 'type'
|
||||
// CHECK:STDOUT: │ │ │ ├─CompileTimeBindingPattern ':'
|
||||
// CHECK:STDOUT: │ │ ├─ImplicitParamList ']'
|
||||
// CHECK:STDOUT: │ │ │ ╭─ExplicitParamListStart '('
|
||||
// CHECK:STDOUT: │ │ │ │ ╭─IdentifierNameNotBeforeSignature 'x'
|
||||
// CHECK:STDOUT: │ │ │ │ ├─BindingPatternTypeStart ':'
|
||||
// CHECK:STDOUT: │ │ │ │ ├─IdentifierNameExpr 'T'
|
||||
// CHECK:STDOUT: │ │ │ ├─LetBindingPattern ':'
|
||||
// CHECK:STDOUT: │ │ ├─ExplicitParamList ')'
|
||||
// CHECK:STDOUT: │ │ │ ╭─IdentifierNameExpr 'T'
|
||||
// CHECK:STDOUT: │ │ ├─ReturnType '->'
|
||||
// CHECK:STDOUT: │ │ ╭─LambdaDefinitionStart '{'
|
||||
// CHECK:STDOUT: │ │ │ ╭─ReturnStatementStart 'return'
|
||||
// CHECK:STDOUT: │ │ │ ├─IdentifierNameExpr 'x'
|
||||
// CHECK:STDOUT: │ │ ├─ReturnStatement ';'
|
||||
// CHECK:STDOUT: │ ├─Lambda '}'
|
||||
// CHECK:STDOUT: ├─VariableDecl ';'
|
||||
// CHECK:STDOUT: │ ╭─VariableIntroducer 'var'
|
||||
// CHECK:STDOUT: │ │ ╭─IdentifierNameNotBeforeSignature 'b'
|
||||
@@ -103,13 +103,14 @@ fn G() {
|
||||
// CHECK:STDOUT: │ │ ╭─VarBindingPattern ':'
|
||||
// CHECK:STDOUT: │ ├─VariablePattern 'var'
|
||||
// CHECK:STDOUT: │ ├─VariableInitializer '='
|
||||
// CHECK:STDOUT: │ │ ╭─LambdaIntroducer 'fn'
|
||||
// CHECK:STDOUT: │ │ │ ╭─ExplicitParamListStart '('
|
||||
// CHECK:STDOUT: │ │ │ │ ╭─IdentifierNameNotBeforeSignature 'x'
|
||||
// CHECK:STDOUT: │ │ │ │ ├─BindingPatternTypeStart ':'
|
||||
// CHECK:STDOUT: │ │ │ │ ├─IntTypeLiteral 'i32'
|
||||
// CHECK:STDOUT: │ │ │ ├─LetBindingPattern ':'
|
||||
// CHECK:STDOUT: │ │ ├─ExplicitParamList ')'
|
||||
// CHECK:STDOUT: │ │ ╭─LambdaIntroducer 'fn'
|
||||
// CHECK:STDOUT: │ │ │ ╭─ExplicitParamListStart '('
|
||||
// CHECK:STDOUT: │ │ │ │ ╭─IdentifierNameNotBeforeSignature 'x'
|
||||
// CHECK:STDOUT: │ │ │ │ ├─BindingPatternTypeStart ':'
|
||||
// CHECK:STDOUT: │ │ │ │ ├─IntTypeLiteral 'i32'
|
||||
// CHECK:STDOUT: │ │ │ ├─LetBindingPattern ':'
|
||||
// CHECK:STDOUT: │ │ ├─ExplicitParamList ')'
|
||||
// CHECK:STDOUT: │ │ ╭─LambdaDefinitionStart '=>'
|
||||
// CHECK:STDOUT: │ │ ├─TerseBodyArrow '=>'
|
||||
// CHECK:STDOUT: │ │ ├─IdentifierNameExpr 'x'
|
||||
// CHECK:STDOUT: │ ├─Lambda 'fn'
|
||||
@@ -121,10 +122,33 @@ fn G() {
|
||||
// CHECK:STDOUT: │ │ ╭─VarBindingPattern ':'
|
||||
// CHECK:STDOUT: │ ├─VariablePattern 'var'
|
||||
// CHECK:STDOUT: │ ├─VariableInitializer '='
|
||||
// CHECK:STDOUT: │ │ ╭─LambdaIntroducer 'fn'
|
||||
// CHECK:STDOUT: │ │ │ ╭─CodeBlockStart '{'
|
||||
// CHECK:STDOUT: │ │ ├─CodeBlock '}'
|
||||
// CHECK:STDOUT: │ ├─Lambda 'fn'
|
||||
// CHECK:STDOUT: │ │ ╭─LambdaIntroducer 'fn'
|
||||
// CHECK:STDOUT: │ │ ╭─LambdaDefinitionStart '{'
|
||||
// CHECK:STDOUT: │ ├─Lambda '}'
|
||||
// CHECK:STDOUT: ├─VariableDecl ';'
|
||||
// CHECK:STDOUT: │ ╭─VariableIntroducer 'var'
|
||||
// CHECK:STDOUT: │ │ ╭─IdentifierNameNotBeforeSignature 'd'
|
||||
// CHECK:STDOUT: │ │ ├─BindingPatternTypeStart ':'
|
||||
// CHECK:STDOUT: │ │ ├─AutoTypeLiteral 'auto'
|
||||
// CHECK:STDOUT: │ │ ╭─VarBindingPattern ':'
|
||||
// CHECK:STDOUT: │ ├─VariablePattern 'var'
|
||||
// CHECK:STDOUT: │ ├─VariableInitializer '='
|
||||
// CHECK:STDOUT: │ │ ╭─LambdaIntroducer 'fn'
|
||||
// CHECK:STDOUT: │ │ │ ╭─ExplicitParamListStart '('
|
||||
// CHECK:STDOUT: │ │ │ │ ╭─IdentifierNameNotBeforeSignature 'x'
|
||||
// CHECK:STDOUT: │ │ │ │ ╭─RefBindingName 'ref'
|
||||
// CHECK:STDOUT: │ │ │ │ ├─BindingPatternTypeStart ':'
|
||||
// CHECK:STDOUT: │ │ │ │ ├─IntTypeLiteral 'i32'
|
||||
// CHECK:STDOUT: │ │ │ ├─LetBindingPattern ':'
|
||||
// CHECK:STDOUT: │ │ ├─ExplicitParamList ')'
|
||||
// CHECK:STDOUT: │ │ │ ╭─IntTypeLiteral 'i32'
|
||||
// CHECK:STDOUT: │ │ │ ╭─PrefixOperatorRef 'ref'
|
||||
// CHECK:STDOUT: │ │ ├─ReturnForm '->?'
|
||||
// CHECK:STDOUT: │ │ ╭─LambdaDefinitionStart '{'
|
||||
// CHECK:STDOUT: │ │ │ ╭─ReturnStatementStart 'return'
|
||||
// CHECK:STDOUT: │ │ │ ├─IdentifierNameExpr 'x'
|
||||
// CHECK:STDOUT: │ │ ├─ReturnStatement ';'
|
||||
// CHECK:STDOUT: │ ├─Lambda '}'
|
||||
// CHECK:STDOUT: ├─VariableDecl ';'
|
||||
// CHECK:STDOUT: ├─FileEnd ''
|
||||
// CHECK:STDOUT: (root)
|
||||
@@ -132,12 +156,12 @@ fn G() {
|
||||
// CHECK:STDOUT: ╭─FileStart ''
|
||||
// CHECK:STDOUT: │ ╭─RequireIntroducer 'require'
|
||||
// CHECK:STDOUT: │ │ ╭─IdentifierNameExpr 'j'
|
||||
// CHECK:STDOUT: │ │ │ ╭─LambdaIntroducer 'fn'
|
||||
// CHECK:STDOUT: │ │ │ │ ╭─InvalidParse '>' has_error
|
||||
// CHECK:STDOUT: │ │ │ │ ├─InvalidParse '' has_error
|
||||
// CHECK:STDOUT: │ │ │ │ ╭─InfixOperatorGreater '>' has_error
|
||||
// CHECK:STDOUT: │ │ │ ├─ReturnType '->'
|
||||
// CHECK:STDOUT: │ │ │ ├─InvalidParse '' has_error
|
||||
// CHECK:STDOUT: │ │ │ ╭─LambdaIntroducer 'fn'
|
||||
// CHECK:STDOUT: │ │ │ │ ╭─InvalidParse '>' has_error
|
||||
// CHECK:STDOUT: │ │ │ │ ├─InvalidParse '' has_error
|
||||
// CHECK:STDOUT: │ │ │ │ ╭─InfixOperatorGreater '>' has_error
|
||||
// CHECK:STDOUT: │ │ │ ├─ReturnType '->'
|
||||
// CHECK:STDOUT: │ │ │ ╭─LambdaDefinitionStart '' has_error
|
||||
// CHECK:STDOUT: │ │ │ ╭─Lambda 'fn' has_error
|
||||
// CHECK:STDOUT: │ │ ├─PrefixOperatorMinus '-'
|
||||
// CHECK:STDOUT: │ ├─InfixOperatorPercent '%'
|
||||
@@ -158,8 +182,8 @@ fn G() {
|
||||
// CHECK:STDOUT: │ │ │ ╭─VarBindingPattern ':'
|
||||
// CHECK:STDOUT: │ │ ├─VariablePattern 'var'
|
||||
// CHECK:STDOUT: │ │ ├─VariableInitializer '='
|
||||
// CHECK:STDOUT: │ │ │ ╭─LambdaIntroducer 'fn'
|
||||
// CHECK:STDOUT: │ │ │ ├─InvalidParse ';' has_error
|
||||
// CHECK:STDOUT: │ │ │ ╭─LambdaIntroducer 'fn'
|
||||
// CHECK:STDOUT: │ │ │ ╭─LambdaDefinitionStart ';' has_error
|
||||
// CHECK:STDOUT: │ │ ├─Lambda 'fn' has_error
|
||||
// CHECK:STDOUT: │ ├─VariableDecl ';'
|
||||
// CHECK:STDOUT: ├─FunctionDefinition '}'
|
||||
@@ -179,10 +203,10 @@ fn G() {
|
||||
// CHECK:STDOUT: │ │ │ ╭─VarBindingPattern ':'
|
||||
// CHECK:STDOUT: │ │ ├─VariablePattern 'var'
|
||||
// CHECK:STDOUT: │ │ ├─VariableInitializer '='
|
||||
// CHECK:STDOUT: │ │ │ ╭─LambdaIntroducer 'fn'
|
||||
// CHECK:STDOUT: │ │ │ │ ╭─IntTypeLiteral 'i32'
|
||||
// CHECK:STDOUT: │ │ │ ├─ReturnType '->'
|
||||
// CHECK:STDOUT: │ │ │ ├─InvalidParse ';' has_error
|
||||
// CHECK:STDOUT: │ │ │ ╭─LambdaIntroducer 'fn'
|
||||
// CHECK:STDOUT: │ │ │ │ ╭─IntTypeLiteral 'i32'
|
||||
// CHECK:STDOUT: │ │ │ ├─ReturnType '->'
|
||||
// CHECK:STDOUT: │ │ │ ╭─LambdaDefinitionStart ';' has_error
|
||||
// CHECK:STDOUT: │ │ ├─Lambda 'fn' has_error
|
||||
// CHECK:STDOUT: │ ├─VariableDecl ';'
|
||||
// CHECK:STDOUT: ├─FunctionDefinition '}'
|
||||
|
||||
Reference in new issue
Block a user