Переглянути джерело

Add initial lowering of a trivial function (#2640)

This is starting to build out actual lowering logic, for a really simple `fn Main() -> i32 { return 0; }`

Notes for achieving this:

- In semantics, currently function names are bound separate from the signature. When emitting IR, this turns out to be inconvenient because we want to know the name when we process the declaration and the definition. This change addresses that by merging the name into the FunctionDeclaration node, which is also accessible from the definition. It removes the separate BindName. This should be the cause of all the test changes in semantics, because the IR generated changes.

- Add a "Lowering" class which I'm using to hold the llvm builder state. This class now has minimal support for the SemanticsIR generated by the above example.

- In the "Lowering", values from expressions are stored in a DenseMap. I'll keep thinking about whether there's a cleaner way to achieve this, and I'd call it a temporary solution for now. However, this is how the `0` in `return 0` gets properly associated across SemanticsIR instructions, and it'll frequently be an issue in less trivial cases.
Jon Ross-Perkins 3 роки тому
батько
коміт
32e8fee4ad
46 змінених файлів з 550 додано та 321 видалено
  1. 6 0
      toolchain/driver/driver.cpp
  2. 14 1
      toolchain/lowering/BUILD
  3. 5 3
      toolchain/lowering/lower_to_llvm.cpp
  4. 0 1
      toolchain/lowering/lower_to_llvm.h
  5. 156 0
      toolchain/lowering/lowering.cpp
  6. 79 0
      toolchain/lowering/lowering.h
  7. 10 0
      toolchain/lowering/testdata/basics/fail_in_semantics.carbon
  8. 17 0
      toolchain/lowering/testdata/basics/zero.carbon
  9. 36 12
      toolchain/semantics/semantics_ir.h
  10. 7 5
      toolchain/semantics/semantics_node.h
  11. 29 20
      toolchain/semantics/semantics_parse_tree_handler.cpp
  12. 6 2
      toolchain/semantics/semantics_parse_tree_handler.h
  13. 1 3
      toolchain/semantics/testdata/basics/fail_name_lookup.carbon
  14. 1 1
      toolchain/semantics/testdata/basics/verbose.carbon
  15. 31 39
      toolchain/semantics/testdata/function/call/fail_param_count.carbon
  16. 5 9
      toolchain/semantics/testdata/function/call/fail_param_type.carbon
  17. 13 17
      toolchain/semantics/testdata/function/call/more_param_ir.carbon
  18. 7 11
      toolchain/semantics/testdata/function/call/params_one.carbon
  19. 9 13
      toolchain/semantics/testdata/function/call/params_one_comma.carbon
  20. 8 12
      toolchain/semantics/testdata/function/call/params_two.carbon
  21. 12 16
      toolchain/semantics/testdata/function/call/params_two_comma.carbon
  22. 4 8
      toolchain/semantics/testdata/function/call/params_zero.carbon
  23. 1 3
      toolchain/semantics/testdata/function/definition/fail_param_name_conflict.carbon
  24. 5 11
      toolchain/semantics/testdata/function/definition/order.carbon
  25. 1 3
      toolchain/semantics/testdata/function/definition/params_one.carbon
  26. 1 3
      toolchain/semantics/testdata/function/definition/params_one_comma.carbon
  27. 1 3
      toolchain/semantics/testdata/function/definition/params_two.carbon
  28. 1 3
      toolchain/semantics/testdata/function/definition/params_two_comma.carbon
  29. 1 3
      toolchain/semantics/testdata/function/definition/params_zero.carbon
  30. 7 11
      toolchain/semantics/testdata/function/definition/same_param_name.carbon
  31. 5 7
      toolchain/semantics/testdata/operators/binary_op.carbon
  32. 5 7
      toolchain/semantics/testdata/operators/fail_type_mismatch.carbon
  33. 6 8
      toolchain/semantics/testdata/operators/fail_type_mismatch_once.carbon
  34. 4 6
      toolchain/semantics/testdata/return/fail_type_mismatch.carbon
  35. 4 6
      toolchain/semantics/testdata/return/fail_value_disallowed.carbon
  36. 3 5
      toolchain/semantics/testdata/return/fail_value_missing.carbon
  37. 3 5
      toolchain/semantics/testdata/return/no_value.carbon
  38. 4 6
      toolchain/semantics/testdata/return/value.carbon
  39. 4 6
      toolchain/semantics/testdata/var/decl.carbon
  40. 5 7
      toolchain/semantics/testdata/var/decl_with_init.carbon
  41. 7 9
      toolchain/semantics/testdata/var/fail_duplicate_decl.carbon
  42. 5 7
      toolchain/semantics/testdata/var/fail_init_type_mismatch.carbon
  43. 5 7
      toolchain/semantics/testdata/var/fail_init_with_self.carbon
  44. 6 8
      toolchain/semantics/testdata/var/fail_lookup_outside_scope.carbon
  45. 5 7
      toolchain/semantics/testdata/var/global_lookup_in_scope.carbon
  46. 5 7
      toolchain/semantics/testdata/var/lookup.carbon

+ 6 - 0
toolchain/driver/driver.cpp

@@ -209,6 +209,12 @@ auto Driver::RunDumpSubcommand(DiagnosticConsumer& consumer,
   }
   }
   CARBON_VLOG() << "semantics_ir: " << semantics_ir;
   CARBON_VLOG() << "semantics_ir: " << semantics_ir;
 
 
+  // Unlike previous steps, errors block further progress.
+  if (has_errors) {
+    CARBON_VLOG() << "Unable to dump llvm-ir due to prior errors.";
+    return false;
+  }
+
   CARBON_VLOG() << "*** LowerToLLVM ***\n";
   CARBON_VLOG() << "*** LowerToLLVM ***\n";
   llvm::LLVMContext llvm_context;
   llvm::LLVMContext llvm_context;
   const std::unique_ptr<llvm::Module> module =
   const std::unique_ptr<llvm::Module> module =

+ 14 - 1
toolchain/lowering/BUILD

