mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
Add a Field node for fields in a class. (#3332)
This replaces the use of `VarStorage` in this case. Add an `UnboundFieldType` type as the type of a field, in cases where it's referenced without an accompanying object. Add a `BindName` node to describe the name binding performed for both variables and fields so that we can handle them more uniformly.
This commit is contained in:
@@ -15,9 +15,10 @@ fn F() -> i32 {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @F() -> i32 {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %n: ref i32 = var "n"
|
||||
// CHECK:STDOUT: %n.var: ref i32 = var "n"
|
||||
// CHECK:STDOUT: %n: ref i32 = bind_name "n", %n.var
|
||||
// CHECK:STDOUT: %.loc8: i32 = int_literal 0
|
||||
// CHECK:STDOUT: assign %n, %.loc8
|
||||
// CHECK:STDOUT: assign %n.var, %.loc8
|
||||
// CHECK:STDOUT: %n.ref: ref i32 = name_reference "n", %n
|
||||
// CHECK:STDOUT: %.loc9_13.1: type = ptr_type i32
|
||||
// CHECK:STDOUT: %.loc9_13.2: i32* = address_of %n.ref
|
||||
|
||||
+25
-18
@@ -24,61 +24,68 @@ fn F() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %.loc8_27.1: type = struct_type {.a: i32, .b: i32}
|
||||
// CHECK:STDOUT: %.loc8_27.2: type = ptr_type {.a: i32, .b: i32}
|
||||
// CHECK:STDOUT: %s: ref {.a: i32, .b: i32} = var "s"
|
||||
// CHECK:STDOUT: %s.var: ref {.a: i32, .b: i32} = var "s"
|
||||
// CHECK:STDOUT: %s: ref {.a: i32, .b: i32} = bind_name "s", %s.var
|
||||
// CHECK:STDOUT: %.loc8_37: i32 = int_literal 1
|
||||
// CHECK:STDOUT: %.loc8_45: i32 = int_literal 2
|
||||
// CHECK:STDOUT: %.loc8_46.1: {.a: i32, .b: i32} = struct_literal (%.loc8_37, %.loc8_45)
|
||||
// CHECK:STDOUT: %.loc8_46.2: ref i32 = struct_access %s, member0
|
||||
// CHECK:STDOUT: %.loc8_46.2: ref i32 = struct_access %s.var, member0
|
||||
// CHECK:STDOUT: %.loc8_46.3: init i32 = initialize_from %.loc8_37 to %.loc8_46.2
|
||||
// CHECK:STDOUT: %.loc8_46.4: ref i32 = struct_access %s, member1
|
||||
// CHECK:STDOUT: %.loc8_46.4: ref i32 = struct_access %s.var, member1
|
||||
// CHECK:STDOUT: %.loc8_46.5: init i32 = initialize_from %.loc8_45 to %.loc8_46.4
|
||||
// CHECK:STDOUT: %.loc8_46.6: init {.a: i32, .b: i32} = struct_init %.loc8_46.1, (%.loc8_46.3, %.loc8_46.5)
|
||||
// CHECK:STDOUT: assign %s, %.loc8_46.6
|
||||
// CHECK:STDOUT: assign %s.var, %.loc8_46.6
|
||||
// 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: ref {.a: i32, .b: i32}* = var "p"
|
||||
// CHECK:STDOUT: %p.var: ref {.a: i32, .b: i32}* = var "p"
|
||||
// CHECK:STDOUT: %p: ref {.a: i32, .b: i32}* = bind_name "p", %p.var
|
||||
// CHECK:STDOUT: %s.ref.loc10: ref {.a: i32, .b: i32} = name_reference "s", %s
|
||||
// CHECK:STDOUT: %.loc10_32: {.a: i32, .b: i32}* = address_of %s.ref.loc10
|
||||
// CHECK:STDOUT: assign %p, %.loc10_32
|
||||
// CHECK:STDOUT: assign %p.var, %.loc10_32
|
||||
// CHECK:STDOUT: %.loc11_13: type = ptr_type i32
|
||||
// CHECK:STDOUT: %q: ref i32* = var "q"
|
||||
// CHECK:STDOUT: %q.var: ref i32* = var "q"
|
||||
// CHECK:STDOUT: %q: ref i32* = bind_name "q", %q.var
|
||||
// CHECK:STDOUT: %s.ref.loc11: ref {.a: i32, .b: i32} = name_reference "s", %s
|
||||
// CHECK:STDOUT: %.loc11_19: ref i32 = struct_access %s.ref.loc11, member0
|
||||
// CHECK:STDOUT: %.loc11_17: i32* = address_of %.loc11_19
|
||||
// CHECK:STDOUT: assign %q, %.loc11_17
|
||||
// CHECK:STDOUT: assign %q.var, %.loc11_17
|
||||
// CHECK:STDOUT: %.loc12_13: type = ptr_type i32
|
||||
// CHECK:STDOUT: %r: ref i32* = var "r"
|
||||
// CHECK:STDOUT: %r.var: ref i32* = var "r"
|
||||
// CHECK:STDOUT: %r: ref i32* = bind_name "r", %r.var
|
||||
// CHECK:STDOUT: %s.ref.loc12: ref {.a: i32, .b: i32} = name_reference "s", %s
|
||||
// CHECK:STDOUT: %.loc12_19: ref i32 = struct_access %s.ref.loc12, member1
|
||||
// CHECK:STDOUT: %.loc12_17: i32* = address_of %.loc12_19
|
||||
// CHECK:STDOUT: assign %r, %.loc12_17
|
||||
// CHECK:STDOUT: assign %r.var, %.loc12_17
|
||||
// CHECK:STDOUT: %.loc14_19.1: type = tuple_type (type, type)
|
||||
// CHECK:STDOUT: %.loc14_19.2: (type, type) = tuple_literal (i32, i32)
|
||||
// CHECK:STDOUT: %.loc14_19.3: type = tuple_type (i32, i32)
|
||||
// CHECK:STDOUT: %.loc14_19.4: type = ptr_type (i32, i32)
|
||||
// CHECK:STDOUT: %t: ref (i32, i32) = var "t"
|
||||
// CHECK:STDOUT: %t.var: ref (i32, i32) = var "t"
|
||||
// CHECK:STDOUT: %t: ref (i32, i32) = bind_name "t", %t.var
|
||||
// CHECK:STDOUT: %.loc14_24: i32 = int_literal 1
|
||||
// CHECK:STDOUT: %.loc14_27: i32 = int_literal 2
|
||||
// CHECK:STDOUT: %.loc14_28.1: (i32, i32) = tuple_literal (%.loc14_24, %.loc14_27)
|
||||
// CHECK:STDOUT: %.loc14_28.2: ref i32 = tuple_access %t, member0
|
||||
// CHECK:STDOUT: %.loc14_28.2: ref i32 = tuple_access %t.var, member0
|
||||
// CHECK:STDOUT: %.loc14_28.3: init i32 = initialize_from %.loc14_24 to %.loc14_28.2
|
||||
// CHECK:STDOUT: %.loc14_28.4: ref i32 = tuple_access %t, member1
|
||||
// CHECK:STDOUT: %.loc14_28.4: ref i32 = tuple_access %t.var, member1
|
||||
// CHECK:STDOUT: %.loc14_28.5: init i32 = initialize_from %.loc14_27 to %.loc14_28.4
|
||||
// CHECK:STDOUT: %.loc14_28.6: init (i32, i32) = tuple_init %.loc14_28.1, (%.loc14_28.3, %.loc14_28.5)
|
||||
// CHECK:STDOUT: assign %t, %.loc14_28.6
|
||||
// CHECK:STDOUT: assign %t.var, %.loc14_28.6
|
||||
// CHECK:STDOUT: %.loc15_14: type = ptr_type i32
|
||||
// CHECK:STDOUT: %t0: ref i32* = var "t0"
|
||||
// CHECK:STDOUT: %t0.var: ref i32* = var "t0"
|
||||
// CHECK:STDOUT: %t0: ref i32* = bind_name "t0", %t0.var
|
||||
// CHECK:STDOUT: %t.ref.loc15: ref (i32, i32) = name_reference "t", %t
|
||||
// CHECK:STDOUT: %.loc15_21: i32 = int_literal 0
|
||||
// CHECK:STDOUT: %.loc15_22: ref i32 = tuple_index %t.ref.loc15, %.loc15_21
|
||||
// CHECK:STDOUT: %.loc15_18: i32* = address_of %.loc15_22
|
||||
// CHECK:STDOUT: assign %t0, %.loc15_18
|
||||
// CHECK:STDOUT: assign %t0.var, %.loc15_18
|
||||
// CHECK:STDOUT: %.loc16_14: type = ptr_type i32
|
||||
// CHECK:STDOUT: %t1: ref i32* = var "t1"
|
||||
// CHECK:STDOUT: %t1.var: ref i32* = var "t1"
|
||||
// CHECK:STDOUT: %t1: ref i32* = bind_name "t1", %t1.var
|
||||
// CHECK:STDOUT: %t.ref.loc16: ref (i32, i32) = name_reference "t", %t
|
||||
// CHECK:STDOUT: %.loc16_21: i32 = int_literal 1
|
||||
// CHECK:STDOUT: %.loc16_22: ref i32 = tuple_index %t.ref.loc16, %.loc16_21
|
||||
// CHECK:STDOUT: %.loc16_18: i32* = address_of %.loc16_22
|
||||
// CHECK:STDOUT: assign %t1, %.loc16_18
|
||||
// CHECK:STDOUT: assign %t1.var, %.loc16_18
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
|
||||
+6
-4
@@ -17,14 +17,16 @@ fn F() -> i32 {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @F() -> i32 {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %n: ref i32 = var "n"
|
||||
// CHECK:STDOUT: %n.var: ref i32 = var "n"
|
||||
// CHECK:STDOUT: %n: ref i32 = bind_name "n", %n.var
|
||||
// CHECK:STDOUT: %.loc8: i32 = int_literal 0
|
||||
// CHECK:STDOUT: assign %n, %.loc8
|
||||
// CHECK:STDOUT: assign %n.var, %.loc8
|
||||
// CHECK:STDOUT: %.loc9_13: type = ptr_type i32
|
||||
// CHECK:STDOUT: %p: ref i32* = var "p"
|
||||
// CHECK:STDOUT: %p.var: ref i32* = var "p"
|
||||
// CHECK:STDOUT: %p: ref i32* = bind_name "p", %p.var
|
||||
// CHECK:STDOUT: %n.ref: ref i32 = name_reference "n", %n
|
||||
// CHECK:STDOUT: %.loc9_17: i32* = address_of %n.ref
|
||||
// CHECK:STDOUT: assign %p, %.loc9_17
|
||||
// CHECK:STDOUT: assign %p.var, %.loc9_17
|
||||
// CHECK:STDOUT: %p.ref: ref i32* = name_reference "p", %p
|
||||
// CHECK:STDOUT: %.loc11_11: i32* = bind_value %p.ref
|
||||
// CHECK:STDOUT: %.loc11_10.1: ref i32 = dereference %.loc11_11
|
||||
|
||||
@@ -175,9 +175,10 @@ fn AddressOfParameter(param: i32) {
|
||||
// CHECK:STDOUT: fn @AddressOfParameter(%param: i32) {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %.loc82_22: type = ptr_type i32
|
||||
// CHECK:STDOUT: %param_addr: ref i32* = var "param_addr"
|
||||
// CHECK:STDOUT: %param_addr.var: ref i32* = var "param_addr"
|
||||
// CHECK:STDOUT: %param_addr: ref i32* = bind_name "param_addr", %param_addr.var
|
||||
// CHECK:STDOUT: %param.ref: i32 = name_reference "param", %param
|
||||
// CHECK:STDOUT: %.loc82_26: i32* = address_of %param.ref
|
||||
// CHECK:STDOUT: assign %param_addr, %.loc82_26
|
||||
// CHECK:STDOUT: assign %param_addr.var, %.loc82_26
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
|
||||
@@ -14,5 +14,6 @@ var p: *i32;
|
||||
|
||||
// CHECK:STDOUT: file "fail_dereference_type.carbon" {
|
||||
// CHECK:STDOUT: %.loc13: ref <error> = dereference i32
|
||||
// CHECK:STDOUT: %p: ref <error> = var "p"
|
||||
// CHECK:STDOUT: %p.var: ref <error> = var "p"
|
||||
// CHECK:STDOUT: %p: ref <error> = bind_name "p", %p.var
|
||||
// CHECK:STDOUT: }
|
||||
|
||||
Reference in New Issue
Block a user