Răsfoiți Sursa

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 ani în urmă
părinte
comite
32e8fee4ad
46 a modificat fișierele cu 550 adăugiri și 321 ștergeri
  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;
 
+  // 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";
   llvm::LLVMContext llvm_context;
   const std::unique_ptr<llvm::Module> module =

+ 14 - 1
toolchain/lowering/BUILD

@@ -8,10 +8,23 @@ cc_library(
     name = "lower_to_llvm",
     srcs = ["lower_to_llvm.cpp"],
     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 = [
         "//common:check",
-        "//common:ostream",
         "//toolchain/semantics:semantics_ir",
+        "//toolchain/semantics:semantics_node",
+        "//toolchain/semantics:semantics_node_kind",
         "@llvm-project//llvm:Core",
         "@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/lowering.h"
+
 namespace Carbon {
 
 auto LowerToLLVM(llvm::LLVMContext& llvm_context, llvm::StringRef module_name,
-                 const SemanticsIR& /*semantics_ir*/)
+                 const SemanticsIR& semantics_ir)
     -> 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

+ 0 - 1
toolchain/lowering/lower_to_llvm.h

@@ -5,7 +5,6 @@
 #ifndef 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/Module.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.
   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.
   auto has_errors() const -> bool { return has_errors_; }
 
@@ -103,11 +134,6 @@ class SemanticsIR {
     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.
   auto AddIntegerLiteral(llvm::APInt integer_literal)
       -> SemanticsIntegerLiteralId {
@@ -125,11 +151,6 @@ class SemanticsIR {
     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.
   auto GetType(SemanticsNodeId node_id) -> SemanticsNodeId {
     return GetNode(node_id).type();
@@ -159,7 +180,7 @@ class SemanticsIR {
   // Adds an string, returning an ID to reference it.
   auto AddString(llvm::StringRef str) -> SemanticsStringId {
     // 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;
     }
 
@@ -171,7 +192,7 @@ class SemanticsIR {
   }
 
   // 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);
     if (str_find != string_to_id_.end()) {
       return str_find->second;
@@ -209,6 +230,9 @@ class SemanticsIR {
 
   // Storage for blocks within the IR. These reference entries in nodes_.
   llvm::SmallVector<llvm::SmallVector<SemanticsNodeId>> node_blocks_;
+
+  // The top node block ID.
+  SemanticsNodeBlockId top_node_block_id_ = SemanticsNodeBlockId::Invalid;
 };
 
 }  // namespace Carbon

+ 7 - 5
toolchain/semantics/semantics_node.h

@@ -203,16 +203,18 @@ class SemanticsNode {
     return {SemanticsCrossReferenceIRId(arg0_), SemanticsNodeId(arg1_)};
   }
 
-  // TODO: The signature should be added as a parameter.
   static auto MakeFunctionDeclaration(ParseTree::Node parse_node,
-                                      SemanticsCallableId signature)
+                                      SemanticsStringId name_id,
+                                      SemanticsCallableId signature_id)
       -> SemanticsNode {
     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);
-    return {SemanticsCallableId(arg0_)};
+    return {SemanticsStringId(arg0_), SemanticsCallableId(arg1_)};
   }
 
   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.
-  node_block_stack_.Pop();
+  semantics_->top_node_block_id_ = node_block_stack_.Pop();
   PopScope();
 
   // 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);
 }
 
-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);
   if (inserted) {
     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 = 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)
         .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;
 }
 
@@ -319,7 +326,7 @@ auto SemanticsParseTreeHandler::HandleCallExpression(ParseTree::Node parse_node)
       return true;
     }
 
-    auto callable_id = name_node.GetAsFunctionDeclaration();
+    auto [_, callable_id] = name_node.GetAsFunctionDeclaration();
     auto callable = semantics_->GetCallable(callable_id);
 
     if (!TryTypeConversionOnArgs(call_expr_parse_node, ir_id, refs_id,
@@ -496,14 +503,16 @@ auto SemanticsParseTreeHandler::HandleFunctionDefinitionStart(
   auto fn_node =
       node_stack_.PopForSoloParseNode(ParseNodeKind::FunctionIntroducer);
 
+  auto name_str = parse_tree_->GetNodeText(name_node);
+  auto name_id = semantics_->AddString(name_str);
+
   auto callable_id =
       semantics_->AddCallable({.param_ir_id = param_ir_id,
                                .param_refs_id = param_refs_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();
   PushScope();
@@ -657,7 +666,7 @@ auto SemanticsParseTreeHandler::HandleNameReference(ParseTree::Node parse_node)
     node_stack_.Push(parse_node, SemanticsNodeId::BuiltinInvalidType);
   };
 
-  auto name_id = semantics_->GetString(name_str);
+  auto name_id = semantics_->GetStringID(name_str);
   if (!name_id) {
     name_not_found();
     return true;
@@ -784,7 +793,7 @@ auto SemanticsParseTreeHandler::HandleReturnStatement(
   CARBON_CHECK(!return_scope_stack_.empty());
   const auto& fn_node = semantics_->GetNode(return_scope_stack_.back());
   const auto callable =
-      semantics_->GetCallable(fn_node.GetAsFunctionDeclaration());
+      semantics_->GetCallable(fn_node.GetAsFunctionDeclaration().second);
 
   if (parse_tree_->node_kind(node_stack_.PeekParseNode()) ==
       ParseNodeKind::ReturnStatementStart) {
@@ -937,7 +946,7 @@ auto SemanticsParseTreeHandler::HandleVariableDeclaration(
     auto binding = node_stack_.PopForParseNodeAndNameId();
 
     // Restore the name now that the initializer is complete.
-    AddNameToLookup(binding.second, storage_id);
+    ReaddNameToLookup(binding.second, storage_id);
 
     auto storage_type =
         TryTypeConversion(parse_node, storage_id, last_child.second,

+ 6 - 2
toolchain/semantics/semantics_parse_tree_handler.h

@@ -79,9 +79,13 @@ class SemanticsParseTreeHandler {
   // result.
   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.
-  auto AddNameToLookup(SemanticsStringId name_id, SemanticsNodeId storage_id)
+  auto ReaddNameToLookup(SemanticsStringId name_id, SemanticsNodeId storage_id)
       -> void {
     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: node5, type: node0},
 // 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: ]
 // CHECK:STDOUT: node_blocks: [
@@ -35,7 +34,6 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node9,
 // 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.
 // 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() {
   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: node5, type: node0},
 // 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: 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: 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: 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: int1, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int2, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int3, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int4, 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: node_blocks: [
 // CHECK:STDOUT:   [
@@ -70,61 +66,57 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node9,
+// CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
-// CHECK:STDOUT:     node13,
-// CHECK:STDOUT:     node14,
+// CHECK:STDOUT:     node17,
+// CHECK:STDOUT:     node18,
 // 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:     node9,
 // CHECK:STDOUT:     node10,
-// CHECK:STDOUT:     node11,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node11,
+// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node13,
+// CHECK:STDOUT:     node14,
 // CHECK:STDOUT:     node15,
 // CHECK:STDOUT:     node16,
-// CHECK:STDOUT:     node17,
-// CHECK:STDOUT:     node18,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node14,
 // CHECK:STDOUT:     node16,
-// CHECK:STDOUT:     node18,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node24,
+// CHECK:STDOUT:     node20,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node24,
+// CHECK:STDOUT:     node20,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node25,
-// CHECK:STDOUT:     node26,
+// CHECK:STDOUT:     node21,
+// CHECK:STDOUT:     node22,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node25,
-// CHECK:STDOUT:     node26,
+// CHECK:STDOUT:     node21,
+// CHECK:STDOUT:     node22,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node27,
-// CHECK:STDOUT:     node28,
+// CHECK:STDOUT:     node23,
+// CHECK:STDOUT:     node24,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node27,
-// CHECK:STDOUT:     node28,
+// CHECK:STDOUT:     node23,
+// CHECK:STDOUT:     node24,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node29,
+// CHECK:STDOUT:     node25,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node29,
+// CHECK:STDOUT:     node25,
 // 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: VarStorage, 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: 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: FunctionDefinition, arg0: node12, arg1: block0},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node11, arg1: block0},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
@@ -53,15 +51,13 @@
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
-// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node13,
-// CHECK:STDOUT:     node15,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node14,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node14,
+// CHECK:STDOUT:     node12,
 // 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: VarStorage, 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: 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: 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: 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: 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: 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: node_blocks: [
 // CHECK:STDOUT:   [
@@ -80,11 +78,11 @@
 // CHECK:STDOUT:     node13,
 // CHECK:STDOUT:     node14,
 // CHECK:STDOUT:     node15,
-// CHECK:STDOUT:     node16,
-// CHECK:STDOUT:     node17,
-// CHECK:STDOUT:     node28,
+// CHECK:STDOUT:     node26,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node16,
+// CHECK:STDOUT:     node17,
 // CHECK:STDOUT:     node18,
 // CHECK:STDOUT:     node19,
 // CHECK:STDOUT:     node20,
@@ -92,16 +90,14 @@
 // CHECK:STDOUT:     node22,
 // CHECK:STDOUT:     node23,
 // CHECK:STDOUT:     node24,
-// CHECK:STDOUT:     node25,
-// CHECK:STDOUT:     node26,
 // 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:     node27,
+// CHECK:STDOUT:     node25,
 // 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: VarStorage, 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: 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: 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: node_blocks: [
 // CHECK:STDOUT:   [
@@ -55,18 +53,16 @@
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
-// CHECK:STDOUT:     node12,
-// CHECK:STDOUT:     node13,
-// CHECK:STDOUT:     node16,
+// CHECK:STDOUT:     node14,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node14,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node14,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node15,
+// CHECK:STDOUT:     node13,
 // 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: VarStorage, 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: 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: Call, arg0: call0, arg1: callable0, type: node6},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int1, type: node2},
 // 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: node_blocks: [
 // CHECK:STDOUT:   [
@@ -59,25 +57,23 @@
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
-// CHECK:STDOUT:     node12,
-// CHECK:STDOUT:     node13,
-// CHECK:STDOUT:     node18,
+// CHECK:STDOUT:     node16,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node14,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node14,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node13,
 // CHECK:STDOUT:     node15,
-// CHECK:STDOUT:     node17,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node16,
+// CHECK:STDOUT:     node14,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node16,
+// CHECK:STDOUT:     node14,
 // 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: VarStorage, 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: 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: int1, type: node2},
 // 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: node_blocks: [
 // CHECK:STDOUT:   [
@@ -63,20 +61,18 @@
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node13,
+// CHECK:STDOUT:     node17,
+// CHECK:STDOUT:   ],
+// CHECK:STDOUT:   [
 // CHECK:STDOUT:     node14,
 // CHECK:STDOUT:     node15,
-// CHECK:STDOUT:     node19,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node16,
-// CHECK:STDOUT:     node17,
+// CHECK:STDOUT:     node14,
+// CHECK:STDOUT:     node15,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node16,
-// CHECK:STDOUT:     node17,
-// CHECK:STDOUT:   ],
-// CHECK:STDOUT:   [
-// CHECK:STDOUT:     node18,
 // 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: VarStorage, 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: 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: int1, type: node2},
 // CHECK:STDOUT:   {kind: Call, arg0: call0, arg1: callable0, type: node6},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int2, type: node2},
 // CHECK:STDOUT:   {kind: IntegerLiteral, arg0: int3, type: node2},
 // 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: node_blocks: [
 // CHECK:STDOUT:   [
@@ -69,29 +67,27 @@
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node13,
+// CHECK:STDOUT:     node20,
+// CHECK:STDOUT:   ],
+// CHECK:STDOUT:   [
 // CHECK:STDOUT:     node14,
 // CHECK:STDOUT:     node15,
-// CHECK:STDOUT:     node22,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node16,
-// CHECK:STDOUT:     node17,
+// CHECK:STDOUT:     node14,
+// CHECK:STDOUT:     node15,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node16,
-// CHECK:STDOUT:     node17,
+// CHECK:STDOUT:     node19,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node17,
 // CHECK:STDOUT:     node18,
-// CHECK:STDOUT:     node21,
-// CHECK:STDOUT:   ],
-// CHECK:STDOUT:   [
-// CHECK:STDOUT:     node19,
-// CHECK:STDOUT:     node20,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node19,
-// CHECK:STDOUT:     node20,
+// CHECK:STDOUT:     node17,
+// CHECK:STDOUT:     node18,
 // 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: node5, type: node0},
 // 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: 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: FunctionDefinition, arg0: node10, arg1: block2},
+// CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node9, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
 // CHECK:STDOUT:   [
@@ -43,12 +41,10 @@
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
-// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
-// CHECK:STDOUT:     node13,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node12,
+// CHECK:STDOUT:     node10,
 // 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: VarStorage, 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: ]
 // CHECK:STDOUT: node_blocks: [
@@ -50,7 +49,6 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
-// CHECK:STDOUT:     node13,
 // 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: node5, type: node0},
 // 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: 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: node_blocks: [
 // CHECK:STDOUT:   [
@@ -49,9 +46,6 @@
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
-// CHECK:STDOUT:     node13,
-// CHECK:STDOUT:     node14,
-// CHECK:STDOUT:     node15,
 // 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: VarStorage, 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: ]
 // CHECK:STDOUT: node_blocks: [
@@ -45,7 +44,6 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
-// CHECK:STDOUT:     node11,
 // 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: VarStorage, 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: ]
 // CHECK:STDOUT: node_blocks: [
@@ -45,7 +44,6 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
-// CHECK:STDOUT:     node11,
 // 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: VarStorage, 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: ]
 // CHECK:STDOUT: node_blocks: [
@@ -51,7 +50,6 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
-// CHECK:STDOUT:     node13,
 // 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: VarStorage, 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: ]
 // CHECK:STDOUT: node_blocks: [
@@ -51,7 +50,6 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
-// CHECK:STDOUT:     node13,
 // 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: node5, type: node0},
 // 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: ]
 // CHECK:STDOUT: node_blocks: [
@@ -35,7 +34,6 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
 // CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node9,
 // 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: VarStorage, 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: 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: node_blocks: [
 // CHECK:STDOUT:   [
@@ -52,17 +50,15 @@
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
-// CHECK:STDOUT:     node11,
+// CHECK:STDOUT:     node13,
 // CHECK:STDOUT:     node14,
-// CHECK:STDOUT:     node15,
-// CHECK:STDOUT:     node16,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
-// CHECK:STDOUT:     node13,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node13,
+// CHECK:STDOUT:     node12,
 // 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: node5, type: node0},
 // 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: 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: ]
 // CHECK:STDOUT: node_blocks: [
@@ -40,14 +39,13 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node13,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
-// CHECK:STDOUT:     node12,
 // 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: node5, type: node0},
 // 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: 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: ]
 // CHECK:STDOUT: node_blocks: [
@@ -40,14 +39,13 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node13,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
-// CHECK:STDOUT:     node12,
 // 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: node5, type: node0},
 // 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: 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: 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: ]
 // CHECK:STDOUT: node_blocks: [
@@ -43,16 +42,15 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node15,
+// CHECK:STDOUT:     node14,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node13,
-// CHECK:STDOUT:     node14,
 // 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: node5, type: node0},
 // 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: ReturnExpression, arg0: node9},
+// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node8},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
@@ -37,12 +36,11 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node11,
+// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
-// CHECK:STDOUT:     node10,
 // 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: node5, type: node0},
 // 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: ReturnExpression, arg0: node9, type: node2},
+// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node8, type: node2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
@@ -37,12 +36,11 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node11,
+// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
-// CHECK:STDOUT:     node10,
 // 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: node5, type: node0},
 // 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: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT: ]
@@ -35,11 +34,10 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node10,
+// CHECK:STDOUT:     node9,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node9,
+// CHECK:STDOUT:     node8,
 // 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: node5, type: node0},
 // 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: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT: ]
@@ -35,11 +34,10 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node10,
+// CHECK:STDOUT:     node9,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
-// CHECK:STDOUT:     node9,
+// CHECK:STDOUT:     node8,
 // 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: node5, type: node0},
 // 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: ReturnExpression, arg0: node9, type: node2},
+// CHECK:STDOUT:   {kind: ReturnExpression, arg0: node8, type: node2},
 // CHECK:STDOUT:   {kind: FunctionDefinition, arg0: node7, arg1: block2},
 // CHECK:STDOUT: ]
 // CHECK:STDOUT: node_blocks: [
@@ -37,12 +36,11 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node11,
+// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
-// CHECK:STDOUT:     node10,
 // 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: node5, type: node0},
 // 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: 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: ]
 // CHECK:STDOUT: node_blocks: [
@@ -37,12 +36,11 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node11,
+// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
-// CHECK:STDOUT:     node10,
 // 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: node5, type: node0},
 // 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: 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: 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: ]
 // CHECK:STDOUT: node_blocks: [
@@ -40,14 +39,13 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node13,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
-// CHECK:STDOUT:     node12,
 // 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: node5, type: node0},
 // 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: 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: 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: 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: 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: ]
 // CHECK:STDOUT: node_blocks: [
@@ -45,10 +44,10 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node17,
+// CHECK:STDOUT:     node16,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
@@ -56,7 +55,6 @@
 // CHECK:STDOUT:     node13,
 // CHECK:STDOUT:     node14,
 // CHECK:STDOUT:     node15,
-// CHECK:STDOUT:     node16,
 // 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: node5, type: node0},
 // 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: 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: 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: ]
 // CHECK:STDOUT: node_blocks: [
@@ -40,14 +39,13 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node13,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
-// CHECK:STDOUT:     node12,
 // 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: node5, type: node0},
 // 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: 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: ]
 // CHECK:STDOUT: node_blocks: [
@@ -38,13 +37,12 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node12,
+// CHECK:STDOUT:     node11,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
-// CHECK:STDOUT:     node11,
 // 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: node5, type: node0},
 // 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: 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: 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: node_blocks: [
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
+// CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
 // CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node13,
-// CHECK:STDOUT:     node14,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
-// CHECK:STDOUT:     node10,
 // 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: IntegerLiteral, arg0: int0, 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: 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: ]
 // CHECK:STDOUT: node_blocks: [
@@ -48,13 +47,12 @@
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
-// CHECK:STDOUT:     node12,
-// CHECK:STDOUT:     node16,
+// CHECK:STDOUT:     node15,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:     node13,
 // CHECK:STDOUT:     node14,
-// CHECK:STDOUT:     node15,
 // 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: node5, type: node0},
 // 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: 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: 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: ]
 // CHECK:STDOUT: node_blocks: [
@@ -40,14 +39,13 @@
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
 // CHECK:STDOUT:     node7,
-// CHECK:STDOUT:     node8,
-// CHECK:STDOUT:     node13,
+// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT:   [
+// CHECK:STDOUT:     node8,
 // CHECK:STDOUT:     node9,
 // CHECK:STDOUT:     node10,
 // CHECK:STDOUT:     node11,
-// CHECK:STDOUT:     node12,
 // CHECK:STDOUT:   ],
 // CHECK:STDOUT: ]