@@ -8,10 +8,23 @@ cc_library(
     name = "lower_to_llvm",
     name = "lower_to_llvm",
     srcs = ["lower_to_llvm.cpp"],
     srcs = ["lower_to_llvm.cpp"],
     hdrs = ["lower_to_llvm.h"],
     hdrs = ["lower_to_llvm.h"],
+    deps = [
+        ":lowering",
+        "//toolchain/semantics:semantics_ir",
+        "@llvm-project//llvm:Core",
+        "@llvm-project//llvm:Support",
+    ],
+)
+
+cc_library(
+    name = "lowering",
+    srcs = ["lowering.cpp"],
+    hdrs = ["lowering.h"],
     deps = [
     deps = [
         "//common:check",
         "//common:check",
-        "//common:ostream",
         "//toolchain/semantics:semantics_ir",
         "//toolchain/semantics:semantics_ir",
+        "//toolchain/semantics:semantics_node",
+        "//toolchain/semantics:semantics_node_kind",
         "@llvm-project//llvm:Core",
         "@llvm-project//llvm:Core",
         "@llvm-project//llvm:Support",
         "@llvm-project//llvm:Support",
     ],
     ],

+ 5 - 3
toolchain/lowering/lower_to_llvm.cpp

@@ -4,13 +4,15 @@
 
 
 #include "toolchain/lowering/lower_to_llvm.h"
 #include "toolchain/lowering/lower_to_llvm.h"
 
 
+#include "toolchain/lowering/lowering.h"
+
 namespace Carbon {
 namespace Carbon {
 
 
 auto LowerToLLVM(llvm::LLVMContext& llvm_context, llvm::StringRef module_name,
 auto LowerToLLVM(llvm::LLVMContext& llvm_context, llvm::StringRef module_name,
-                 const SemanticsIR& /*semantics_ir*/)
+                 const SemanticsIR& semantics_ir)
     -> std::unique_ptr<llvm::Module> {
     -> std::unique_ptr<llvm::Module> {
-  auto result = std::make_unique<llvm::Module>(module_name, llvm_context);
-  return result;
+  Lowering lowering(llvm_context, module_name, semantics_ir);
+  return lowering.Run();
 }
 }
 
 
 }  // namespace Carbon
 }  // namespace Carbon

+ 0 - 1
toolchain/lowering/lower_to_llvm.h

@@ -5,7 +5,6 @@
 #ifndef CARBON_TOOLCHAIN_LOWERING_LOWER_TO_LLVM_H_
 #ifndef CARBON_TOOLCHAIN_LOWERING_LOWER_TO_LLVM_H_
 #define CARBON_TOOLCHAIN_LOWERING_LOWER_TO_LLVM_H_
 #define CARBON_TOOLCHAIN_LOWERING_LOWER_TO_LLVM_H_
 
 
-#include "common/ostream.h"
 #include "llvm/IR/LLVMContext.h"
 #include "llvm/IR/LLVMContext.h"
 #include "llvm/IR/Module.h"
 #include "llvm/IR/Module.h"
 #include "toolchain/semantics/semantics_ir.h"
 #include "toolchain/semantics/semantics_ir.h"

+ 156 - 0
toolchain/lowering/lowering.cpp

@@ -0,0 +1,156 @@
+// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
+// Exceptions. See /LICENSE for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+#include "toolchain/lowering/lowering.h"
+
+#include "toolchain/semantics/semantics_ir.h"
+
+namespace Carbon {
+
+Lowering::Lowering(llvm::LLVMContext& llvm_context, llvm::StringRef module_name,
+                   const SemanticsIR& semantics_ir)
+    : llvm_context_(&llvm_context),
+      llvm_module_(std::make_unique<llvm::Module>(module_name, llvm_context)),
+      builder_(llvm_context),
+      semantics_ir_(&semantics_ir) {
+  CARBON_CHECK(!semantics_ir.has_errors())
+      << "Generating LLVM IR from invalid SemanticsIR is unsupported.";
+}
+
+auto Lowering::Run() -> std::unique_ptr<llvm::Module> {
+  CARBON_CHECK(llvm_module_) << "Run can only be called once.";
+
+  LowerBlock(semantics_ir_->top_node_block_id());
+
+  while (!todo_blocks_.empty()) {
+    auto [llvm_block, block_id] = todo_blocks_.pop_back_val();
+    builder_.SetInsertPoint(llvm_block);
+    LowerBlock(block_id);
+  }
+
+  return std::move(llvm_module_);
+}
+
+auto Lowering::LowerBlock(SemanticsNodeBlockId block_id) -> void {
+  for (const auto& node_id : semantics_ir_->GetNodeBlock(block_id)) {
+    auto node = semantics_ir_->GetNode(node_id);
+    switch (node.kind()) {
+#define CARBON_SEMANTICS_NODE_KIND(Name) \
+  case SemanticsNodeKind::Name:          \
+    Handle##Name##Node(node_id, node);   \
+    break;
+#include "toolchain/semantics/semantics_node_kind.def"
+    }
+  }
+}
+
+auto Lowering::HandleInvalidNode(SemanticsNodeId /*node_id*/,
+                                 SemanticsNode /*node*/) -> void {
+  llvm_unreachable("never in actual IR");
+}
+
+auto Lowering::HandleCrossReferenceNode(SemanticsNodeId /*node_id*/,
+                                        SemanticsNode node) -> void {
+  CARBON_FATAL() << "TODO: Add support: " << node;
+}
+
+auto Lowering::HandleAssignNode(SemanticsNodeId /*node_id*/, SemanticsNode node)
+    -> void {
+  CARBON_FATAL() << "TODO: Add support: " << node;
+}
+
+auto Lowering::HandleBinaryOperatorAddNode(SemanticsNodeId /*node_id*/,
+                                           SemanticsNode node) -> void {
+  CARBON_FATAL() << "TODO: Add support: " << node;
+}
+
+auto Lowering::HandleBindNameNode(SemanticsNodeId /*node_id*/,
+                                  SemanticsNode node) -> void {
+  CARBON_FATAL() << "TODO: Add support: " << node;
+}
+
+auto Lowering::HandleBuiltinNode(SemanticsNodeId /*node_id*/,
+                                 SemanticsNode node) -> void {
+  CARBON_FATAL() << "TODO: Add support: " << node;
+}
+
+auto Lowering::HandleCallNode(SemanticsNodeId /*node_id*/, SemanticsNode node)
+    -> void {
+  CARBON_FATAL() << "TODO: Add support: " << node;
+}
+
+auto Lowering::HandleCodeBlockNode(SemanticsNodeId /*node_id*/,
+                                   SemanticsNode node) -> void {
+  CARBON_FATAL() << "TODO: Add support: " << node;
+}
+
+auto Lowering::HandleFunctionDeclarationNode(SemanticsNodeId /*node_id*/,
+                                             SemanticsNode node) -> void {
+  auto [name_id, callable_id] = node.GetAsFunctionDeclaration();
+  auto callable = semantics_ir_->GetCallable(callable_id);
+  llvm::SmallVector<llvm::Type*> args;
+  // Note, when handling non-empty parameters, we'll also want to set names.
+  CARBON_CHECK(callable.param_refs_id == SemanticsNodeBlockId::Empty)
+      << "TODO: Handle non-empty parameters.";
+  CARBON_CHECK(callable.return_type_id == SemanticsNodeId::BuiltinIntegerType)
+      << "TODO: Handle non-i32 return types.";
+  llvm::Type* return_type = builder_.getInt32Ty();
+  llvm::FunctionType* function_type =
+      llvm::FunctionType::get(return_type, args, /*isVarArg=*/false);
+  llvm::Function::Create(function_type, llvm::Function::ExternalLinkage,
+                         semantics_ir_->GetString(name_id), llvm_module_.get());
+  // TODO: Name arguments.
+}
+
+auto Lowering::HandleFunctionDefinitionNode(SemanticsNodeId /*node_id*/,
+                                            SemanticsNode node) -> void {
+  auto [declaration_id, body_block_id] = node.GetAsFunctionDefinition();
+  auto [name_id, callable_id] =
+      semantics_ir_->GetNode(declaration_id).GetAsFunctionDeclaration();
+
+  llvm::Function* function =
+      llvm_module_->getFunction(semantics_ir_->GetString(name_id));
+
+  // Create a new basic block to start insertion into.
+  llvm::BasicBlock* body =
+      llvm::BasicBlock::Create(*llvm_context_, "entry", function);
+  todo_blocks_.push_back({body, body_block_id});
+}
+
+auto Lowering::HandleIntegerLiteralNode(SemanticsNodeId node_id,
+                                        SemanticsNode node) -> void {
+  SemanticsIntegerLiteralId int_id = node.GetAsIntegerLiteral();
+  llvm::APInt i = semantics_ir_->GetIntegerLiteral(int_id);
+  llvm::Value* v =
+      llvm::ConstantInt::get(builder_.getInt32Ty(), i.getLimitedValue());
+  node_values_[node_id] = v;
+}
+
+auto Lowering::HandleRealLiteralNode(SemanticsNodeId /*node_id*/,
+                                     SemanticsNode node) -> void {
+  CARBON_FATAL() << "TODO: Add support: " << node;
+}
+
+auto Lowering::HandleReturnNode(SemanticsNodeId /*node_id*/, SemanticsNode node)
+    -> void {
+  CARBON_FATAL() << "TODO: Add support: " << node;
+}
+
+auto Lowering::HandleReturnExpressionNode(SemanticsNodeId /*node_id*/,
+                                          SemanticsNode node) -> void {
+  SemanticsNodeId expr_id = node.GetAsReturnExpression();
+  builder_.CreateRet(node_values_[expr_id]);
+}
+
+auto Lowering::HandleStringLiteralNode(SemanticsNodeId /*node_id*/,
+                                       SemanticsNode node) -> void {
+  CARBON_FATAL() << "TODO: Add support: " << node;
+}
+
+auto Lowering::HandleVarStorageNode(SemanticsNodeId /*node_id*/,
+                                    SemanticsNode node) -> void {
+  CARBON_FATAL() << "TODO: Add support: " << node;
+}
+
+}  // namespace Carbon

+ 79 - 0
toolchain/lowering/lowering.h

@@ -0,0 +1,79 @@
+// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
+// Exceptions. See /LICENSE for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+#ifndef CARBON_TOOLCHAIN_LOWERING_LOWERING_H_
+#define CARBON_TOOLCHAIN_LOWERING_LOWERING_H_
+
+#include "llvm/IR/IRBuilder.h"
+#include "llvm/IR/LLVMContext.h"
+#include "llvm/IR/Module.h"
+#include "toolchain/semantics/semantics_ir.h"
+#include "toolchain/semantics/semantics_node.h"
+
+namespace Carbon {
+
+// Use LowerToLLVM rather than calling this directly.
+//
+// This carries state for lowering. `Run()` should only be called once, and
+// handles the main execution.
+class Lowering {
+ public:
+  explicit Lowering(llvm::LLVMContext& llvm_context,
+                    llvm::StringRef module_name,
+                    const SemanticsIR& semantics_ir);
+
+  // Lowers the SemanticsIR to LLVM IR.
+  auto Run() -> std::unique_ptr<llvm::Module>;
+
+ private:
+  // Provides DenseMapInfo for SemanticsNodeId.
+  struct SemanticsNodeIdMapInfo {
+    static inline auto getEmptyKey() -> SemanticsNodeId {
+      return SemanticsNodeId(llvm::DenseMapInfo<int32_t>::getEmptyKey());
+    }
+    static inline auto getTombstoneKey() -> SemanticsNodeId {
+      return SemanticsNodeId(llvm::DenseMapInfo<int32_t>::getTombstoneKey());
+    }
+
+    static auto getHashValue(const SemanticsNodeId& val) -> unsigned {
+      return llvm::DenseMapInfo<int32_t>::getHashValue(val.index);
+    }
+
+    static auto isEqual(const SemanticsNodeId& lhs, const SemanticsNodeId& rhs)
+        -> bool {
+      return lhs == rhs;
+    }
+  };
+
+  // Declare handlers for each SemanticsIR node.
+#define CARBON_SEMANTICS_NODE_KIND(Name) \
+  auto Handle##Name##Node(SemanticsNodeId node_id, SemanticsNode node)->void;
+#include "toolchain/semantics/semantics_node_kind.def"
+
+  // Runs lowering for a block.
+  auto LowerBlock(SemanticsNodeBlockId block_id) -> void;
+
+  // State for building the LLVM IR.
+  llvm::LLVMContext* llvm_context_;
+  std::unique_ptr<llvm::Module> llvm_module_;
+  llvm::IRBuilder<> builder_;
+
+  // The input Semantics IR.
+  const SemanticsIR* const semantics_ir_;
+
+  // Blocks which we've observed and need to lower.
+  llvm::SmallVector<std::pair<llvm::BasicBlock*, SemanticsNodeBlockId>>
+      todo_blocks_;
+
+  // A mapping of nodes to designated values.
+  // TODO: It might be worth considering other approaches, or at least if we
+  // stick with this we'll probably want to clean up nodes as they leave scope.
+  // However, for now, it's handy to make things work.
+  llvm::DenseMap<SemanticsNodeId, llvm::Value*, SemanticsNodeIdMapInfo>
+      node_values_;
+};
+
+}  // namespace Carbon
+
+#endif  // CARBON_TOOLCHAIN_LOWERING_LOWERING_H_

+ 10 - 0
toolchain/lowering/testdata/basics/fail_in_semantics.carbon

@@ -0,0 +1,10 @@
+// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
+// Exceptions. See /LICENSE for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+// This validates that earlier errors prevent lowering, without crashing.
+// AUTOUPDATE
+// RUN: %{not} %{carbon-run-lowering}
+
+// CHECK:STDERR: {{.*}}/toolchain/lowering/testdata/basics/fail_in_semantics.carbon:[[@LINE+1]]:17: Type mismatch: lhs is node2, rhs is node3
+var x: i32 = 1.0;

+ 17 - 0
toolchain/lowering/testdata/basics/zero.carbon

@@ -0,0 +1,17 @@
+// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
+// Exceptions. See /LICENSE for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+// AUTOUPDATE
+// RUN: %{carbon-run-lowering}
+// CHECK:STDOUT: ; ModuleID = '{{.*}}/toolchain/lowering/testdata/basics/zero.carbon'
+// CHECK:STDOUT: source_filename = "{{.*}}/toolchain/lowering/testdata/basics/zero.carbon"
+// CHECK-EMPTY:
+// CHECK:STDOUT: define i32 @Main() {
+// CHECK:STDOUT: entry:
+// CHECK:STDOUT:   ret i32 0
+// CHECK:STDOUT: }
+
+fn Main() -> i32 {
+  return 0;
+}

+ 36 - 12
toolchain/semantics/semantics_ir.h

@@ -77,6 +77,37 @@ class SemanticsIR {
   // Prints the full IR.
   // Prints the full IR.
   auto Print(llvm::raw_ostream& out) const -> void;
   auto Print(llvm::raw_ostream& out) const -> void;
 
 
+  // Returns the requested callable.
+  auto GetCallable(SemanticsCallableId callable_id) const -> SemanticsCallable {
+    return callables_[callable_id.index];
+  }
+
+  // Returns the requested integer literal.
+  auto GetIntegerLiteral(SemanticsIntegerLiteralId int_id) const
+      -> const llvm::APInt& {
+    return integer_literals_[int_id.index];
+  }
+
+  // Returns the requested node.
+  auto GetNode(SemanticsNodeId node_id) const -> SemanticsNode {
+    return nodes_[node_id.index];
+  }
+
+  // Returns the requested node block.
+  auto GetNodeBlock(SemanticsNodeBlockId block_id) const
+      -> const llvm::SmallVector<SemanticsNodeId>& {
+    return node_blocks_[block_id.index];
+  }
+
+  // Returns the requested string.
+  auto GetString(SemanticsStringId string_id) const -> llvm::StringRef {
+    return strings_[string_id.index];
+  }
+
+  auto top_node_block_id() const -> SemanticsNodeBlockId {
+    return top_node_block_id_;
+  }
+
   // Returns true if there were errors creating the semantics IR.
   // Returns true if there were errors creating the semantics IR.
   auto has_errors() const -> bool { return has_errors_; }
   auto has_errors() const -> bool { return has_errors_; }
 
 
@@ -103,11 +134,6 @@ class SemanticsIR {
     return id;
     return id;
   }
   }
 
 
-  // Returns the requested callable.
-  auto GetCallable(SemanticsCallableId callable_id) -> SemanticsCallable {
-    return callables_[callable_id.index];
-  }
-
   // Adds an integer literal, returning an ID to reference it.
   // Adds an integer literal, returning an ID to reference it.
   auto AddIntegerLiteral(llvm::APInt integer_literal)
   auto AddIntegerLiteral(llvm::APInt integer_literal)
       -> SemanticsIntegerLiteralId {
       -> SemanticsIntegerLiteralId {
@@ -125,11 +151,6 @@ class SemanticsIR {
     return node_id;
     return node_id;
   }
   }
 
 
-  // Returns the requested node.
-  auto GetNode(SemanticsNodeId node_id) const -> const SemanticsNode& {
-    return nodes_[node_id.index];
-  }
-
   // Returns the type of the requested node.
   // Returns the type of the requested node.
   auto GetType(SemanticsNodeId node_id) -> SemanticsNodeId {
   auto GetType(SemanticsNodeId node_id) -> SemanticsNodeId {
     return GetNode(node_id).type();
     return GetNode(node_id).type();
@@ -159,7 +180,7 @@ class SemanticsIR {
   // Adds an string, returning an ID to reference it.
   // Adds an string, returning an ID to reference it.
   auto AddString(llvm::StringRef str) -> SemanticsStringId {
   auto AddString(llvm::StringRef str) -> SemanticsStringId {
     // If the string has already been stored, return the corresponding ID.
     // If the string has already been stored, return the corresponding ID.
-    if (auto existing_id = GetString(str)) {
+    if (auto existing_id = GetStringID(str)) {
       return *existing_id;
       return *existing_id;
     }
     }
 
 
@@ -171,7 +192,7 @@ class SemanticsIR {
   }
   }
 
 
   // Returns an ID for the string if it's previously been stored.
   // Returns an ID for the string if it's previously been stored.
-  auto GetString(llvm::StringRef str) -> std::optional<SemanticsStringId> {
+  auto GetStringID(llvm::StringRef str) -> std::optional<SemanticsStringId> {
     auto str_find = string_to_id_.find(str);
     auto str_find = string_to_id_.find(str);
     if (str_find != string_to_id_.end()) {
     if (str_find != string_to_id_.end()) {
       return str_find->second;
       return str_find->second;
@@ -209,6 +230,9 @@ class SemanticsIR {
 
 
   // Storage for blocks within the IR. These reference entries in nodes_.
   // Storage for blocks within the IR. These reference entries in nodes_.
   llvm::SmallVector<llvm::SmallVector<SemanticsNodeId>> node_blocks_;
   llvm::SmallVector<llvm::SmallVector<SemanticsNodeId>> node_blocks_;
+
+  // The top node block ID.
+  SemanticsNodeBlockId top_node_block_id_ = SemanticsNodeBlockId::Invalid;
 };
 };
 
 
 }  // namespace Carbon
 }  // namespace Carbon

+ 7 - 5
toolchain/semantics/semantics_node.h

@@ -203,16 +203,18 @@ class SemanticsNode {
     return {SemanticsCrossReferenceIRId(arg0_), SemanticsNodeId(arg1_)};
     return {SemanticsCrossReferenceIRId(arg0_), SemanticsNodeId(arg1_)};
   }
   }
 
 
-  // TODO: The signature should be added as a parameter.
   static auto MakeFunctionDeclaration(ParseTree::Node parse_node,
   static auto MakeFunctionDeclaration(ParseTree::Node parse_node,
-                                      SemanticsCallableId signature)
+                                      SemanticsStringId name_id,
+                                      SemanticsCallableId signature_id)
       -> SemanticsNode {
       -> SemanticsNode {
     return SemanticsNode(parse_node, SemanticsNodeKind::FunctionDeclaration,
     return SemanticsNode(parse_node, SemanticsNodeKind::FunctionDeclaration,
-                         SemanticsNodeId::Invalid, signature.index);
+                         SemanticsNodeId::Invalid, name_id.index,
+                         signature_id.index);
   }
   }
-  auto GetAsFunctionDeclaration() const -> SemanticsCallableId {
+  auto GetAsFunctionDeclaration() const
+      -> std::pair<SemanticsStringId, SemanticsCallableId> {
     CARBON_CHECK(kind_ == SemanticsNodeKind::FunctionDeclaration);
     CARBON_CHECK(kind_ == SemanticsNodeKind::FunctionDeclaration);
-    return {SemanticsCallableId(arg0_)};
+    return {SemanticsStringId(arg0_), SemanticsCallableId(arg1_)};
   }
   }
 
 
   static auto MakeFunctionDefinition(ParseTree::Node parse_node,
   static auto MakeFunctionDefinition(ParseTree::Node parse_node,

+ 29 - 20
toolchain/semantics/semantics_parse_tree_handler.cpp

@@ -62,7 +62,7 @@ auto SemanticsParseTreeHandler::Build() -> void {
   }
   }
 
 
   // Pop information for the file-level scope.
   // Pop information for the file-level scope.
-  node_block_stack_.Pop();
+  semantics_->top_node_block_id_ = node_block_stack_.Pop();
   PopScope();
   PopScope();
 
 
   // Information in all the various context objects should be cleaned up as
   // Information in all the various context objects should be cleaned up as
@@ -87,16 +87,10 @@ auto SemanticsParseTreeHandler::AddNodeAndPush(ParseTree::Node parse_node,
   node_stack_.Push(parse_node, node_id);
   node_stack_.Push(parse_node, node_id);
 }
 }
 
 
-auto SemanticsParseTreeHandler::BindName(ParseTree::Node name_node,
-                                         SemanticsNodeId type_id,
-                                         SemanticsNodeId target_id)
-    -> SemanticsStringId {
-  CARBON_CHECK(parse_tree_->node_kind(name_node) == ParseNodeKind::DeclaredName)
-      << parse_tree_->node_kind(name_node);
-  auto name_str = parse_tree_->GetNodeText(name_node);
-  auto name_id = semantics_->AddString(name_str);
-
-  AddNode(SemanticsNode::MakeBindName(name_node, type_id, name_id, target_id));
+auto SemanticsParseTreeHandler::AddNameToLookup(ParseTree::Node name_node,
+                                                SemanticsStringId name_id,
+                                                SemanticsNodeId target_id)
+    -> void {
   auto [it, inserted] = current_scope().names.insert(name_id);
   auto [it, inserted] = current_scope().names.insert(name_id);
   if (inserted) {
   if (inserted) {
     name_lookup_[name_id].push_back(target_id);
     name_lookup_[name_id].push_back(target_id);
@@ -107,10 +101,23 @@ auto SemanticsParseTreeHandler::BindName(ParseTree::Node name_node,
     auto prev_def_id = name_lookup_[name_id].back();
     auto prev_def_id = name_lookup_[name_id].back();
     auto prev_def = semantics_->GetNode(prev_def_id);
     auto prev_def = semantics_->GetNode(prev_def_id);
 
 
-    emitter_->Build(name_node, NameRedefined, name_str)
+    emitter_->Build(name_node, NameRedefined, semantics_->GetString(name_id))
         .Note(prev_def.parse_node(), PreviousDefinition)
         .Note(prev_def.parse_node(), PreviousDefinition)
         .Emit();
         .Emit();
   }
   }
+}
+
+auto SemanticsParseTreeHandler::BindName(ParseTree::Node name_node,
+                                         SemanticsNodeId type_id,
+                                         SemanticsNodeId target_id)
+    -> SemanticsStringId {
+  CARBON_CHECK(parse_tree_->node_kind(name_node) == ParseNodeKind::DeclaredName)
+      << parse_tree_->node_kind(name_node);
+  auto name_str = parse_tree_->GetNodeText(name_node);
+  auto name_id = semantics_->AddString(name_str);
+
+  AddNode(SemanticsNode::MakeBindName(name_node, type_id, name_id, target_id));
+  AddNameToLookup(name_node, name_id, target_id);
   return name_id;
   return name_id;
 }
 }
 
 
@@ -319,7 +326,7 @@ auto SemanticsParseTreeHandler::HandleCallExpression(ParseTree::Node parse_node)
       return true;
       return true;
     }
     }
 
 
-    auto callable_id = name_node.GetAsFunctionDeclaration();
+    auto [_, callable_id] = name_node.GetAsFunctionDeclaration();
     auto callable = semantics_->GetCallable(callable_id);
     auto callable = semantics_->GetCallable(callable_id);
 
 
     if (!TryTypeConversionOnArgs(call_expr_parse_node, ir_id, refs_id,
     if (!TryTypeConversionOnArgs(call_expr_parse_node, ir_id, refs_id,
@@ -496,14 +503,16 @@ auto SemanticsParseTreeHandler::HandleFunctionDefinitionStart(
   auto fn_node =
   auto fn_node =
       node_stack_.PopForSoloParseNode(ParseNodeKind::FunctionIntroducer);
       node_stack_.PopForSoloParseNode(ParseNodeKind::FunctionIntroducer);
 
 
+  auto name_str = parse_tree_->GetNodeText(name_node);
+  auto name_id = semantics_->AddString(name_str);
+
   auto callable_id =
   auto callable_id =
       semantics_->AddCallable({.param_ir_id = param_ir_id,
       semantics_->AddCallable({.param_ir_id = param_ir_id,
                                .param_refs_id = param_refs_id,
                                .param_refs_id = param_refs_id,
                                .return_type_id = return_type_id});
                                .return_type_id = return_type_id});
-  auto decl_id =
-      AddNode(SemanticsNode::MakeFunctionDeclaration(fn_node, callable_id));
-  // TODO: Propagate the type of the function.
-  BindName(name_node, SemanticsNodeId::Invalid, decl_id);
+  auto decl_id = AddNode(
+      SemanticsNode::MakeFunctionDeclaration(fn_node, name_id, callable_id));
+  AddNameToLookup(name_node, name_id, decl_id);
 
 
   node_block_stack_.Push();
   node_block_stack_.Push();
   PushScope();
   PushScope();
@@ -657,7 +666,7 @@ auto SemanticsParseTreeHandler::HandleNameReference(ParseTree::Node parse_node)
     node_stack_.Push(parse_node, SemanticsNodeId::BuiltinInvalidType);
     node_stack_.Push(parse_node, SemanticsNodeId::BuiltinInvalidType);
   };
   };
 
 
-  auto name_id = semantics_->GetString(name_str);
+  auto name_id = semantics_->GetStringID(name_str);
   if (!name_id) {
   if (!name_id) {
     name_not_found();
     name_not_found();
     return true;
     return true;
@@ -784,7 +793,7 @@ auto SemanticsParseTreeHandler::HandleReturnStatement(
   CARBON_CHECK(!return_scope_stack_.empty());
   CARBON_CHECK(!return_scope_stack_.empty());
   const auto& fn_node = semantics_->GetNode(return_scope_stack_.back());
   const auto& fn_node = semantics_->GetNode(return_scope_stack_.back());
   const auto callable =
   const auto callable =
-      semantics_->GetCallable(fn_node.GetAsFunctionDeclaration());
+      semantics_->GetCallable(fn_node.GetAsFunctionDeclaration().second);
 
 
   if (parse_tree_->node_kind(node_stack_.PeekParseNode()) ==
   if (parse_tree_->node_kind(node_stack_.PeekParseNode()) ==
       ParseNodeKind::ReturnStatementStart) {
       ParseNodeKind::ReturnStatementStart) {
@@ -937,7 +946,7 @@ auto SemanticsParseTreeHandler::HandleVariableDeclaration(
     auto binding = node_stack_.PopForParseNodeAndNameId();
     auto binding = node_stack_.PopForParseNodeAndNameId();
 
 
     // Restore the name now that the initializer is complete.
     // Restore the name now that the initializer is complete.
-    AddNameToLookup(binding.second, storage_id);
+    ReaddNameToLookup(binding.second, storage_id);
 
 
     auto storage_type =
     auto storage_type =
         TryTypeConversion(parse_node, storage_id, last_child.second,
         TryTypeConversion(parse_node, storage_id, last_child.second,

+ 6 - 2
toolchain/semantics/semantics_parse_tree_handler.h

@@ -79,9 +79,13 @@ class SemanticsParseTreeHandler {
   // result.
   // result.
   auto AddNodeAndPush(ParseTree::Node parse_node, SemanticsNode node) -> void;
   auto AddNodeAndPush(ParseTree::Node parse_node, SemanticsNode node) -> void;
 
 
-  // Adds a name to name lookup. This is typically done through BindName, but
+  // Adds a name to name lookup.
+  auto AddNameToLookup(ParseTree::Node name_node, SemanticsStringId name_id,
+                       SemanticsNodeId target_id) -> void;
+
+  // Re-adds a name to name lookup. This is typically done through BindName, but
   // can also be used to restore removed names.
   // can also be used to restore removed names.
-  auto AddNameToLookup(SemanticsStringId name_id, SemanticsNodeId storage_id)
+  auto ReaddNameToLookup(SemanticsStringId name_id, SemanticsNodeId storage_id)
       -> void {
       -> void {
     name_lookup_[name_id].push_back(storage_id);
     name_lookup_[name_id].push_back(storage_id);
   }
   }

+ 1 - 3
toolchain/semantics/testdata/basics/fail_name_lookup.carbon

@@ -25,8 +25,7 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str0, arg1: callable0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block0},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
@@ -35,7 +34,6 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node9,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 1 - 1
toolchain/semantics/testdata/basics/verbose.carbon

@@ -7,7 +7,7 @@
 //
 //
 // Only checks a couple statements in order to minimize manual update churn.
 // Only checks a couple statements in order to minimize manual update churn.
 // CHECK:STDERR: Node Push 0: FunctionIntroducer -> <none>
 // CHECK:STDERR: Node Push 0: FunctionIntroducer -> <none>
-// CHECK:STDERR: AddNode block{{[0-9]+}}: {kind: BindName, arg0: str{{[0-9]+}}, arg1: node{{[0-9]+}}}
+// CHECK:STDERR: AddNode block{{[0-9]+}}: {kind: FunctionDeclaration, arg0: str{{[0-9]+}}, arg1: callable{{[0-9]+}}}
 
 
 fn Foo() {
 fn Foo() {
   return;
   return;

+ 31 - 39
toolchain/semantics/testdata/function/call/fail_param_count.carbon

@@ -39,30 +39,26 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str0, arg1: callable0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block0},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node10, type: node2},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable1},
-// CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node12},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node12, arg1: block0},
+// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9, type: node2},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str2, arg1: callable1},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node11, arg1: block0},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node15, type: node2},
+// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node13, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str3, arg1: node17, type: node2},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str4, arg1: node19},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node19, arg1: block0},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable3},
-// CHECK:STDOUT:   {kind: BindName, arg0: str5, arg1: node22},
+// CHECK:STDOUT:   {kind: BindName, arg0: str3, arg1: node15, type: node2},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str4, arg1: callable2},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node17, arg1: block0},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str5, arg1: callable3},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int1, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int1, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int2, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int2, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int3, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int3, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int4, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int4, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int5, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int5, type: node2},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node22, arg1: block0},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node19, arg1: block0},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
@@ -70,61 +66,57 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node9,
+// CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node12,
-// CHECK:STDOUT:     node13,
-// CHECK:STDOUT:     node14,
+// CHECK:STDOUT:     node17,
+// CHECK:STDOUT:     node18,
 // CHECK:STDOUT:     node19,
 // CHECK:STDOUT:     node19,
-// CHECK:STDOUT:     node20,
-// CHECK:STDOUT:     node21,
-// CHECK:STDOUT:     node22,
-// CHECK:STDOUT:     node23,
-// CHECK:STDOUT:     node30,
+// CHECK:STDOUT:     node26,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node10,
-// CHECK:STDOUT:     node11,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node11,
+// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node13,
+// CHECK:STDOUT:     node14,
 // CHECK:STDOUT:     node15,
 // CHECK:STDOUT:     node15,
 // CHECK:STDOUT:     node16,
 // CHECK:STDOUT:     node16,
-// CHECK:STDOUT:     node17,
-// CHECK:STDOUT:     node18,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node14,
 // CHECK:STDOUT:     node16,
 // CHECK:STDOUT:     node16,
-// CHECK:STDOUT:     node18,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node24,
+// CHECK:STDOUT:     node20,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node24,
+// CHECK:STDOUT:     node20,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node25,
-// CHECK:STDOUT:     node26,
+// CHECK:STDOUT:     node21,
+// CHECK:STDOUT:     node22,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node25,
-// CHECK:STDOUT:     node26,
+// CHECK:STDOUT:     node21,
+// CHECK:STDOUT:     node22,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node27,
-// CHECK:STDOUT:     node28,
+// CHECK:STDOUT:     node23,
+// CHECK:STDOUT:     node24,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node27,
-// CHECK:STDOUT:     node28,
+// CHECK:STDOUT:     node23,
+// CHECK:STDOUT:     node24,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node29,
+// CHECK:STDOUT:     node25,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node29,
+// CHECK:STDOUT:     node25,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 5 - 9
toolchain/semantics/testdata/function/call/fail_param_type.carbon

@@ -31,13 +31,11 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str1, arg1: callable0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node9, arg1: block0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node9, arg1: block0},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable1},
-// CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node12},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str2, arg1: callable1},
 // CHECK:STDOUT:   {kind: RealLiteral, arg0: real0, type: node3},
 // CHECK:STDOUT:   {kind: RealLiteral, arg0: real0, type: node3},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node12, arg1: block0},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node11, arg1: block0},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
@@ -53,15 +51,13 @@
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node11,
-// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node13,
 // CHECK:STDOUT:     node13,
-// CHECK:STDOUT:     node15,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node14,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node14,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 13 - 17
toolchain/semantics/testdata/function/call/more_param_ir.carbon

@@ -43,22 +43,20 @@
 // CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node11, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node11, type: node2},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str3, arg1: node13},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str3, arg1: callable0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node13, arg1: block0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node13, arg1: block0},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable1},
-// CHECK:STDOUT:   {kind: BindName, arg0: str4, arg1: node16},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str4, arg1: callable1},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int1, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int1, type: node2},
-// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node18, arg1: node19, type: node2},
+// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node16, arg1: node17, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int2, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int2, type: node2},
-// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node20, arg1: node21, type: node2},
+// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node18, arg1: node19, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int3, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int3, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int4, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int4, type: node2},
-// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node23, arg1: node24, type: node2},
+// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node21, arg1: node22, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int5, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int5, type: node2},
 // CHECK:STDOUT:   {kind: Call, arg0: call0, arg1: callable0, type: node6},
 // CHECK:STDOUT:   {kind: Call, arg0: call0, arg1: callable0, type: node6},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node16, arg1: block6},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node15, arg1: block6},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
@@ -80,11 +78,11 @@
 // CHECK:STDOUT:     node13,
 // CHECK:STDOUT:     node13,
 // CHECK:STDOUT:     node14,
 // CHECK:STDOUT:     node14,
 // CHECK:STDOUT:     node15,
 // CHECK:STDOUT:     node15,
-// CHECK:STDOUT:     node16,
-// CHECK:STDOUT:     node17,
-// CHECK:STDOUT:     node28,
+// CHECK:STDOUT:     node26,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node16,
+// CHECK:STDOUT:     node17,
 // CHECK:STDOUT:     node18,
 // CHECK:STDOUT:     node18,
 // CHECK:STDOUT:     node19,
 // CHECK:STDOUT:     node19,
 // CHECK:STDOUT:     node20,
 // CHECK:STDOUT:     node20,
@@ -92,16 +90,14 @@
 // CHECK:STDOUT:     node22,
 // CHECK:STDOUT:     node22,
 // CHECK:STDOUT:     node23,
 // CHECK:STDOUT:     node23,
 // CHECK:STDOUT:     node24,
 // CHECK:STDOUT:     node24,
-// CHECK:STDOUT:     node25,
-// CHECK:STDOUT:     node26,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node22,
-// CHECK:STDOUT:     node25,
-// CHECK:STDOUT:     node26,
+// CHECK:STDOUT:     node20,
+// CHECK:STDOUT:     node23,
+// CHECK:STDOUT:     node24,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node27,
+// CHECK:STDOUT:     node25,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 7 - 11
toolchain/semantics/testdata/function/call/params_one.carbon

@@ -32,14 +32,12 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str1, arg1: callable0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node9, arg1: block0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node9, arg1: block0},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable1},
-// CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node12},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str2, arg1: callable1},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: Call, arg0: call0, arg1: callable0, type: node6},
 // CHECK:STDOUT:   {kind: Call, arg0: call0, arg1: callable0, type: node6},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node12, arg1: block6},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node11, arg1: block6},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
@@ -55,18 +53,16 @@
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node11,
-// CHECK:STDOUT:     node12,
-// CHECK:STDOUT:     node13,
-// CHECK:STDOUT:     node16,
+// CHECK:STDOUT:     node14,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node14,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node14,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node15,
+// CHECK:STDOUT:     node13,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 9 - 13
toolchain/semantics/testdata/function/call/params_one_comma.carbon

@@ -34,16 +34,14 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str1, arg1: callable0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node9, arg1: block0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node9, arg1: block0},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable1},
-// CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node12},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str2, arg1: callable1},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: Call, arg0: call0, arg1: callable0, type: node6},
 // CHECK:STDOUT:   {kind: Call, arg0: call0, arg1: callable0, type: node6},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int1, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int1, type: node2},
 // CHECK:STDOUT:   {kind: Call, arg0: call1, arg1: callable0, type: node6},
 // CHECK:STDOUT:   {kind: Call, arg0: call1, arg1: callable0, type: node6},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node12, arg1: block6},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node11, arg1: block6},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
@@ -59,25 +57,23 @@
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node11,
-// CHECK:STDOUT:     node12,
-// CHECK:STDOUT:     node13,
-// CHECK:STDOUT:     node18,
+// CHECK:STDOUT:     node16,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node14,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node14,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node13,
 // CHECK:STDOUT:     node15,
 // CHECK:STDOUT:     node15,
-// CHECK:STDOUT:     node17,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node16,
+// CHECK:STDOUT:     node14,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node16,
+// CHECK:STDOUT:     node14,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 8 - 12
toolchain/semantics/testdata/function/call/params_two.carbon

@@ -36,15 +36,13 @@
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9, type: node2},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node11},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str2, arg1: callable0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node11, arg1: block0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node11, arg1: block0},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable1},
-// CHECK:STDOUT:   {kind: BindName, arg0: str3, arg1: node14},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str3, arg1: callable1},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int1, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int1, type: node2},
 // CHECK:STDOUT:   {kind: Call, arg0: call0, arg1: callable0, type: node6},
 // CHECK:STDOUT:   {kind: Call, arg0: call0, arg1: callable0, type: node6},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node14, arg1: block6},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node13, arg1: block6},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
@@ -63,20 +61,18 @@
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node13,
 // CHECK:STDOUT:     node13,
+// CHECK:STDOUT:     node17,
+// CHECK:STDOUT:   ],
+// CHECK:STDOUT:   [
 // CHECK:STDOUT:     node14,
 // CHECK:STDOUT:     node14,
 // CHECK:STDOUT:     node15,
 // CHECK:STDOUT:     node15,
-// CHECK:STDOUT:     node19,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node16,
-// CHECK:STDOUT:     node17,
+// CHECK:STDOUT:     node14,
+// CHECK:STDOUT:     node15,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node16,
 // CHECK:STDOUT:     node16,
-// CHECK:STDOUT:     node17,
-// CHECK:STDOUT:   ],
-// CHECK:STDOUT:   [
-// CHECK:STDOUT:     node18,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 12 - 16
toolchain/semantics/testdata/function/call/params_two_comma.carbon

@@ -39,18 +39,16 @@
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9, type: node2},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node11},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str2, arg1: callable0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node11, arg1: block0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node11, arg1: block0},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable1},
-// CHECK:STDOUT:   {kind: BindName, arg0: str3, arg1: node14},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str3, arg1: callable1},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int1, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int1, type: node2},
 // CHECK:STDOUT:   {kind: Call, arg0: call0, arg1: callable0, type: node6},
 // CHECK:STDOUT:   {kind: Call, arg0: call0, arg1: callable0, type: node6},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int2, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int2, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int3, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int3, type: node2},
 // CHECK:STDOUT:   {kind: Call, arg0: call1, arg1: callable0, type: node6},
 // CHECK:STDOUT:   {kind: Call, arg0: call1, arg1: callable0, type: node6},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node14, arg1: block6},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node13, arg1: block6},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
@@ -69,29 +67,27 @@
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node13,
 // CHECK:STDOUT:     node13,
+// CHECK:STDOUT:     node20,
+// CHECK:STDOUT:   ],
+// CHECK:STDOUT:   [
 // CHECK:STDOUT:     node14,
 // CHECK:STDOUT:     node14,
 // CHECK:STDOUT:     node15,
 // CHECK:STDOUT:     node15,
-// CHECK:STDOUT:     node22,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node16,
-// CHECK:STDOUT:     node17,
+// CHECK:STDOUT:     node14,
+// CHECK:STDOUT:     node15,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node16,
 // CHECK:STDOUT:     node16,
-// CHECK:STDOUT:     node17,
+// CHECK:STDOUT:     node19,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node17,
 // CHECK:STDOUT:     node18,
 // CHECK:STDOUT:     node18,
-// CHECK:STDOUT:     node21,
-// CHECK:STDOUT:   ],
-// CHECK:STDOUT:   [
-// CHECK:STDOUT:     node19,
-// CHECK:STDOUT:     node20,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node19,
-// CHECK:STDOUT:     node20,
+// CHECK:STDOUT:     node17,
+// CHECK:STDOUT:     node18,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 4 - 8
toolchain/semantics/testdata/function/call/params_zero.carbon

@@ -28,13 +28,11 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str0, arg1: callable0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block0},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable1},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node10},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str1, arg1: callable1},
 // CHECK:STDOUT:   {kind: Call, arg0: call0, arg1: callable0, type: node6},
 // CHECK:STDOUT:   {kind: Call, arg0: call0, arg1: callable0, type: node6},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node10, arg1: block2},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node9, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
