diff --git a/toolchain/semantics/semantics_handle_struct.cpp b/toolchain/semantics/semantics_handle_struct.cpp index 208ac4e13ad2..68741f030f50 100644 --- a/toolchain/semantics/semantics_handle_struct.cpp +++ b/toolchain/semantics/semantics_handle_struct.cpp @@ -108,9 +108,9 @@ auto SemanticsHandleStructTypeLiteral(SemanticsContext& context, CARBON_CHECK(refs_id != SemanticsNodeBlockId::Empty) << "{} is handled by StructLiteral."; - auto type_id = context.CanonicalizeStructType(parse_node, refs_id); - context.node_stack().Push(parse_node, - context.semantics_ir().GetType(type_id)); + context.AddNodeAndPush(parse_node, + SemanticsNode::StructType::Make( + parse_node, SemanticsTypeId::TypeType, refs_id)); return true; } diff --git a/toolchain/semantics/testdata/pointer/address_of_lvalue.carbon b/toolchain/semantics/testdata/pointer/address_of_lvalue.carbon index 1df4eb8d9a10..7bde977e46c6 100644 --- a/toolchain/semantics/testdata/pointer/address_of_lvalue.carbon +++ b/toolchain/semantics/testdata/pointer/address_of_lvalue.carbon @@ -51,10 +51,10 @@ fn F(param: i32) { // CHECK:STDOUT: types: [ // CHECK:STDOUT: nodeIntegerType, // CHECK:STDOUT: node+5, -// CHECK:STDOUT: node+18, -// CHECK:STDOUT: node+23, -// CHECK:STDOUT: node+37, -// CHECK:STDOUT: node+39, +// CHECK:STDOUT: node+19, +// CHECK:STDOUT: node+24, +// CHECK:STDOUT: node+38, +// CHECK:STDOUT: node+40, // CHECK:STDOUT: ] // CHECK:STDOUT: type_blocks: [ // CHECK:STDOUT: [ @@ -85,55 +85,56 @@ fn F(param: i32) { // CHECK:STDOUT: {kind: Assign, arg0: node+6, arg1: node+14}, // CHECK:STDOUT: {kind: StructTypeField, arg0: str3, arg1: type0}, // CHECK:STDOUT: {kind: StructTypeField, arg0: str4, arg1: type0}, +// CHECK:STDOUT: {kind: StructType, arg0: block8, type: typeTypeType}, // CHECK:STDOUT: {kind: PointerType, arg0: type1, type: typeTypeType}, // CHECK:STDOUT: {kind: VarStorage, type: type2}, -// CHECK:STDOUT: {kind: BindName, arg0: str5, arg1: node+19, type: type2}, +// CHECK:STDOUT: {kind: BindName, arg0: str5, arg1: node+20, type: type2}, // CHECK:STDOUT: {kind: AddressOf, arg0: node+6, type: type2}, -// CHECK:STDOUT: {kind: Assign, arg0: node+19, arg1: node+21}, +// CHECK:STDOUT: {kind: Assign, arg0: node+20, arg1: node+22}, // CHECK:STDOUT: {kind: PointerType, arg0: type0, type: typeTypeType}, // CHECK:STDOUT: {kind: VarStorage, type: type3}, -// CHECK:STDOUT: {kind: BindName, arg0: str6, arg1: node+24, type: type3}, +// CHECK:STDOUT: {kind: BindName, arg0: str6, arg1: node+25, type: type3}, // CHECK:STDOUT: {kind: StructMemberAccess, arg0: node+6, arg1: member0, type: type0}, -// CHECK:STDOUT: {kind: AddressOf, arg0: node+26, type: type3}, -// CHECK:STDOUT: {kind: Assign, arg0: node+24, arg1: node+27}, +// CHECK:STDOUT: {kind: AddressOf, arg0: node+27, type: type3}, +// CHECK:STDOUT: {kind: Assign, arg0: node+25, arg1: node+28}, // CHECK:STDOUT: {kind: PointerType, arg0: type0, type: typeTypeType}, // CHECK:STDOUT: {kind: VarStorage, type: type3}, -// CHECK:STDOUT: {kind: BindName, arg0: str7, arg1: node+30, type: type3}, +// CHECK:STDOUT: {kind: BindName, arg0: str7, arg1: node+31, type: type3}, // CHECK:STDOUT: {kind: StructMemberAccess, arg0: node+6, arg1: member1, type: type0}, -// CHECK:STDOUT: {kind: AddressOf, arg0: node+32, type: type3}, -// CHECK:STDOUT: {kind: Assign, arg0: node+30, arg1: node+33}, +// CHECK:STDOUT: {kind: AddressOf, arg0: node+33, type: type3}, +// CHECK:STDOUT: {kind: Assign, arg0: node+31, arg1: node+34}, // CHECK:STDOUT: {kind: StubReference, arg0: nodeIntegerType, type: typeTypeType}, // CHECK:STDOUT: {kind: StubReference, arg0: nodeIntegerType, type: typeTypeType}, // CHECK:STDOUT: {kind: TupleType, arg0: typeBlock0, type: typeTypeType}, // CHECK:STDOUT: {kind: TupleValue, arg0: block9, type: type4}, // CHECK:STDOUT: {kind: TupleType, arg0: typeBlock1, type: typeTypeType}, // CHECK:STDOUT: {kind: VarStorage, type: type5}, -// CHECK:STDOUT: {kind: BindName, arg0: str8, arg1: node+40, type: type5}, +// CHECK:STDOUT: {kind: BindName, arg0: str8, arg1: node+41, type: type5}, // CHECK:STDOUT: {kind: IntegerLiteral, arg0: int2, type: type0}, -// CHECK:STDOUT: {kind: StubReference, arg0: node+42, type: type0}, +// CHECK:STDOUT: {kind: StubReference, arg0: node+43, type: type0}, // CHECK:STDOUT: {kind: IntegerLiteral, arg0: int3, type: type0}, -// CHECK:STDOUT: {kind: StubReference, arg0: node+44, type: type0}, +// CHECK:STDOUT: {kind: StubReference, arg0: node+45, type: type0}, // CHECK:STDOUT: {kind: TupleValue, arg0: block10, type: type5}, -// CHECK:STDOUT: {kind: Assign, arg0: node+40, arg1: node+46}, +// CHECK:STDOUT: {kind: Assign, arg0: node+41, arg1: node+47}, // CHECK:STDOUT: {kind: PointerType, arg0: type0, type: typeTypeType}, // CHECK:STDOUT: {kind: VarStorage, type: type3}, -// CHECK:STDOUT: {kind: BindName, arg0: str9, arg1: node+49, type: type3}, +// CHECK:STDOUT: {kind: BindName, arg0: str9, arg1: node+50, type: type3}, // CHECK:STDOUT: {kind: IntegerLiteral, arg0: int4, type: type0}, -// CHECK:STDOUT: {kind: Index, arg0: node+40, arg1: node+51, type: type0}, -// CHECK:STDOUT: {kind: AddressOf, arg0: node+52, type: type3}, -// CHECK:STDOUT: {kind: Assign, arg0: node+49, arg1: node+53}, +// CHECK:STDOUT: {kind: Index, arg0: node+41, arg1: node+52, type: type0}, +// CHECK:STDOUT: {kind: AddressOf, arg0: node+53, type: type3}, +// CHECK:STDOUT: {kind: Assign, arg0: node+50, arg1: node+54}, // CHECK:STDOUT: {kind: PointerType, arg0: type0, type: typeTypeType}, // CHECK:STDOUT: {kind: VarStorage, type: type3}, -// CHECK:STDOUT: {kind: BindName, arg0: str10, arg1: node+56, type: type3}, +// CHECK:STDOUT: {kind: BindName, arg0: str10, arg1: node+57, type: type3}, // CHECK:STDOUT: {kind: IntegerLiteral, arg0: int5, type: type0}, -// CHECK:STDOUT: {kind: Index, arg0: node+40, arg1: node+58, type: type0}, -// CHECK:STDOUT: {kind: AddressOf, arg0: node+59, type: type3}, -// CHECK:STDOUT: {kind: Assign, arg0: node+56, arg1: node+60}, +// CHECK:STDOUT: {kind: Index, arg0: node+41, arg1: node+59, type: type0}, +// CHECK:STDOUT: {kind: AddressOf, arg0: node+60, type: type3}, +// CHECK:STDOUT: {kind: Assign, arg0: node+57, arg1: node+61}, // CHECK:STDOUT: {kind: PointerType, arg0: type0, type: typeTypeType}, // CHECK:STDOUT: {kind: VarStorage, type: type3}, -// CHECK:STDOUT: {kind: BindName, arg0: str11, arg1: node+63, type: type3}, +// CHECK:STDOUT: {kind: BindName, arg0: str11, arg1: node+64, type: type3}, // CHECK:STDOUT: {kind: AddressOf, arg0: node+0, type: type3}, -// CHECK:STDOUT: {kind: Assign, arg0: node+63, arg1: node+65}, +// CHECK:STDOUT: {kind: Assign, arg0: node+64, arg1: node+66}, // CHECK:STDOUT: {kind: Return}, // CHECK:STDOUT: ] // CHECK:STDOUT: node_blocks: [ @@ -213,6 +214,7 @@ fn F(param: i32) { // CHECK:STDOUT: node+65, // CHECK:STDOUT: node+66, // CHECK:STDOUT: node+67, +// CHECK:STDOUT: node+68, // CHECK:STDOUT: ], // CHECK:STDOUT: [ // CHECK:STDOUT: node+3, @@ -231,12 +233,12 @@ fn F(param: i32) { // CHECK:STDOUT: node+17, // CHECK:STDOUT: ], // CHECK:STDOUT: [ -// CHECK:STDOUT: node+35, // CHECK:STDOUT: node+36, +// CHECK:STDOUT: node+37, // CHECK:STDOUT: ], // CHECK:STDOUT: [ -// CHECK:STDOUT: node+43, -// CHECK:STDOUT: node+45, +// CHECK:STDOUT: node+44, +// CHECK:STDOUT: node+46, // CHECK:STDOUT: ], // CHECK:STDOUT: ] // CHECK:STDOUT: @@ -254,6 +256,7 @@ fn F(param: i32) { // CHECK:STDOUT: %.loc8_43: i32 = stub_reference %.loc8_45 // CHECK:STDOUT: %.loc8_46: {.a: i32, .b: i32} = struct_value (%.loc8_35, %.loc8_43) // CHECK:STDOUT: assign %s, %.loc8_46 +// CHECK:STDOUT: %.loc10_27: type = struct_type {.a: i32, .b: i32} // CHECK:STDOUT: %.loc10_28: type = ptr_type {.a: i32, .b: i32} // CHECK:STDOUT: %p: {.a: i32, .b: i32}* = var // CHECK:STDOUT: %.loc10_32: {.a: i32, .b: i32}* = address_of %s diff --git a/toolchain/semantics/testdata/struct/fail_type_assign.carbon b/toolchain/semantics/testdata/struct/fail_type_assign.carbon index e6f41e8cf267..63d7e1f661af 100644 --- a/toolchain/semantics/testdata/struct/fail_type_assign.carbon +++ b/toolchain/semantics/testdata/struct/fail_type_assign.carbon @@ -32,6 +32,7 @@ var x: {.a: i32} = {.a: i32}; // CHECK:STDOUT: {kind: VarStorage, type: type1}, // CHECK:STDOUT: {kind: BindName, arg0: str0, arg1: node+2, type: type1}, // CHECK:STDOUT: {kind: StructTypeField, arg0: str1, arg1: type0}, +// CHECK:STDOUT: {kind: StructType, arg0: block3, type: typeTypeType}, // CHECK:STDOUT: {kind: Assign, arg0: node+2, arg1: nodeError}, // CHECK:STDOUT: ] // CHECK:STDOUT: node_blocks: [ @@ -44,6 +45,7 @@ var x: {.a: i32} = {.a: i32}; // CHECK:STDOUT: node+3, // CHECK:STDOUT: node+4, // CHECK:STDOUT: node+5, +// CHECK:STDOUT: node+6, // CHECK:STDOUT: ], // CHECK:STDOUT: [ // CHECK:STDOUT: node+0, @@ -54,7 +56,8 @@ var x: {.a: i32} = {.a: i32}; // CHECK:STDOUT: ] // CHECK:STDOUT: // CHECK:STDOUT: package { -// CHECK:STDOUT: %.loc10: type = struct_type {.a: i32} +// CHECK:STDOUT: %.loc10_16: type = struct_type {.a: i32} // CHECK:STDOUT: %x: {.a: i32} = var +// CHECK:STDOUT: %.loc10_28: type = struct_type {.a: i32} // CHECK:STDOUT: assign %x, // CHECK:STDOUT: } diff --git a/toolchain/semantics/testdata/struct/one_entry.carbon b/toolchain/semantics/testdata/struct/one_entry.carbon index b834c2260ad9..d48dea4022dc 100644 --- a/toolchain/semantics/testdata/struct/one_entry.carbon +++ b/toolchain/semantics/testdata/struct/one_entry.carbon @@ -37,9 +37,10 @@ var y: {.a: i32} = x; // CHECK:STDOUT: {kind: StructValue, arg0: block4, type: type1}, // CHECK:STDOUT: {kind: Assign, arg0: node+2, arg1: node+7}, // CHECK:STDOUT: {kind: StructTypeField, arg0: str1, arg1: type0}, +// CHECK:STDOUT: {kind: StructType, arg0: block5, type: typeTypeType}, // CHECK:STDOUT: {kind: VarStorage, type: type1}, -// CHECK:STDOUT: {kind: BindName, arg0: str2, arg1: node+10, type: type1}, -// CHECK:STDOUT: {kind: Assign, arg0: node+10, arg1: node+2}, +// CHECK:STDOUT: {kind: BindName, arg0: str2, arg1: node+11, type: type1}, +// CHECK:STDOUT: {kind: Assign, arg0: node+11, arg1: node+2}, // CHECK:STDOUT: ] // CHECK:STDOUT: node_blocks: [ // CHECK:STDOUT: [ @@ -57,6 +58,7 @@ var y: {.a: i32} = x; // CHECK:STDOUT: node+10, // CHECK:STDOUT: node+11, // CHECK:STDOUT: node+12, +// CHECK:STDOUT: node+13, // CHECK:STDOUT: ], // CHECK:STDOUT: [ // CHECK:STDOUT: node+0, @@ -79,6 +81,7 @@ var y: {.a: i32} = x; // CHECK:STDOUT: %.loc7_24: i32 = stub_reference %.loc7_26 // CHECK:STDOUT: %.loc7_27: {.a: i32} = struct_value (%.loc7_24) // CHECK:STDOUT: assign %x, %.loc7_27 +// CHECK:STDOUT: %.loc8: type = struct_type {.a: i32} // CHECK:STDOUT: %y: {.a: i32} = var // CHECK:STDOUT: assign %y, %x // CHECK:STDOUT: } diff --git a/toolchain/semantics/testdata/struct/tuple_as_element.carbon b/toolchain/semantics/testdata/struct/tuple_as_element.carbon index 979b65fca037..ffb45bf36545 100644 --- a/toolchain/semantics/testdata/struct/tuple_as_element.carbon +++ b/toolchain/semantics/testdata/struct/tuple_as_element.carbon @@ -60,9 +60,10 @@ var y: {.a: i32, .b: (i32,)} = x; // CHECK:STDOUT: {kind: StubReference, arg0: nodeIntegerType, type: typeTypeType}, // CHECK:STDOUT: {kind: TupleValue, arg0: block8, type: type1}, // CHECK:STDOUT: {kind: StructTypeField, arg0: str2, arg1: type2}, +// CHECK:STDOUT: {kind: StructType, arg0: block7, type: typeTypeType}, // CHECK:STDOUT: {kind: VarStorage, type: type3}, -// CHECK:STDOUT: {kind: BindName, arg0: str3, arg1: node+23, type: type3}, -// CHECK:STDOUT: {kind: Assign, arg0: node+23, arg1: node+7}, +// CHECK:STDOUT: {kind: BindName, arg0: str3, arg1: node+24, type: type3}, +// CHECK:STDOUT: {kind: Assign, arg0: node+24, arg1: node+7}, // CHECK:STDOUT: ] // CHECK:STDOUT: node_blocks: [ // CHECK:STDOUT: [ @@ -92,6 +93,7 @@ var y: {.a: i32, .b: (i32,)} = x; // CHECK:STDOUT: node+23, // CHECK:STDOUT: node+24, // CHECK:STDOUT: node+25, +// CHECK:STDOUT: node+26, // CHECK:STDOUT: ], // CHECK:STDOUT: [ // CHECK:STDOUT: node+0, @@ -137,6 +139,7 @@ var y: {.a: i32, .b: (i32,)} = x; // CHECK:STDOUT: assign %x, %.loc7_50 // CHECK:STDOUT: %.loc8_23: type = stub_reference i32 // CHECK:STDOUT: %.loc8_27: (type,) = tuple_value (%.loc8_23) +// CHECK:STDOUT: %.loc8_28: type = struct_type {.a: i32, .b: (i32,)} // CHECK:STDOUT: %y: {.a: i32, .b: (i32,)} = var // CHECK:STDOUT: assign %y, %x // CHECK:STDOUT: } diff --git a/toolchain/semantics/testdata/struct/two_entries.carbon b/toolchain/semantics/testdata/struct/two_entries.carbon index 3dd084a90534..e164afbff634 100644 --- a/toolchain/semantics/testdata/struct/two_entries.carbon +++ b/toolchain/semantics/testdata/struct/two_entries.carbon @@ -44,9 +44,10 @@ var y: {.a: i32, .b: i32} = x; // CHECK:STDOUT: {kind: Assign, arg0: node+3, arg1: node+11}, // CHECK:STDOUT: {kind: StructTypeField, arg0: str1, arg1: type0}, // CHECK:STDOUT: {kind: StructTypeField, arg0: str2, arg1: type0}, +// CHECK:STDOUT: {kind: StructType, arg0: block5, type: typeTypeType}, // CHECK:STDOUT: {kind: VarStorage, type: type1}, -// CHECK:STDOUT: {kind: BindName, arg0: str3, arg1: node+15, type: type1}, -// CHECK:STDOUT: {kind: Assign, arg0: node+15, arg1: node+3}, +// CHECK:STDOUT: {kind: BindName, arg0: str3, arg1: node+16, type: type1}, +// CHECK:STDOUT: {kind: Assign, arg0: node+16, arg1: node+3}, // CHECK:STDOUT: ] // CHECK:STDOUT: node_blocks: [ // CHECK:STDOUT: [ @@ -68,6 +69,7 @@ var y: {.a: i32, .b: i32} = x; // CHECK:STDOUT: node+15, // CHECK:STDOUT: node+16, // CHECK:STDOUT: node+17, +// CHECK:STDOUT: node+18, // CHECK:STDOUT: ], // CHECK:STDOUT: [ // CHECK:STDOUT: node+0, @@ -96,6 +98,7 @@ var y: {.a: i32, .b: i32} = x; // CHECK:STDOUT: %.loc7_41: i32 = stub_reference %.loc7_43 // CHECK:STDOUT: %.loc7_44: {.a: i32, .b: i32} = struct_value (%.loc7_33, %.loc7_41) // CHECK:STDOUT: assign %x, %.loc7_44 +// CHECK:STDOUT: %.loc8: type = struct_type {.a: i32, .b: i32} // CHECK:STDOUT: %y: {.a: i32, .b: i32} = var // CHECK:STDOUT: assign %y, %x // CHECK:STDOUT: }