Add parsing of default value exprs in pattern lists (#7631)

Adds parsing support only for default value expressions in pattern
lists, including leaving the default value unspecified with an
underscore `_`.

Per #7521.
This commit is contained in:
Lucile Rose Nihlen
2026-09-01 01:19:13 +00:00
committed by GitHub
parent 742684635a
commit 91c1e1049d
10 changed files with 319 additions and 83 deletions
+15 -9
View File
@@ -186,9 +186,9 @@ let {.x = x: i32 foo, .y = y: i32} = {};
// --- fail_struct_pattern_extra_token_start.carbon
// CHECK:STDERR: fail_struct_pattern_extra_token_start.carbon:[[@LINE+4]]:26: error: expected `,` or `}` [UnexpectedTokenAfterListElement]
// CHECK:STDERR: fail_struct_pattern_extra_token_start.carbon:[[@LINE+4]]:29: error: expected `,` or `}` [UnexpectedTokenAfterListElement]
// CHECK:STDERR: let {.x = x: i32, foo .y = y: i32} = {};
// CHECK:STDERR: ^
// CHECK:STDERR: ^
// CHECK:STDERR:
let {.x = x: i32, foo .y = y: i32} = {};
@@ -248,9 +248,9 @@ let {.x foo x: (), .y = y: ()} = {};
// --- fail_struct_pattern_invalid_field.carbon
// CHECK:STDERR: fail_struct_pattern_invalid_field.carbon:[[@LINE+4]]:12: error: expected `,` or `}` [UnexpectedTokenAfterListElement]
// CHECK:STDERR: fail_struct_pattern_invalid_field.carbon:[[@LINE+4]]:14: error: expected expression [ExpectedExpr]
// CHECK:STDERR: let {"foo" = , .x = x:()} = {};
// CHECK:STDERR: ^
// CHECK:STDERR: ^
// CHECK:STDERR:
let {"foo" = , .x = x:()} = {};
@@ -566,7 +566,9 @@ let {var _: i32} = {};
// CHECK:STDOUT: ╭─FileStart ''
// CHECK:STDOUT: │ ╭─LetIntroducer 'let'
// CHECK:STDOUT: │ │ ╭─StructPatternStart '{'
// CHECK:STDOUT: │ │ ├─InvalidParse '=' has_error
// CHECK:STDOUT: │ │ │ ╭─InvalidParse '=' has_error
// CHECK:STDOUT: │ │ │ ├─IdentifierNameExpr 'y'
// CHECK:STDOUT: │ │ ├─DefaultValuePattern '=' has_error
// CHECK:STDOUT: │ ├─StructPattern '}' has_error
// CHECK:STDOUT: │ ├─LetInitializer '='
// CHECK:STDOUT: │ │ ╭─StructLiteralStart '{'
@@ -829,9 +831,11 @@ let {var _: i32} = {};
// CHECK:STDOUT: │ │ │ ├─LetBindingPattern ':'
// CHECK:STDOUT: │ │ ├─StructPatternDesignatedField '='
// CHECK:STDOUT: │ │ ├─PatternListComma ','
// CHECK:STDOUT: │ │ │ ╭─IdentifierNameExpr 'foo'
// CHECK:STDOUT: │ │ │ ├─IdentifierNameNotBeforeSignature 'y'
// CHECK:STDOUT: │ │ ├─MemberAccessExpr '.'
// CHECK:STDOUT: │ │ │ ╭─IdentifierNameExpr 'foo'
// CHECK:STDOUT: │ │ │ ├─IdentifierNameNotBeforeSignature 'y'
// CHECK:STDOUT: │ │ │ ╭─MemberAccessExpr '.'
// CHECK:STDOUT: │ │ │ ├─IdentifierNameExpr 'y'
// CHECK:STDOUT: │ │ ├─DefaultValuePattern '='
// CHECK:STDOUT: │ ├─StructPattern '}' has_error
// CHECK:STDOUT: │ ├─LetInitializer '='
// CHECK:STDOUT: │ │ ╭─StructLiteralStart '{'
@@ -954,7 +958,9 @@ let {var _: i32} = {};
// CHECK:STDOUT: ╭─FileStart ''
// CHECK:STDOUT: │ ╭─LetIntroducer 'let'
// CHECK:STDOUT: │ │ ╭─StructPatternStart '{'
// CHECK:STDOUT: │ │ ├─StringLiteral '"foo"'
// CHECK:STDOUT: │ │ │ ╭─StringLiteral '"foo"'
// CHECK:STDOUT: │ │ │ ├─InvalidParse ',' has_error
// CHECK:STDOUT: │ │ ├─DefaultValuePattern '=' has_error
// CHECK:STDOUT: │ │ ├─PatternListComma ','
// CHECK:STDOUT: │ │ │ ╭─IdentifierNameNotBeforeSignature 'x'
// CHECK:STDOUT: │ │ │ ╭─StructFieldDesignator '.'