@@ -43,12 +41,10 @@
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node9,
-// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node11,
-// CHECK:STDOUT:     node13,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node12,
+// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 1 - 3
toolchain/semantics/testdata/function/definition/fail_param_name_conflict.carbon

@@ -30,8 +30,7 @@
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node9, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node9, type: node2},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node11},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str1, arg1: callable0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node11, arg1: block0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node11, arg1: block0},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
@@ -50,7 +49,6 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node12,
-// CHECK:STDOUT:     node13,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 5 - 11
toolchain/semantics/testdata/function/definition/order.carbon

@@ -29,15 +29,12 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str0, arg1: callable0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block0},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable1},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node10},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node10, arg1: block0},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node13},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node13, arg1: block0},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str1, arg1: callable1},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node9, arg1: block0},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str2, arg1: callable2},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node11, arg1: block0},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
@@ -49,9 +46,6 @@
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node12,
-// CHECK:STDOUT:     node13,
-// CHECK:STDOUT:     node14,
-// CHECK:STDOUT:     node15,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 1 - 3
toolchain/semantics/testdata/function/definition/params_one.carbon

@@ -28,8 +28,7 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str1, arg1: callable0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node9, arg1: block0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node9, arg1: block0},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
@@ -45,7 +44,6 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node10,
-// CHECK:STDOUT:     node11,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 1 - 3
toolchain/semantics/testdata/function/definition/params_one_comma.carbon

