mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
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:
@@ -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)
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -17,6 +17,7 @@ fn G() { F(); }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @G() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %F.ref = name_reference_untyped "F", package.%F
|
||||
// CHECK:STDOUT: %.loc9_11.1: type = tuple_type ()
|
||||
// CHECK:STDOUT: %.loc9_11.2: init () = call @F()
|
||||
// CHECK:STDOUT: return
|
||||
|
||||
Reference in New Issue
Block a user