Răsfoiți Sursa

Simplify handling of `VariableInitializer` (#3515)

Also stop supporting `var` with initializer inside `for`.

Resolves TODO in `handle_variable.cpp`

---------

Co-authored-by: Richard Smith <richard@metafoo.co.uk>
Geoff Romer 2 ani în urmă
părinte
comite
927d633762
70 a modificat fișierele cu 412 adăugiri și 408 ștergeri
  1. 7 17
      toolchain/check/handle_variable.cpp
  2. 1 1
      toolchain/check/node_stack.h
  3. 16 4
      toolchain/parse/handle_var.cpp
  4. 2 3
      toolchain/parse/node_kind.def
  5. 16 22
      toolchain/parse/state.def
  6. 6 6
      toolchain/parse/testdata/basics/builtin_types.carbon
  7. 4 4
      toolchain/parse/testdata/basics/fail_paren_match_regression.carbon
  8. 30 30
      toolchain/parse/testdata/basics/numeric_literals.carbon
  9. 5 5
      toolchain/parse/testdata/if_expr/fail_condition_missing.carbon
  10. 7 7
      toolchain/parse/testdata/if_expr/fail_else_expr_missing.carbon
  11. 7 7
      toolchain/parse/testdata/if_expr/fail_else_missing.carbon
  12. 6 6
      toolchain/parse/testdata/if_expr/fail_then_expr_missing.carbon
  13. 6 6
      toolchain/parse/testdata/if_expr/fail_then_missing.carbon
  14. 5 5
      toolchain/parse/testdata/index/assign_to_var.carbon
  15. 5 5
      toolchain/parse/testdata/index/fail_empty_expr.carbon
  16. 5 5
      toolchain/parse/testdata/index/fail_malformed_expr.carbon
  17. 4 4
      toolchain/parse/testdata/operators/assign.carbon
  18. 3 3
      toolchain/parse/testdata/operators/fail_infix_uneven_space_after.carbon
  19. 12 12
      toolchain/parse/testdata/operators/fail_invalid_infix.carbon
  20. 2 2
      toolchain/parse/testdata/operators/fail_postincrement.carbon
  21. 4 4
      toolchain/parse/testdata/operators/fail_precedence_star_minus.carbon
  22. 5 5
      toolchain/parse/testdata/operators/fail_precedence_star_star.carbon
  23. 4 4
      toolchain/parse/testdata/operators/fail_star_star_no_space.carbon
  24. 5 5
      toolchain/parse/testdata/operators/fixity_in_var.carbon
  25. 4 4
      toolchain/parse/testdata/operators/infix.carbon
  26. 4 4
      toolchain/parse/testdata/operators/infix_no_space.carbon
  27. 6 6
      toolchain/parse/testdata/operators/infix_with_paren_after.carbon
  28. 6 6
      toolchain/parse/testdata/operators/infix_with_paren_before.carbon
  29. 3 3
      toolchain/parse/testdata/operators/postfix.carbon
  30. 3 3
      toolchain/parse/testdata/operators/postfix_space_after_op.carbon
  31. 6 6
      toolchain/parse/testdata/operators/prefix.carbon
  32. 3 3
      toolchain/parse/testdata/operators/prefix_no_space.carbon
  33. 4 4
      toolchain/parse/testdata/operators/recover_infix_uneven_space_before.carbon
  34. 3 3
      toolchain/parse/testdata/operators/recover_postfix_space.carbon
  35. 8 8
      toolchain/parse/testdata/operators/recover_postfix_space_before_comma.carbon
  36. 6 6
      toolchain/parse/testdata/operators/recover_postfix_space_in_call.carbon
  37. 3 3
      toolchain/parse/testdata/operators/recover_postfix_space_surrounding.carbon
  38. 3 3
      toolchain/parse/testdata/operators/recover_prefix_space.carbon
  39. 3 3
      toolchain/parse/testdata/operators/recover_prefix_uneven_space_with_assign.carbon
  40. 4 4
      toolchain/parse/testdata/package_expr/basic.carbon
  41. 8 8
      toolchain/parse/testdata/pointer/pointer_type.carbon
  42. 8 8
      toolchain/parse/testdata/pointer/pointer_value.carbon
  43. 2 2
      toolchain/parse/testdata/return/returned_var.carbon
  44. 3 3
      toolchain/parse/testdata/struct/fail_comma_only.carbon
  45. 3 3
      toolchain/parse/testdata/struct/fail_comma_repeat_in_type.carbon
  46. 3 3
      toolchain/parse/testdata/struct/fail_comma_repeat_in_value.carbon
  47. 3 3
      toolchain/parse/testdata/struct/fail_dot_only.carbon
  48. 3 3
      toolchain/parse/testdata/struct/fail_dot_string_colon.carbon
  49. 3 3
      toolchain/parse/testdata/struct/fail_dot_string_equals.carbon
  50. 7 7
      toolchain/parse/testdata/struct/fail_extra_token_in_type.carbon
  51. 7 7
      toolchain/parse/testdata/struct/fail_extra_token_in_value.carbon
  52. 3 3
      toolchain/parse/testdata/struct/fail_identifier_colon.carbon
  53. 3 3
      toolchain/parse/testdata/struct/fail_identifier_equals.carbon
  54. 3 3
      toolchain/parse/testdata/struct/fail_identifier_only.carbon
  55. 3 3
      toolchain/parse/testdata/struct/fail_missing_type.carbon
  56. 3 3
      toolchain/parse/testdata/struct/fail_missing_value.carbon
  57. 3 3
      toolchain/parse/testdata/struct/fail_mix_type_and_value.carbon
  58. 3 3
      toolchain/parse/testdata/struct/fail_mix_value_and_type.carbon
  59. 28 28
      toolchain/parse/testdata/struct/fail_mix_with_unknown.carbon
  60. 3 3
      toolchain/parse/testdata/struct/fail_no_colon_or_equals.carbon
  61. 3 3
      toolchain/parse/testdata/struct/fail_type_no_designator.carbon
  62. 3 3
      toolchain/parse/testdata/struct/no_entries.carbon
  63. 7 7
      toolchain/parse/testdata/struct/one_entry_no_comma.carbon
  64. 8 8
      toolchain/parse/testdata/struct/one_entry_with_comma.carbon
  65. 12 12
      toolchain/parse/testdata/struct/two_entries.carbon
  66. 6 6
      toolchain/parse/testdata/tuple/two_entries.carbon
  67. 4 4
      toolchain/parse/testdata/var/var.carbon
  68. 6 6
      toolchain/parse/testdata/var/var_tuple.carbon
  69. 8 6
      toolchain/parse/typed_nodes.h
  70. 17 10
      toolchain/parse/typed_nodes_test.cpp

+ 7 - 17
toolchain/check/handle_variable.cpp

@@ -27,26 +27,16 @@ auto HandleReturnedModifier(Context& context,
 auto HandleVariableInitializer(Context& context,
                                Parse::VariableInitializerId parse_node)
     -> bool {
-  // No action, just a bracketing node.
-  context.node_stack().Push(parse_node);
+  SemIR::InstId init_id = context.node_stack().PopExpr();
+  context.node_stack().Push(parse_node, init_id);
   return true;
 }
 
 auto HandleVariableDecl(Context& context, Parse::VariableDeclId parse_node)
     -> bool {
   // Handle the optional initializer.
-  auto init_id = SemIR::InstId::Invalid;
-  Parse::NodeKind next_kind = context.node_stack().PeekParseNodeKind();
-  if (next_kind == Parse::NodeKind::TuplePattern) {
-    return context.TODO(parse_node, "tuple pattern in var");
-  }
-  // TODO: find a more robust way to determine if there was an initializer.
-  bool has_init = next_kind != Parse::NodeKind::BindingPattern;
-  if (has_init) {
-    init_id = context.node_stack().PopExpr();
-    context.node_stack()
-        .PopAndDiscardSoloParseNode<Parse::NodeKind::VariableInitializer>();
-  }
+  std::optional<SemIR::InstId> init_id =
+      context.node_stack().PopIf<Parse::NodeKind::VariableInitializer>();
 
   if (context.node_stack().PeekIs<Parse::NodeKind::TuplePattern>()) {
     return context.TODO(parse_node, "tuple pattern in var");
@@ -71,16 +61,16 @@ auto HandleVariableDecl(Context& context, Parse::VariableDeclId parse_node)
       .PopAndDiscardSoloParseNodeIf<Parse::NodeKind::ReturnedModifier>();
 
   // If there was an initializer, assign it to the storage.
-  if (has_init) {
+  if (init_id.has_value()) {
     if (context.GetCurrentScopeAs<SemIR::ClassDecl>()) {
       // TODO: In a class scope, we should instead save the initializer
       // somewhere so that we can use it as a default.
       context.TODO(parse_node, "Field initializer");
     } else {
-      init_id = Initialize(context, parse_node, value_id, init_id);
+      init_id = Initialize(context, parse_node, value_id, *init_id);
       // TODO: Consider using different instruction kinds for assignment versus
       // initialization.
-      context.AddInst(SemIR::Assign{parse_node, value_id, init_id});
+      context.AddInst(SemIR::Assign{parse_node, value_id, *init_id});
     }
   }
 

+ 1 - 1
toolchain/check/node_stack.h

@@ -391,6 +391,7 @@ class NodeStack {
       case Parse::NodeKind::StructFieldType:
       case Parse::NodeKind::StructTypeLiteral:
       case Parse::NodeKind::TupleLiteral:
+      case Parse::NodeKind::VariableInitializer:
         return IdKind::InstId;
       case Parse::NodeKind::IfCondition:
       case Parse::NodeKind::IfExprIf:
@@ -424,7 +425,6 @@ class NodeStack {
       case Parse::NodeKind::ReturnVarModifier:
       case Parse::NodeKind::StructLiteralOrStructTypeLiteralStart:
       case Parse::NodeKind::TuplePatternStart:
-      case Parse::NodeKind::VariableInitializer:
       case Parse::NodeKind::VariableIntroducer:
         return IdKind::SoloParseNode;
 // Use x-macros to handle boilerplate cases.

+ 16 - 4
toolchain/parse/handle_var.cpp

@@ -6,7 +6,7 @@
 
 namespace Carbon::Parse {
 
-// Handles VarAs(Decl|For).
+// Handles VarAs(Decl|Returned).
 static auto HandleVar(Context& context, State finish_state,
                       Lex::TokenIndex returned_token = Lex::TokenIndex::Invalid)
     -> void {
@@ -47,7 +47,12 @@ auto HandleVarAsReturned(Context& context) -> void {
 }
 
 auto HandleVarAsFor(Context& context) -> void {
-  HandleVar(context, State::VarFinishAsFor);
+  auto state = context.PopState();
+
+  // The finished variable declaration will start at the `var`.
+  context.PushState(state, State::VarFinishAsFor);
+
+  context.PushState(State::Pattern);
 }
 
 auto HandleVarAfterPattern(Context& context) -> void {
@@ -60,12 +65,19 @@ auto HandleVarAfterPattern(Context& context) -> void {
     }
   }
 
-  if (auto equals = context.ConsumeIf(Lex::TokenKind::Equal)) {
-    context.AddLeafNode(NodeKind::VariableInitializer, *equals);
+  if (context.PositionIs(Lex::TokenKind::Equal)) {
+    context.PushState(State::VarInitializer);
+    context.ConsumeChecked(Lex::TokenKind::Equal);
     context.PushState(State::Expr);
   }
 }
 
+auto HandleVarInitializer(Context& context) -> void {
+  auto state = context.PopState();
+  context.AddNode(NodeKind::VariableInitializer, state.token,
+                  state.subtree_start, state.has_error);
+}
+
 auto HandleVarFinishAsDecl(Context& context) -> void {
   auto state = context.PopState();
 

+ 2 - 3
toolchain/parse/node_kind.def

@@ -323,9 +323,8 @@ CARBON_PARSE_NODE_KIND_BRACKET(LetDecl, LetIntroducer, CARBON_IF_VALID(Semi))
 //   _repeated_ _external_: modifier
 //   _optional_ ReturnedModifier
 //   _external_: BindingPattern or TuplePattern
-//     VariableInitializer
 //     _external_: expression
-//   _optional_
+//   _optional_ VariableInitializer
 // VariableDecl
 //
 // Access and declaration modifier keywords only appear for `var` declarations,
@@ -334,7 +333,7 @@ CARBON_PARSE_NODE_KIND_BRACKET(LetDecl, LetIntroducer, CARBON_IF_VALID(Semi))
 // be present, or neither will.
 CARBON_PARSE_NODE_KIND_CHILD_COUNT(VariableIntroducer, 0, CARBON_IF_VALID(Var))
 CARBON_PARSE_NODE_KIND_CHILD_COUNT(ReturnedModifier, 0, Returned)
-CARBON_PARSE_NODE_KIND_CHILD_COUNT(VariableInitializer, 0, Equal)
+CARBON_PARSE_NODE_KIND_CHILD_COUNT(VariableInitializer, 1, Equal)
 CARBON_PARSE_NODE_KIND_BRACKET(VariableDecl, VariableIntroducer,
                                CARBON_IF_VALID(Semi))
 

+ 16 - 22
toolchain/parse/state.def

@@ -814,7 +814,7 @@ CARBON_PARSE_STATE(ParenExprFinish)
 //
 //  ( ... )
 // ^
-//   1. ParamListAsRegular
+//   1. PatternListAsTuple
 //
 //  ...
 // ^
@@ -1154,27 +1154,20 @@ CARBON_PARSE_STATE(ImplBeforeAs)
 
 // Handles the start of a `var` or `returned var`.
 //
-// var ...             (variant is not Returned)
+// var ...             (variant is Decl)
 //    ^
-//   1. BindingPattern
+//   1. Pattern
 //   2. VarAfterPattern
-//   3. VarFinishAs(Decl|For)
+//   3. VarFinishAsDecl
 //
-// var (...)
+// var ...             (variant is For)
 //    ^
-//   1. ParamListAsRegular
-//   2. VarAfterPattern
-//   3. VarFinishAs(Decl|For)
-//
-// returned var ...    (variant is Returned)
-// ^~~~~~~~~~~~
-//   1. BindingPattern
-//   2. VarAfterPattern
-//   3. VarFinishAsDecl
+//   1. Pattern
+//   2. VarFinishAsFor
 //
 // returned var ...    (variant is Returned)
 // ^~~~~~~~~~~~
-//   1. ParamListAsRegular
+//   1. Pattern
 //   2. VarAfterPattern
 //   3. VarFinishAsDecl
 //
@@ -1191,12 +1184,19 @@ CARBON_PARSE_STATE_VARIANTS3(Var, Decl, Returned, For)
 // var ... ??? = ...
 //         ^~~~~
 //   1. Expr
+//   2. VarInitializer
 //
 // var ... ...
 //        ^
 //   (state done)
 CARBON_PARSE_STATE(VarAfterPattern)
 
+// var ... = ... ;
+//              ^
+//
+//   (state done)
+CARBON_PARSE_STATE(VarInitializer)
+
 // Handles `var` parsing at the end.
 //
 // var ... ;        (variant is Semicolon)
@@ -1214,15 +1214,9 @@ CARBON_PARSE_STATE_VARIANTS2(VarFinish, Decl, For)
 
 // Handles the start of a `let`.
 //
-// let (...)
-// ^~~
-//   1. ParamListAsRegular
-//   2. LetAfterPattern
-//   3. LetFinish
-//
 // let ...
 //    ^
-//   1. BindingPattern
+//   1. Pattern
 //   2. LetAfterPattern
 //   3. LetFinish
 CARBON_PARSE_STATE(Let)

+ 6 - 6
toolchain/parse/testdata/basics/builtin_types.carbon

@@ -15,22 +15,22 @@ var test_str: String = "Test";
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'test_i32'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:       {kind: 'IntLiteral', text: '0'},
+// CHECK:STDOUT:         {kind: 'IntLiteral', text: '0'},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 7},
 // CHECK:STDOUT:       {kind: 'VariableIntroducer', text: 'var'},
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'test_f64'},
 // CHECK:STDOUT:         {kind: 'FloatTypeLiteral', text: 'f64'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:       {kind: 'RealLiteral', text: '0.1'},
+// CHECK:STDOUT:         {kind: 'RealLiteral', text: '0.1'},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 7},
 // CHECK:STDOUT:       {kind: 'VariableIntroducer', text: 'var'},
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'test_str'},
 // CHECK:STDOUT:         {kind: 'StringTypeLiteral', text: 'String'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:       {kind: 'StringLiteral', text: '"Test"'},
+// CHECK:STDOUT:         {kind: 'StringLiteral', text: '"Test"'},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 7},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 4 - 4
toolchain/parse/testdata/basics/fail_paren_match_regression.carbon

@@ -22,10 +22,10 @@ var = (foo {})
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: '=', has_error: yes},
 // CHECK:STDOUT:         {kind: 'InvalidParse', text: '=', has_error: yes},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: '=', has_error: yes, subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'ExprOpenParen', text: '('},
-// CHECK:STDOUT:         {kind: 'IdentifierNameExpr', text: 'foo'},
-// CHECK:STDOUT:       {kind: 'ParenExpr', text: ')', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:           {kind: 'ExprOpenParen', text: '('},
+// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'foo'},
+// CHECK:STDOUT:         {kind: 'ParenExpr', text: ')', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 4},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ')', has_error: yes, subtree_size: 9},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 30 - 30
toolchain/parse/testdata/basics/numeric_literals.carbon

@@ -41,19 +41,19 @@ fn F() {
 // CHECK:STDOUT:             {kind: 'IntLiteral', text: '5'},
 // CHECK:STDOUT:           {kind: 'ArrayExpr', text: ']', subtree_size: 5},
 // CHECK:STDOUT:         {kind: 'BindingPattern', text: ':', subtree_size: 7},
-// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:           {kind: 'ExprOpenParen', text: '('},
-// CHECK:STDOUT:           {kind: 'IntLiteral', text: '8'},
-// CHECK:STDOUT:           {kind: 'TupleLiteralComma', text: ','},
-// CHECK:STDOUT:           {kind: 'IntLiteral', text: '9'},
-// CHECK:STDOUT:           {kind: 'TupleLiteralComma', text: ','},
-// CHECK:STDOUT:           {kind: 'IntLiteral', text: '0x8'},
-// CHECK:STDOUT:           {kind: 'TupleLiteralComma', text: ','},
-// CHECK:STDOUT:           {kind: 'IntLiteral', text: '0b1000'},
-// CHECK:STDOUT:           {kind: 'TupleLiteralComma', text: ','},
-// CHECK:STDOUT:           {kind: 'IntLiteral', text: '39999999999999999993'},
-// CHECK:STDOUT:           {kind: 'TupleLiteralComma', text: ','},
-// CHECK:STDOUT:         {kind: 'TupleLiteral', text: ')', subtree_size: 12},
+// CHECK:STDOUT:             {kind: 'ExprOpenParen', text: '('},
+// CHECK:STDOUT:             {kind: 'IntLiteral', text: '8'},
+// CHECK:STDOUT:             {kind: 'TupleLiteralComma', text: ','},
+// CHECK:STDOUT:             {kind: 'IntLiteral', text: '9'},
+// CHECK:STDOUT:             {kind: 'TupleLiteralComma', text: ','},
+// CHECK:STDOUT:             {kind: 'IntLiteral', text: '0x8'},
+// CHECK:STDOUT:             {kind: 'TupleLiteralComma', text: ','},
+// CHECK:STDOUT:             {kind: 'IntLiteral', text: '0b1000'},
+// CHECK:STDOUT:             {kind: 'TupleLiteralComma', text: ','},
+// CHECK:STDOUT:             {kind: 'IntLiteral', text: '39999999999999999993'},
+// CHECK:STDOUT:             {kind: 'TupleLiteralComma', text: ','},
+// CHECK:STDOUT:           {kind: 'TupleLiteral', text: ')', subtree_size: 12},
+// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '=', subtree_size: 13},
 // CHECK:STDOUT:       {kind: 'VariableDecl', text: ';', subtree_size: 22},
 // CHECK:STDOUT:         {kind: 'VariableIntroducer', text: 'var'},
 // CHECK:STDOUT:           {kind: 'IdentifierName', text: 'floats'},
@@ -63,23 +63,23 @@ fn F() {
 // CHECK:STDOUT:             {kind: 'IntLiteral', text: '7'},
 // CHECK:STDOUT:           {kind: 'ArrayExpr', text: ']', subtree_size: 5},
 // CHECK:STDOUT:         {kind: 'BindingPattern', text: ':', subtree_size: 7},
-// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:           {kind: 'ExprOpenParen', text: '('},
-// CHECK:STDOUT:           {kind: 'RealLiteral', text: '0.9'},
-// CHECK:STDOUT:           {kind: 'TupleLiteralComma', text: ','},
-// CHECK:STDOUT:           {kind: 'RealLiteral', text: '8.0'},
-// CHECK:STDOUT:           {kind: 'TupleLiteralComma', text: ','},
-// CHECK:STDOUT:           {kind: 'RealLiteral', text: '80.0'},
-// CHECK:STDOUT:           {kind: 'TupleLiteralComma', text: ','},
-// CHECK:STDOUT:           {kind: 'RealLiteral', text: '1.0e7'},
-// CHECK:STDOUT:           {kind: 'TupleLiteralComma', text: ','},
-// CHECK:STDOUT:           {kind: 'RealLiteral', text: '1.0e8'},
-// CHECK:STDOUT:           {kind: 'TupleLiteralComma', text: ','},
-// CHECK:STDOUT:           {kind: 'RealLiteral', text: '1.0e-8'},
-// CHECK:STDOUT:           {kind: 'TupleLiteralComma', text: ','},
-// CHECK:STDOUT:           {kind: 'RealLiteral', text: '39999999999999999993.0e39999999999999999993'},
-// CHECK:STDOUT:           {kind: 'TupleLiteralComma', text: ','},
-// CHECK:STDOUT:         {kind: 'TupleLiteral', text: ')', subtree_size: 16},
+// CHECK:STDOUT:             {kind: 'ExprOpenParen', text: '('},
+// CHECK:STDOUT:             {kind: 'RealLiteral', text: '0.9'},
+// CHECK:STDOUT:             {kind: 'TupleLiteralComma', text: ','},
+// CHECK:STDOUT:             {kind: 'RealLiteral', text: '8.0'},
+// CHECK:STDOUT:             {kind: 'TupleLiteralComma', text: ','},
+// CHECK:STDOUT:             {kind: 'RealLiteral', text: '80.0'},
+// CHECK:STDOUT:             {kind: 'TupleLiteralComma', text: ','},
+// CHECK:STDOUT:             {kind: 'RealLiteral', text: '1.0e7'},
+// CHECK:STDOUT:             {kind: 'TupleLiteralComma', text: ','},
+// CHECK:STDOUT:             {kind: 'RealLiteral', text: '1.0e8'},
+// CHECK:STDOUT:             {kind: 'TupleLiteralComma', text: ','},
+// CHECK:STDOUT:             {kind: 'RealLiteral', text: '1.0e-8'},
+// CHECK:STDOUT:             {kind: 'TupleLiteralComma', text: ','},
+// CHECK:STDOUT:             {kind: 'RealLiteral', text: '39999999999999999993.0e39999999999999999993'},
+// CHECK:STDOUT:             {kind: 'TupleLiteralComma', text: ','},
+// CHECK:STDOUT:           {kind: 'TupleLiteral', text: ')', subtree_size: 16},
+// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '=', subtree_size: 17},
 // CHECK:STDOUT:       {kind: 'VariableDecl', text: ';', subtree_size: 26},
 // CHECK:STDOUT:     {kind: 'FunctionDefinition', text: '}', subtree_size: 54},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},

+ 5 - 5
toolchain/parse/testdata/if_expr/fail_condition_missing.carbon

@@ -23,12 +23,12 @@ fn F() {
 // CHECK:STDOUT:           {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:           {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:         {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '='},
+// CHECK:STDOUT:               {kind: 'InvalidParse', text: ';', has_error: yes},
+// CHECK:STDOUT:             {kind: 'IfExprIf', text: 'if', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:             {kind: 'InvalidParse', text: ';', has_error: yes},
-// CHECK:STDOUT:           {kind: 'IfExprIf', text: 'if', has_error: yes, subtree_size: 2},
-// CHECK:STDOUT:           {kind: 'InvalidParse', text: ';', has_error: yes},
-// CHECK:STDOUT:           {kind: 'InvalidParse', text: ';', has_error: yes},
-// CHECK:STDOUT:         {kind: 'IfExprElse', text: 'if', has_error: yes, subtree_size: 5},
+// CHECK:STDOUT:             {kind: 'InvalidParse', text: ';', has_error: yes},
+// CHECK:STDOUT:           {kind: 'IfExprElse', text: 'if', has_error: yes, subtree_size: 5},
+// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '=', subtree_size: 6},
 // CHECK:STDOUT:       {kind: 'VariableDecl', text: ';', subtree_size: 11},
 // CHECK:STDOUT:     {kind: 'FunctionDefinition', text: '}', subtree_size: 17},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},

+ 7 - 7
toolchain/parse/testdata/if_expr/fail_else_expr_missing.carbon

@@ -23,13 +23,13 @@ fn F() {
 // CHECK:STDOUT:           {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:           {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:         {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:             {kind: 'BoolLiteralTrue', text: 'true'},
-// CHECK:STDOUT:           {kind: 'IfExprIf', text: 'if', subtree_size: 2},
-// CHECK:STDOUT:             {kind: 'IntLiteral', text: '1'},
-// CHECK:STDOUT:           {kind: 'IfExprThen', text: 'then', subtree_size: 2},
-// CHECK:STDOUT:           {kind: 'InvalidParse', text: ';', has_error: yes},
-// CHECK:STDOUT:         {kind: 'IfExprElse', text: 'else', has_error: yes, subtree_size: 6},
+// CHECK:STDOUT:               {kind: 'BoolLiteralTrue', text: 'true'},
+// CHECK:STDOUT:             {kind: 'IfExprIf', text: 'if', subtree_size: 2},
+// CHECK:STDOUT:               {kind: 'IntLiteral', text: '1'},
+// CHECK:STDOUT:             {kind: 'IfExprThen', text: 'then', subtree_size: 2},
+// CHECK:STDOUT:             {kind: 'InvalidParse', text: ';', has_error: yes},
+// CHECK:STDOUT:           {kind: 'IfExprElse', text: 'else', has_error: yes, subtree_size: 6},
+// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '=', subtree_size: 7},
 // CHECK:STDOUT:       {kind: 'VariableDecl', text: ';', subtree_size: 12},
 // CHECK:STDOUT:     {kind: 'FunctionDefinition', text: '}', subtree_size: 18},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},

+ 7 - 7
toolchain/parse/testdata/if_expr/fail_else_missing.carbon

@@ -23,13 +23,13 @@ fn F() {
 // CHECK:STDOUT:           {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:           {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:         {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:             {kind: 'BoolLiteralTrue', text: 'true'},
-// CHECK:STDOUT:           {kind: 'IfExprIf', text: 'if', subtree_size: 2},
-// CHECK:STDOUT:             {kind: 'IntLiteral', text: '1'},
-// CHECK:STDOUT:           {kind: 'IfExprThen', text: 'then', subtree_size: 2},
-// CHECK:STDOUT:           {kind: 'InvalidParse', text: ';', has_error: yes},
-// CHECK:STDOUT:         {kind: 'IfExprElse', text: 'if', has_error: yes, subtree_size: 6},
+// CHECK:STDOUT:               {kind: 'BoolLiteralTrue', text: 'true'},
+// CHECK:STDOUT:             {kind: 'IfExprIf', text: 'if', subtree_size: 2},
+// CHECK:STDOUT:               {kind: 'IntLiteral', text: '1'},
+// CHECK:STDOUT:             {kind: 'IfExprThen', text: 'then', subtree_size: 2},
+// CHECK:STDOUT:             {kind: 'InvalidParse', text: ';', has_error: yes},
+// CHECK:STDOUT:           {kind: 'IfExprElse', text: 'if', has_error: yes, subtree_size: 6},
+// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '=', subtree_size: 7},
 // CHECK:STDOUT:       {kind: 'VariableDecl', text: ';', subtree_size: 12},
 // CHECK:STDOUT:     {kind: 'FunctionDefinition', text: '}', subtree_size: 18},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},

+ 6 - 6
toolchain/parse/testdata/if_expr/fail_then_expr_missing.carbon

@@ -23,13 +23,13 @@ fn F() {
 // CHECK:STDOUT:           {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:           {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:         {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:             {kind: 'BoolLiteralTrue', text: 'true'},
-// CHECK:STDOUT:           {kind: 'IfExprIf', text: 'if', subtree_size: 2},
+// CHECK:STDOUT:               {kind: 'BoolLiteralTrue', text: 'true'},
+// CHECK:STDOUT:             {kind: 'IfExprIf', text: 'if', subtree_size: 2},
+// CHECK:STDOUT:               {kind: 'InvalidParse', text: ';', has_error: yes},
+// CHECK:STDOUT:             {kind: 'IfExprThen', text: 'then', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:             {kind: 'InvalidParse', text: ';', has_error: yes},
-// CHECK:STDOUT:           {kind: 'IfExprThen', text: 'then', has_error: yes, subtree_size: 2},
-// CHECK:STDOUT:           {kind: 'InvalidParse', text: ';', has_error: yes},
-// CHECK:STDOUT:         {kind: 'IfExprElse', text: 'if', has_error: yes, subtree_size: 6},
+// CHECK:STDOUT:           {kind: 'IfExprElse', text: 'if', has_error: yes, subtree_size: 6},
+// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '=', subtree_size: 7},
 // CHECK:STDOUT:       {kind: 'VariableDecl', text: ';', subtree_size: 12},
 // CHECK:STDOUT:     {kind: 'FunctionDefinition', text: '}', subtree_size: 18},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},

+ 6 - 6
toolchain/parse/testdata/if_expr/fail_then_missing.carbon

@@ -23,12 +23,12 @@ fn F() {
 // CHECK:STDOUT:           {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:           {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:         {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:             {kind: 'BoolLiteralTrue', text: 'true'},
-// CHECK:STDOUT:           {kind: 'IfExprIf', text: 'if', subtree_size: 2},
-// CHECK:STDOUT:           {kind: 'InvalidParse', text: ';', has_error: yes},
-// CHECK:STDOUT:           {kind: 'InvalidParse', text: ';', has_error: yes},
-// CHECK:STDOUT:         {kind: 'IfExprElse', text: 'if', has_error: yes, subtree_size: 5},
+// CHECK:STDOUT:               {kind: 'BoolLiteralTrue', text: 'true'},
+// CHECK:STDOUT:             {kind: 'IfExprIf', text: 'if', subtree_size: 2},
+// CHECK:STDOUT:             {kind: 'InvalidParse', text: ';', has_error: yes},
+// CHECK:STDOUT:             {kind: 'InvalidParse', text: ';', has_error: yes},
+// CHECK:STDOUT:           {kind: 'IfExprElse', text: 'if', has_error: yes, subtree_size: 5},
+// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '=', subtree_size: 6},
 // CHECK:STDOUT:       {kind: 'VariableDecl', text: ';', subtree_size: 11},
 // CHECK:STDOUT:     {kind: 'FunctionDefinition', text: '}', subtree_size: 17},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},

+ 5 - 5
toolchain/parse/testdata/index/assign_to_var.carbon

@@ -13,11 +13,11 @@ var v: i32 = t[0];
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'v'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 't'},
-// CHECK:STDOUT:         {kind: 'IndexExprStart', text: '[', subtree_size: 2},
-// CHECK:STDOUT:         {kind: 'IntLiteral', text: '0'},
-// CHECK:STDOUT:       {kind: 'IndexExpr', text: ']', subtree_size: 4},
+// CHECK:STDOUT:             {kind: 'IdentifierNameExpr', text: 't'},
+// CHECK:STDOUT:           {kind: 'IndexExprStart', text: '[', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'IntLiteral', text: '0'},
+// CHECK:STDOUT:         {kind: 'IndexExpr', text: ']', subtree_size: 4},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 5},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 10},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 5 - 5
toolchain/parse/testdata/index/fail_empty_expr.carbon

@@ -16,11 +16,11 @@ var v: i32 = t[];
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'v'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 't'},
-// CHECK:STDOUT:         {kind: 'IndexExprStart', text: '[', subtree_size: 2},
-// CHECK:STDOUT:         {kind: 'InvalidParse', text: ']', has_error: yes},
-// CHECK:STDOUT:       {kind: 'IndexExpr', text: ']', has_error: yes, subtree_size: 4},
+// CHECK:STDOUT:             {kind: 'IdentifierNameExpr', text: 't'},
+// CHECK:STDOUT:           {kind: 'IndexExprStart', text: '[', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'InvalidParse', text: ']', has_error: yes},
+// CHECK:STDOUT:         {kind: 'IndexExpr', text: ']', has_error: yes, subtree_size: 4},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 5},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 10},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 5 - 5
toolchain/parse/testdata/index/fail_malformed_expr.carbon

@@ -16,11 +16,11 @@ var v: i32 = t[0,];
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'v'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 't'},
-// CHECK:STDOUT:         {kind: 'IndexExprStart', text: '[', subtree_size: 2},
-// CHECK:STDOUT:         {kind: 'IntLiteral', text: '0'},
-// CHECK:STDOUT:       {kind: 'IndexExpr', text: ']', has_error: yes, subtree_size: 4},
+// CHECK:STDOUT:             {kind: 'IdentifierNameExpr', text: 't'},
+// CHECK:STDOUT:           {kind: 'IndexExprStart', text: '[', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'IntLiteral', text: '0'},
+// CHECK:STDOUT:         {kind: 'IndexExpr', text: ']', has_error: yes, subtree_size: 4},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 5},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 10},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 4 - 4
toolchain/parse/testdata/operators/assign.carbon

@@ -34,15 +34,15 @@ fn F() {
 // CHECK:STDOUT:           {kind: 'IdentifierName', text: 'a'},
 // CHECK:STDOUT:           {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:         {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'IntLiteral', text: '0'},
+// CHECK:STDOUT:           {kind: 'IntLiteral', text: '0'},
+// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '=', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'VariableDecl', text: ';', subtree_size: 7},
 // CHECK:STDOUT:         {kind: 'VariableIntroducer', text: 'var'},
 // CHECK:STDOUT:           {kind: 'IdentifierName', text: 'b'},
 // CHECK:STDOUT:           {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:         {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'IntLiteral', text: '1'},
+// CHECK:STDOUT:           {kind: 'IntLiteral', text: '1'},
+// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '=', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'VariableDecl', text: ';', subtree_size: 7},
 // CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'a'},
 // CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'b'},

+ 3 - 3
toolchain/parse/testdata/operators/fail_infix_uneven_space_after.carbon

@@ -18,9 +18,9 @@ var n: i8 = n* n;
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i8'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'IdentifierNameExpr', text: 'n'},
-// CHECK:STDOUT:       {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'n'},
+// CHECK:STDOUT:         {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', has_error: yes, subtree_size: 8},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 12 - 12
toolchain/parse/testdata/operators/fail_invalid_infix.carbon

@@ -27,28 +27,28 @@ var c: i32 = == ;
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'a'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'IdentifierNameExpr', text: 'n'},
-// CHECK:STDOUT:         {kind: 'InvalidParse', text: ';', has_error: yes},
-// CHECK:STDOUT:       {kind: 'InfixOperatorEqualEqual', text: '==', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'n'},
+// CHECK:STDOUT:           {kind: 'InvalidParse', text: ';', has_error: yes},
+// CHECK:STDOUT:         {kind: 'InfixOperatorEqualEqual', text: '==', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 4},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 9},
 // CHECK:STDOUT:       {kind: 'VariableIntroducer', text: 'var'},
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'b'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'InvalidParse', text: '==', has_error: yes},
-// CHECK:STDOUT:         {kind: 'IdentifierNameExpr', text: 'n'},
-// CHECK:STDOUT:       {kind: 'InfixOperatorEqualEqual', text: '==', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:           {kind: 'InvalidParse', text: '==', has_error: yes},
+// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'n'},
+// CHECK:STDOUT:         {kind: 'InfixOperatorEqualEqual', text: '==', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 4},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 9},
 // CHECK:STDOUT:       {kind: 'VariableIntroducer', text: 'var'},
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'c'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'InvalidParse', text: '==', has_error: yes},
-// CHECK:STDOUT:         {kind: 'InvalidParse', text: ';', has_error: yes},
-// CHECK:STDOUT:       {kind: 'InfixOperatorEqualEqual', text: '==', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:           {kind: 'InvalidParse', text: '==', has_error: yes},
+// CHECK:STDOUT:           {kind: 'InvalidParse', text: ';', has_error: yes},
+// CHECK:STDOUT:         {kind: 'InfixOperatorEqualEqual', text: '==', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 4},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 9},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 2 - 2
toolchain/parse/testdata/operators/fail_postincrement.carbon

@@ -29,8 +29,8 @@ fn F() {
 // CHECK:STDOUT:           {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:           {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:         {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'IntLiteral', text: '0'},
+// CHECK:STDOUT:           {kind: 'IntLiteral', text: '0'},
+// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '=', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'VariableDecl', text: ';', subtree_size: 7},
 // CHECK:STDOUT:         {kind: 'IdentifierNameExpr', text: 'n'},
 // CHECK:STDOUT:       {kind: 'ExprStatement', text: ';', has_error: yes, subtree_size: 2},

+ 4 - 4
toolchain/parse/testdata/operators/fail_precedence_star_minus.carbon

@@ -16,11 +16,11 @@ var n: i8 = n* -n;
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i8'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
+// CHECK:STDOUT:             {kind: 'IdentifierNameExpr', text: 'n'},
+// CHECK:STDOUT:           {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
 // CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'n'},
-// CHECK:STDOUT:         {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
-// CHECK:STDOUT:         {kind: 'IdentifierNameExpr', text: 'n'},
-// CHECK:STDOUT:       {kind: 'InfixOperatorMinus', text: '-', has_error: yes, subtree_size: 4},
+// CHECK:STDOUT:         {kind: 'InfixOperatorMinus', text: '-', has_error: yes, subtree_size: 4},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 5},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 10},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 5 - 5
toolchain/parse/testdata/operators/fail_precedence_star_star.carbon

@@ -16,11 +16,11 @@ var n: i8 = n* *p;
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i8'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'n'},
-// CHECK:STDOUT:         {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
-// CHECK:STDOUT:         {kind: 'IdentifierNameExpr', text: 'p'},
-// CHECK:STDOUT:       {kind: 'InfixOperatorStar', text: '*', has_error: yes, subtree_size: 4},
+// CHECK:STDOUT:             {kind: 'IdentifierNameExpr', text: 'n'},
+// CHECK:STDOUT:           {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'p'},
+// CHECK:STDOUT:         {kind: 'InfixOperatorStar', text: '*', has_error: yes, subtree_size: 4},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 5},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 10},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 4 - 4
toolchain/parse/testdata/operators/fail_star_star_no_space.carbon

@@ -20,10 +20,10 @@ var n: i8 = n**p;
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i8'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'n'},
-// CHECK:STDOUT:         {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
-// CHECK:STDOUT:       {kind: 'PostfixOperatorStar', text: '*', subtree_size: 3},
+// CHECK:STDOUT:             {kind: 'IdentifierNameExpr', text: 'n'},
+// CHECK:STDOUT:           {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
+// CHECK:STDOUT:         {kind: 'PostfixOperatorStar', text: '*', subtree_size: 3},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 4},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', has_error: yes, subtree_size: 9},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 5 - 5
toolchain/parse/testdata/operators/fixity_in_var.carbon

@@ -22,16 +22,16 @@ fn F() {
 // CHECK:STDOUT:             {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:           {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
 // CHECK:STDOUT:         {kind: 'BindingPattern', text: ':', subtree_size: 4},
-// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'IdentifierNameExpr', text: 'p'},
+// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'p'},
+// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '=', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'VariableDecl', text: ';', subtree_size: 8},
 // CHECK:STDOUT:         {kind: 'VariableIntroducer', text: 'var'},
 // CHECK:STDOUT:           {kind: 'IdentifierName', text: 't'},
 // CHECK:STDOUT:           {kind: 'TypeTypeLiteral', text: 'type'},
 // CHECK:STDOUT:         {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:           {kind: 'IntTypeLiteral', text: 'i32'},
-// CHECK:STDOUT:         {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
+// CHECK:STDOUT:             {kind: 'IntTypeLiteral', text: 'i32'},
+// CHECK:STDOUT:           {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
+// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:       {kind: 'VariableDecl', text: ';', subtree_size: 8},
 // CHECK:STDOUT:     {kind: 'FunctionDefinition', text: '}', subtree_size: 22},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},

+ 4 - 4
toolchain/parse/testdata/operators/infix.carbon

@@ -13,10 +13,10 @@ var n: i8 = n * n;
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i8'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'IdentifierNameExpr', text: 'n'},
-// CHECK:STDOUT:         {kind: 'IdentifierNameExpr', text: 'n'},
-// CHECK:STDOUT:       {kind: 'InfixOperatorStar', text: '*', subtree_size: 3},
+// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'n'},
+// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'n'},
+// CHECK:STDOUT:         {kind: 'InfixOperatorStar', text: '*', subtree_size: 3},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 4},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 9},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 4 - 4
toolchain/parse/testdata/operators/infix_no_space.carbon

@@ -13,10 +13,10 @@ var n: i8 = n*n;
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i8'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'IdentifierNameExpr', text: 'n'},
-// CHECK:STDOUT:         {kind: 'IdentifierNameExpr', text: 'n'},
-// CHECK:STDOUT:       {kind: 'InfixOperatorStar', text: '*', subtree_size: 3},
+// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'n'},
+// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'n'},
+// CHECK:STDOUT:         {kind: 'InfixOperatorStar', text: '*', subtree_size: 3},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 4},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 9},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 6 - 6
toolchain/parse/testdata/operators/infix_with_paren_after.carbon

@@ -13,12 +13,12 @@ var n: i8 = 3*(n);
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i8'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'IntLiteral', text: '3'},
-// CHECK:STDOUT:           {kind: 'ExprOpenParen', text: '('},
-// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'n'},
-// CHECK:STDOUT:         {kind: 'ParenExpr', text: ')', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'InfixOperatorStar', text: '*', subtree_size: 5},
+// CHECK:STDOUT:           {kind: 'IntLiteral', text: '3'},
+// CHECK:STDOUT:             {kind: 'ExprOpenParen', text: '('},
+// CHECK:STDOUT:             {kind: 'IdentifierNameExpr', text: 'n'},
+// CHECK:STDOUT:           {kind: 'ParenExpr', text: ')', subtree_size: 3},
+// CHECK:STDOUT:         {kind: 'InfixOperatorStar', text: '*', subtree_size: 5},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 6},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 11},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 6 - 6
toolchain/parse/testdata/operators/infix_with_paren_before.carbon

@@ -13,12 +13,12 @@ var n: i8 = (n)*3;
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i8'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:           {kind: 'ExprOpenParen', text: '('},
-// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'n'},
-// CHECK:STDOUT:         {kind: 'ParenExpr', text: ')', subtree_size: 3},
-// CHECK:STDOUT:         {kind: 'IntLiteral', text: '3'},
-// CHECK:STDOUT:       {kind: 'InfixOperatorStar', text: '*', subtree_size: 5},
+// CHECK:STDOUT:             {kind: 'ExprOpenParen', text: '('},
+// CHECK:STDOUT:             {kind: 'IdentifierNameExpr', text: 'n'},
+// CHECK:STDOUT:           {kind: 'ParenExpr', text: ')', subtree_size: 3},
+// CHECK:STDOUT:           {kind: 'IntLiteral', text: '3'},
+// CHECK:STDOUT:         {kind: 'InfixOperatorStar', text: '*', subtree_size: 5},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 6},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 11},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/operators/postfix.carbon

@@ -13,9 +13,9 @@ var v: type = i8*;
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'v'},
 // CHECK:STDOUT:         {kind: 'TypeTypeLiteral', text: 'type'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i8'},
-// CHECK:STDOUT:       {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'IntTypeLiteral', text: 'i8'},
+// CHECK:STDOUT:         {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 8},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/operators/postfix_space_after_op.carbon

@@ -13,9 +13,9 @@ var v: type = i8* ;
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'v'},
 // CHECK:STDOUT:         {kind: 'TypeTypeLiteral', text: 'type'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i8'},
-// CHECK:STDOUT:       {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'IntTypeLiteral', text: 'i8'},
+// CHECK:STDOUT:         {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 8},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 6 - 6
toolchain/parse/testdata/operators/prefix.carbon

@@ -14,17 +14,17 @@ var b: bool = not true;
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i8'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'IdentifierNameExpr', text: 'n'},
-// CHECK:STDOUT:       {kind: 'PrefixOperatorMinus', text: '-', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'n'},
+// CHECK:STDOUT:         {kind: 'PrefixOperatorMinus', text: '-', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 8},
 // CHECK:STDOUT:       {kind: 'VariableIntroducer', text: 'var'},
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'b'},
 // CHECK:STDOUT:         {kind: 'BoolTypeLiteral', text: 'bool'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'BoolLiteralTrue', text: 'true'},
-// CHECK:STDOUT:       {kind: 'PrefixOperatorNot', text: 'not', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'BoolLiteralTrue', text: 'true'},
+// CHECK:STDOUT:         {kind: 'PrefixOperatorNot', text: 'not', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 8},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/operators/prefix_no_space.carbon

@@ -14,9 +14,9 @@ var n: i8 =-n;
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i8'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'IdentifierNameExpr', text: 'n'},
-// CHECK:STDOUT:       {kind: 'PrefixOperatorMinus', text: '-', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'n'},
+// CHECK:STDOUT:         {kind: 'PrefixOperatorMinus', text: '-', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 8},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 4 - 4
toolchain/parse/testdata/operators/recover_infix_uneven_space_before.carbon

@@ -16,10 +16,10 @@ var n: i8 = n *n;
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i8'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'IdentifierNameExpr', text: 'n'},
-// CHECK:STDOUT:         {kind: 'IdentifierNameExpr', text: 'n'},
-// CHECK:STDOUT:       {kind: 'InfixOperatorStar', text: '*', subtree_size: 3},
+// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'n'},
+// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'n'},
+// CHECK:STDOUT:         {kind: 'InfixOperatorStar', text: '*', subtree_size: 3},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 4},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 9},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/operators/recover_postfix_space.carbon

@@ -16,9 +16,9 @@ var v: type = i8 *;
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'v'},
 // CHECK:STDOUT:         {kind: 'TypeTypeLiteral', text: 'type'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i8'},
-// CHECK:STDOUT:       {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'IntTypeLiteral', text: 'i8'},
+// CHECK:STDOUT:         {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 8},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 8 - 8
toolchain/parse/testdata/operators/recover_postfix_space_before_comma.carbon

@@ -16,14 +16,14 @@ var n: i8 = F(i8 *, 0);
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i8'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'F'},
-// CHECK:STDOUT:         {kind: 'CallExprStart', text: '(', subtree_size: 2},
-// CHECK:STDOUT:           {kind: 'IntTypeLiteral', text: 'i8'},
-// CHECK:STDOUT:         {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
-// CHECK:STDOUT:         {kind: 'CallExprComma', text: ','},
-// CHECK:STDOUT:         {kind: 'IntLiteral', text: '0'},
-// CHECK:STDOUT:       {kind: 'CallExpr', text: ')', subtree_size: 7},
+// CHECK:STDOUT:             {kind: 'IdentifierNameExpr', text: 'F'},
+// CHECK:STDOUT:           {kind: 'CallExprStart', text: '(', subtree_size: 2},
+// CHECK:STDOUT:             {kind: 'IntTypeLiteral', text: 'i8'},
+// CHECK:STDOUT:           {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'CallExprComma', text: ','},
+// CHECK:STDOUT:           {kind: 'IntLiteral', text: '0'},
+// CHECK:STDOUT:         {kind: 'CallExpr', text: ')', subtree_size: 7},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 8},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 13},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 6 - 6
toolchain/parse/testdata/operators/recover_postfix_space_in_call.carbon

@@ -16,12 +16,12 @@ var n: i8 = F(i8 *);
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i8'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'F'},
-// CHECK:STDOUT:         {kind: 'CallExprStart', text: '(', subtree_size: 2},
-// CHECK:STDOUT:           {kind: 'IntTypeLiteral', text: 'i8'},
-// CHECK:STDOUT:         {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
-// CHECK:STDOUT:       {kind: 'CallExpr', text: ')', subtree_size: 5},
+// CHECK:STDOUT:             {kind: 'IdentifierNameExpr', text: 'F'},
+// CHECK:STDOUT:           {kind: 'CallExprStart', text: '(', subtree_size: 2},
+// CHECK:STDOUT:             {kind: 'IntTypeLiteral', text: 'i8'},
+// CHECK:STDOUT:           {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
+// CHECK:STDOUT:         {kind: 'CallExpr', text: ')', subtree_size: 5},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 6},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 11},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/operators/recover_postfix_space_surrounding.carbon

@@ -16,9 +16,9 @@ var v: type = i8 * ;
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'v'},
 // CHECK:STDOUT:         {kind: 'TypeTypeLiteral', text: 'type'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i8'},
-// CHECK:STDOUT:       {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'IntTypeLiteral', text: 'i8'},
+// CHECK:STDOUT:         {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 8},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/operators/recover_prefix_space.carbon

@@ -16,9 +16,9 @@ var n: i8 = - n;
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i8'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'IdentifierNameExpr', text: 'n'},
-// CHECK:STDOUT:       {kind: 'PrefixOperatorMinus', text: '-', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'n'},
+// CHECK:STDOUT:         {kind: 'PrefixOperatorMinus', text: '-', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 8},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/operators/recover_prefix_uneven_space_with_assign.carbon

@@ -16,9 +16,9 @@ var n: i8 =- n;
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i8'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'IdentifierNameExpr', text: 'n'},
-// CHECK:STDOUT:       {kind: 'PrefixOperatorMinus', text: '-', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'n'},
+// CHECK:STDOUT:         {kind: 'PrefixOperatorMinus', text: '-', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 8},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 4 - 4
toolchain/parse/testdata/package_expr/basic.carbon

@@ -15,10 +15,10 @@ var x: package.Foo = package.Bar;
 // CHECK:STDOUT:           {kind: 'IdentifierName', text: 'Foo'},
 // CHECK:STDOUT:         {kind: 'MemberAccessExpr', text: '.', subtree_size: 3},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 5},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'PackageExpr', text: 'package'},
-// CHECK:STDOUT:         {kind: 'IdentifierName', text: 'Bar'},
-// CHECK:STDOUT:       {kind: 'MemberAccessExpr', text: '.', subtree_size: 3},
+// CHECK:STDOUT:           {kind: 'PackageExpr', text: 'package'},
+// CHECK:STDOUT:           {kind: 'IdentifierName', text: 'Bar'},
+// CHECK:STDOUT:         {kind: 'MemberAccessExpr', text: '.', subtree_size: 3},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 4},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 11},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 8 - 8
toolchain/parse/testdata/pointer/pointer_type.carbon

@@ -33,15 +33,15 @@ var T: type = if true then i32* else f64*;
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'T'},
 // CHECK:STDOUT:         {kind: 'TypeTypeLiteral', text: 'type'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:           {kind: 'BoolLiteralTrue', text: 'true'},
-// CHECK:STDOUT:         {kind: 'IfExprIf', text: 'if', subtree_size: 2},
-// CHECK:STDOUT:             {kind: 'IntTypeLiteral', text: 'i32'},
+// CHECK:STDOUT:             {kind: 'BoolLiteralTrue', text: 'true'},
+// CHECK:STDOUT:           {kind: 'IfExprIf', text: 'if', subtree_size: 2},
+// CHECK:STDOUT:               {kind: 'IntTypeLiteral', text: 'i32'},
+// CHECK:STDOUT:             {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'IfExprThen', text: 'then', subtree_size: 3},
+// CHECK:STDOUT:             {kind: 'FloatTypeLiteral', text: 'f64'},
 // CHECK:STDOUT:           {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
-// CHECK:STDOUT:         {kind: 'IfExprThen', text: 'then', subtree_size: 3},
-// CHECK:STDOUT:           {kind: 'FloatTypeLiteral', text: 'f64'},
-// CHECK:STDOUT:         {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
-// CHECK:STDOUT:       {kind: 'IfExprElse', text: 'else', subtree_size: 8},
+// CHECK:STDOUT:         {kind: 'IfExprElse', text: 'else', subtree_size: 8},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 9},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 14},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 8 - 8
toolchain/parse/testdata/pointer/pointer_value.carbon

@@ -25,17 +25,17 @@ fn F() -> i32 {
 // CHECK:STDOUT:           {kind: 'IdentifierName', text: 'n'},
 // CHECK:STDOUT:           {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:         {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'IntLiteral', text: '0'},
+// CHECK:STDOUT:           {kind: 'IntLiteral', text: '0'},
+// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '=', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'VariableDecl', text: ';', subtree_size: 7},
 // CHECK:STDOUT:         {kind: 'VariableIntroducer', text: 'var'},
 // CHECK:STDOUT:           {kind: 'IdentifierName', text: 'p'},
 // CHECK:STDOUT:             {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:           {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
 // CHECK:STDOUT:         {kind: 'BindingPattern', text: ':', subtree_size: 4},
-// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'n'},
-// CHECK:STDOUT:         {kind: 'PrefixOperatorAmp', text: '&', subtree_size: 2},
+// CHECK:STDOUT:             {kind: 'IdentifierNameExpr', text: 'n'},
+// CHECK:STDOUT:           {kind: 'PrefixOperatorAmp', text: '&', subtree_size: 2},
+// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:       {kind: 'VariableDecl', text: ';', subtree_size: 9},
 // CHECK:STDOUT:         {kind: 'VariableIntroducer', text: 'var'},
 // CHECK:STDOUT:           {kind: 'IdentifierName', text: 'q'},
@@ -43,9 +43,9 @@ fn F() -> i32 {
 // CHECK:STDOUT:             {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2},
 // CHECK:STDOUT:           {kind: 'PostfixOperatorStar', text: '*', subtree_size: 3},
 // CHECK:STDOUT:         {kind: 'BindingPattern', text: ':', subtree_size: 5},
-// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:           {kind: 'IdentifierNameExpr', text: 'p'},
-// CHECK:STDOUT:         {kind: 'PrefixOperatorAmp', text: '&', subtree_size: 2},
+// CHECK:STDOUT:             {kind: 'IdentifierNameExpr', text: 'p'},
+// CHECK:STDOUT:           {kind: 'PrefixOperatorAmp', text: '&', subtree_size: 2},
+// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:       {kind: 'VariableDecl', text: ';', subtree_size: 10},
 // CHECK:STDOUT:         {kind: 'ReturnStatementStart', text: 'return'},
 // CHECK:STDOUT:             {kind: 'IdentifierNameExpr', text: 'q'},

+ 2 - 2
toolchain/parse/testdata/return/returned_var.carbon

@@ -24,8 +24,8 @@ fn F() -> String {
 // CHECK:STDOUT:           {kind: 'IdentifierName', text: 's'},
 // CHECK:STDOUT:           {kind: 'StringTypeLiteral', text: 'String'},
 // CHECK:STDOUT:         {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StringLiteral', text: '"hello"'},
+// CHECK:STDOUT:           {kind: 'StringLiteral', text: '"hello"'},
+// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '=', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'VariableDecl', text: ';', subtree_size: 8},
 // CHECK:STDOUT:         {kind: 'ReturnStatementStart', text: 'return'},
 // CHECK:STDOUT:         {kind: 'ReturnVarModifier', text: 'var'},

+ 3 - 3
toolchain/parse/testdata/struct/fail_comma_only.carbon

@@ -19,9 +19,9 @@ var x: {,} = {};
 // CHECK:STDOUT:           {kind: 'StructComma', text: ','},
 // CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', has_error: yes, subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 6},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 11},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/struct/fail_comma_repeat_in_type.carbon

@@ -24,9 +24,9 @@ var x: {.a: i32,,} = {};
 // CHECK:STDOUT:           {kind: 'StructComma', text: ','},
 // CHECK:STDOUT:         {kind: 'StructTypeLiteral', text: '}', has_error: yes, subtree_size: 9},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 11},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 16},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/struct/fail_comma_repeat_in_value.carbon

@@ -24,9 +24,9 @@ var x: {.a = 0,,} = {};
 // CHECK:STDOUT:           {kind: 'StructComma', text: ','},
 // CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', has_error: yes, subtree_size: 9},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 11},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 16},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/struct/fail_dot_only.carbon

@@ -20,9 +20,9 @@ var x: {.} = {};
 // CHECK:STDOUT:           {kind: 'InvalidParse', text: '.', has_error: yes},
 // CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', has_error: yes, subtree_size: 5},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 7},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 12},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/struct/fail_dot_string_colon.carbon

@@ -26,9 +26,9 @@ var x: {."hello": i32, .y: i32} = {};
 // CHECK:STDOUT:           {kind: 'StructFieldType', text: ':', subtree_size: 4},
 // CHECK:STDOUT:         {kind: 'StructTypeLiteral', text: '}', has_error: yes, subtree_size: 11},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 13},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 18},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/struct/fail_dot_string_equals.carbon

@@ -26,9 +26,9 @@ var x: {."hello" = 0, .y = 4} = {};
 // CHECK:STDOUT:           {kind: 'StructFieldValue', text: '=', subtree_size: 4},
 // CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', has_error: yes, subtree_size: 11},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 13},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 18},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 7 - 7
toolchain/parse/testdata/struct/fail_extra_token_in_type.carbon

@@ -21,13 +21,13 @@ var x: {.a: i32 banana} = {.a = 0};
 // CHECK:STDOUT:           {kind: 'StructFieldType', text: ':', subtree_size: 4},
 // CHECK:STDOUT:         {kind: 'StructTypeLiteral', text: '}', has_error: yes, subtree_size: 6},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 8},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:             {kind: 'IdentifierName', text: 'a'},
-// CHECK:STDOUT:           {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
-// CHECK:STDOUT:           {kind: 'IntLiteral', text: '0'},
-// CHECK:STDOUT:         {kind: 'StructFieldValue', text: '=', subtree_size: 4},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', subtree_size: 6},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:               {kind: 'IdentifierName', text: 'a'},
+// CHECK:STDOUT:             {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
+// CHECK:STDOUT:             {kind: 'IntLiteral', text: '0'},
+// CHECK:STDOUT:           {kind: 'StructFieldValue', text: '=', subtree_size: 4},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', subtree_size: 6},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 7},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 17},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 7 - 7
toolchain/parse/testdata/struct/fail_extra_token_in_value.carbon

@@ -21,13 +21,13 @@ var x: {.a: i32} = {.a = 0 banana};
 // CHECK:STDOUT:           {kind: 'StructFieldType', text: ':', subtree_size: 4},
 // CHECK:STDOUT:         {kind: 'StructTypeLiteral', text: '}', subtree_size: 6},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 8},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:             {kind: 'IdentifierName', text: 'a'},
-// CHECK:STDOUT:           {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
-// CHECK:STDOUT:           {kind: 'IntLiteral', text: '0'},
-// CHECK:STDOUT:         {kind: 'StructFieldValue', text: '=', subtree_size: 4},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', has_error: yes, subtree_size: 6},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:               {kind: 'IdentifierName', text: 'a'},
+// CHECK:STDOUT:             {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
+// CHECK:STDOUT:             {kind: 'IntLiteral', text: '0'},
+// CHECK:STDOUT:           {kind: 'StructFieldValue', text: '=', subtree_size: 4},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', has_error: yes, subtree_size: 6},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 7},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 17},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/struct/fail_identifier_colon.carbon

@@ -18,9 +18,9 @@ var x: {a:} = {};
 // CHECK:STDOUT:           {kind: 'InvalidParse', text: 'a', has_error: yes},
 // CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', has_error: yes, subtree_size: 3},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 5},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 10},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/struct/fail_identifier_equals.carbon

@@ -18,9 +18,9 @@ var x: {a=} = {};
 // CHECK:STDOUT:           {kind: 'InvalidParse', text: 'a', has_error: yes},
 // CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', has_error: yes, subtree_size: 3},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 5},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 10},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/struct/fail_identifier_only.carbon

@@ -18,9 +18,9 @@ var x: {a} = {};
 // CHECK:STDOUT:           {kind: 'InvalidParse', text: 'a', has_error: yes},
 // CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', has_error: yes, subtree_size: 3},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 5},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 10},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/struct/fail_missing_type.carbon

@@ -21,9 +21,9 @@ var x: {.a:} = {};
 // CHECK:STDOUT:           {kind: 'InvalidParse', text: ':', has_error: yes},
 // CHECK:STDOUT:         {kind: 'StructTypeLiteral', text: '}', has_error: yes, subtree_size: 6},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 8},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 13},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/struct/fail_missing_value.carbon

@@ -21,9 +21,9 @@ var x: {.a=} = {};
 // CHECK:STDOUT:           {kind: 'InvalidParse', text: '=', has_error: yes},
 // CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', has_error: yes, subtree_size: 6},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 8},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 13},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/struct/fail_mix_type_and_value.carbon

@@ -25,9 +25,9 @@ var x: {.a: i32, .b = 0} = {};
 // CHECK:STDOUT:           {kind: 'InvalidParse', text: '.', has_error: yes},
 // CHECK:STDOUT:         {kind: 'StructTypeLiteral', text: '}', has_error: yes, subtree_size: 10},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 12},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 17},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/struct/fail_mix_value_and_type.carbon

@@ -23,9 +23,9 @@ var x: {.a = 0, b: i32} = {};
 // CHECK:STDOUT:           {kind: 'InvalidParse', text: 'b', has_error: yes},
 // CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', has_error: yes, subtree_size: 8},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 10},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 15},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 28 - 28
toolchain/parse/testdata/struct/fail_mix_with_unknown.carbon

@@ -27,41 +27,41 @@ var x: i32 = {.a: i32, .b, .c = 1};
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'x'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:             {kind: 'IdentifierName', text: 'a'},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:               {kind: 'IdentifierName', text: 'a'},
+// CHECK:STDOUT:             {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
+// CHECK:STDOUT:             {kind: 'IntLiteral', text: '1'},
+// CHECK:STDOUT:           {kind: 'StructFieldValue', text: '=', subtree_size: 4},
+// CHECK:STDOUT:           {kind: 'StructComma', text: ','},
+// CHECK:STDOUT:             {kind: 'IdentifierName', text: 'b'},
 // CHECK:STDOUT:           {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
-// CHECK:STDOUT:           {kind: 'IntLiteral', text: '1'},
-// CHECK:STDOUT:         {kind: 'StructFieldValue', text: '=', subtree_size: 4},
-// CHECK:STDOUT:         {kind: 'StructComma', text: ','},
-// CHECK:STDOUT:           {kind: 'IdentifierName', text: 'b'},
-// CHECK:STDOUT:         {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
-// CHECK:STDOUT:         {kind: 'InvalidParse', text: '.', has_error: yes},
-// CHECK:STDOUT:         {kind: 'StructComma', text: ','},
-// CHECK:STDOUT:           {kind: 'IdentifierName', text: 'c'},
-// CHECK:STDOUT:         {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
-// CHECK:STDOUT:         {kind: 'InvalidParse', text: '.', has_error: yes},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', has_error: yes, subtree_size: 14},
+// CHECK:STDOUT:           {kind: 'InvalidParse', text: '.', has_error: yes},
+// CHECK:STDOUT:           {kind: 'StructComma', text: ','},
+// CHECK:STDOUT:             {kind: 'IdentifierName', text: 'c'},
+// CHECK:STDOUT:           {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'InvalidParse', text: '.', has_error: yes},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', has_error: yes, subtree_size: 14},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 15},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 20},
 // CHECK:STDOUT:       {kind: 'VariableIntroducer', text: 'var'},
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'x'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:             {kind: 'IdentifierName', text: 'a'},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:               {kind: 'IdentifierName', text: 'a'},
+// CHECK:STDOUT:             {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
+// CHECK:STDOUT:             {kind: 'IntTypeLiteral', text: 'i32'},
+// CHECK:STDOUT:           {kind: 'StructFieldType', text: ':', subtree_size: 4},
+// CHECK:STDOUT:           {kind: 'StructComma', text: ','},
+// CHECK:STDOUT:             {kind: 'IdentifierName', text: 'b'},
+// CHECK:STDOUT:           {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'InvalidParse', text: '.', has_error: yes},
+// CHECK:STDOUT:           {kind: 'StructComma', text: ','},
+// CHECK:STDOUT:             {kind: 'IdentifierName', text: 'c'},
 // CHECK:STDOUT:           {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
-// CHECK:STDOUT:           {kind: 'IntTypeLiteral', text: 'i32'},
-// CHECK:STDOUT:         {kind: 'StructFieldType', text: ':', subtree_size: 4},
-// CHECK:STDOUT:         {kind: 'StructComma', text: ','},
-// CHECK:STDOUT:           {kind: 'IdentifierName', text: 'b'},
-// CHECK:STDOUT:         {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
-// CHECK:STDOUT:         {kind: 'InvalidParse', text: '.', has_error: yes},
-// CHECK:STDOUT:         {kind: 'StructComma', text: ','},
-// CHECK:STDOUT:           {kind: 'IdentifierName', text: 'c'},
-// CHECK:STDOUT:         {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
-// CHECK:STDOUT:         {kind: 'InvalidParse', text: '.', has_error: yes},
-// CHECK:STDOUT:       {kind: 'StructTypeLiteral', text: '}', has_error: yes, subtree_size: 14},
+// CHECK:STDOUT:           {kind: 'InvalidParse', text: '.', has_error: yes},
+// CHECK:STDOUT:         {kind: 'StructTypeLiteral', text: '}', has_error: yes, subtree_size: 14},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 15},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 20},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/struct/fail_no_colon_or_equals.carbon

@@ -20,9 +20,9 @@ var x: {.a} = {};
 // CHECK:STDOUT:           {kind: 'InvalidParse', text: '.', has_error: yes},
 // CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', has_error: yes, subtree_size: 5},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 7},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 12},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/struct/fail_type_no_designator.carbon

@@ -18,9 +18,9 @@ var x: {i32} = {};
 // CHECK:STDOUT:           {kind: 'InvalidParse', text: 'i32', has_error: yes},
 // CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', has_error: yes, subtree_size: 3},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 5},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 10},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/struct/no_entries.carbon

@@ -14,9 +14,9 @@ var y: {} = {};
 // CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
 // CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 4},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', subtree_size: 2},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 9},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 7 - 7
toolchain/parse/testdata/struct/one_entry_no_comma.carbon

@@ -18,13 +18,13 @@ var z: {.n: i32} = {.n = 4};
 // CHECK:STDOUT:           {kind: 'StructFieldType', text: ':', subtree_size: 4},
 // CHECK:STDOUT:         {kind: 'StructTypeLiteral', text: '}', subtree_size: 6},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 8},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:             {kind: 'IdentifierName', text: 'n'},
-// CHECK:STDOUT:           {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
-// CHECK:STDOUT:           {kind: 'IntLiteral', text: '4'},
-// CHECK:STDOUT:         {kind: 'StructFieldValue', text: '=', subtree_size: 4},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', subtree_size: 6},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:               {kind: 'IdentifierName', text: 'n'},
+// CHECK:STDOUT:             {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
+// CHECK:STDOUT:             {kind: 'IntLiteral', text: '4'},
+// CHECK:STDOUT:           {kind: 'StructFieldValue', text: '=', subtree_size: 4},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', subtree_size: 6},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 7},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 17},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 8 - 8
toolchain/parse/testdata/struct/one_entry_with_comma.carbon

@@ -19,14 +19,14 @@ var z: {.n: i32,} = {.n = 4,};
 // CHECK:STDOUT:           {kind: 'StructComma', text: ','},
 // CHECK:STDOUT:         {kind: 'StructTypeLiteral', text: '}', subtree_size: 7},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 9},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:             {kind: 'IdentifierName', text: 'n'},
-// CHECK:STDOUT:           {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
-// CHECK:STDOUT:           {kind: 'IntLiteral', text: '4'},
-// CHECK:STDOUT:         {kind: 'StructFieldValue', text: '=', subtree_size: 4},
-// CHECK:STDOUT:         {kind: 'StructComma', text: ','},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', subtree_size: 7},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:               {kind: 'IdentifierName', text: 'n'},
+// CHECK:STDOUT:             {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
+// CHECK:STDOUT:             {kind: 'IntLiteral', text: '4'},
+// CHECK:STDOUT:           {kind: 'StructFieldValue', text: '=', subtree_size: 4},
+// CHECK:STDOUT:           {kind: 'StructComma', text: ','},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', subtree_size: 7},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 8},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 19},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 12 - 12
toolchain/parse/testdata/struct/two_entries.carbon

@@ -23,18 +23,18 @@ var x: {.a: i32, .b: i32} = {.a = 1, .b = 2};
 // CHECK:STDOUT:           {kind: 'StructFieldType', text: ':', subtree_size: 4},
 // CHECK:STDOUT:         {kind: 'StructTypeLiteral', text: '}', subtree_size: 11},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 13},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
-// CHECK:STDOUT:             {kind: 'IdentifierName', text: 'a'},
-// CHECK:STDOUT:           {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
-// CHECK:STDOUT:           {kind: 'IntLiteral', text: '1'},
-// CHECK:STDOUT:         {kind: 'StructFieldValue', text: '=', subtree_size: 4},
-// CHECK:STDOUT:         {kind: 'StructComma', text: ','},
-// CHECK:STDOUT:             {kind: 'IdentifierName', text: 'b'},
-// CHECK:STDOUT:           {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
-// CHECK:STDOUT:           {kind: 'IntLiteral', text: '2'},
-// CHECK:STDOUT:         {kind: 'StructFieldValue', text: '=', subtree_size: 4},
-// CHECK:STDOUT:       {kind: 'StructLiteral', text: '}', subtree_size: 11},
+// CHECK:STDOUT:           {kind: 'StructLiteralOrStructTypeLiteralStart', text: '{'},
+// CHECK:STDOUT:               {kind: 'IdentifierName', text: 'a'},
+// CHECK:STDOUT:             {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
+// CHECK:STDOUT:             {kind: 'IntLiteral', text: '1'},
+// CHECK:STDOUT:           {kind: 'StructFieldValue', text: '=', subtree_size: 4},
+// CHECK:STDOUT:           {kind: 'StructComma', text: ','},
+// CHECK:STDOUT:               {kind: 'IdentifierName', text: 'b'},
+// CHECK:STDOUT:             {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
+// CHECK:STDOUT:             {kind: 'IntLiteral', text: '2'},
+// CHECK:STDOUT:           {kind: 'StructFieldValue', text: '=', subtree_size: 4},
+// CHECK:STDOUT:         {kind: 'StructLiteral', text: '}', subtree_size: 11},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 12},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 27},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 6 - 6
toolchain/parse/testdata/tuple/two_entries.carbon

@@ -17,12 +17,12 @@ var x: (i32, i32) = (1, 2);
 // CHECK:STDOUT:           {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:         {kind: 'TupleLiteral', text: ')', subtree_size: 5},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 7},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'ExprOpenParen', text: '('},
-// CHECK:STDOUT:         {kind: 'IntLiteral', text: '1'},
-// CHECK:STDOUT:         {kind: 'TupleLiteralComma', text: ','},
-// CHECK:STDOUT:         {kind: 'IntLiteral', text: '2'},
-// CHECK:STDOUT:       {kind: 'TupleLiteral', text: ')', subtree_size: 5},
+// CHECK:STDOUT:           {kind: 'ExprOpenParen', text: '('},
+// CHECK:STDOUT:           {kind: 'IntLiteral', text: '1'},
+// CHECK:STDOUT:           {kind: 'TupleLiteralComma', text: ','},
+// CHECK:STDOUT:           {kind: 'IntLiteral', text: '2'},
+// CHECK:STDOUT:         {kind: 'TupleLiteral', text: ')', subtree_size: 5},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 6},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 15},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]

+ 4 - 4
toolchain/parse/testdata/var/var.carbon

@@ -17,8 +17,8 @@ fn F() {
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'v'},
 // CHECK:STDOUT:         {kind: 'IntTypeLiteral', text: 'i32'},
 // CHECK:STDOUT:       {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:       {kind: 'IntLiteral', text: '0'},
+// CHECK:STDOUT:         {kind: 'IntLiteral', text: '0'},
+// CHECK:STDOUT:       {kind: 'VariableInitializer', text: '=', subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'VariableDecl', text: ';', subtree_size: 7},
 // CHECK:STDOUT:       {kind: 'VariableIntroducer', text: 'var'},
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'w'},
@@ -34,8 +34,8 @@ fn F() {
 // CHECK:STDOUT:           {kind: 'IdentifierName', text: 's'},
 // CHECK:STDOUT:           {kind: 'StringTypeLiteral', text: 'String'},
 // CHECK:STDOUT:         {kind: 'BindingPattern', text: ':', subtree_size: 3},
-// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:         {kind: 'StringLiteral', text: '"hello"'},
+// CHECK:STDOUT:           {kind: 'StringLiteral', text: '"hello"'},
+// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '=', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'VariableDecl', text: ';', subtree_size: 7},
 // CHECK:STDOUT:     {kind: 'FunctionDefinition', text: '}', subtree_size: 13},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},

+ 6 - 6
toolchain/parse/testdata/var/var_tuple.carbon

@@ -26,12 +26,12 @@ fn F() {
 // CHECK:STDOUT:             {kind: 'IntLiteral', text: '32'},
 // CHECK:STDOUT:           {kind: 'BindingPattern', text: ':', subtree_size: 3},
 // CHECK:STDOUT:         {kind: 'TuplePattern', text: ')', subtree_size: 9},
-// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '='},
-// CHECK:STDOUT:           {kind: 'ExprOpenParen', text: '('},
-// CHECK:STDOUT:           {kind: 'StringLiteral', text: '"hello"'},
-// CHECK:STDOUT:           {kind: 'TupleLiteralComma', text: ','},
-// CHECK:STDOUT:           {kind: 'IntLiteral', text: '0'},
-// CHECK:STDOUT:         {kind: 'TupleLiteral', text: ')', subtree_size: 5},
+// CHECK:STDOUT:             {kind: 'ExprOpenParen', text: '('},
+// CHECK:STDOUT:             {kind: 'StringLiteral', text: '"hello"'},
+// CHECK:STDOUT:             {kind: 'TupleLiteralComma', text: ','},
+// CHECK:STDOUT:             {kind: 'IntLiteral', text: '0'},
+// CHECK:STDOUT:           {kind: 'TupleLiteral', text: ')', subtree_size: 5},
+// CHECK:STDOUT:         {kind: 'VariableInitializer', text: '=', subtree_size: 6},
 // CHECK:STDOUT:       {kind: 'VariableDecl', text: ';', subtree_size: 17},
 // CHECK:STDOUT:     {kind: 'FunctionDefinition', text: '}', subtree_size: 23},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},

+ 8 - 6
toolchain/parse/typed_nodes.h

@@ -332,7 +332,13 @@ struct LetDecl {
 
 using VariableIntroducer = LeafNode<NodeKind::VariableIntroducer>;
 using ReturnedModifier = LeafNode<NodeKind::ReturnedModifier>;
-using VariableInitializer = LeafNode<NodeKind::VariableInitializer>;
+
+// The initializer part of a `var` declaration.
+struct VariableInitializer {
+  static constexpr auto Kind = NodeKind::VariableInitializer.Define();
+
+  AnyExprId value;
+};
 
 // A `var` declaration: `var a: i32;` or `var a: i32 = 5;`.
 struct VariableDecl {
@@ -344,11 +350,7 @@ struct VariableDecl {
   std::optional<ReturnedModifierId> returned;
   AnyPatternId pattern;
 
-  struct Initializer {
-    VariableInitializerId equals;
-    AnyExprId value;
-  };
-  std::optional<Initializer> initializer;
+  std::optional<VariableInitializerId> initializer;
 };
 
 // Statement nodes

+ 17 - 10
toolchain/parse/typed_nodes_test.cpp

@@ -173,9 +173,7 @@ TEST_F(TypedNodeTest, VerifyExtractTraceVarNoInit) {
   EXPECT_THAT(err.message(), testing::MatchesRegex(
                                  R"Trace(Aggregate [^:]*: begin
 Optional [^:]*: begin
-Aggregate [^:]*: begin
-NodeIdInCategory Expr error: kind BindingPattern doesn't match
-Aggregate [^:]*: error
+NodeIdForKind error: wrong kind BindingPattern, expected VariableInitializer
 Optional [^:]*: missing
 NodeIdInCategory Pattern: kind BindingPattern consumed
 Optional [^:]*: begin
@@ -203,11 +201,8 @@ TEST_F(TypedNodeTest, VerifyExtractTraceExpression) {
   // Use Regex matching to avoid hard-coding the result of `typeinfo(T).name()`.
   EXPECT_THAT(err1.message(), testing::MatchesRegex(
                                   R"Trace(Aggregate [^:]*: begin
-Optional [^:]*leDecl11InitializerE: begin
-Aggregate [^:]*: begin
-NodeIdInCategory Expr: kind MemberAccessExpr consumed
+Optional [^:]*: begin
 NodeIdForKind: VariableInitializer consumed
-Aggregate [^:]*: success
 Optional [^:]*: found
 NodeIdInCategory Pattern: kind BindingPattern consumed
 Optional [^:]*: begin
@@ -222,13 +217,25 @@ Aggregate [^:]*: success
 
   ASSERT_TRUE(var->initializer.has_value());
   ErrorBuilder trace2;
-  auto value =
-      tree->VerifyExtractAs<MemberAccessExpr>(var->initializer->value, &trace2);
-  ASSERT_TRUE(value.has_value());
+  auto initializer =
+      tree->VerifyExtractAs<VariableInitializer>(*var->initializer, &trace2);
+  ASSERT_TRUE(initializer.has_value());
   Error err2 = trace2;
   // Use Regex matching to avoid hard-coding the result of `typeinfo(T).name()`.
   EXPECT_THAT(err2.message(), testing::MatchesRegex(
                                   R"Trace(Aggregate [^:]*: begin
+NodeIdInCategory Expr: kind MemberAccessExpr consumed
+Aggregate [^:]*: success
+)Trace"));
+
+  ErrorBuilder trace3;
+  auto value =
+      tree->VerifyExtractAs<MemberAccessExpr>(initializer->value, &trace3);
+  ASSERT_TRUE(value.has_value());
+  Error err3 = trace3;
+  // Use Regex matching to avoid hard-coding the result of `typeinfo(T).name()`.
+  EXPECT_THAT(err3.message(), testing::MatchesRegex(
+                                  R"Trace(Aggregate [^:]*: begin
 NodeIdInCategory MemberName: kind IdentifierName consumed
 NodeIdInCategory Expr: kind PointerMemberAccessExpr consumed
 Aggregate [^:]*: success