@@ -28,8 +28,7 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str1, arg1: callable0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node9, arg1: block0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node9, arg1: block0},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
@@ -45,7 +44,6 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node10,
-// CHECK:STDOUT:     node11,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 1 - 3
toolchain/semantics/testdata/function/definition/params_two.carbon

@@ -31,8 +31,7 @@
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9, type: node2},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node11},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str2, arg1: callable0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node11, arg1: block0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node11, arg1: block0},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
@@ -51,7 +50,6 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node12,
-// CHECK:STDOUT:     node13,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 1 - 3
toolchain/semantics/testdata/function/definition/params_two_comma.carbon

@@ -31,8 +31,7 @@
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9, type: node2},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node11},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str2, arg1: callable0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node11, arg1: block0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node11, arg1: block0},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
@@ -51,7 +50,6 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node12,
-// CHECK:STDOUT:     node13,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 1 - 3
toolchain/semantics/testdata/function/definition/params_zero.carbon

@@ -25,8 +25,7 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str0, arg1: callable0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block0},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
@@ -35,7 +34,6 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node9,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 7 - 11
toolchain/semantics/testdata/function/definition/same_param_name.carbon

@@ -30,14 +30,12 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str1, arg1: callable0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node9, arg1: block0},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node9, arg1: block0},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node12, type: node2},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable1},
-// CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node14},
-// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node14, arg1: block0},
+// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node11, type: node2},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str2, arg1: callable1},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node13, arg1: block0},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
@@ -52,17 +50,15 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node10,
-// CHECK:STDOUT:     node11,
+// CHECK:STDOUT:     node13,
 // CHECK:STDOUT:     node14,
 // CHECK:STDOUT:     node14,
