From e5d49f5989be981b2314f71740ea8e5d48621c0e Mon Sep 17 00:00:00 2001 From: Jon Ross-Perkins Date: Wed, 21 Dec 2022 13:13:13 -0800 Subject: [PATCH] Store SemanticsNode in a single list instead of per-block (#2475) This switches to single list storage of SemanticsNode. The driving motivation behind this is to simplify cross-references within a given IR. Types of nodes will frequently refer to other blocks. This causes a significant increase in the number of cross-references, which can become difficult to manage (and reason about). By reducing to a single list of nodes, cross-references are only needed when crossing IR boundaries. Because cross-references now only have 2 things to track (IR and index), they can be a regular SemanticsNode and don't need further indirection. This wasn't motivating, but feels like it reinforces the simplification. Note this isn't being used to deduplicate nodes, at least right now. That could lead to difficult-to-update situations, but also most nodes are associated with the underlying ParseTree::Node in order to track sources for diagnostics; as a consequence, nodes representing equal text in different source locations wouldn't be the same node. There may be future opportunities here, discussed with @zygoloid, but no action is taken at present. We may eventually want to switch the storage of NodeBlocks to have `[start, end)` ranges instead of individual numbers, but I'm leaving that alone for now. As an aside, I noticed I was accidentally overloading the copy constructor on SemanticsIR. I've added some disambiguation on that, but am not deleting the copy constructor per style advice (even though the type should never be copied due to storage size). codespell tries to change `CrossReference -> cross-reference` so disabling it there. --- .codespell_ignore | 1 + toolchain/parser/parse_tree.h | 3 + toolchain/semantics/semantics_ir.cpp | 51 +++++---- toolchain/semantics/semantics_ir.h | 104 +++--------------- toolchain/semantics/semantics_node.h | 46 ++++---- toolchain/semantics/semantics_node_kind.def | 3 + .../semantics_parse_tree_handler.cpp | 20 +--- .../semantics/semantics_parse_tree_handler.h | 3 - .../semantics/testdata/basics/empty.carbon | 14 +-- .../testdata/basics/empty_decl.carbon | 14 +-- .../testdata/basics/fail_name_lookup.carbon | 24 ++-- .../semantics/testdata/basics/verbose.carbon | 2 +- .../semantics/testdata/function/basic.carbon | 24 ++-- .../semantics/testdata/function/order.carbon | 44 ++++---- .../testdata/operators/binary_op.carbon | 36 +++--- .../operators/fail_type_mismatch.carbon | 38 ++++--- .../operators/fail_type_mismatch_once.carbon | 44 +++++--- .../semantics/testdata/return/literal.carbon | 30 ++--- .../semantics/testdata/return/trivial.carbon | 27 +++-- toolchain/semantics/testdata/var/decl.carbon | 31 +++--- .../testdata/var/decl_with_init.carbon | 37 ++++--- .../testdata/var/fail_duplicate_decl.carbon | 49 +++++---- .../var/fail_init_type_mismatch.carbon | 39 ++++--- .../var/fail_lookup_outside_scope.carbon | 49 +++++++++ .../semantics/testdata/var/global_decl.carbon | 21 ++-- .../testdata/var/global_decl_with_init.carbon | 27 +++-- .../testdata/var/global_lookup.carbon | 37 ++++--- .../var/global_lookup_in_scope.carbon | 47 ++++---- .../semantics/testdata/var/lookup.carbon | 37 ++++--- .../var/todo_bad_init_with_self.carbon | 34 +++--- .../var/todo_bad_lookup_outside_scope.carbon | 41 ------- 31 files changed, 495 insertions(+), 482 deletions(-) create mode 100644 toolchain/semantics/testdata/var/fail_lookup_outside_scope.carbon delete mode 100644 toolchain/semantics/testdata/var/todo_bad_lookup_outside_scope.carbon diff --git a/.codespell_ignore b/.codespell_ignore index 9e4efe467487..0bd55bee31ec 100644 --- a/.codespell_ignore +++ b/.codespell_ignore @@ -6,6 +6,7 @@ atleast circularly copyable crate +crossreference falsy inout pullrequest diff --git a/toolchain/parser/parse_tree.h b/toolchain/parser/parse_tree.h index af2db73a21ad..db9bf68a9a5d 100644 --- a/toolchain/parser/parse_tree.h +++ b/toolchain/parser/parse_tree.h @@ -242,6 +242,9 @@ class ParseTree { // That said, nodes can be compared and are part of a depth-first pre-order // sequence across all nodes in the parse tree. struct ParseTree::Node : public ComparableIndexBase { + // Constructs an explicitly invalid instance. + static auto MakeInvalid() -> Node { return Node(); } + using ComparableIndexBase::ComparableIndexBase; }; diff --git a/toolchain/semantics/semantics_ir.cpp b/toolchain/semantics/semantics_ir.cpp index 9dedded1d3bf..a25b31fa3335 100644 --- a/toolchain/semantics/semantics_ir.cpp +++ b/toolchain/semantics/semantics_ir.cpp @@ -14,18 +14,14 @@ namespace Carbon { auto SemanticsIR::MakeBuiltinIR() -> SemanticsIR { - SemanticsIR semantics; - static constexpr auto BuiltinIR = SemanticsCrossReferenceIRId(0); + SemanticsIR semantics(/*builtin_ir=*/nullptr); auto block_id = semantics.AddNodeBlock(); - semantics.cross_references_.resize_for_overwrite( - SemanticsBuiltinKind::ValidCount); + semantics.nodes_.reserve(SemanticsBuiltinKind::ValidCount); constexpr int32_t TypeOfTypeType = 0; auto type_type = semantics.AddNode( block_id, SemanticsNode::MakeBuiltin(SemanticsBuiltinKind::TypeType(), SemanticsNodeId(TypeOfTypeType))); - semantics.cross_references_[SemanticsBuiltinKind::TypeType().AsInt()] = - SemanticsCrossReference(BuiltinIR, block_id, type_type); CARBON_CHECK(type_type.index == TypeOfTypeType) << "TypeType's type must be self-referential."; @@ -33,22 +29,15 @@ auto SemanticsIR::MakeBuiltinIR() -> SemanticsIR { auto invalid_type = semantics.AddNode( block_id, SemanticsNode::MakeBuiltin(SemanticsBuiltinKind::InvalidType(), SemanticsNodeId(TypeOfInvalidType))); - semantics.cross_references_[SemanticsBuiltinKind::InvalidType().AsInt()] = - SemanticsCrossReference(BuiltinIR, block_id, invalid_type); CARBON_CHECK(invalid_type.index == TypeOfInvalidType) << "InvalidType's type must be self-referential."; - auto integer_literal_type = semantics.AddNode( + semantics.AddNode( block_id, SemanticsNode::MakeBuiltin(SemanticsBuiltinKind::IntegerType(), type_type)); - semantics.cross_references_[SemanticsBuiltinKind::IntegerType().AsInt()] = - SemanticsCrossReference(BuiltinIR, block_id, integer_literal_type); - auto real_literal_type = semantics.AddNode( - block_id, - SemanticsNode::MakeBuiltin(SemanticsBuiltinKind::RealType(), type_type)); - semantics.cross_references_[SemanticsBuiltinKind::RealType().AsInt()] = - SemanticsCrossReference(BuiltinIR, block_id, real_literal_type); + semantics.AddNode(block_id, SemanticsNode::MakeBuiltin( + SemanticsBuiltinKind::RealType(), type_type)); CARBON_CHECK(semantics.node_blocks_.size() == 1) << "BuildBuiltins should only produce 1 block, actual: " @@ -62,7 +51,18 @@ auto SemanticsIR::MakeFromParseTree(const SemanticsIR& builtin_ir, DiagnosticConsumer& consumer, llvm::raw_ostream* vlog_stream) -> SemanticsIR { - SemanticsIR semantics(builtin_ir); + SemanticsIR semantics(&builtin_ir); + + // Copy builtins over. + semantics.nodes_.resize_for_overwrite(SemanticsBuiltinKind::ValidCount); + static constexpr auto BuiltinIR = SemanticsCrossReferenceIRId(0); + for (int i = 0; i < SemanticsBuiltinKind::ValidCount; ++i) { + // We can reuse the type node ID because the offsets of cross-references + // will be the same in this IR. + auto type = builtin_ir.nodes_[i].type(); + semantics.nodes_[i] = + SemanticsNode::MakeCrossReference(type, BuiltinIR, SemanticsNodeId(i)); + } TokenizedBuffer::TokenLocationTranslator translator( &tokens, /*last_line_lexed_to_column=*/nullptr); @@ -79,14 +79,6 @@ auto SemanticsIR::Print(llvm::raw_ostream& out) const -> void { out << "cross_reference_irs.size == " << cross_reference_irs_.size() << ",\n"; - out << "cross_references = {\n"; - for (int32_t i = 0; i < static_cast(cross_references_.size()); ++i) { - out.indent(Indent); - out << SemanticsNodeId::MakeCrossReference(i) << " = " - << cross_references_[i] << ";\n"; - } - out << "},\n"; - out << "integer_literals = {\n"; for (int32_t i = 0; i < static_cast(integer_literals_.size()); ++i) { out.indent(Indent); @@ -102,6 +94,13 @@ auto SemanticsIR::Print(llvm::raw_ostream& out) const -> void { } out << "},\n"; + out << "nodes = {\n"; + for (int32_t i = 0; i < static_cast(nodes_.size()); ++i) { + out.indent(Indent); + out << SemanticsNodeId(i) << " = " << nodes_[i] << ";\n"; + } + out << "},\n"; + out << "node_blocks = {\n"; for (int32_t i = 0; i < static_cast(node_blocks_.size()); ++i) { out.indent(Indent); @@ -110,7 +109,7 @@ auto SemanticsIR::Print(llvm::raw_ostream& out) const -> void { const auto& node_block = node_blocks_[i]; for (int32_t i = 0; i < static_cast(node_block.size()); ++i) { out.indent(2 * Indent); - out << SemanticsNodeId(i) << " = " << node_block[i] << ";\n"; + out << node_block[i] << ";\n"; } out.indent(Indent); diff --git a/toolchain/semantics/semantics_ir.h b/toolchain/semantics/semantics_ir.h index 0c369cbcc08e..c2875872ae9f 100644 --- a/toolchain/semantics/semantics_ir.h +++ b/toolchain/semantics/semantics_ir.h @@ -16,36 +16,9 @@ class SemanticsIRForTest; namespace Carbon { -// The ID of a cross-referenced IR (within cross_reference_irs_). -struct SemanticsCrossReferenceIRId : public IndexBase { - using IndexBase::IndexBase; - auto Print(llvm::raw_ostream& out) const -> void { out << "ir" << index; } -}; - -// A cross-reference between node blocks or IRs; essentially, anything that's -// not in the same SemanticsNodeBlock as the referencing node. -struct SemanticsCrossReference { - SemanticsCrossReference() = default; - SemanticsCrossReference(SemanticsCrossReferenceIRId ir, - SemanticsNodeBlockId node_block, SemanticsNodeId node) - : ir(ir), node_block(node_block), node(node) {} - - auto Print(llvm::raw_ostream& out) const -> void { - out << "xref(" << ir << ", " << node_block << ", " << node << ")"; - } - - SemanticsCrossReferenceIRId ir; - SemanticsNodeBlockId node_block; - SemanticsNodeId node; -}; - // Provides semantic analysis on a ParseTree. class SemanticsIR { public: - // As noted under cross_reference_irs_, the current IR must always be at - // index 1. This is a constant for that. - static constexpr auto ThisIR = SemanticsCrossReferenceIRId(1); - // Produces the builtins. static auto MakeBuiltinIR() -> SemanticsIR; @@ -65,57 +38,17 @@ class SemanticsIR { private: friend class SemanticsParseTreeHandler; - // For the builtin IR only. - SemanticsIR() : SemanticsIR(*this) {} - // For most IRs. - SemanticsIR(const SemanticsIR& builtins) - : cross_reference_irs_({&builtins, this}), - cross_references_(builtins.cross_references_) {} + explicit SemanticsIR(const SemanticsIR* builtin_ir) + : cross_reference_irs_({builtin_ir == nullptr ? this : builtin_ir}) {} - // Returns the requested node, resolving cross references. - auto GetNode(SemanticsNodeBlockId block_id, SemanticsNodeId node_id) - -> SemanticsNode { - if (node_id.is_cross_reference()) { - auto ref = cross_references_[node_id.GetAsCrossReference()]; - return cross_reference_irs_[ref.ir.index] - ->node_blocks_[ref.node_block.index][ref.node.index]; - } else { - return node_blocks_[block_id.index][node_id.index]; - } + // Returns the requested node. + auto GetNode(SemanticsNodeId node_id) const -> const SemanticsNode& { + return nodes_[node_id.index]; } - // Returns the type of the requested node, resolving cross references. - auto GetType(SemanticsNodeBlockId block_id, SemanticsNodeId node_id) - -> SemanticsNodeId { - if (node_id.is_cross_reference()) { - auto ref = cross_references_[node_id.GetAsCrossReference()]; - auto type = cross_reference_irs_[ref.ir.index] - ->node_blocks_[ref.node_block.index][ref.node.index] - .type(); - if (type.is_cross_reference() || - (ref.ir == ThisIR && ref.node_block == block_id)) { - return type; - } else { - // TODO: If the type is a local reference within a block other than the - // present one, we don't really want to add a cross reference at this - // point. Does this mean types should be required to be cross - // references? And maybe always with a presence in the current IR's - // cross-references, so that equality is straightforward even though - // resolving the actual type is a two-step process? - CARBON_FATAL() << "Need to think more about this case"; - } - } else { - return node_blocks_[block_id.index][node_id.index].type(); - } - } - - // Adds a cross reference, returning an ID to reference it. - auto AddCrossReference(SemanticsCrossReference cross_reference) - -> SemanticsNodeId { - SemanticsNodeId id = - SemanticsNodeId::MakeCrossReference(cross_references_.size()); - cross_references_.push_back(cross_reference); - return id; + // Returns the type of the requested node. + auto GetType(SemanticsNodeId node_id) -> SemanticsNodeId { + return GetNode(node_id).type(); } // Adds an integer literal, returning an ID to reference it. @@ -137,9 +70,9 @@ class SemanticsIR { // Adds a node to a specified block, returning an ID to reference the node. auto AddNode(SemanticsNodeBlockId block_id, SemanticsNode node) -> SemanticsNodeId { - auto& block = node_blocks_[block_id.index]; - SemanticsNodeId node_id(block.size()); - block.push_back(node); + SemanticsNodeId node_id(nodes_.size()); + nodes_.push_back(node); + node_blocks_[block_id.index].push_back(node_id); return node_id; } @@ -173,13 +106,6 @@ class SemanticsIR { // crossing node blocks). llvm::SmallVector cross_reference_irs_; - // Cross-references within the current IR across node blocks, and to other - // IRs. The first entries will always be builtins, at indices matching - // SemanticsBuiltinKind ordering. - // TODO: Deduplicate cross-references after they can be added outside - // builtins. - llvm::SmallVector cross_references_; - // Storage for integer literals. llvm::SmallVector integer_literals_; @@ -188,8 +114,12 @@ class SemanticsIR { llvm::StringMap string_to_id_; llvm::SmallVector strings_; - // Storage for blocks within the IR. - llvm::SmallVector> node_blocks_; + // All nodes. The first entries will always be cross-references to builtins, + // at indices matching SemanticsBuiltinKind ordering. + llvm::SmallVector nodes_; + + // Storage for blocks within the IR. These reference entries in nodes_. + llvm::SmallVector> node_blocks_; }; } // namespace Carbon diff --git a/toolchain/semantics/semantics_node.h b/toolchain/semantics/semantics_node.h index f98b6855c0de..5ac23a209fbf 100644 --- a/toolchain/semantics/semantics_node.h +++ b/toolchain/semantics/semantics_node.h @@ -17,39 +17,24 @@ namespace Carbon { // Type-safe storage of Node IDs. struct SemanticsNodeId : public IndexBase { - static constexpr int32_t CrossReferenceBit = 0x8000'0000; - - // Constructs a cross-reference node ID. - static auto MakeCrossReference(int32_t index) -> SemanticsNodeId { - return SemanticsNodeId(index | CrossReferenceBit); - } - - // Constructs a cross-reference node ID for a builtin. This relies on - // SemanticsIR guarantees for builtin cross-reference placement. + // Uses the cross-reference node ID for a builtin. This relies on SemanticsIR + // guarantees for builtin cross-reference placement. static auto MakeBuiltinReference(SemanticsBuiltinKind kind) -> SemanticsNodeId { - return MakeCrossReference(kind.AsInt()); + return SemanticsNodeId(kind.AsInt()); } // Constructs an explicitly invalid instance. static auto MakeInvalid() -> SemanticsNodeId { return SemanticsNodeId(); } using IndexBase::IndexBase; + auto Print(llvm::raw_ostream& out) const -> void { out << "node" << index; } +}; - auto is_cross_reference() const -> bool { return index & CrossReferenceBit; } - // Returns the ID for a cross-reference, just handling removal of the marker - // bit. - auto GetAsCrossReference() const -> int32_t { - return index & ~CrossReferenceBit; - } - - auto Print(llvm::raw_ostream& out) const -> void { - if (is_cross_reference()) { - out << "node_xref" << GetAsCrossReference(); - } else { - out << "node" << index; - } - } +// The ID of a cross-referenced IR. +struct SemanticsCrossReferenceIRId : public IndexBase { + using IndexBase::IndexBase; + auto Print(llvm::raw_ostream& out) const -> void { out << "ir" << index; } }; // Type-safe storage of integer literals. @@ -133,6 +118,19 @@ class SemanticsNode { return SemanticsNodeBlockId(arg0_); } + static auto MakeCrossReference(SemanticsNodeId type, + SemanticsCrossReferenceIRId ir, + SemanticsNodeId node) -> SemanticsNode { + return SemanticsNode(ParseTree::Node::MakeInvalid(), + SemanticsNodeKind::CrossReference(), type, ir.index, + node.index); + } + auto GetAsCrossReference() const + -> std::pair { + CARBON_CHECK(kind_ == SemanticsNodeKind::CrossReference()); + return {SemanticsCrossReferenceIRId(arg0_), SemanticsNodeBlockId(arg1_)}; + } + // TODO: The signature should be added as a parameter. static auto MakeFunctionDeclaration(ParseTree::Node parse_node) -> SemanticsNode { diff --git a/toolchain/semantics/semantics_node_kind.def b/toolchain/semantics/semantics_node_kind.def index 07d2dfc5c288..26a830fb4d9f 100644 --- a/toolchain/semantics/semantics_node_kind.def +++ b/toolchain/semantics/semantics_node_kind.def @@ -15,6 +15,9 @@ CARBON_SEMANTICS_NODE_KIND(Invalid) +// A cross-reference between IRs. +CARBON_SEMANTICS_NODE_KIND(CrossReference) + CARBON_SEMANTICS_NODE_KIND(Assign) CARBON_SEMANTICS_NODE_KIND(BinaryOperatorAdd) CARBON_SEMANTICS_NODE_KIND(BindName) diff --git a/toolchain/semantics/semantics_parse_tree_handler.cpp b/toolchain/semantics/semantics_parse_tree_handler.cpp index 774f3fbe6ef3..0be658750060 100644 --- a/toolchain/semantics/semantics_parse_tree_handler.cpp +++ b/toolchain/semantics/semantics_parse_tree_handler.cpp @@ -86,15 +86,6 @@ auto SemanticsParseTreeHandler::Build() -> void { CARBON_CHECK(scope_stack_.empty()) << scope_stack_.size(); } -auto SemanticsParseTreeHandler::AddCrossReference(SemanticsNodeId node_id) - -> SemanticsNodeId { - CARBON_CHECK(!node_id.is_cross_reference()) - << "Should use the existing cross-reference. Might want to return this, " - "but lacking a use-case, it's treated as bad input."; - return semantics_->AddCrossReference(SemanticsCrossReference( - SemanticsIR::ThisIR, current_block_id(), node_id)); -} - auto SemanticsParseTreeHandler::AddNode(SemanticsNode node) -> SemanticsNodeId { CARBON_VLOG() << "AddNode " << current_block_id() << ": " << node << "\n"; return semantics_->AddNode(current_block_id(), node); @@ -113,7 +104,7 @@ auto SemanticsParseTreeHandler::BindName(ParseTree::Node name_node, SemanticsNode::MakeBindName(name_node, type_id, name_id, target_id)); auto [it, inserted] = current_scope().names.insert(name_id); if (inserted) { - name_lookup_[name_id].push_back(AddCrossReference(bind_id)); + name_lookup_[name_id].push_back(bind_id); } else { CARBON_DIAGNOSTIC(NameRedefined, Error, "Redefining {0} in the same scope.", llvm::StringRef); @@ -122,7 +113,7 @@ auto SemanticsParseTreeHandler::BindName(ParseTree::Node name_node, // TODO: This should be a note and sorted with the above diagnostic. // But that depends on more diagnostic support we currently don't have. auto prev_def_id = name_lookup_[name_id].back(); - auto prev_def = semantics_->GetNode(current_block_id(), prev_def_id); + auto prev_def = semantics_->GetNode(prev_def_id); CARBON_DIAGNOSTIC(PreviousDefinition, Error, "Previous definition is here."); emitter_->Emit(parse_tree_->node_token(prev_def.parse_node()), @@ -234,9 +225,8 @@ auto SemanticsParseTreeHandler::TryTypeConversion(ParseTree::Node parse_node, SemanticsNodeId rhs_id, bool /*can_convert_lhs*/) -> SemanticsNodeId { - auto block = current_block_id(); - auto lhs_type = semantics_->GetType(block, lhs_id); - auto rhs_type = semantics_->GetType(block, rhs_id); + auto lhs_type = semantics_->GetType(lhs_id); + auto rhs_type = semantics_->GetType(rhs_id); // TODO: This should attempt a type conversion, but there's not enough // implemented to do that right now. if (lhs_type != rhs_type) { @@ -615,7 +605,7 @@ auto SemanticsParseTreeHandler::HandleReturnStatement( Push(parse_node, SemanticsNode::MakeReturn(parse_node)); } else { auto arg = PopWithResult(); - auto arg_type = semantics_->GetType(current_block_id(), arg); + auto arg_type = semantics_->GetType(arg); Pop(ParseNodeKind::ReturnStatementStart()); Push(parse_node, SemanticsNode::MakeReturnExpression(parse_node, arg_type, arg)); diff --git a/toolchain/semantics/semantics_parse_tree_handler.h b/toolchain/semantics/semantics_parse_tree_handler.h index 25e1824da7de..c238e64664b7 100644 --- a/toolchain/semantics/semantics_parse_tree_handler.h +++ b/toolchain/semantics/semantics_parse_tree_handler.h @@ -74,9 +74,6 @@ class SemanticsParseTreeHandler { // TODO: This likely needs to track things which need to be destructed. }; - // Adds a cross-reference for a node_id in the current block. - auto AddCrossReference(SemanticsNodeId node_id) -> SemanticsNodeId; - // Adds a node to the current block, returning the produced ID. auto AddNode(SemanticsNode node) -> SemanticsNodeId; diff --git a/toolchain/semantics/testdata/basics/empty.carbon b/toolchain/semantics/testdata/basics/empty.carbon index 7aeabdce219d..dd69f082eef6 100644 --- a/toolchain/semantics/testdata/basics/empty.carbon +++ b/toolchain/semantics/testdata/basics/empty.carbon @@ -4,17 +4,17 @@ // // AUTOUPDATE // RUN: %{carbon-run-semantics} -// CHECK:STDOUT: cross_reference_irs.size == 2, -// CHECK:STDOUT: cross_references = { -// CHECK:STDOUT: node_xref0 = xref(ir0, block0, node0); -// CHECK:STDOUT: node_xref1 = xref(ir0, block0, node1); -// CHECK:STDOUT: node_xref2 = xref(ir0, block0, node2); -// CHECK:STDOUT: node_xref3 = xref(ir0, block0, node3); -// CHECK:STDOUT: }, +// CHECK:STDOUT: cross_reference_irs.size == 1, // CHECK:STDOUT: integer_literals = { // CHECK:STDOUT: }, // CHECK:STDOUT: strings = { // CHECK:STDOUT: }, +// CHECK:STDOUT: nodes = { +// CHECK:STDOUT: node0 = CrossReference(ir0, block0): node0; +// CHECK:STDOUT: node1 = CrossReference(ir0, block1): node1; +// CHECK:STDOUT: node2 = CrossReference(ir0, block2): node0; +// CHECK:STDOUT: node3 = CrossReference(ir0, block3): node0; +// CHECK:STDOUT: }, // CHECK:STDOUT: node_blocks = { // CHECK:STDOUT: block0 = { // CHECK:STDOUT: }, diff --git a/toolchain/semantics/testdata/basics/empty_decl.carbon b/toolchain/semantics/testdata/basics/empty_decl.carbon index 8f028feaafa7..273c88d3dae2 100644 --- a/toolchain/semantics/testdata/basics/empty_decl.carbon +++ b/toolchain/semantics/testdata/basics/empty_decl.carbon @@ -4,17 +4,17 @@ // // AUTOUPDATE // RUN: %{carbon-run-semantics} -// CHECK:STDOUT: cross_reference_irs.size == 2, -// CHECK:STDOUT: cross_references = { -// CHECK:STDOUT: node_xref0 = xref(ir0, block0, node0); -// CHECK:STDOUT: node_xref1 = xref(ir0, block0, node1); -// CHECK:STDOUT: node_xref2 = xref(ir0, block0, node2); -// CHECK:STDOUT: node_xref3 = xref(ir0, block0, node3); -// CHECK:STDOUT: }, +// CHECK:STDOUT: cross_reference_irs.size == 1, // CHECK:STDOUT: integer_literals = { // CHECK:STDOUT: }, // CHECK:STDOUT: strings = { // CHECK:STDOUT: }, +// CHECK:STDOUT: nodes = { +// CHECK:STDOUT: node0 = CrossReference(ir0, block0): node0; +// CHECK:STDOUT: node1 = CrossReference(ir0, block1): node1; +// CHECK:STDOUT: node2 = CrossReference(ir0, block2): node0; +// CHECK:STDOUT: node3 = CrossReference(ir0, block3): node0; +// CHECK:STDOUT: }, // CHECK:STDOUT: node_blocks = { // CHECK:STDOUT: block0 = { // CHECK:STDOUT: }, diff --git a/toolchain/semantics/testdata/basics/fail_name_lookup.carbon b/toolchain/semantics/testdata/basics/fail_name_lookup.carbon index 66783581f45c..e9769035a130 100644 --- a/toolchain/semantics/testdata/basics/fail_name_lookup.carbon +++ b/toolchain/semantics/testdata/basics/fail_name_lookup.carbon @@ -4,24 +4,26 @@ // // AUTOUPDATE // RUN: %{not} %{carbon-run-semantics} -// CHECK:STDOUT: cross_reference_irs.size == 2, -// CHECK:STDOUT: cross_references = { -// CHECK:STDOUT: node_xref0 = xref(ir0, block0, node0); -// CHECK:STDOUT: node_xref1 = xref(ir0, block0, node1); -// CHECK:STDOUT: node_xref2 = xref(ir0, block0, node2); -// CHECK:STDOUT: node_xref3 = xref(ir0, block0, node3); -// CHECK:STDOUT: node_xref4 = xref(ir1, block0, node1); -// CHECK:STDOUT: }, +// CHECK:STDOUT: cross_reference_irs.size == 1, // CHECK:STDOUT: integer_literals = { // CHECK:STDOUT: }, // CHECK:STDOUT: strings = { // CHECK:STDOUT: str0 = "Main"; // CHECK:STDOUT: }, +// CHECK:STDOUT: nodes = { +// CHECK:STDOUT: node0 = CrossReference(ir0, block0): node0; +// CHECK:STDOUT: node1 = CrossReference(ir0, block1): node1; +// CHECK:STDOUT: node2 = CrossReference(ir0, block2): node0; +// CHECK:STDOUT: node3 = CrossReference(ir0, block3): node0; +// CHECK:STDOUT: node4 = FunctionDeclaration(); +// CHECK:STDOUT: node5 = BindName(str0, node4); +// CHECK:STDOUT: node6 = FunctionDefinition(node4, block1); +// CHECK:STDOUT: }, // CHECK:STDOUT: node_blocks = { // CHECK:STDOUT: block0 = { -// CHECK:STDOUT: node0 = FunctionDeclaration(); -// CHECK:STDOUT: node1 = BindName(str0, node0); -// CHECK:STDOUT: node2 = FunctionDefinition(node0, block1); +// CHECK:STDOUT: node4; +// CHECK:STDOUT: node5; +// CHECK:STDOUT: node6; // CHECK:STDOUT: }, // CHECK:STDOUT: block1 = { // CHECK:STDOUT: }, diff --git a/toolchain/semantics/testdata/basics/verbose.carbon b/toolchain/semantics/testdata/basics/verbose.carbon index 669b4784a991..426dc18e8980 100644 --- a/toolchain/semantics/testdata/basics/verbose.carbon +++ b/toolchain/semantics/testdata/basics/verbose.carbon @@ -7,7 +7,7 @@ // // Only checks a couple statements in order to minimize manual update churn. // CHECK:STDERR: Push 0: FunctionIntroducer -// CHECK:STDERR: AddNode block0: BindName(str0, node0) +// CHECK:STDERR: AddNode block0: BindName(str0, node{{[0-9]+}}) fn Foo() { return; diff --git a/toolchain/semantics/testdata/function/basic.carbon b/toolchain/semantics/testdata/function/basic.carbon index dfc8638d1376..592c0783920c 100644 --- a/toolchain/semantics/testdata/function/basic.carbon +++ b/toolchain/semantics/testdata/function/basic.carbon @@ -4,24 +4,26 @@ // // AUTOUPDATE // RUN: %{carbon-run-semantics} -// CHECK:STDOUT: cross_reference_irs.size == 2, -// CHECK:STDOUT: cross_references = { -// CHECK:STDOUT: node_xref0 = xref(ir0, block0, node0); -// CHECK:STDOUT: node_xref1 = xref(ir0, block0, node1); -// CHECK:STDOUT: node_xref2 = xref(ir0, block0, node2); -// CHECK:STDOUT: node_xref3 = xref(ir0, block0, node3); -// CHECK:STDOUT: node_xref4 = xref(ir1, block0, node1); -// CHECK:STDOUT: }, +// CHECK:STDOUT: cross_reference_irs.size == 1, // CHECK:STDOUT: integer_literals = { // CHECK:STDOUT: }, // CHECK:STDOUT: strings = { // CHECK:STDOUT: str0 = "Foo"; // CHECK:STDOUT: }, +// CHECK:STDOUT: nodes = { +// CHECK:STDOUT: node0 = CrossReference(ir0, block0): node0; +// CHECK:STDOUT: node1 = CrossReference(ir0, block1): node1; +// CHECK:STDOUT: node2 = CrossReference(ir0, block2): node0; +// CHECK:STDOUT: node3 = CrossReference(ir0, block3): node0; +// CHECK:STDOUT: node4 = FunctionDeclaration(); +// CHECK:STDOUT: node5 = BindName(str0, node4); +// CHECK:STDOUT: node6 = FunctionDefinition(node4, block1); +// CHECK:STDOUT: }, // CHECK:STDOUT: node_blocks = { // CHECK:STDOUT: block0 = { -// CHECK:STDOUT: node0 = FunctionDeclaration(); -// CHECK:STDOUT: node1 = BindName(str0, node0); -// CHECK:STDOUT: node2 = FunctionDefinition(node0, block1); +// CHECK:STDOUT: node4; +// CHECK:STDOUT: node5; +// CHECK:STDOUT: node6; // CHECK:STDOUT: }, // CHECK:STDOUT: block1 = { // CHECK:STDOUT: }, diff --git a/toolchain/semantics/testdata/function/order.carbon b/toolchain/semantics/testdata/function/order.carbon index 7a1b04a027b2..38dfddf13996 100644 --- a/toolchain/semantics/testdata/function/order.carbon +++ b/toolchain/semantics/testdata/function/order.carbon @@ -4,16 +4,7 @@ // // AUTOUPDATE // RUN: %{carbon-run-semantics} -// CHECK:STDOUT: cross_reference_irs.size == 2, -// CHECK:STDOUT: cross_references = { -// CHECK:STDOUT: node_xref0 = xref(ir0, block0, node0); -// CHECK:STDOUT: node_xref1 = xref(ir0, block0, node1); -// CHECK:STDOUT: node_xref2 = xref(ir0, block0, node2); -// CHECK:STDOUT: node_xref3 = xref(ir0, block0, node3); -// CHECK:STDOUT: node_xref4 = xref(ir1, block0, node1); -// CHECK:STDOUT: node_xref5 = xref(ir1, block0, node4); -// CHECK:STDOUT: node_xref6 = xref(ir1, block0, node7); -// CHECK:STDOUT: }, +// CHECK:STDOUT: cross_reference_irs.size == 1, // CHECK:STDOUT: integer_literals = { // CHECK:STDOUT: }, // CHECK:STDOUT: strings = { @@ -21,17 +12,32 @@ // CHECK:STDOUT: str1 = "Bar"; // CHECK:STDOUT: str2 = "Baz"; // CHECK:STDOUT: }, +// CHECK:STDOUT: nodes = { +// CHECK:STDOUT: node0 = CrossReference(ir0, block0): node0; +// CHECK:STDOUT: node1 = CrossReference(ir0, block1): node1; +// CHECK:STDOUT: node2 = CrossReference(ir0, block2): node0; +// CHECK:STDOUT: node3 = CrossReference(ir0, block3): node0; +// CHECK:STDOUT: node4 = FunctionDeclaration(); +// CHECK:STDOUT: node5 = BindName(str0, node4); +// CHECK:STDOUT: node6 = FunctionDefinition(node4, block1); +// CHECK:STDOUT: node7 = FunctionDeclaration(); +// CHECK:STDOUT: node8 = BindName(str1, node7); +// CHECK:STDOUT: node9 = FunctionDefinition(node7, block2); +// CHECK:STDOUT: node10 = FunctionDeclaration(); +// CHECK:STDOUT: node11 = BindName(str2, node10); +// CHECK:STDOUT: node12 = FunctionDefinition(node10, block3); +// CHECK:STDOUT: }, // CHECK:STDOUT: node_blocks = { // CHECK:STDOUT: block0 = { -// CHECK:STDOUT: node0 = FunctionDeclaration(); -// CHECK:STDOUT: node1 = BindName(str0, node0); -// CHECK:STDOUT: node2 = FunctionDefinition(node0, block1); -// CHECK:STDOUT: node3 = FunctionDeclaration(); -// CHECK:STDOUT: node4 = BindName(str1, node3); -// CHECK:STDOUT: node5 = FunctionDefinition(node3, block2); -// CHECK:STDOUT: node6 = FunctionDeclaration(); -// CHECK:STDOUT: node7 = BindName(str2, node6); -// CHECK:STDOUT: node8 = FunctionDefinition(node6, block3); +// CHECK:STDOUT: node4; +// CHECK:STDOUT: node5; +// CHECK:STDOUT: node6; +// CHECK:STDOUT: node7; +// CHECK:STDOUT: node8; +// CHECK:STDOUT: node9; +// CHECK:STDOUT: node10; +// CHECK:STDOUT: node11; +// CHECK:STDOUT: node12; // CHECK:STDOUT: }, // CHECK:STDOUT: block1 = { // CHECK:STDOUT: }, diff --git a/toolchain/semantics/testdata/operators/binary_op.carbon b/toolchain/semantics/testdata/operators/binary_op.carbon index 088b1104cde3..5823c19b742c 100644 --- a/toolchain/semantics/testdata/operators/binary_op.carbon +++ b/toolchain/semantics/testdata/operators/binary_op.carbon @@ -4,14 +4,7 @@ // // AUTOUPDATE // RUN: %{carbon-run-semantics} -// CHECK:STDOUT: cross_reference_irs.size == 2, -// CHECK:STDOUT: cross_references = { -// CHECK:STDOUT: node_xref0 = xref(ir0, block0, node0); -// CHECK:STDOUT: node_xref1 = xref(ir0, block0, node1); -// CHECK:STDOUT: node_xref2 = xref(ir0, block0, node2); -// CHECK:STDOUT: node_xref3 = xref(ir0, block0, node3); -// CHECK:STDOUT: node_xref4 = xref(ir1, block0, node1); -// CHECK:STDOUT: }, +// CHECK:STDOUT: cross_reference_irs.size == 1, // CHECK:STDOUT: integer_literals = { // CHECK:STDOUT: int0 = 12; // CHECK:STDOUT: int1 = 34; @@ -19,17 +12,30 @@ // CHECK:STDOUT: strings = { // CHECK:STDOUT: str0 = "Main"; // CHECK:STDOUT: }, +// CHECK:STDOUT: nodes = { +// CHECK:STDOUT: node0 = CrossReference(ir0, block0): node0; +// CHECK:STDOUT: node1 = CrossReference(ir0, block1): node1; +// CHECK:STDOUT: node2 = CrossReference(ir0, block2): node0; +// CHECK:STDOUT: node3 = CrossReference(ir0, block3): node0; +// CHECK:STDOUT: node4 = FunctionDeclaration(); +// CHECK:STDOUT: node5 = BindName(str0, node4); +// CHECK:STDOUT: node6 = FunctionDefinition(node4, block1); +// CHECK:STDOUT: node7 = IntegerLiteral(int0): node2; +// CHECK:STDOUT: node8 = IntegerLiteral(int1): node2; +// CHECK:STDOUT: node9 = BinaryOperatorAdd(node7, node8): node2; +// CHECK:STDOUT: node10 = ReturnExpression(node9): node2; +// CHECK:STDOUT: }, // CHECK:STDOUT: node_blocks = { // CHECK:STDOUT: block0 = { -// CHECK:STDOUT: node0 = FunctionDeclaration(); -// CHECK:STDOUT: node1 = BindName(str0, node0); -// CHECK:STDOUT: node2 = FunctionDefinition(node0, block1); +// CHECK:STDOUT: node4; +// CHECK:STDOUT: node5; +// CHECK:STDOUT: node6; // CHECK:STDOUT: }, // CHECK:STDOUT: block1 = { -// CHECK:STDOUT: node0 = IntegerLiteral(int0): node_xref2; -// CHECK:STDOUT: node1 = IntegerLiteral(int1): node_xref2; -// CHECK:STDOUT: node2 = BinaryOperatorAdd(node0, node1): node_xref2; -// CHECK:STDOUT: node3 = ReturnExpression(node2): node_xref2; +// CHECK:STDOUT: node7; +// CHECK:STDOUT: node8; +// CHECK:STDOUT: node9; +// CHECK:STDOUT: node10; // CHECK:STDOUT: }, // CHECK:STDOUT: } diff --git a/toolchain/semantics/testdata/operators/fail_type_mismatch.carbon b/toolchain/semantics/testdata/operators/fail_type_mismatch.carbon index fee3d99b1b0f..88d2b75a1d19 100644 --- a/toolchain/semantics/testdata/operators/fail_type_mismatch.carbon +++ b/toolchain/semantics/testdata/operators/fail_type_mismatch.carbon @@ -4,35 +4,41 @@ // // AUTOUPDATE // RUN: %{not} %{carbon-run-semantics} -// CHECK:STDOUT: cross_reference_irs.size == 2, -// CHECK:STDOUT: cross_references = { -// CHECK:STDOUT: node_xref0 = xref(ir0, block0, node0); -// CHECK:STDOUT: node_xref1 = xref(ir0, block0, node1); -// CHECK:STDOUT: node_xref2 = xref(ir0, block0, node2); -// CHECK:STDOUT: node_xref3 = xref(ir0, block0, node3); -// CHECK:STDOUT: node_xref4 = xref(ir1, block0, node1); -// CHECK:STDOUT: }, +// CHECK:STDOUT: cross_reference_irs.size == 1, // CHECK:STDOUT: integer_literals = { // CHECK:STDOUT: int0 = 12; // CHECK:STDOUT: }, // CHECK:STDOUT: strings = { // CHECK:STDOUT: str0 = "Main"; // CHECK:STDOUT: }, +// CHECK:STDOUT: nodes = { +// CHECK:STDOUT: node0 = CrossReference(ir0, block0): node0; +// CHECK:STDOUT: node1 = CrossReference(ir0, block1): node1; +// CHECK:STDOUT: node2 = CrossReference(ir0, block2): node0; +// CHECK:STDOUT: node3 = CrossReference(ir0, block3): node0; +// CHECK:STDOUT: node4 = FunctionDeclaration(); +// CHECK:STDOUT: node5 = BindName(str0, node4); +// CHECK:STDOUT: node6 = FunctionDefinition(node4, block1); +// CHECK:STDOUT: node7 = IntegerLiteral(int0): node2; +// CHECK:STDOUT: node8 = RealLiteral(): node3; +// CHECK:STDOUT: node9 = BinaryOperatorAdd(node7, node8): node1; +// CHECK:STDOUT: node10 = ReturnExpression(node9): node1; +// CHECK:STDOUT: }, // CHECK:STDOUT: node_blocks = { // CHECK:STDOUT: block0 = { -// CHECK:STDOUT: node0 = FunctionDeclaration(); -// CHECK:STDOUT: node1 = BindName(str0, node0); -// CHECK:STDOUT: node2 = FunctionDefinition(node0, block1); +// CHECK:STDOUT: node4; +// CHECK:STDOUT: node5; +// CHECK:STDOUT: node6; // CHECK:STDOUT: }, // CHECK:STDOUT: block1 = { -// CHECK:STDOUT: node0 = IntegerLiteral(int0): node_xref2; -// CHECK:STDOUT: node1 = RealLiteral(): node_xref3; -// CHECK:STDOUT: node2 = BinaryOperatorAdd(node0, node1): node_xref1; -// CHECK:STDOUT: node3 = ReturnExpression(node2): node_xref1; +// CHECK:STDOUT: node7; +// CHECK:STDOUT: node8; +// CHECK:STDOUT: node9; +// CHECK:STDOUT: node10; // CHECK:STDOUT: }, // CHECK:STDOUT: } fn Main() { - // CHECK:STDERR: {{.*}}/toolchain/semantics/testdata/operators/fail_type_mismatch.carbon:[[@LINE+1]]:13: Type mismatch: lhs is node_xref2, rhs is node_xref3 + // CHECK:STDERR: {{.*}}/toolchain/semantics/testdata/operators/fail_type_mismatch.carbon:[[@LINE+1]]:13: Type mismatch: lhs is node2, rhs is node3 return 12 + 3.4; } diff --git a/toolchain/semantics/testdata/operators/fail_type_mismatch_once.carbon b/toolchain/semantics/testdata/operators/fail_type_mismatch_once.carbon index 0e42359964a1..9f9edd3d7e0a 100644 --- a/toolchain/semantics/testdata/operators/fail_type_mismatch_once.carbon +++ b/toolchain/semantics/testdata/operators/fail_type_mismatch_once.carbon @@ -4,14 +4,7 @@ // // AUTOUPDATE // RUN: %{not} %{carbon-run-semantics} -// CHECK:STDOUT: cross_reference_irs.size == 2, -// CHECK:STDOUT: cross_references = { -// CHECK:STDOUT: node_xref0 = xref(ir0, block0, node0); -// CHECK:STDOUT: node_xref1 = xref(ir0, block0, node1); -// CHECK:STDOUT: node_xref2 = xref(ir0, block0, node2); -// CHECK:STDOUT: node_xref3 = xref(ir0, block0, node3); -// CHECK:STDOUT: node_xref4 = xref(ir1, block0, node1); -// CHECK:STDOUT: }, +// CHECK:STDOUT: cross_reference_irs.size == 1, // CHECK:STDOUT: integer_literals = { // CHECK:STDOUT: int0 = 12; // CHECK:STDOUT: int1 = 12; @@ -19,25 +12,40 @@ // CHECK:STDOUT: strings = { // CHECK:STDOUT: str0 = "Main"; // CHECK:STDOUT: }, +// CHECK:STDOUT: nodes = { +// CHECK:STDOUT: node0 = CrossReference(ir0, block0): node0; +// CHECK:STDOUT: node1 = CrossReference(ir0, block1): node1; +// CHECK:STDOUT: node2 = CrossReference(ir0, block2): node0; +// CHECK:STDOUT: node3 = CrossReference(ir0, block3): node0; +// CHECK:STDOUT: node4 = FunctionDeclaration(); +// CHECK:STDOUT: node5 = BindName(str0, node4); +// CHECK:STDOUT: node6 = FunctionDefinition(node4, block1); +// CHECK:STDOUT: node7 = IntegerLiteral(int0): node2; +// CHECK:STDOUT: node8 = RealLiteral(): node3; +// CHECK:STDOUT: node9 = BinaryOperatorAdd(node7, node8): node1; +// CHECK:STDOUT: node10 = IntegerLiteral(int1): node2; +// CHECK:STDOUT: node11 = BinaryOperatorAdd(node9, node10): node1; +// CHECK:STDOUT: node12 = ReturnExpression(node11): node1; +// CHECK:STDOUT: }, // CHECK:STDOUT: node_blocks = { // CHECK:STDOUT: block0 = { -// CHECK:STDOUT: node0 = FunctionDeclaration(); -// CHECK:STDOUT: node1 = BindName(str0, node0); -// CHECK:STDOUT: node2 = FunctionDefinition(node0, block1); +// CHECK:STDOUT: node4; +// CHECK:STDOUT: node5; +// CHECK:STDOUT: node6; // CHECK:STDOUT: }, // CHECK:STDOUT: block1 = { -// CHECK:STDOUT: node0 = IntegerLiteral(int0): node_xref2; -// CHECK:STDOUT: node1 = RealLiteral(): node_xref3; -// CHECK:STDOUT: node2 = BinaryOperatorAdd(node0, node1): node_xref1; -// CHECK:STDOUT: node3 = IntegerLiteral(int1): node_xref2; -// CHECK:STDOUT: node4 = BinaryOperatorAdd(node2, node3): node_xref1; -// CHECK:STDOUT: node5 = ReturnExpression(node4): node_xref1; +// CHECK:STDOUT: node7; +// CHECK:STDOUT: node8; +// CHECK:STDOUT: node9; +// CHECK:STDOUT: node10; +// CHECK:STDOUT: node11; +// CHECK:STDOUT: node12; // CHECK:STDOUT: }, // CHECK:STDOUT: } fn Main() { // The following line has two mismatches, but after the first, it shouldn't // keep erroring. - // CHECK:STDERR: {{.*}}/toolchain/semantics/testdata/operators/fail_type_mismatch_once.carbon:[[@LINE+1]]:13: Type mismatch: lhs is node_xref2, rhs is node_xref3 + // CHECK:STDERR: {{.*}}/toolchain/semantics/testdata/operators/fail_type_mismatch_once.carbon:[[@LINE+1]]:13: Type mismatch: lhs is node2, rhs is node3 return 12 + 3.4 + 12; } diff --git a/toolchain/semantics/testdata/return/literal.carbon b/toolchain/semantics/testdata/return/literal.carbon index c1ea28edb58e..372375f766e3 100644 --- a/toolchain/semantics/testdata/return/literal.carbon +++ b/toolchain/semantics/testdata/return/literal.carbon @@ -4,29 +4,33 @@ // // AUTOUPDATE // RUN: %{carbon-run-semantics} -// CHECK:STDOUT: cross_reference_irs.size == 2, -// CHECK:STDOUT: cross_references = { -// CHECK:STDOUT: node_xref0 = xref(ir0, block0, node0); -// CHECK:STDOUT: node_xref1 = xref(ir0, block0, node1); -// CHECK:STDOUT: node_xref2 = xref(ir0, block0, node2); -// CHECK:STDOUT: node_xref3 = xref(ir0, block0, node3); -// CHECK:STDOUT: node_xref4 = xref(ir1, block0, node1); -// CHECK:STDOUT: }, +// CHECK:STDOUT: cross_reference_irs.size == 1, // CHECK:STDOUT: integer_literals = { // CHECK:STDOUT: int0 = 0; // CHECK:STDOUT: }, // CHECK:STDOUT: strings = { // CHECK:STDOUT: str0 = "Main"; // CHECK:STDOUT: }, +// CHECK:STDOUT: nodes = { +// CHECK:STDOUT: node0 = CrossReference(ir0, block0): node0; +// CHECK:STDOUT: node1 = CrossReference(ir0, block1): node1; +// CHECK:STDOUT: node2 = CrossReference(ir0, block2): node0; +// CHECK:STDOUT: node3 = CrossReference(ir0, block3): node0; +// CHECK:STDOUT: node4 = FunctionDeclaration(); +// CHECK:STDOUT: node5 = BindName(str0, node4); +// CHECK:STDOUT: node6 = FunctionDefinition(node4, block1); +// CHECK:STDOUT: node7 = IntegerLiteral(int0): node2; +// CHECK:STDOUT: node8 = ReturnExpression(node7): node2; +// CHECK:STDOUT: }, // CHECK:STDOUT: node_blocks = { // CHECK:STDOUT: block0 = { -// CHECK:STDOUT: node0 = FunctionDeclaration(); -// CHECK:STDOUT: node1 = BindName(str0, node0); -// CHECK:STDOUT: node2 = FunctionDefinition(node0, block1); +// CHECK:STDOUT: node4; +// CHECK:STDOUT: node5; +// CHECK:STDOUT: node6; // CHECK:STDOUT: }, // CHECK:STDOUT: block1 = { -// CHECK:STDOUT: node0 = IntegerLiteral(int0): node_xref2; -// CHECK:STDOUT: node1 = ReturnExpression(node0): node_xref2; +// CHECK:STDOUT: node7; +// CHECK:STDOUT: node8; // CHECK:STDOUT: }, // CHECK:STDOUT: } diff --git a/toolchain/semantics/testdata/return/trivial.carbon b/toolchain/semantics/testdata/return/trivial.carbon index 373236d32bd2..6868c7f89a02 100644 --- a/toolchain/semantics/testdata/return/trivial.carbon +++ b/toolchain/semantics/testdata/return/trivial.carbon @@ -4,27 +4,30 @@ // // AUTOUPDATE // RUN: %{carbon-run-semantics} -// CHECK:STDOUT: cross_reference_irs.size == 2, -// CHECK:STDOUT: cross_references = { -// CHECK:STDOUT: node_xref0 = xref(ir0, block0, node0); -// CHECK:STDOUT: node_xref1 = xref(ir0, block0, node1); -// CHECK:STDOUT: node_xref2 = xref(ir0, block0, node2); -// CHECK:STDOUT: node_xref3 = xref(ir0, block0, node3); -// CHECK:STDOUT: node_xref4 = xref(ir1, block0, node1); -// CHECK:STDOUT: }, +// CHECK:STDOUT: cross_reference_irs.size == 1, // CHECK:STDOUT: integer_literals = { // CHECK:STDOUT: }, // CHECK:STDOUT: strings = { // CHECK:STDOUT: str0 = "Main"; // CHECK:STDOUT: }, +// CHECK:STDOUT: nodes = { +// CHECK:STDOUT: node0 = CrossReference(ir0, block0): node0; +// CHECK:STDOUT: node1 = CrossReference(ir0, block1): node1; +// CHECK:STDOUT: node2 = CrossReference(ir0, block2): node0; +// CHECK:STDOUT: node3 = CrossReference(ir0, block3): node0; +// CHECK:STDOUT: node4 = FunctionDeclaration(); +// CHECK:STDOUT: node5 = BindName(str0, node4); +// CHECK:STDOUT: node6 = FunctionDefinition(node4, block1); +// CHECK:STDOUT: node7 = Return(); +// CHECK:STDOUT: }, // CHECK:STDOUT: node_blocks = { // CHECK:STDOUT: block0 = { -// CHECK:STDOUT: node0 = FunctionDeclaration(); -// CHECK:STDOUT: node1 = BindName(str0, node0); -// CHECK:STDOUT: node2 = FunctionDefinition(node0, block1); +// CHECK:STDOUT: node4; +// CHECK:STDOUT: node5; +// CHECK:STDOUT: node6; // CHECK:STDOUT: }, // CHECK:STDOUT: block1 = { -// CHECK:STDOUT: node0 = Return(); +// CHECK:STDOUT: node7; // CHECK:STDOUT: }, // CHECK:STDOUT: } diff --git a/toolchain/semantics/testdata/var/decl.carbon b/toolchain/semantics/testdata/var/decl.carbon index 21101f4c014c..f5f35f9375fc 100644 --- a/toolchain/semantics/testdata/var/decl.carbon +++ b/toolchain/semantics/testdata/var/decl.carbon @@ -4,30 +4,33 @@ // // AUTOUPDATE // RUN: %{carbon-run-semantics} -// CHECK:STDOUT: cross_reference_irs.size == 2, -// CHECK:STDOUT: cross_references = { -// CHECK:STDOUT: node_xref0 = xref(ir0, block0, node0); -// CHECK:STDOUT: node_xref1 = xref(ir0, block0, node1); -// CHECK:STDOUT: node_xref2 = xref(ir0, block0, node2); -// CHECK:STDOUT: node_xref3 = xref(ir0, block0, node3); -// CHECK:STDOUT: node_xref4 = xref(ir1, block0, node1); -// CHECK:STDOUT: node_xref5 = xref(ir1, block1, node1); -// CHECK:STDOUT: }, +// CHECK:STDOUT: cross_reference_irs.size == 1, // CHECK:STDOUT: integer_literals = { // CHECK:STDOUT: }, // CHECK:STDOUT: strings = { // CHECK:STDOUT: str0 = "Main"; // CHECK:STDOUT: str1 = "x"; // CHECK:STDOUT: }, +// CHECK:STDOUT: nodes = { +// CHECK:STDOUT: node0 = CrossReference(ir0, block0): node0; +// CHECK:STDOUT: node1 = CrossReference(ir0, block1): node1; +// CHECK:STDOUT: node2 = CrossReference(ir0, block2): node0; +// CHECK:STDOUT: node3 = CrossReference(ir0, block3): node0; +// CHECK:STDOUT: node4 = FunctionDeclaration(); +// CHECK:STDOUT: node5 = BindName(str0, node4); +// CHECK:STDOUT: node6 = FunctionDefinition(node4, block1); +// CHECK:STDOUT: node7 = VarStorage(): node2; +// CHECK:STDOUT: node8 = BindName(str1, node7): node2; +// CHECK:STDOUT: }, // CHECK:STDOUT: node_blocks = { // CHECK:STDOUT: block0 = { -// CHECK:STDOUT: node0 = FunctionDeclaration(); -// CHECK:STDOUT: node1 = BindName(str0, node0); -// CHECK:STDOUT: node2 = FunctionDefinition(node0, block1); +// CHECK:STDOUT: node4; +// CHECK:STDOUT: node5; +// CHECK:STDOUT: node6; // CHECK:STDOUT: }, // CHECK:STDOUT: block1 = { -// CHECK:STDOUT: node0 = VarStorage(): node_xref2; -// CHECK:STDOUT: node1 = BindName(str1, node0): node_xref2; +// CHECK:STDOUT: node7; +// CHECK:STDOUT: node8; // CHECK:STDOUT: }, // CHECK:STDOUT: } diff --git a/toolchain/semantics/testdata/var/decl_with_init.carbon b/toolchain/semantics/testdata/var/decl_with_init.carbon index efab87126d14..a2bf3077ad34 100644 --- a/toolchain/semantics/testdata/var/decl_with_init.carbon +++ b/toolchain/semantics/testdata/var/decl_with_init.carbon @@ -4,15 +4,7 @@ // // AUTOUPDATE // RUN: %{carbon-run-semantics} -// CHECK:STDOUT: cross_reference_irs.size == 2, -// CHECK:STDOUT: cross_references = { -// CHECK:STDOUT: node_xref0 = xref(ir0, block0, node0); -// CHECK:STDOUT: node_xref1 = xref(ir0, block0, node1); -// CHECK:STDOUT: node_xref2 = xref(ir0, block0, node2); -// CHECK:STDOUT: node_xref3 = xref(ir0, block0, node3); -// CHECK:STDOUT: node_xref4 = xref(ir1, block0, node1); -// CHECK:STDOUT: node_xref5 = xref(ir1, block1, node1); -// CHECK:STDOUT: }, +// CHECK:STDOUT: cross_reference_irs.size == 1, // CHECK:STDOUT: integer_literals = { // CHECK:STDOUT: int0 = 0; // CHECK:STDOUT: }, @@ -20,17 +12,30 @@ // CHECK:STDOUT: str0 = "Main"; // CHECK:STDOUT: str1 = "x"; // CHECK:STDOUT: }, +// CHECK:STDOUT: nodes = { +// CHECK:STDOUT: node0 = CrossReference(ir0, block0): node0; +// CHECK:STDOUT: node1 = CrossReference(ir0, block1): node1; +// CHECK:STDOUT: node2 = CrossReference(ir0, block2): node0; +// CHECK:STDOUT: node3 = CrossReference(ir0, block3): node0; +// CHECK:STDOUT: node4 = FunctionDeclaration(); +// CHECK:STDOUT: node5 = BindName(str0, node4); +// CHECK:STDOUT: node6 = FunctionDefinition(node4, block1); +// CHECK:STDOUT: node7 = VarStorage(): node2; +// CHECK:STDOUT: node8 = BindName(str1, node7): node2; +// CHECK:STDOUT: node9 = IntegerLiteral(int0): node2; +// CHECK:STDOUT: node10 = Assign(node7, node9): node2; +// CHECK:STDOUT: }, // CHECK:STDOUT: node_blocks = { // CHECK:STDOUT: block0 = { -// CHECK:STDOUT: node0 = FunctionDeclaration(); -// CHECK:STDOUT: node1 = BindName(str0, node0); -// CHECK:STDOUT: node2 = FunctionDefinition(node0, block1); +// CHECK:STDOUT: node4; +// CHECK:STDOUT: node5; +// CHECK:STDOUT: node6; // CHECK:STDOUT: }, // CHECK:STDOUT: block1 = { -// CHECK:STDOUT: node0 = VarStorage(): node_xref2; -// CHECK:STDOUT: node1 = BindName(str1, node0): node_xref2; -// CHECK:STDOUT: node2 = IntegerLiteral(int0): node_xref2; -// CHECK:STDOUT: node3 = Assign(node0, node2): node_xref2; +// CHECK:STDOUT: node7; +// CHECK:STDOUT: node8; +// CHECK:STDOUT: node9; +// CHECK:STDOUT: node10; // CHECK:STDOUT: }, // CHECK:STDOUT: } diff --git a/toolchain/semantics/testdata/var/fail_duplicate_decl.carbon b/toolchain/semantics/testdata/var/fail_duplicate_decl.carbon index 2a74d5cceb33..dcf6dd9e5594 100644 --- a/toolchain/semantics/testdata/var/fail_duplicate_decl.carbon +++ b/toolchain/semantics/testdata/var/fail_duplicate_decl.carbon @@ -4,15 +4,7 @@ // // AUTOUPDATE // RUN: %{not} %{carbon-run-semantics} -// CHECK:STDOUT: cross_reference_irs.size == 2, -// CHECK:STDOUT: cross_references = { -// CHECK:STDOUT: node_xref0 = xref(ir0, block0, node0); -// CHECK:STDOUT: node_xref1 = xref(ir0, block0, node1); -// CHECK:STDOUT: node_xref2 = xref(ir0, block0, node2); -// CHECK:STDOUT: node_xref3 = xref(ir0, block0, node3); -// CHECK:STDOUT: node_xref4 = xref(ir1, block0, node1); -// CHECK:STDOUT: node_xref5 = xref(ir1, block1, node1); -// CHECK:STDOUT: }, +// CHECK:STDOUT: cross_reference_irs.size == 1, // CHECK:STDOUT: integer_literals = { // CHECK:STDOUT: int0 = 0; // CHECK:STDOUT: int1 = 0; @@ -21,21 +13,38 @@ // CHECK:STDOUT: str0 = "Main"; // CHECK:STDOUT: str1 = "x"; // CHECK:STDOUT: }, +// CHECK:STDOUT: nodes = { +// CHECK:STDOUT: node0 = CrossReference(ir0, block0): node0; +// CHECK:STDOUT: node1 = CrossReference(ir0, block1): node1; +// CHECK:STDOUT: node2 = CrossReference(ir0, block2): node0; +// CHECK:STDOUT: node3 = CrossReference(ir0, block3): node0; +// CHECK:STDOUT: node4 = FunctionDeclaration(); +// CHECK:STDOUT: node5 = BindName(str0, node4); +// CHECK:STDOUT: node6 = FunctionDefinition(node4, block1); +// CHECK:STDOUT: node7 = VarStorage(): node2; +// CHECK:STDOUT: node8 = BindName(str1, node7): node2; +// CHECK:STDOUT: node9 = IntegerLiteral(int0): node2; +// CHECK:STDOUT: node10 = Assign(node7, node9): node2; +// CHECK:STDOUT: node11 = VarStorage(): node2; +// CHECK:STDOUT: node12 = BindName(str1, node11): node2; +// CHECK:STDOUT: node13 = IntegerLiteral(int1): node2; +// CHECK:STDOUT: node14 = Assign(node11, node13): node2; +// CHECK:STDOUT: }, // CHECK:STDOUT: node_blocks = { // CHECK:STDOUT: block0 = { -// CHECK:STDOUT: node0 = FunctionDeclaration(); -// CHECK:STDOUT: node1 = BindName(str0, node0); -// CHECK:STDOUT: node2 = FunctionDefinition(node0, block1); +// CHECK:STDOUT: node4; +// CHECK:STDOUT: node5; +// CHECK:STDOUT: node6; // CHECK:STDOUT: }, // CHECK:STDOUT: block1 = { -// CHECK:STDOUT: node0 = VarStorage(): node_xref2; -// CHECK:STDOUT: node1 = BindName(str1, node0): node_xref2; -// CHECK:STDOUT: node2 = IntegerLiteral(int0): node_xref2; -// CHECK:STDOUT: node3 = Assign(node0, node2): node_xref2; -// CHECK:STDOUT: node4 = VarStorage(): node_xref2; -// CHECK:STDOUT: node5 = BindName(str1, node4): node_xref2; -// CHECK:STDOUT: node6 = IntegerLiteral(int1): node_xref2; -// CHECK:STDOUT: node7 = Assign(node4, node6): node_xref2; +// CHECK:STDOUT: node7; +// 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: } diff --git a/toolchain/semantics/testdata/var/fail_init_type_mismatch.carbon b/toolchain/semantics/testdata/var/fail_init_type_mismatch.carbon index ba2dce8c3973..0556120bed6b 100644 --- a/toolchain/semantics/testdata/var/fail_init_type_mismatch.carbon +++ b/toolchain/semantics/testdata/var/fail_init_type_mismatch.carbon @@ -4,36 +4,41 @@ // // AUTOUPDATE // RUN: %{not} %{carbon-run-semantics} -// CHECK:STDOUT: cross_reference_irs.size == 2, -// CHECK:STDOUT: cross_references = { -// CHECK:STDOUT: node_xref0 = xref(ir0, block0, node0); -// CHECK:STDOUT: node_xref1 = xref(ir0, block0, node1); -// CHECK:STDOUT: node_xref2 = xref(ir0, block0, node2); -// CHECK:STDOUT: node_xref3 = xref(ir0, block0, node3); -// CHECK:STDOUT: node_xref4 = xref(ir1, block0, node1); -// CHECK:STDOUT: node_xref5 = xref(ir1, block1, node1); -// CHECK:STDOUT: }, +// CHECK:STDOUT: cross_reference_irs.size == 1, // CHECK:STDOUT: integer_literals = { // CHECK:STDOUT: }, // CHECK:STDOUT: strings = { // CHECK:STDOUT: str0 = "Main"; // CHECK:STDOUT: str1 = "x"; // CHECK:STDOUT: }, +// CHECK:STDOUT: nodes = { +// CHECK:STDOUT: node0 = CrossReference(ir0, block0): node0; +// CHECK:STDOUT: node1 = CrossReference(ir0, block1): node1; +// CHECK:STDOUT: node2 = CrossReference(ir0, block2): node0; +// CHECK:STDOUT: node3 = CrossReference(ir0, block3): node0; +// CHECK:STDOUT: node4 = FunctionDeclaration(); +// CHECK:STDOUT: node5 = BindName(str0, node4); +// CHECK:STDOUT: node6 = FunctionDefinition(node4, block1); +// CHECK:STDOUT: node7 = VarStorage(): node2; +// CHECK:STDOUT: node8 = BindName(str1, node7): node2; +// CHECK:STDOUT: node9 = RealLiteral(): node3; +// CHECK:STDOUT: node10 = Assign(node7, node9): node1; +// CHECK:STDOUT: }, // CHECK:STDOUT: node_blocks = { // CHECK:STDOUT: block0 = { -// CHECK:STDOUT: node0 = FunctionDeclaration(); -// CHECK:STDOUT: node1 = BindName(str0, node0); -// CHECK:STDOUT: node2 = FunctionDefinition(node0, block1); +// CHECK:STDOUT: node4; +// CHECK:STDOUT: node5; +// CHECK:STDOUT: node6; // CHECK:STDOUT: }, // CHECK:STDOUT: block1 = { -// CHECK:STDOUT: node0 = VarStorage(): node_xref2; -// CHECK:STDOUT: node1 = BindName(str1, node0): node_xref2; -// CHECK:STDOUT: node2 = RealLiteral(): node_xref3; -// CHECK:STDOUT: node3 = Assign(node0, node2): node_xref1; +// CHECK:STDOUT: node7; +// CHECK:STDOUT: node8; +// CHECK:STDOUT: node9; +// CHECK:STDOUT: node10; // CHECK:STDOUT: }, // CHECK:STDOUT: } fn Main() { - // CHECK:STDERR: {{.*}}/toolchain/semantics/testdata/var/fail_init_type_mismatch.carbon:[[@LINE+1]]:19: Type mismatch: lhs is node_xref2, rhs is node_xref3 + // CHECK:STDERR: {{.*}}/toolchain/semantics/testdata/var/fail_init_type_mismatch.carbon:[[@LINE+1]]:19: Type mismatch: lhs is node2, rhs is node3 var x: i32 = 1.0; } diff --git a/toolchain/semantics/testdata/var/fail_lookup_outside_scope.carbon b/toolchain/semantics/testdata/var/fail_lookup_outside_scope.carbon new file mode 100644 index 000000000000..0ab395442860 --- /dev/null +++ b/toolchain/semantics/testdata/var/fail_lookup_outside_scope.carbon @@ -0,0 +1,49 @@ +// 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: %{not} %{carbon-run-semantics} +// CHECK:STDOUT: cross_reference_irs.size == 1, +// CHECK:STDOUT: integer_literals = { +// CHECK:STDOUT: }, +// CHECK:STDOUT: strings = { +// CHECK:STDOUT: str0 = "Main"; +// CHECK:STDOUT: str1 = "x"; +// CHECK:STDOUT: str2 = "y"; +// CHECK:STDOUT: }, +// CHECK:STDOUT: nodes = { +// CHECK:STDOUT: node0 = CrossReference(ir0, block0): node0; +// CHECK:STDOUT: node1 = CrossReference(ir0, block1): node1; +// CHECK:STDOUT: node2 = CrossReference(ir0, block2): node0; +// CHECK:STDOUT: node3 = CrossReference(ir0, block3): node0; +// CHECK:STDOUT: node4 = FunctionDeclaration(); +// CHECK:STDOUT: node5 = BindName(str0, node4); +// CHECK:STDOUT: node6 = FunctionDefinition(node4, block1); +// CHECK:STDOUT: node7 = VarStorage(): node2; +// CHECK:STDOUT: node8 = BindName(str1, node7): node2; +// CHECK:STDOUT: node9 = VarStorage(): node2; +// CHECK:STDOUT: node10 = BindName(str2, node9): node2; +// CHECK:STDOUT: node11 = Assign(node9, node1): node1; +// CHECK:STDOUT: }, +// CHECK:STDOUT: node_blocks = { +// CHECK:STDOUT: block0 = { +// CHECK:STDOUT: node4; +// CHECK:STDOUT: node5; +// CHECK:STDOUT: node6; +// CHECK:STDOUT: node9; +// CHECK:STDOUT: node10; +// CHECK:STDOUT: node11; +// CHECK:STDOUT: }, +// CHECK:STDOUT: block1 = { +// CHECK:STDOUT: node7; +// CHECK:STDOUT: node8; +// CHECK:STDOUT: }, +// CHECK:STDOUT: } + +fn Main() { + var x: i32; +} + +// CHECK:STDERR: {{.*}}/toolchain/semantics/testdata/var/fail_lookup_outside_scope.carbon:[[@LINE+1]]:14: Name x not found +var y: i32 = x; diff --git a/toolchain/semantics/testdata/var/global_decl.carbon b/toolchain/semantics/testdata/var/global_decl.carbon index 1bbc94a292a7..2ddeea9049c2 100644 --- a/toolchain/semantics/testdata/var/global_decl.carbon +++ b/toolchain/semantics/testdata/var/global_decl.carbon @@ -4,23 +4,24 @@ // // AUTOUPDATE // RUN: %{carbon-run-semantics} -// CHECK:STDOUT: cross_reference_irs.size == 2, -// CHECK:STDOUT: cross_references = { -// CHECK:STDOUT: node_xref0 = xref(ir0, block0, node0); -// CHECK:STDOUT: node_xref1 = xref(ir0, block0, node1); -// CHECK:STDOUT: node_xref2 = xref(ir0, block0, node2); -// CHECK:STDOUT: node_xref3 = xref(ir0, block0, node3); -// CHECK:STDOUT: node_xref4 = xref(ir1, block0, node1); -// CHECK:STDOUT: }, +// CHECK:STDOUT: cross_reference_irs.size == 1, // CHECK:STDOUT: integer_literals = { // CHECK:STDOUT: }, // CHECK:STDOUT: strings = { // CHECK:STDOUT: str0 = "x"; // CHECK:STDOUT: }, +// CHECK:STDOUT: nodes = { +// CHECK:STDOUT: node0 = CrossReference(ir0, block0): node0; +// CHECK:STDOUT: node1 = CrossReference(ir0, block1): node1; +// CHECK:STDOUT: node2 = CrossReference(ir0, block2): node0; +// CHECK:STDOUT: node3 = CrossReference(ir0, block3): node0; +// CHECK:STDOUT: node4 = VarStorage(): node2; +// CHECK:STDOUT: node5 = BindName(str0, node4): node2; +// CHECK:STDOUT: }, // CHECK:STDOUT: node_blocks = { // CHECK:STDOUT: block0 = { -// CHECK:STDOUT: node0 = VarStorage(): node_xref2; -// CHECK:STDOUT: node1 = BindName(str0, node0): node_xref2; +// CHECK:STDOUT: node4; +// CHECK:STDOUT: node5; // CHECK:STDOUT: }, // CHECK:STDOUT: } diff --git a/toolchain/semantics/testdata/var/global_decl_with_init.carbon b/toolchain/semantics/testdata/var/global_decl_with_init.carbon index 4b374b5b8042..fbf36646e8e6 100644 --- a/toolchain/semantics/testdata/var/global_decl_with_init.carbon +++ b/toolchain/semantics/testdata/var/global_decl_with_init.carbon @@ -4,26 +4,29 @@ // // AUTOUPDATE // RUN: %{carbon-run-semantics} -// CHECK:STDOUT: cross_reference_irs.size == 2, -// CHECK:STDOUT: cross_references = { -// CHECK:STDOUT: node_xref0 = xref(ir0, block0, node0); -// CHECK:STDOUT: node_xref1 = xref(ir0, block0, node1); -// CHECK:STDOUT: node_xref2 = xref(ir0, block0, node2); -// CHECK:STDOUT: node_xref3 = xref(ir0, block0, node3); -// CHECK:STDOUT: node_xref4 = xref(ir1, block0, node1); -// CHECK:STDOUT: }, +// CHECK:STDOUT: cross_reference_irs.size == 1, // CHECK:STDOUT: integer_literals = { // CHECK:STDOUT: int0 = 0; // CHECK:STDOUT: }, // CHECK:STDOUT: strings = { // CHECK:STDOUT: str0 = "x"; // CHECK:STDOUT: }, +// CHECK:STDOUT: nodes = { +// CHECK:STDOUT: node0 = CrossReference(ir0, block0): node0; +// CHECK:STDOUT: node1 = CrossReference(ir0, block1): node1; +// CHECK:STDOUT: node2 = CrossReference(ir0, block2): node0; +// CHECK:STDOUT: node3 = CrossReference(ir0, block3): node0; +// CHECK:STDOUT: node4 = VarStorage(): node2; +// CHECK:STDOUT: node5 = BindName(str0, node4): node2; +// CHECK:STDOUT: node6 = IntegerLiteral(int0): node2; +// CHECK:STDOUT: node7 = Assign(node4, node6): node2; +// CHECK:STDOUT: }, // CHECK:STDOUT: node_blocks = { // CHECK:STDOUT: block0 = { -// CHECK:STDOUT: node0 = VarStorage(): node_xref2; -// CHECK:STDOUT: node1 = BindName(str0, node0): node_xref2; -// CHECK:STDOUT: node2 = IntegerLiteral(int0): node_xref2; -// CHECK:STDOUT: node3 = Assign(node0, node2): node_xref2; +// CHECK:STDOUT: node4; +// CHECK:STDOUT: node5; +// CHECK:STDOUT: node6; +// CHECK:STDOUT: node7; // CHECK:STDOUT: }, // CHECK:STDOUT: } diff --git a/toolchain/semantics/testdata/var/global_lookup.carbon b/toolchain/semantics/testdata/var/global_lookup.carbon index 17cfe5a09696..a08f802139ad 100644 --- a/toolchain/semantics/testdata/var/global_lookup.carbon +++ b/toolchain/semantics/testdata/var/global_lookup.carbon @@ -4,15 +4,7 @@ // // AUTOUPDATE // RUN: %{carbon-run-semantics} -// CHECK:STDOUT: cross_reference_irs.size == 2, -// CHECK:STDOUT: cross_references = { -// CHECK:STDOUT: node_xref0 = xref(ir0, block0, node0); -// CHECK:STDOUT: node_xref1 = xref(ir0, block0, node1); -// CHECK:STDOUT: node_xref2 = xref(ir0, block0, node2); -// CHECK:STDOUT: node_xref3 = xref(ir0, block0, node3); -// CHECK:STDOUT: node_xref4 = xref(ir1, block0, node1); -// CHECK:STDOUT: node_xref5 = xref(ir1, block0, node5); -// CHECK:STDOUT: }, +// CHECK:STDOUT: cross_reference_irs.size == 1, // CHECK:STDOUT: integer_literals = { // CHECK:STDOUT: int0 = 0; // CHECK:STDOUT: }, @@ -20,15 +12,28 @@ // CHECK:STDOUT: str0 = "x"; // CHECK:STDOUT: str1 = "y"; // CHECK:STDOUT: }, +// CHECK:STDOUT: nodes = { +// CHECK:STDOUT: node0 = CrossReference(ir0, block0): node0; +// CHECK:STDOUT: node1 = CrossReference(ir0, block1): node1; +// CHECK:STDOUT: node2 = CrossReference(ir0, block2): node0; +// CHECK:STDOUT: node3 = CrossReference(ir0, block3): node0; +// CHECK:STDOUT: node4 = VarStorage(): node2; +// CHECK:STDOUT: node5 = BindName(str0, node4): node2; +// CHECK:STDOUT: node6 = IntegerLiteral(int0): node2; +// CHECK:STDOUT: node7 = Assign(node4, node6): node2; +// CHECK:STDOUT: node8 = VarStorage(): node2; +// CHECK:STDOUT: node9 = BindName(str1, node8): node2; +// CHECK:STDOUT: node10 = Assign(node8, node5): node2; +// CHECK:STDOUT: }, // CHECK:STDOUT: node_blocks = { // CHECK:STDOUT: block0 = { -// CHECK:STDOUT: node0 = VarStorage(): node_xref2; -// CHECK:STDOUT: node1 = BindName(str0, node0): node_xref2; -// CHECK:STDOUT: node2 = IntegerLiteral(int0): node_xref2; -// CHECK:STDOUT: node3 = Assign(node0, node2): node_xref2; -// CHECK:STDOUT: node4 = VarStorage(): node_xref2; -// CHECK:STDOUT: node5 = BindName(str1, node4): node_xref2; -// CHECK:STDOUT: node6 = Assign(node4, node_xref4): node_xref2; +// CHECK:STDOUT: node4; +// CHECK:STDOUT: node5; +// CHECK:STDOUT: node6; +// CHECK:STDOUT: node7; +// CHECK:STDOUT: node8; +// CHECK:STDOUT: node9; +// CHECK:STDOUT: node10; // CHECK:STDOUT: }, // CHECK:STDOUT: } diff --git a/toolchain/semantics/testdata/var/global_lookup_in_scope.carbon b/toolchain/semantics/testdata/var/global_lookup_in_scope.carbon index 8d2bd2ab4542..641673caa256 100644 --- a/toolchain/semantics/testdata/var/global_lookup_in_scope.carbon +++ b/toolchain/semantics/testdata/var/global_lookup_in_scope.carbon @@ -4,16 +4,7 @@ // // AUTOUPDATE // RUN: %{carbon-run-semantics} -// CHECK:STDOUT: cross_reference_irs.size == 2, -// CHECK:STDOUT: cross_references = { -// CHECK:STDOUT: node_xref0 = xref(ir0, block0, node0); -// CHECK:STDOUT: node_xref1 = xref(ir0, block0, node1); -// CHECK:STDOUT: node_xref2 = xref(ir0, block0, node2); -// CHECK:STDOUT: node_xref3 = xref(ir0, block0, node3); -// CHECK:STDOUT: node_xref4 = xref(ir1, block0, node1); -// CHECK:STDOUT: node_xref5 = xref(ir1, block0, node5); -// CHECK:STDOUT: node_xref6 = xref(ir1, block1, node1); -// CHECK:STDOUT: }, +// CHECK:STDOUT: cross_reference_irs.size == 1, // CHECK:STDOUT: integer_literals = { // CHECK:STDOUT: int0 = 0; // CHECK:STDOUT: }, @@ -22,20 +13,36 @@ // CHECK:STDOUT: str1 = "Main"; // CHECK:STDOUT: str2 = "y"; // CHECK:STDOUT: }, +// CHECK:STDOUT: nodes = { +// CHECK:STDOUT: node0 = CrossReference(ir0, block0): node0; +// CHECK:STDOUT: node1 = CrossReference(ir0, block1): node1; +// CHECK:STDOUT: node2 = CrossReference(ir0, block2): node0; +// CHECK:STDOUT: node3 = CrossReference(ir0, block3): node0; +// CHECK:STDOUT: node4 = VarStorage(): node2; +// CHECK:STDOUT: node5 = BindName(str0, node4): node2; +// CHECK:STDOUT: node6 = IntegerLiteral(int0): node2; +// CHECK:STDOUT: node7 = Assign(node4, node6): node2; +// CHECK:STDOUT: node8 = FunctionDeclaration(); +// CHECK:STDOUT: node9 = BindName(str1, node8); +// CHECK:STDOUT: node10 = FunctionDefinition(node8, block1); +// CHECK:STDOUT: node11 = VarStorage(): node2; +// CHECK:STDOUT: node12 = BindName(str2, node11): node2; +// CHECK:STDOUT: node13 = Assign(node11, node5): node2; +// CHECK:STDOUT: }, // CHECK:STDOUT: node_blocks = { // CHECK:STDOUT: block0 = { -// CHECK:STDOUT: node0 = VarStorage(): node_xref2; -// CHECK:STDOUT: node1 = BindName(str0, node0): node_xref2; -// CHECK:STDOUT: node2 = IntegerLiteral(int0): node_xref2; -// CHECK:STDOUT: node3 = Assign(node0, node2): node_xref2; -// CHECK:STDOUT: node4 = FunctionDeclaration(); -// CHECK:STDOUT: node5 = BindName(str1, node4); -// CHECK:STDOUT: node6 = FunctionDefinition(node4, block1); +// CHECK:STDOUT: node4; +// CHECK:STDOUT: node5; +// CHECK:STDOUT: node6; +// CHECK:STDOUT: node7; +// CHECK:STDOUT: node8; +// CHECK:STDOUT: node9; +// CHECK:STDOUT: node10; // CHECK:STDOUT: }, // CHECK:STDOUT: block1 = { -// CHECK:STDOUT: node0 = VarStorage(): node_xref2; -// CHECK:STDOUT: node1 = BindName(str2, node0): node_xref2; -// CHECK:STDOUT: node2 = Assign(node0, node_xref4): node_xref2; +// CHECK:STDOUT: node11; +// CHECK:STDOUT: node12; +// CHECK:STDOUT: node13; // CHECK:STDOUT: }, // CHECK:STDOUT: } diff --git a/toolchain/semantics/testdata/var/lookup.carbon b/toolchain/semantics/testdata/var/lookup.carbon index 7409038856ac..c839897d30bf 100644 --- a/toolchain/semantics/testdata/var/lookup.carbon +++ b/toolchain/semantics/testdata/var/lookup.carbon @@ -4,15 +4,7 @@ // // AUTOUPDATE // RUN: %{carbon-run-semantics} -// CHECK:STDOUT: cross_reference_irs.size == 2, -// CHECK:STDOUT: cross_references = { -// CHECK:STDOUT: node_xref0 = xref(ir0, block0, node0); -// CHECK:STDOUT: node_xref1 = xref(ir0, block0, node1); -// CHECK:STDOUT: node_xref2 = xref(ir0, block0, node2); -// CHECK:STDOUT: node_xref3 = xref(ir0, block0, node3); -// CHECK:STDOUT: node_xref4 = xref(ir1, block0, node1); -// CHECK:STDOUT: node_xref5 = xref(ir1, block1, node1); -// CHECK:STDOUT: }, +// CHECK:STDOUT: cross_reference_irs.size == 1, // CHECK:STDOUT: integer_literals = { // CHECK:STDOUT: int0 = 0; // CHECK:STDOUT: }, @@ -20,17 +12,30 @@ // CHECK:STDOUT: str0 = "Main"; // CHECK:STDOUT: str1 = "x"; // CHECK:STDOUT: }, +// CHECK:STDOUT: nodes = { +// CHECK:STDOUT: node0 = CrossReference(ir0, block0): node0; +// CHECK:STDOUT: node1 = CrossReference(ir0, block1): node1; +// CHECK:STDOUT: node2 = CrossReference(ir0, block2): node0; +// CHECK:STDOUT: node3 = CrossReference(ir0, block3): node0; +// CHECK:STDOUT: node4 = FunctionDeclaration(); +// CHECK:STDOUT: node5 = BindName(str0, node4); +// CHECK:STDOUT: node6 = FunctionDefinition(node4, block1); +// CHECK:STDOUT: node7 = VarStorage(): node2; +// CHECK:STDOUT: node8 = BindName(str1, node7): node2; +// CHECK:STDOUT: node9 = IntegerLiteral(int0): node2; +// CHECK:STDOUT: node10 = Assign(node7, node9): node2; +// CHECK:STDOUT: }, // CHECK:STDOUT: node_blocks = { // CHECK:STDOUT: block0 = { -// CHECK:STDOUT: node0 = FunctionDeclaration(); -// CHECK:STDOUT: node1 = BindName(str0, node0); -// CHECK:STDOUT: node2 = FunctionDefinition(node0, block1); +// CHECK:STDOUT: node4; +// CHECK:STDOUT: node5; +// CHECK:STDOUT: node6; // CHECK:STDOUT: }, // CHECK:STDOUT: block1 = { -// CHECK:STDOUT: node0 = VarStorage(): node_xref2; -// CHECK:STDOUT: node1 = BindName(str1, node0): node_xref2; -// CHECK:STDOUT: node2 = IntegerLiteral(int0): node_xref2; -// CHECK:STDOUT: node3 = Assign(node0, node2): node_xref2; +// CHECK:STDOUT: node7; +// CHECK:STDOUT: node8; +// CHECK:STDOUT: node9; +// CHECK:STDOUT: node10; // CHECK:STDOUT: }, // CHECK:STDOUT: } diff --git a/toolchain/semantics/testdata/var/todo_bad_init_with_self.carbon b/toolchain/semantics/testdata/var/todo_bad_init_with_self.carbon index 0a9a0f18b21b..6b783dbf5902 100644 --- a/toolchain/semantics/testdata/var/todo_bad_init_with_self.carbon +++ b/toolchain/semantics/testdata/var/todo_bad_init_with_self.carbon @@ -4,31 +4,35 @@ // // AUTOUPDATE // RUN: %{carbon-run-semantics} -// CHECK:STDOUT: cross_reference_irs.size == 2, -// CHECK:STDOUT: cross_references = { -// CHECK:STDOUT: node_xref0 = xref(ir0, block0, node0); -// CHECK:STDOUT: node_xref1 = xref(ir0, block0, node1); -// CHECK:STDOUT: node_xref2 = xref(ir0, block0, node2); -// CHECK:STDOUT: node_xref3 = xref(ir0, block0, node3); -// CHECK:STDOUT: node_xref4 = xref(ir1, block0, node1); -// CHECK:STDOUT: node_xref5 = xref(ir1, block1, node1); -// CHECK:STDOUT: }, +// CHECK:STDOUT: cross_reference_irs.size == 1, // CHECK:STDOUT: integer_literals = { // CHECK:STDOUT: }, // CHECK:STDOUT: strings = { // CHECK:STDOUT: str0 = "Main"; // CHECK:STDOUT: str1 = "x"; // CHECK:STDOUT: }, +// CHECK:STDOUT: nodes = { +// CHECK:STDOUT: node0 = CrossReference(ir0, block0): node0; +// CHECK:STDOUT: node1 = CrossReference(ir0, block1): node1; +// CHECK:STDOUT: node2 = CrossReference(ir0, block2): node0; +// CHECK:STDOUT: node3 = CrossReference(ir0, block3): node0; +// CHECK:STDOUT: node4 = FunctionDeclaration(); +// CHECK:STDOUT: node5 = BindName(str0, node4); +// CHECK:STDOUT: node6 = FunctionDefinition(node4, block1); +// CHECK:STDOUT: node7 = VarStorage(): node2; +// CHECK:STDOUT: node8 = BindName(str1, node7): node2; +// CHECK:STDOUT: node9 = Assign(node7, node8): node2; +// CHECK:STDOUT: }, // CHECK:STDOUT: node_blocks = { // CHECK:STDOUT: block0 = { -// CHECK:STDOUT: node0 = FunctionDeclaration(); -// CHECK:STDOUT: node1 = BindName(str0, node0); -// CHECK:STDOUT: node2 = FunctionDefinition(node0, block1); +// CHECK:STDOUT: node4; +// CHECK:STDOUT: node5; +// CHECK:STDOUT: node6; // CHECK:STDOUT: }, // CHECK:STDOUT: block1 = { -// CHECK:STDOUT: node0 = VarStorage(): node_xref2; -// CHECK:STDOUT: node1 = BindName(str1, node0): node_xref2; -// CHECK:STDOUT: node2 = Assign(node0, node_xref5): node_xref2; +// CHECK:STDOUT: node7; +// CHECK:STDOUT: node8; +// CHECK:STDOUT: node9; // CHECK:STDOUT: }, // CHECK:STDOUT: } diff --git a/toolchain/semantics/testdata/var/todo_bad_lookup_outside_scope.carbon b/toolchain/semantics/testdata/var/todo_bad_lookup_outside_scope.carbon deleted file mode 100644 index c91319b04a1b..000000000000 --- a/toolchain/semantics/testdata/var/todo_bad_lookup_outside_scope.carbon +++ /dev/null @@ -1,41 +0,0 @@ -// 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-semantics} -// CHECK:STDOUT: cross_reference_irs.size == 2, -// CHECK:STDOUT: cross_references = { -// CHECK:STDOUT: node_xref0 = xref(ir0, block0, node0); -// CHECK:STDOUT: node_xref1 = xref(ir0, block0, node1); -// CHECK:STDOUT: node_xref2 = xref(ir0, block0, node2); -// CHECK:STDOUT: node_xref3 = xref(ir0, block0, node3); -// CHECK:STDOUT: node_xref4 = xref(ir1, block0, node1); -// CHECK:STDOUT: node_xref5 = xref(ir1, block1, node1); -// CHECK:STDOUT: }, -// CHECK:STDOUT: integer_literals = { -// CHECK:STDOUT: }, -// CHECK:STDOUT: strings = { -// CHECK:STDOUT: str0 = "Main"; -// CHECK:STDOUT: str1 = "x"; -// CHECK:STDOUT: }, -// CHECK:STDOUT: node_blocks = { -// CHECK:STDOUT: block0 = { -// CHECK:STDOUT: node0 = FunctionDeclaration(); -// CHECK:STDOUT: node1 = BindName(str0, node0); -// CHECK:STDOUT: node2 = FunctionDefinition(node0, block1); -// CHECK:STDOUT: }, -// CHECK:STDOUT: block1 = { -// CHECK:STDOUT: node0 = VarStorage(): node_xref2; -// CHECK:STDOUT: node1 = BindName(str1, node0): node_xref2; -// CHECK:STDOUT: }, -// CHECK:STDOUT: } - -fn Main() { - var x: i32; -} - -// TODO: This is a crash because the type of `x` is incorrect. That needs to be -// fixed, but it crashes due to cross-reference handling which I intend to -// rewrite, so leaving this as a TODO. -// var y: i32 = x;