allow trailing commas in a struct pattern after an _ field (#8074)

Following a leads decision
(https://github.com/carbon-language/carbon-lang/issues/7404), this PR
adds support for trailing commas in a struct pattern where it was
previously only allowed after a full field.
This commit is contained in:
oli-ej authored and GitHub committed 2026-11-03 22:02:33 +00:00
1 parent 80a4a4d005
commit 5ae3dcaa92
8 files changed
+78 -25

No files matched your search

+31 -7
View File
@@ -32,6 +32,10 @@ let {.x = 1, .y = 2};
let {.x = y: i32, _} = {};
// --- struct_pattern_discard_with_comma.carbon
let {.x = y: i32, _, } = {};
// --- struct_pattern_unnamed.carbon
let {.x = _: i32} = {};
@@ -136,13 +140,13 @@ let {.x x:i32} = {};
// --- fail_struct_pattern_token_after_underscore.carbon
// CHECK:STDERR: fail_struct_pattern_token_after_underscore.carbon:[[@LINE+2]]:20: error: unexpected token `,` after `_` in struct pattern, expected `}` [ExpectedCloseAfterUnderscore]
// CHECK:STDERR: fail_struct_pattern_token_after_underscore.carbon:[[@LINE+2]]:20: error: unexpected token `.` after `_` in struct pattern, expected `}` [ExpectedCloseAfterUnderscore]
// CHECK:STDERR:
let {.x = x: i32, _,} = {};
let {.x = x: i32, _. } = {};
// --- fail_struct_pattern_underscore_not_last.carbon
// CHECK:STDERR: fail_struct_pattern_underscore_not_last.carbon:[[@LINE+2]]:6: error: unexpected token `,` after `_` in struct pattern, expected `}` [ExpectedCloseAfterUnderscore]
// CHECK:STDERR: fail_struct_pattern_underscore_not_last.carbon:[[@LINE+2]]:8: error: unexpected token `.` after `,` in struct pattern with `_` field, expected `}` [ExpectedCloseAfterUnderscore]
// CHECK:STDERR:
let{_, .x = x: i32} = {};
@@ -337,7 +341,28 @@ let {var _: i32} = {};
// CHECK:STDOUT: │ │ │ ├─LetBindingPattern ':'
// CHECK:STDOUT: │ │ ├─StructPatternDesignatedField '='
// CHECK:STDOUT: │ │ ├─PatternListComma ','
// CHECK:STDOUT: │ │ ├─UnderscoreName '_'
// CHECK:STDOUT: │ │ ├─PatternListUnderscoreField '_'
// CHECK:STDOUT: │ ├─StructPattern '}'
// CHECK:STDOUT: │ ├─LetInitializer '='
// CHECK:STDOUT: │ │ ╭─StructLiteralStart '{'
// CHECK:STDOUT: │ ├─StructLiteral '}'
// CHECK:STDOUT: ├─LetDecl ';'
// CHECK:STDOUT: ├─FileEnd ''
// CHECK:STDOUT: (root)
// CHECK:STDOUT: - filename: struct_pattern_discard_with_comma.carbon
// CHECK:STDOUT: ╭─FileStart ''
// CHECK:STDOUT: │ ╭─LetIntroducer 'let'
// CHECK:STDOUT: │ │ ╭─StructPatternStart '{'
// CHECK:STDOUT: │ │ │ ╭─IdentifierNameNotBeforeSignature 'x'
// CHECK:STDOUT: │ │ │ ╭─StructFieldDesignator '.'
// CHECK:STDOUT: │ │ │ │ ╭─IdentifierNameNotBeforeSignature 'y'
// CHECK:STDOUT: │ │ │ │ ├─BindingPatternTypeStart ':'
// CHECK:STDOUT: │ │ │ │ ├─IntTypeLiteral 'i32'
// CHECK:STDOUT: │ │ │ ├─LetBindingPattern ':'
// CHECK:STDOUT: │ │ ├─StructPatternDesignatedField '='
// CHECK:STDOUT: │ │ ├─PatternListComma ','
// CHECK:STDOUT: │ │ ├─PatternListUnderscoreField '_'
// CHECK:STDOUT: │ │ ├─PatternListComma ','
// CHECK:STDOUT: │ ├─StructPattern '}'
// CHECK:STDOUT: │ ├─LetInitializer '='
// CHECK:STDOUT: │ │ ╭─StructLiteralStart '{'
@@ -715,8 +740,7 @@ let {var _: i32} = {};
// CHECK:STDOUT: │ │ │ ├─LetBindingPattern ':'
// CHECK:STDOUT: │ │ ├─StructPatternDesignatedField '='
// CHECK:STDOUT: │ │ ├─PatternListComma ','
// CHECK:STDOUT: │ │ ├─UnderscoreName '_' has_error
// CHECK:STDOUT: │ │ ├─PatternListComma ','
// CHECK:STDOUT: │ │ ├─PatternListUnderscoreField '_' has_error
// CHECK:STDOUT: │ ├─StructPattern '}' has_error
// CHECK:STDOUT: │ ├─LetInitializer '='
// CHECK:STDOUT: │ │ ╭─StructLiteralStart '{'
@@ -728,7 +752,7 @@ let {var _: i32} = {};
// CHECK:STDOUT: ╭─FileStart ''
// CHECK:STDOUT: │ ╭─LetIntroducer 'let'
// CHECK:STDOUT: │ │ ╭─StructPatternStart '{'
// CHECK:STDOUT: │ │ ├─UnderscoreName '_' has_error
// CHECK:STDOUT: │ │ ├─PatternListUnderscoreField '_' has_error
// CHECK:STDOUT: │ │ ├─PatternListComma ','
// CHECK:STDOUT: │ │ │ ╭─IdentifierNameNotBeforeSignature 'x'
// CHECK:STDOUT: │ │ │ ╭─StructFieldDesignator '.'