-// CHECK:STDOUT:     node15,
-// CHECK:STDOUT:     node16,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node12,
-// CHECK:STDOUT:     node13,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node13,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 5 - 7
toolchain/semantics/testdata/operators/binary_op.carbon

@@ -27,12 +27,11 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str0, arg1: callable0},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int1, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int1, type: node2},
-// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node9, arg1: node10, type: node2},
-// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node11, type: node2},
+// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node8, arg1: node9, type: node2},
+// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node10, type: node2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
@@ -40,14 +39,13 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node13,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node11,
-// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 5 - 7
toolchain/semantics/testdata/operators/fail_type_mismatch.carbon

@@ -27,12 +27,11 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str0, arg1: callable0},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: RealLiteral, arg0: real0, type: node3},
 // CHECK:STDOUT:   {kind: RealLiteral, arg0: real0, type: node3},
-// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node9, arg1: node10, type: node1},
-// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node11, type: node1},
+// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node8, arg1: node9, type: node1},
+// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node10, type: node1},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
@@ -40,14 +39,13 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node13,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node11,
-// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 6 - 8
toolchain/semantics/testdata/operators/fail_type_mismatch_once.carbon

@@ -28,14 +28,13 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str0, arg1: callable0},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: RealLiteral, arg0: real0, type: node3},
 // CHECK:STDOUT:   {kind: RealLiteral, arg0: real0, type: node3},
-// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node9, arg1: node10, type: node1},
+// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node8, arg1: node9, type: node1},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int1, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int1, type: node2},
-// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node11, arg1: node12, type: node1},
-// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node13, type: node1},
+// CHECK:STDOUT:   {kind: BinaryOperatorAdd, arg0: node10, arg1: node11, type: node1},
+// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node12, type: node1},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
@@ -43,16 +42,15 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node15,
+// CHECK:STDOUT:     node14,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node13,
 // CHECK:STDOUT:     node13,
-// CHECK:STDOUT:     node14,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 4 - 6
toolchain/semantics/testdata/return/fail_type_mismatch.carbon

@@ -26,10 +26,9 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str0, arg1: callable0},
 // CHECK:STDOUT:   {kind: RealLiteral, arg0: real0, type: node3},
 // CHECK:STDOUT:   {kind: RealLiteral, arg0: real0, type: node3},
-// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node9},
+// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node8},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
@@ -37,12 +36,11 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node11,
+// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node9,
-// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 4 - 6
toolchain/semantics/testdata/return/fail_value_disallowed.carbon

@@ -26,10 +26,9 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str0, arg1: callable0},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
-// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node9, type: node2},
+// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node8, type: node2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
@@ -37,12 +36,11 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node11,
+// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node9,
-// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 3 - 5
toolchain/semantics/testdata/return/fail_value_missing.carbon

