Canonicalize struct types. (#2855)

This adds canonicalization of struct types based on their type fields. It obsoletes the current CanImplicitAsStruct because the type ids should now be identical when they're structurally identical; there's only a reason to implicit CanImplicitAsStruct to detect _compatible_ conversions.

The type fields themselves aren't canonicalized because it would need to be done during the first parse, and could yield name conflicts being associated with the wrong location. i.e.:

```
var x: {a: i32, a: i32};
var y: {a: i32, b: i32, a: i32};
```

This should yield two separate name conflict diagnostics pointing at the type fields for each respective line, but if struct type fields were canonicalized then both would point at the first `a: i32` field definition. This isn't expected to be an issue for types because I'm trying to print those, but we may also end up with a "first defined at" situation in some cases (still, less confusing because the type should match). Regardless, I think individual fields gets much more awkward.
This commit is contained in:
Jon Ross-Perkins
2023-05-26 14:42:45 -07:00
committed by GitHub
parent 1497e1333d
commit 2e4beaf8f0
16 changed files with 133 additions and 161 deletions
+6 -12
View File
@@ -16,22 +16,18 @@
// CHECK:STDOUT: ]
// CHECK:STDOUT: types: [
// CHECK:STDOUT: node+0,
// CHECK:STDOUT: node+4,
// CHECK:STDOUT: node+7,
// CHECK:STDOUT: ]
// CHECK:STDOUT: nodes: [
// CHECK:STDOUT: {kind: StructType, arg0: block0, type: typeTypeType},
// CHECK:STDOUT: {kind: StructValue, arg0: block0, type: type0},
// CHECK:STDOUT: {kind: VarStorage, type: type0},
// CHECK:STDOUT: {kind: BindName, arg0: str0, arg1: node+2, type: type0},
// CHECK:STDOUT: {kind: StructType, arg0: block0, type: typeTypeType},
// CHECK:STDOUT: {kind: StructValue, arg0: block0, type: type1},
// CHECK:STDOUT: {kind: Assign, arg0: node+2, arg1: node+5, type: type1},
// CHECK:STDOUT: {kind: StructType, arg0: block0, type: typeTypeType},
// CHECK:STDOUT: {kind: StructValue, arg0: block0, type: type2},
// CHECK:STDOUT: {kind: VarStorage, type: type2},
// CHECK:STDOUT: {kind: BindName, arg0: str1, arg1: node+9, type: type2},
// CHECK:STDOUT: {kind: Assign, arg0: node+9, arg1: node+2, type: type0},
// CHECK:STDOUT: {kind: StructValue, arg0: block0, type: type0},
// CHECK:STDOUT: {kind: Assign, arg0: node+2, arg1: node+4, type: type0},
// CHECK:STDOUT: {kind: StructValue, arg0: block0, type: type0},
// CHECK:STDOUT: {kind: VarStorage, type: type0},
// CHECK:STDOUT: {kind: BindName, arg0: str1, arg1: node+7, type: type0},
// CHECK:STDOUT: {kind: Assign, arg0: node+7, arg1: node+2, type: type0},
// CHECK:STDOUT: ]
// CHECK:STDOUT: node_blocks: [
// CHECK:STDOUT: [
@@ -47,8 +43,6 @@
// CHECK:STDOUT: node+7,
// CHECK:STDOUT: node+8,
// CHECK:STDOUT: node+9,
// CHECK:STDOUT: node+10,
// CHECK:STDOUT: node+11,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
@@ -20,7 +20,6 @@
// CHECK:STDOUT: types: [
// CHECK:STDOUT: nodeFloatingPointType,
// CHECK:STDOUT: node+1,
// CHECK:STDOUT: node+7,
// CHECK:STDOUT: nodeIntegerType,
// CHECK:STDOUT: ]
// CHECK:STDOUT: nodes: [
@@ -31,12 +30,11 @@
// CHECK:STDOUT: {kind: RealLiteral, arg0: real0, type: type0},
// CHECK:STDOUT: {kind: StructTypeField, arg0: str0, type: type0},
// CHECK:STDOUT: {kind: StubReference, arg0: node+4, type: type0},
// CHECK:STDOUT: {kind: StructType, arg0: block3, type: typeTypeType},
// CHECK:STDOUT: {kind: StructValue, arg0: block4, type: type2},
// CHECK:STDOUT: {kind: Assign, arg0: node+2, arg1: node+8, type: type2},
// CHECK:STDOUT: {kind: VarStorage, type: type3},
// CHECK:STDOUT: {kind: BindName, arg0: str2, arg1: node+10, type: type3},
// CHECK:STDOUT: {kind: Assign, arg0: node+10, arg1: nodeInvalidType, type: typeInvalidType},
// CHECK:STDOUT: {kind: StructValue, arg0: block4, type: type1},
// CHECK:STDOUT: {kind: Assign, arg0: node+2, arg1: node+7, type: type1},
// CHECK:STDOUT: {kind: VarStorage, type: type2},
// CHECK:STDOUT: {kind: BindName, arg0: str2, arg1: node+9, type: type2},
// CHECK:STDOUT: {kind: Assign, arg0: node+9, arg1: nodeInvalidType, type: typeInvalidType},
// CHECK:STDOUT: ]
// CHECK:STDOUT: node_blocks: [
// CHECK:STDOUT: [
@@ -53,7 +51,6 @@
// CHECK:STDOUT: node+9,
// CHECK:STDOUT: node+10,
// CHECK:STDOUT: node+11,
// CHECK:STDOUT: node+12,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node+0,
@@ -20,7 +20,6 @@
// CHECK:STDOUT: types: [
// CHECK:STDOUT: nodeIntegerType,
// CHECK:STDOUT: node+1,
// CHECK:STDOUT: node+7,
// CHECK:STDOUT: ]
// CHECK:STDOUT: nodes: [
// CHECK:STDOUT: {kind: StructTypeField, arg0: str0, type: type0},
@@ -30,12 +29,11 @@
// CHECK:STDOUT: {kind: IntegerLiteral, arg0: int0, type: type0},
// CHECK:STDOUT: {kind: StructTypeField, arg0: str0, type: type0},
// CHECK:STDOUT: {kind: StubReference, arg0: node+4, type: type0},
// CHECK:STDOUT: {kind: StructType, arg0: block3, type: typeTypeType},
// CHECK:STDOUT: {kind: StructValue, arg0: block4, type: type2},
// CHECK:STDOUT: {kind: Assign, arg0: node+2, arg1: node+8, type: type2},
// CHECK:STDOUT: {kind: StructValue, arg0: block4, type: type1},
// CHECK:STDOUT: {kind: Assign, arg0: node+2, arg1: node+7, type: type1},
// CHECK:STDOUT: {kind: VarStorage, type: type0},
// CHECK:STDOUT: {kind: BindName, arg0: str2, arg1: node+10, type: type0},
// CHECK:STDOUT: {kind: Assign, arg0: node+10, arg1: nodeInvalidType, type: typeInvalidType},
// CHECK:STDOUT: {kind: BindName, arg0: str2, arg1: node+9, type: type0},
// CHECK:STDOUT: {kind: Assign, arg0: node+9, arg1: nodeInvalidType, type: typeInvalidType},
// CHECK:STDOUT: ]
// CHECK:STDOUT: node_blocks: [
// CHECK:STDOUT: [
@@ -52,7 +50,6 @@
// CHECK:STDOUT: node+9,
// CHECK:STDOUT: node+10,
// CHECK:STDOUT: node+11,
// CHECK:STDOUT: node+12,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node+0,
@@ -24,7 +24,6 @@
// CHECK:STDOUT: {kind: VarStorage, type: type1},
// CHECK:STDOUT: {kind: BindName, arg0: str1, arg1: node+2, type: type1},
// CHECK:STDOUT: {kind: StructTypeField, arg0: str0, type: type0},
// CHECK:STDOUT: {kind: StructType, arg0: block3, type: typeTypeType},
// CHECK:STDOUT: {kind: Assign, arg0: node+2, arg1: nodeInvalidType, type: typeInvalidType},
// CHECK:STDOUT: ]
// CHECK:STDOUT: node_blocks: [
@@ -37,7 +36,6 @@
// CHECK:STDOUT: node+3,
// CHECK:STDOUT: node+4,
// CHECK:STDOUT: node+5,
// CHECK:STDOUT: node+6,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node+0,
+6 -9
View File
@@ -23,7 +23,6 @@
// CHECK:STDOUT: nodeFloatingPointType,
// CHECK:STDOUT: nodeIntegerType,
// CHECK:STDOUT: node+2,
// CHECK:STDOUT: node+11,
// CHECK:STDOUT: ]
// CHECK:STDOUT: nodes: [
// CHECK:STDOUT: {kind: StructTypeField, arg0: str0, type: type0},
@@ -37,16 +36,15 @@
// CHECK:STDOUT: {kind: IntegerLiteral, arg0: int0, type: type1},
// CHECK:STDOUT: {kind: StructTypeField, arg0: str1, type: type1},
// CHECK:STDOUT: {kind: StubReference, arg0: node+8, type: type1},
// CHECK:STDOUT: {kind: StructType, arg0: block3, type: typeTypeType},
// CHECK:STDOUT: {kind: StructValue, arg0: block4, type: type3},
// CHECK:STDOUT: {kind: Assign, arg0: node+3, arg1: node+12, type: type3},
// CHECK:STDOUT: {kind: StructValue, arg0: block4, type: type2},
// CHECK:STDOUT: {kind: Assign, arg0: node+3, arg1: node+11, type: type2},
// CHECK:STDOUT: {kind: VarStorage, type: type1},
// CHECK:STDOUT: {kind: BindName, arg0: str3, arg1: node+14, type: type1},
// CHECK:STDOUT: {kind: BindName, arg0: str3, arg1: node+13, type: type1},
// CHECK:STDOUT: {kind: StructMemberAccess, arg0: node+3, arg1: member1, type: type1},
// CHECK:STDOUT: {kind: Assign, arg0: node+14, arg1: node+16, type: type1},
// CHECK:STDOUT: {kind: Assign, arg0: node+13, arg1: node+15, type: type1},
// CHECK:STDOUT: {kind: VarStorage, type: type1},
// CHECK:STDOUT: {kind: BindName, arg0: str4, arg1: node+18, type: type1},
// CHECK:STDOUT: {kind: Assign, arg0: node+18, arg1: node+14, type: type1},
// CHECK:STDOUT: {kind: BindName, arg0: str4, arg1: node+17, type: type1},
// CHECK:STDOUT: {kind: Assign, arg0: node+17, arg1: node+13, type: type1},
// CHECK:STDOUT: ]
// CHECK:STDOUT: node_blocks: [
// CHECK:STDOUT: [
@@ -70,7 +68,6 @@
// CHECK:STDOUT: node+17,
// CHECK:STDOUT: node+18,
// CHECK:STDOUT: node+19,
// CHECK:STDOUT: node+20,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node+0,
+6 -12
View File
@@ -19,8 +19,6 @@
// CHECK:STDOUT: types: [
// CHECK:STDOUT: nodeIntegerType,
// CHECK:STDOUT: node+1,
// CHECK:STDOUT: node+7,
// CHECK:STDOUT: node+11,
// CHECK:STDOUT: ]
// CHECK:STDOUT: nodes: [
// CHECK:STDOUT: {kind: StructTypeField, arg0: str0, type: type0},
@@ -30,14 +28,12 @@
// CHECK:STDOUT: {kind: IntegerLiteral, arg0: int0, type: type0},
// CHECK:STDOUT: {kind: StructTypeField, arg0: str0, type: type0},
// CHECK:STDOUT: {kind: StubReference, arg0: node+4, type: type0},
// CHECK:STDOUT: {kind: StructType, arg0: block3, type: typeTypeType},
// CHECK:STDOUT: {kind: StructValue, arg0: block4, type: type2},
// CHECK:STDOUT: {kind: Assign, arg0: node+2, arg1: node+8, type: type2},
// CHECK:STDOUT: {kind: StructValue, arg0: block4, type: type1},
// CHECK:STDOUT: {kind: Assign, arg0: node+2, arg1: node+7, type: type1},
// CHECK:STDOUT: {kind: StructTypeField, arg0: str0, type: type0},
// CHECK:STDOUT: {kind: StructType, arg0: block5, type: typeTypeType},
// CHECK:STDOUT: {kind: VarStorage, type: type3},
// CHECK:STDOUT: {kind: BindName, arg0: str2, arg1: node+12, type: type3},
// CHECK:STDOUT: {kind: Assign, arg0: node+12, arg1: node+2, type: type1},
// 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, type: type1},
// CHECK:STDOUT: ]
// CHECK:STDOUT: node_blocks: [
// CHECK:STDOUT: [
@@ -55,8 +51,6 @@
// CHECK:STDOUT: node+10,
// CHECK:STDOUT: node+11,
// CHECK:STDOUT: node+12,
// CHECK:STDOUT: node+13,
// CHECK:STDOUT: node+14,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node+0,
@@ -68,7 +62,7 @@
// CHECK:STDOUT: node+6,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node+10,
// CHECK:STDOUT: node+9,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
+6 -12
View File
@@ -21,8 +21,6 @@
// CHECK:STDOUT: types: [
// CHECK:STDOUT: nodeIntegerType,
// CHECK:STDOUT: node+2,
// CHECK:STDOUT: node+11,
// CHECK:STDOUT: node+16,
// CHECK:STDOUT: ]
// CHECK:STDOUT: nodes: [
// CHECK:STDOUT: {kind: StructTypeField, arg0: str0, type: type0},
@@ -36,15 +34,13 @@
// CHECK:STDOUT: {kind: IntegerLiteral, arg0: int1, type: type0},
// CHECK:STDOUT: {kind: StructTypeField, arg0: str1, type: type0},
// CHECK:STDOUT: {kind: StubReference, arg0: node+8, type: type0},
// CHECK:STDOUT: {kind: StructType, arg0: block3, type: typeTypeType},
// CHECK:STDOUT: {kind: StructValue, arg0: block4, type: type2},
// CHECK:STDOUT: {kind: Assign, arg0: node+3, arg1: node+12, type: type2},
// CHECK:STDOUT: {kind: StructValue, arg0: block4, type: type1},
// CHECK:STDOUT: {kind: Assign, arg0: node+3, arg1: node+11, type: type1},
// CHECK:STDOUT: {kind: StructTypeField, arg0: str0, type: type0},
// CHECK:STDOUT: {kind: StructTypeField, arg0: str1, type: type0},
// CHECK:STDOUT: {kind: StructType, arg0: block5, type: typeTypeType},
// CHECK:STDOUT: {kind: VarStorage, type: type3},
// CHECK:STDOUT: {kind: BindName, arg0: str3, arg1: node+17, type: type3},
// CHECK:STDOUT: {kind: Assign, arg0: node+17, arg1: node+3, type: type1},
// 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, type: type1},
// CHECK:STDOUT: ]
// CHECK:STDOUT: node_blocks: [
// CHECK:STDOUT: [
@@ -66,8 +62,6 @@
// CHECK:STDOUT: node+15,
// CHECK:STDOUT: node+16,
// CHECK:STDOUT: node+17,
// CHECK:STDOUT: node+18,
// CHECK:STDOUT: node+19,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node+0,
@@ -82,8 +76,8 @@
// CHECK:STDOUT: node+10,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node+13,
// CHECK:STDOUT: node+14,
// CHECK:STDOUT: node+15,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]