Distinguish between name IDs and string IDs in the type system. (#3341)

Add a `NameId` that is effectively just a wrapper around a `StringId`,
with
some additional predefined values for names that don't correspond to
strings, such as the name of `self` or the function's return slot.
This commit is contained in:
Richard Smith
2023-11-09 16:51:36 +00:00
committed by GitHub
parent 84bc8cc4bf
commit 71aa4a45be
206 changed files with 1050 additions and 921 deletions
+2 -2
View File
@@ -24,13 +24,13 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Echo(%a: {}) -> {} {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %a.ref: {} = name_reference "a", %a
// CHECK:STDOUT: %a.ref: {} = name_reference a, %a
// CHECK:STDOUT: return %a.ref
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Echo.ref: <function> = name_reference "Echo", file.%Echo
// CHECK:STDOUT: %Echo.ref: <function> = name_reference Echo, file.%Echo
// CHECK:STDOUT: %.loc12_9.1: {} = struct_literal ()
// CHECK:STDOUT: %.loc12_9.2: {} = struct_value %.loc12_9.1, ()
// CHECK:STDOUT: %.loc12_7: init {} = call %Echo.ref(%.loc12_9.2)
+2 -2
View File
@@ -23,13 +23,13 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Echo(%a: ()) -> () {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %a.ref: () = name_reference "a", %a
// CHECK:STDOUT: %a.ref: () = name_reference a, %a
// CHECK:STDOUT: return %a.ref
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Echo.ref: <function> = name_reference "Echo", file.%Echo
// CHECK:STDOUT: %Echo.ref: <function> = name_reference Echo, file.%Echo
// CHECK:STDOUT: %.loc12_9.1: () = tuple_literal ()
// CHECK:STDOUT: %.loc12_9.2: () = tuple_value %.loc12_9.1, ()
// CHECK:STDOUT: %.loc12_7: init () = call %Echo.ref(%.loc12_9.2)
@@ -21,8 +21,8 @@ fn Run() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Run() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %x.var: ref i32 = var "x"
// CHECK:STDOUT: %x: ref i32 = bind_name "x", %x.var
// CHECK:STDOUT: %x.var: ref i32 = var x
// CHECK:STDOUT: %x: ref i32 = bind_name x, %x.var
// CHECK:STDOUT: %.loc11: String = string_literal "hello"
// CHECK:STDOUT: assign %x.var, <error>
// CHECK:STDOUT: return
@@ -83,22 +83,22 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Run0.ref.loc18: <function> = name_reference "Run0", file.%Run0
// CHECK:STDOUT: %Run0.ref.loc18: <function> = name_reference Run0, file.%Run0
// CHECK:STDOUT: %.loc18_8: i32 = int_literal 1
// CHECK:STDOUT: %.loc18_7: init () = call %Run0.ref.loc18(<invalid>)
// CHECK:STDOUT: %Run0.ref.loc25: <function> = name_reference "Run0", file.%Run0
// CHECK:STDOUT: %Run0.ref.loc25: <function> = name_reference Run0, file.%Run0
// CHECK:STDOUT: %.loc25_8: i32 = int_literal 0
// CHECK:STDOUT: %.loc25_11: i32 = int_literal 1
// CHECK:STDOUT: %.loc25_7: init () = call %Run0.ref.loc25(<invalid>)
// CHECK:STDOUT: %Run1.ref.loc33: <function> = name_reference "Run1", file.%Run1
// CHECK:STDOUT: %Run1.ref.loc33: <function> = name_reference Run1, file.%Run1
// CHECK:STDOUT: %.loc33: init () = call %Run1.ref.loc33(<invalid>)
// CHECK:STDOUT: %Run1.ref.loc40: <function> = name_reference "Run1", file.%Run1
// CHECK:STDOUT: %Run1.ref.loc40: <function> = name_reference Run1, file.%Run1
// CHECK:STDOUT: %.loc40_8: i32 = int_literal 0
// CHECK:STDOUT: %.loc40_11: i32 = int_literal 1
// CHECK:STDOUT: %.loc40_7: init () = call %Run1.ref.loc40(<invalid>)
// CHECK:STDOUT: %Run2.ref.loc48: <function> = name_reference "Run2", file.%Run2
// CHECK:STDOUT: %Run2.ref.loc48: <function> = name_reference Run2, file.%Run2
// CHECK:STDOUT: %.loc48: init () = call %Run2.ref.loc48(<invalid>)
// CHECK:STDOUT: %Run2.ref.loc55: <function> = name_reference "Run2", file.%Run2
// CHECK:STDOUT: %Run2.ref.loc55: <function> = name_reference Run2, file.%Run2
// CHECK:STDOUT: %.loc55_8: i32 = int_literal 0
// CHECK:STDOUT: %.loc55_7: init () = call %Run2.ref.loc55(<invalid>)
// CHECK:STDOUT: return
@@ -32,7 +32,7 @@ fn F() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %G.ref: <function> = name_reference "G", file.%G
// CHECK:STDOUT: %G.ref: <function> = name_reference G, file.%G
// CHECK:STDOUT: %.loc16_5: f64 = real_literal 10e-1
// CHECK:STDOUT: %.loc16_4: init () = call %G.ref(<invalid>)
// CHECK:STDOUT: return
@@ -26,9 +26,9 @@ fn Run() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Run() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %x.var: ref i32 = var "x"
// CHECK:STDOUT: %x: ref i32 = bind_name "x", %x.var
// CHECK:STDOUT: %Foo.ref: <function> = name_reference "Foo", file.%Foo
// CHECK:STDOUT: %x.var: ref i32 = var x
// CHECK:STDOUT: %x: ref i32 = bind_name x, %x.var
// CHECK:STDOUT: %Foo.ref: <function> = name_reference Foo, file.%Foo
// CHECK:STDOUT: %.loc13: init f64 = call %Foo.ref()
// CHECK:STDOUT: assign %x.var, <error>
// CHECK:STDOUT: return
+4 -4
View File
@@ -19,15 +19,15 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Echo(%a: i32) -> i32 {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %a.ref: i32 = name_reference "a", %a
// CHECK:STDOUT: %a.ref: i32 = name_reference a, %a
// CHECK:STDOUT: return %a.ref
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %b.var: ref i32 = var "b"
// CHECK:STDOUT: %b: ref i32 = bind_name "b", %b.var
// CHECK:STDOUT: %Echo.ref: <function> = name_reference "Echo", file.%Echo
// CHECK:STDOUT: %b.var: ref i32 = var b
// CHECK:STDOUT: %b: ref i32 = bind_name b, %b.var
// CHECK:STDOUT: %Echo.ref: <function> = name_reference Echo, file.%Echo
// CHECK:STDOUT: %.loc12_21: i32 = int_literal 1
// CHECK:STDOUT: %.loc12_20: init i32 = call %Echo.ref(%.loc12_21)
// CHECK:STDOUT: assign %b.var, %.loc12_20
@@ -27,7 +27,7 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Foo.ref: <function> = name_reference "Foo", file.%Foo
// CHECK:STDOUT: %Foo.ref: <function> = name_reference Foo, file.%Foo
// CHECK:STDOUT: %.loc11_7: i32 = int_literal 1
// CHECK:STDOUT: %.loc11_11: i32 = int_literal 2
// CHECK:STDOUT: %.loc11_9: i32 = add %.loc11_7, %.loc11_11
+1 -1
View File
@@ -26,7 +26,7 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Foo.ref: <function> = name_reference "Foo", file.%Foo
// CHECK:STDOUT: %Foo.ref: <function> = name_reference Foo, file.%Foo
// CHECK:STDOUT: %.loc10_7: i32 = int_literal 1
// CHECK:STDOUT: %.loc10_6: init () = call %Foo.ref(%.loc10_7)
// CHECK:STDOUT: return
@@ -27,10 +27,10 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Foo.ref.loc10: <function> = name_reference "Foo", file.%Foo
// CHECK:STDOUT: %Foo.ref.loc10: <function> = name_reference Foo, file.%Foo
// CHECK:STDOUT: %.loc10_7: i32 = int_literal 1
// CHECK:STDOUT: %.loc10_6: init () = call %Foo.ref.loc10(%.loc10_7)
// CHECK:STDOUT: %Foo.ref.loc11: <function> = name_reference "Foo", file.%Foo
// CHECK:STDOUT: %Foo.ref.loc11: <function> = name_reference Foo, file.%Foo
// CHECK:STDOUT: %.loc11_7: i32 = int_literal 1
// CHECK:STDOUT: %.loc11_6: init () = call %Foo.ref.loc11(%.loc11_7)
// CHECK:STDOUT: return
+1 -1
View File
@@ -26,7 +26,7 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Foo.ref: <function> = name_reference "Foo", file.%Foo
// CHECK:STDOUT: %Foo.ref: <function> = name_reference Foo, file.%Foo
// CHECK:STDOUT: %.loc10_7: i32 = int_literal 1
// CHECK:STDOUT: %.loc10_10: i32 = int_literal 2
// CHECK:STDOUT: %.loc10_6: init () = call %Foo.ref(%.loc10_7, %.loc10_10)
@@ -27,11 +27,11 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Foo.ref.loc10: <function> = name_reference "Foo", file.%Foo
// CHECK:STDOUT: %Foo.ref.loc10: <function> = name_reference Foo, file.%Foo
// CHECK:STDOUT: %.loc10_7: i32 = int_literal 1
// CHECK:STDOUT: %.loc10_10: i32 = int_literal 2
// CHECK:STDOUT: %.loc10_6: init () = call %Foo.ref.loc10(%.loc10_7, %.loc10_10)
// CHECK:STDOUT: %Foo.ref.loc11: <function> = name_reference "Foo", file.%Foo
// CHECK:STDOUT: %Foo.ref.loc11: <function> = name_reference Foo, file.%Foo
// CHECK:STDOUT: %.loc11_7: i32 = int_literal 1
// CHECK:STDOUT: %.loc11_10: i32 = int_literal 2
// CHECK:STDOUT: %.loc11_6: init () = call %Foo.ref.loc11(%.loc11_7, %.loc11_10)
+1 -1
View File
@@ -26,7 +26,7 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Foo.ref: <function> = name_reference "Foo", file.%Foo
// CHECK:STDOUT: %Foo.ref: <function> = name_reference Foo, file.%Foo
// CHECK:STDOUT: %.loc10: init () = call %Foo.ref()
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -28,9 +28,9 @@ fn Main() {
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %.loc11_11: () = tuple_literal ()
// CHECK:STDOUT: %b.var: ref () = var "b"
// CHECK:STDOUT: %b: ref () = bind_name "b", %b.var
// CHECK:STDOUT: %MakeImplicitEmptyTuple.ref: <function> = name_reference "MakeImplicitEmptyTuple", file.%MakeImplicitEmptyTuple
// CHECK:STDOUT: %b.var: ref () = var b
// CHECK:STDOUT: %b: ref () = bind_name b, %b.var
// CHECK:STDOUT: %MakeImplicitEmptyTuple.ref: <function> = name_reference MakeImplicitEmptyTuple, file.%MakeImplicitEmptyTuple
// CHECK:STDOUT: %.loc11_37: init () = call %MakeImplicitEmptyTuple.ref()
// CHECK:STDOUT: assign %b.var, %.loc11_37
// CHECK:STDOUT: return
@@ -21,7 +21,7 @@ fn G() { F(); }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @G() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %F.ref: <function> = name_reference "F", file.%F
// CHECK:STDOUT: %F.ref: <function> = name_reference F, file.%F
// CHECK:STDOUT: %.loc9: init () = call %F.ref()
// CHECK:STDOUT: return
// CHECK:STDOUT: }