@@ -25,8 +25,7 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str0, arg1: callable0},
 // CHECK:STDOUT:   {kind: Return},
 // CHECK:STDOUT:   {kind: Return},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
@@ -35,11 +34,10 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node10,
+// CHECK:STDOUT:     node9,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node9,
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 3 - 5
toolchain/semantics/testdata/return/no_value.carbon

@@ -25,8 +25,7 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str0, arg1: callable0},
 // CHECK:STDOUT:   {kind: Return},
 // CHECK:STDOUT:   {kind: Return},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
@@ -35,11 +34,10 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node10,
+// CHECK:STDOUT:     node9,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node9,
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 4 - 6
toolchain/semantics/testdata/return/value.carbon

@@ -26,10 +26,9 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str0, arg1: callable0},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
-// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node9, type: node2},
+// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node8, type: node2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
@@ -37,12 +36,11 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node11,
+// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node9,
-// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 4 - 6
toolchain/semantics/testdata/var/decl.carbon

@@ -26,10 +26,9 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str0, arg1: callable0},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9, type: node2},
+// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node8, type: node2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
@@ -37,12 +36,11 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node11,
+// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node9,
-// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 5 - 7
toolchain/semantics/testdata/var/decl_with_init.carbon

@@ -27,12 +27,11 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str0, arg1: callable0},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9, type: node2},
+// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node8, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
-// CHECK:STDOUT:   {kind: Assign, arg0: node9, arg1: node11, type: node2},
+// CHECK:STDOUT:   {kind: Assign, arg0: node8, arg1: node10, type: node2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
@@ -40,14 +39,13 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node13,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node11,
-// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 7 - 9
toolchain/semantics/testdata/var/fail_duplicate_decl.carbon

