Add name_reference SemIR node for references to names. (#3260)

Also add `name_reference_untyped` for references to non-first-class
names without types, which currently covers namespaces and functions.

This improves the fidelity of the SemIR representation, and fixes some
issues where we would use the wrong location for nodes and diagnostics
downstream of a name reference.

We're still missing a representation for dotted name expressions, such
as `Namespace.Function`, and we don't use the `untyped` node as an
operand of any other node yet.
This commit is contained in:
Richard Smith
2023-10-05 01:15:53 +00:00
committed by GitHub
parent d552545c6d
commit 5ccee62918
97 changed files with 489 additions and 235 deletions
+3 -1
View File
@@ -19,11 +19,13 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Echo(%a: {}) -> {} {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return %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 = name_reference_untyped "Echo", package.%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(%.loc12_9.2)
+3 -1
View File
@@ -19,11 +19,13 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Echo(%a: ()) -> () {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return %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 = name_reference_untyped "Echo", package.%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(%.loc12_9.2)
@@ -79,12 +79,18 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Run0.ref.loc18 = name_reference_untyped "Run0", package.%Run0
// CHECK:STDOUT: %.loc18_8: i32 = int_literal 1
// CHECK:STDOUT: %.loc18_7: type = tuple_type ()
// CHECK:STDOUT: %Run0.ref.loc25 = name_reference_untyped "Run0", package.%Run0
// CHECK:STDOUT: %.loc25_8: i32 = int_literal 0
// CHECK:STDOUT: %.loc25_11: i32 = int_literal 1
// CHECK:STDOUT: %Run1.ref.loc33 = name_reference_untyped "Run1", package.%Run1
// CHECK:STDOUT: %Run1.ref.loc40 = name_reference_untyped "Run1", package.%Run1
// CHECK:STDOUT: %.loc40_8: i32 = int_literal 0
// CHECK:STDOUT: %.loc40_11: i32 = int_literal 1
// CHECK:STDOUT: %Run2.ref.loc48 = name_reference_untyped "Run2", package.%Run2
// CHECK:STDOUT: %Run2.ref.loc55 = name_reference_untyped "Run2", package.%Run2
// CHECK:STDOUT: %.loc55: i32 = int_literal 0
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -28,6 +28,7 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Run.ref = name_reference_untyped "Run", package.%Run
// CHECK:STDOUT: %.loc16_7: f64 = real_literal 10e-1
// CHECK:STDOUT: %.loc16_6: type = tuple_type ()
// CHECK:STDOUT: return
@@ -27,6 +27,7 @@ fn Run() {
// CHECK:STDOUT: fn @Run() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %x: ref i32 = var "x"
// CHECK:STDOUT: %Foo.ref = name_reference_untyped "Foo", package.%Foo
// CHECK:STDOUT: %.loc13: init f64 = call @Foo()
// CHECK:STDOUT: assign %x, <error>
// CHECK:STDOUT: return
+3 -1
View File
@@ -19,12 +19,14 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Echo(%a: i32) -> i32 {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return %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: ref i32 = var "b"
// CHECK:STDOUT: %Echo.ref = name_reference_untyped "Echo", package.%Echo
// CHECK:STDOUT: %.loc12_21: i32 = int_literal 1
// CHECK:STDOUT: %.loc12_20: init i32 = call @Echo(%.loc12_21)
// CHECK:STDOUT: assign %b, %.loc12_20
@@ -23,6 +23,7 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Foo.ref = name_reference_untyped "Foo", package.%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
@@ -22,6 +22,7 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Foo.ref = name_reference_untyped "Foo", package.%Foo
// CHECK:STDOUT: %.loc10_7: i32 = int_literal 1
// CHECK:STDOUT: %.loc10_6.1: type = tuple_type ()
// CHECK:STDOUT: %.loc10_6.2: init () = call @Foo(%.loc10_7)
@@ -23,9 +23,11 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Foo.ref.loc10 = name_reference_untyped "Foo", package.%Foo
// CHECK:STDOUT: %.loc10_7: i32 = int_literal 1
// CHECK:STDOUT: %.loc10_6.1: type = tuple_type ()
// CHECK:STDOUT: %.loc10_6.2: init () = call @Foo(%.loc10_7)
// CHECK:STDOUT: %Foo.ref.loc11 = name_reference_untyped "Foo", package.%Foo
// CHECK:STDOUT: %.loc11_7: i32 = int_literal 1
// CHECK:STDOUT: %.loc11_6: init () = call @Foo(%.loc11_7)
// CHECK:STDOUT: return
@@ -22,6 +22,7 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Foo.ref = name_reference_untyped "Foo", package.%Foo
// CHECK:STDOUT: %.loc10_7: i32 = int_literal 1
// CHECK:STDOUT: %.loc10_10: i32 = int_literal 2
// CHECK:STDOUT: %.loc10_6.1: type = tuple_type ()
@@ -23,10 +23,12 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Foo.ref.loc10 = name_reference_untyped "Foo", package.%Foo
// CHECK:STDOUT: %.loc10_7: i32 = int_literal 1
// CHECK:STDOUT: %.loc10_10: i32 = int_literal 2
// CHECK:STDOUT: %.loc10_6.1: type = tuple_type ()
// CHECK:STDOUT: %.loc10_6.2: init () = call @Foo(%.loc10_7, %.loc10_10)
// CHECK:STDOUT: %Foo.ref.loc11 = name_reference_untyped "Foo", package.%Foo
// CHECK:STDOUT: %.loc11_7: i32 = int_literal 1
// CHECK:STDOUT: %.loc11_10: i32 = int_literal 2
// CHECK:STDOUT: %.loc11_6: init () = call @Foo(%.loc11_7, %.loc11_10)
@@ -22,6 +22,7 @@ fn Main() {
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Main() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Foo.ref = name_reference_untyped "Foo", package.%Foo
// CHECK:STDOUT: %.loc10_6.1: type = tuple_type ()
// CHECK:STDOUT: %.loc10_6.2: init () = call @Foo()
// CHECK:STDOUT: return
@@ -26,6 +26,7 @@ fn Main() {
// CHECK:STDOUT: %.loc11_11.1: type = tuple_type ()
// CHECK:STDOUT: %.loc11_11.2: () = tuple_literal ()
// CHECK:STDOUT: %b: ref () = var "b"
// CHECK:STDOUT: %MakeImplicitEmptyTuple.ref = name_reference_untyped "MakeImplicitEmptyTuple", package.%MakeImplicitEmptyTuple
// CHECK:STDOUT: %.loc11_37: init () = call @MakeImplicitEmptyTuple()
// CHECK:STDOUT: assign %b, %.loc11_37
// CHECK:STDOUT: return