@@ -28,16 +28,15 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str0, arg1: callable0},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9, type: node2},
+// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node8, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
-// CHECK:STDOUT:   {kind: Assign, arg0: node9, arg1: node11, type: node2},
+// CHECK:STDOUT:   {kind: Assign, arg0: node8, arg1: node10, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node13, type: node2},
+// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node12, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int1, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int1, type: node2},
-// CHECK:STDOUT:   {kind: Assign, arg0: node9, arg1: node15, type: node2},
+// CHECK:STDOUT:   {kind: Assign, arg0: node8, arg1: node14, type: node2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
@@ -45,10 +44,10 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node17,
+// CHECK:STDOUT:     node16,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node11,
@@ -56,7 +55,6 @@
 // CHECK:STDOUT:     node13,
 // CHECK:STDOUT:     node13,
 // CHECK:STDOUT:     node14,
 // CHECK:STDOUT:     node14,
 // CHECK:STDOUT:     node15,
 // CHECK:STDOUT:     node15,
-// CHECK:STDOUT:     node16,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 5 - 7
toolchain/semantics/testdata/var/fail_init_type_mismatch.carbon

@@ -27,12 +27,11 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str0, arg1: callable0},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9, type: node2},
+// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node8, type: node2},
 // CHECK:STDOUT:   {kind: RealLiteral, arg0: real0, type: node3},
 // CHECK:STDOUT:   {kind: RealLiteral, arg0: real0, type: node3},
-// CHECK:STDOUT:   {kind: Assign, arg0: node9, arg1: node11, type: node1},
+// CHECK:STDOUT:   {kind: Assign, arg0: node8, arg1: node10, type: node1},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
@@ -40,14 +39,13 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node13,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node11,
-// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 5 - 7
toolchain/semantics/testdata/var/fail_init_with_self.carbon

@@ -26,11 +26,10 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str0, arg1: callable0},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9, type: node2},
-// CHECK:STDOUT:   {kind: Assign, arg0: node9, arg1: node1, type: node1},
+// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node8, type: node2},
+// CHECK:STDOUT:   {kind: Assign, arg0: node8, arg1: node1, type: node1},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
@@ -38,13 +37,12 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node12,
+// CHECK:STDOUT:     node11,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node10,
-// CHECK:STDOUT:     node11,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 6 - 8
toolchain/semantics/testdata/var/fail_lookup_outside_scope.carbon

@@ -27,29 +27,27 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str0, arg1: callable0},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9, type: node2},
+// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node8, type: node2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node12, type: node2},
-// CHECK:STDOUT:   {kind: Assign, arg0: node12, arg1: node1, type: node1},
+// CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node11, type: node2},
+// CHECK:STDOUT:   {kind: Assign, arg0: node11, arg1: node1, type: node1},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
+// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node13,
 // CHECK:STDOUT:     node13,
-// CHECK:STDOUT:     node14,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node9,
-// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 5 - 7
toolchain/semantics/testdata/var/global_lookup_in_scope.carbon

@@ -32,11 +32,10 @@
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
 // CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: Assign, arg0: node7, arg1: node9, type: node2},
 // CHECK:STDOUT:   {kind: Assign, arg0: node7, arg1: node9, type: node2},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node11},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str1, arg1: callable0},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node13, type: node2},
-// CHECK:STDOUT:   {kind: Assign, arg0: node13, arg1: node7, type: node2},
+// CHECK:STDOUT:   {kind: BindName, arg0: str2, arg1: node12, type: node2},
+// CHECK:STDOUT:   {kind: Assign, arg0: node12, arg1: node7, type: node2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node11, arg1: block2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node11, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
@@ -48,13 +47,12 @@
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node11,
-// CHECK:STDOUT:     node12,
-// CHECK:STDOUT:     node16,
+// CHECK:STDOUT:     node15,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node13,
 // CHECK:STDOUT:     node13,
 // CHECK:STDOUT:     node14,
 // CHECK:STDOUT:     node14,
-// CHECK:STDOUT:     node15,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 
 

+ 5 - 7
toolchain/semantics/testdata/var/lookup.carbon

@@ -27,12 +27,11 @@
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node5, type: node0},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
 // CHECK:STDOUT:   {kind: CrossReference, arg0: ir0, arg1: node6, type: node5},
-// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: callable0},
-// CHECK:STDOUT:   {kind: BindName, arg0: str0, arg1: node7},
+// CHECK:STDOUT:   {kind: FunctionDeclaration, arg0: str0, arg1: callable0},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
 // CHECK:STDOUT:   {kind: VarStorage, type: node2},
-// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node9, type: node2},
+// CHECK:STDOUT:   {kind: BindName, arg0: str1, arg1: node8, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int0, type: node2},
-// CHECK:STDOUT:   {kind: Assign, arg0: node9, arg1: node11, type: node2},
+// CHECK:STDOUT:   {kind: Assign, arg0: node8, arg1: node10, type: node2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT: node_blocks: [
@@ -40,14 +39,13 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node13,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node11,
-// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: ]