Răsfoiți Sursa

Associate a name with ClassDecl (#3447)

Note generics will probably need different behavior.

---------

Co-authored-by: Richard Smith <richard@metafoo.co.uk>
Jon Ross-Perkins 2 ani în urmă
părinte
comite
962defd1e8
46 a modificat fișierele cu 96 adăugiri și 84 ștergeri
  1. 1 1
      toolchain/check/testdata/array/fail_incomplete_element.carbon
  2. 1 1
      toolchain/check/testdata/as/identity.carbon
  3. 1 1
      toolchain/check/testdata/as/tuple.carbon
  4. 1 1
      toolchain/check/testdata/class/basic.carbon
  5. 1 1
      toolchain/check/testdata/class/fail_abstract.carbon
  6. 1 1
      toolchain/check/testdata/class/fail_addr_not_self.carbon
  7. 1 1
      toolchain/check/testdata/class/fail_addr_self.carbon
  8. 1 1
      toolchain/check/testdata/class/fail_incomplete.carbon
  9. 1 1
      toolchain/check/testdata/class/fail_init.carbon
  10. 1 1
      toolchain/check/testdata/class/fail_init_as_inplace.carbon
  11. 2 2
      toolchain/check/testdata/class/fail_memaccess_category.carbon
  12. 1 1
      toolchain/check/testdata/class/fail_member_of_let.carbon
  13. 1 1
      toolchain/check/testdata/class/fail_method.carbon
  14. 15 15
      toolchain/check/testdata/class/fail_redeclaration_introducer.carbon
  15. 12 12
      toolchain/check/testdata/class/fail_redeclaration_scope.carbon
  16. 2 2
      toolchain/check/testdata/class/fail_redefinition.carbon
  17. 1 1
      toolchain/check/testdata/class/fail_reorder.carbon
  18. 1 1
      toolchain/check/testdata/class/fail_scope.carbon
  19. 2 2
      toolchain/check/testdata/class/fail_self.carbon
  20. 1 1
      toolchain/check/testdata/class/fail_unbound_field.carbon
  21. 1 1
      toolchain/check/testdata/class/fail_unknown_member.carbon
  22. 1 1
      toolchain/check/testdata/class/field_access.carbon
  23. 1 1
      toolchain/check/testdata/class/field_access_in_value.carbon
  24. 1 1
      toolchain/check/testdata/class/forward_declared.carbon
  25. 1 1
      toolchain/check/testdata/class/init.carbon
  26. 1 1
      toolchain/check/testdata/class/init_as.carbon
  27. 2 2
      toolchain/check/testdata/class/init_nested.carbon
  28. 1 1
      toolchain/check/testdata/class/method.carbon
  29. 3 3
      toolchain/check/testdata/class/nested.carbon
  30. 3 3
      toolchain/check/testdata/class/nested_name.carbon
  31. 1 1
      toolchain/check/testdata/class/raw_self.carbon
  32. 1 1
      toolchain/check/testdata/class/raw_self_type.carbon
  33. 2 2
      toolchain/check/testdata/class/redeclaration.carbon
  34. 6 6
      toolchain/check/testdata/class/redeclaration_introducer.carbon
  35. 1 1
      toolchain/check/testdata/class/reenter_scope.carbon
  36. 1 1
      toolchain/check/testdata/class/scope.carbon
  37. 1 1
      toolchain/check/testdata/class/self.carbon
  38. 1 1
      toolchain/check/testdata/class/self_type.carbon
  39. 1 1
      toolchain/check/testdata/class/static_method.carbon
  40. 1 1
      toolchain/check/testdata/if_expr/fail_not_in_function.carbon
  41. 1 1
      toolchain/check/testdata/return/fail_return_with_returned_var.carbon
  42. 1 1
      toolchain/check/testdata/return/returned_var.carbon
  43. 1 1
      toolchain/check/testdata/struct/fail_nested_incomplete.carbon
  44. 1 1
      toolchain/check/testdata/tuples/fail_nested_incomplete.carbon
  45. 1 1
      toolchain/check/testdata/var/fail_not_copyable.carbon
  46. 12 0
      toolchain/sem_ir/formatter.cpp

+ 1 - 1
toolchain/check/testdata/array/fail_incomplete_element.carbon

@@ -26,7 +26,7 @@ var p: Incomplete* = &a[0];
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Incomplete, ()
+// CHECK:STDOUT:   %Incomplete.decl = class_decl @Incomplete, ()
 // CHECK:STDOUT:   %Incomplete: type = class_type @Incomplete
 // CHECK:STDOUT:   %Incomplete.ref.loc15: type = name_ref Incomplete, %Incomplete
 // CHECK:STDOUT:   %.loc15_21: i32 = int_literal 1

+ 1 - 1
toolchain/check/testdata/as/identity.carbon

@@ -33,7 +33,7 @@ fn Initializing() {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @X, ()
+// CHECK:STDOUT:   %X.decl = class_decl @X, ()
 // CHECK:STDOUT:   %X: type = class_type @X
 // CHECK:STDOUT:   %Value: <function> = fn_decl @Value
 // CHECK:STDOUT:   %Reference: <function> = fn_decl @Reference

+ 1 - 1
toolchain/check/testdata/as/tuple.carbon

@@ -33,7 +33,7 @@ fn Var() {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @X, ()
+// CHECK:STDOUT:   %X.decl = class_decl @X, ()
 // CHECK:STDOUT:   %X: type = class_type @X
 // CHECK:STDOUT:   %Make: <function> = fn_decl @Make
 // CHECK:STDOUT:   %Let: <function> = fn_decl @Let

+ 1 - 1
toolchain/check/testdata/class/basic.carbon

@@ -29,7 +29,7 @@ fn Run() -> i32 {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %G: <function> = fn_decl @G
 // CHECK:STDOUT:   %Run: <function> = fn_decl @Run

+ 1 - 1
toolchain/check/testdata/class/fail_abstract.carbon

@@ -23,7 +23,7 @@ fn Make() -> Class {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %Make: <function> = fn_decl @Make
 // CHECK:STDOUT: }

+ 1 - 1
toolchain/check/testdata/class/fail_addr_not_self.carbon

@@ -23,7 +23,7 @@ class Class {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT: }
 // CHECK:STDOUT:

+ 1 - 1
toolchain/check/testdata/class/fail_addr_self.carbon

@@ -47,7 +47,7 @@ fn F(c: Class, p: Class*) {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %F: <function> = fn_decl @F.2
 // CHECK:STDOUT: }

+ 1 - 1
toolchain/check/testdata/class/fail_incomplete.carbon

@@ -123,7 +123,7 @@ fn CallReturnIncomplete() {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %.loc15: <function> = fn_decl @.1
 // CHECK:STDOUT:   %CallClassFunction: <function> = fn_decl @CallClassFunction

+ 1 - 1
toolchain/check/testdata/class/fail_init.carbon

@@ -35,7 +35,7 @@ fn F() {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %F: <function> = fn_decl @F
 // CHECK:STDOUT: }

+ 1 - 1
toolchain/check/testdata/class/fail_init_as_inplace.carbon

@@ -31,7 +31,7 @@ fn F() {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %G: <function> = fn_decl @G
 // CHECK:STDOUT:   %F: <function> = fn_decl @F

+ 2 - 2
toolchain/check/testdata/class/fail_memaccess_category.carbon

@@ -45,9 +45,9 @@ fn F(s: {.a: A}, b: B) {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @A, ()
+// CHECK:STDOUT:   %A.decl = class_decl @A, ()
 // CHECK:STDOUT:   %A: type = class_type @A
-// CHECK:STDOUT:   class_decl @B, ()
+// CHECK:STDOUT:   %B.decl = class_decl @B, ()
 // CHECK:STDOUT:   %B: type = class_type @B
 // CHECK:STDOUT:   %F: <function> = fn_decl @F.2
 // CHECK:STDOUT: }

+ 1 - 1
toolchain/check/testdata/class/fail_member_of_let.carbon

@@ -28,7 +28,7 @@ fn T.F() {}
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %Class.ref: type = name_ref Class, %Class
 // CHECK:STDOUT:   %T: type = bind_name T, %Class.ref

+ 1 - 1
toolchain/check/testdata/class/fail_method.carbon

@@ -39,7 +39,7 @@ fn F(c: Class) {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %F: <function> = fn_decl @F
 // CHECK:STDOUT: }

+ 15 - 15
toolchain/check/testdata/class/fail_redeclaration_introducer.carbon

@@ -81,28 +81,28 @@ base class G;
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @A, ()
+// CHECK:STDOUT:   %A.decl.loc7 = class_decl @A, ()
 // CHECK:STDOUT:   %A: type = class_type @A
-// CHECK:STDOUT:   class_decl @A, ()
-// CHECK:STDOUT:   class_decl @B, ()
+// CHECK:STDOUT:   %A.decl.loc14 = class_decl @A, ()
+// CHECK:STDOUT:   %B.decl.loc16 = class_decl @B, ()
 // CHECK:STDOUT:   %B: type = class_type @B
-// CHECK:STDOUT:   class_decl @B, ()
-// CHECK:STDOUT:   class_decl @C, ()
+// CHECK:STDOUT:   %B.decl.loc23 = class_decl @B, ()
+// CHECK:STDOUT:   %C.decl.loc25 = class_decl @C, ()
 // CHECK:STDOUT:   %C: type = class_type @C
-// CHECK:STDOUT:   class_decl @C, ()
-// CHECK:STDOUT:   class_decl @D, ()
+// CHECK:STDOUT:   %C.decl.loc32 = class_decl @C, ()
+// CHECK:STDOUT:   %D.decl.loc34 = class_decl @D, ()
 // CHECK:STDOUT:   %D: type = class_type @D
-// CHECK:STDOUT:   class_decl @D, ()
-// CHECK:STDOUT:   class_decl @E, ()
+// CHECK:STDOUT:   %D.decl.loc41 = class_decl @D, ()
+// CHECK:STDOUT:   %E.decl.loc43 = class_decl @E, ()
 // CHECK:STDOUT:   %E: type = class_type @E
-// CHECK:STDOUT:   class_decl @E, ()
-// CHECK:STDOUT:   class_decl @F, ()
+// CHECK:STDOUT:   %E.decl.loc50 = class_decl @E, ()
+// CHECK:STDOUT:   %F.decl.loc52 = class_decl @F, ()
 // CHECK:STDOUT:   %F: type = class_type @F
-// CHECK:STDOUT:   class_decl @F, ()
-// CHECK:STDOUT:   class_decl @G, ()
+// CHECK:STDOUT:   %F.decl.loc59 = class_decl @F, ()
+// CHECK:STDOUT:   %G.decl.loc61 = class_decl @G, ()
 // CHECK:STDOUT:   %G: type = class_type @G
-// CHECK:STDOUT:   class_decl @G, ()
-// CHECK:STDOUT:   class_decl @G, ()
+// CHECK:STDOUT:   %G.decl.loc68 = class_decl @G, ()
+// CHECK:STDOUT:   %G.decl.loc75 = class_decl @G, ()
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: class @A {

+ 12 - 12
toolchain/check/testdata/class/fail_redeclaration_scope.carbon

@@ -28,38 +28,38 @@ class Y {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @A.1, ()
+// CHECK:STDOUT:   %A.decl.loc7 = class_decl @A.1, ()
 // CHECK:STDOUT:   %A: type = class_type @A.1
-// CHECK:STDOUT:   class_decl @X, ()
+// CHECK:STDOUT:   %X.decl = class_decl @X, ()
 // CHECK:STDOUT:   %X: type = class_type @X
-// CHECK:STDOUT:   class_decl @A.1, ()
-// CHECK:STDOUT:   class_decl @Y, ()
+// CHECK:STDOUT:   %A.decl.loc15 = class_decl @A.1, ()
+// CHECK:STDOUT:   %Y.decl = class_decl @Y, ()
 // CHECK:STDOUT:   %Y: type = class_type @Y
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: class @A.1 {
-// CHECK:STDOUT:   class_decl @B.2, ()
+// CHECK:STDOUT:   %B.decl = class_decl @B.2, ()
 // CHECK:STDOUT:   %B: type = class_type @B.2
 // CHECK:STDOUT:
 // CHECK:STDOUT: !members:
-// CHECK:STDOUT:   .B = <unexpected instref inst+11>
+// CHECK:STDOUT:   .B = %B.decl
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: class @X {
-// CHECK:STDOUT:   class_decl @A.2, ()
+// CHECK:STDOUT:   %A.decl = class_decl @A.2, ()
 // CHECK:STDOUT:   %A: type = class_type @A.2
-// CHECK:STDOUT:   class_decl @B.1, ()
+// CHECK:STDOUT:   %B.decl = class_decl @B.1, ()
 // CHECK:STDOUT:
 // CHECK:STDOUT: !members:
-// CHECK:STDOUT:   .A = <unexpected instref inst+4>
+// CHECK:STDOUT:   .A = %A.decl
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: class @A.2 {
-// CHECK:STDOUT:   class_decl @B.1, ()
+// CHECK:STDOUT:   %B.decl = class_decl @B.1, ()
 // CHECK:STDOUT:   %B: type = class_type @B.1
 // CHECK:STDOUT:
 // CHECK:STDOUT: !members:
-// CHECK:STDOUT:   .B = <unexpected instref inst+6>
+// CHECK:STDOUT:   .B = %B.decl
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: class @B.1 {
@@ -70,7 +70,7 @@ class Y {
 // CHECK:STDOUT: class @B.2;
 // CHECK:STDOUT:
 // CHECK:STDOUT: class @Y {
-// CHECK:STDOUT:   class_decl @.1, ()
+// CHECK:STDOUT:   %.decl = class_decl @.1, ()
 // CHECK:STDOUT:   %.loc21: type = class_type @.1
 // CHECK:STDOUT:
 // CHECK:STDOUT: !members:

+ 2 - 2
toolchain/check/testdata/class/fail_redefinition.carbon

@@ -31,9 +31,9 @@ fn Class.H() {}
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl.loc7 = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl.loc18 = class_decl @Class, ()
 // CHECK:STDOUT:   %F: <function> = fn_decl @F
 // CHECK:STDOUT:   %G: <function> = fn_decl @G
 // CHECK:STDOUT:   %H: <function> = fn_decl @H

+ 1 - 1
toolchain/check/testdata/class/fail_reorder.carbon

@@ -32,7 +32,7 @@ class Class {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT: }
 // CHECK:STDOUT:

+ 1 - 1
toolchain/check/testdata/class/fail_scope.carbon

@@ -24,7 +24,7 @@ fn G() -> i32 {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %G: <function> = fn_decl @G
 // CHECK:STDOUT: }

+ 2 - 2
toolchain/check/testdata/class/fail_self.carbon

@@ -59,11 +59,11 @@ fn CallWrongSelf(ws: WrongSelf) {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %F: <function> = fn_decl @F.1
 // CHECK:STDOUT:   %G: <function> = fn_decl @G
-// CHECK:STDOUT:   class_decl @WrongSelf, ()
+// CHECK:STDOUT:   %WrongSelf.decl = class_decl @WrongSelf, ()
 // CHECK:STDOUT:   %WrongSelf: type = class_type @WrongSelf
 // CHECK:STDOUT:   %CallWrongSelf: <function> = fn_decl @CallWrongSelf
 // CHECK:STDOUT: }

+ 1 - 1
toolchain/check/testdata/class/fail_unbound_field.carbon

@@ -28,7 +28,7 @@ fn G() -> i32 {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %G: <function> = fn_decl @G
 // CHECK:STDOUT: }

+ 1 - 1
toolchain/check/testdata/class/fail_unknown_member.carbon

@@ -24,7 +24,7 @@ fn G(c: Class) -> i32 {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %G: <function> = fn_decl @G
 // CHECK:STDOUT: }

+ 1 - 1
toolchain/check/testdata/class/field_access.carbon

@@ -24,7 +24,7 @@ fn Run() -> i32 {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %Run: <function> = fn_decl @Run
 // CHECK:STDOUT: }

+ 1 - 1
toolchain/check/testdata/class/field_access_in_value.carbon

@@ -25,7 +25,7 @@ fn Run() -> i32 {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %Run: <function> = fn_decl @Run
 // CHECK:STDOUT: }

+ 1 - 1
toolchain/check/testdata/class/forward_declared.carbon

@@ -11,7 +11,7 @@ fn F(p: Class*) -> Class* { return p; }
 // CHECK:STDOUT: --- forward_declared.carbon
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %F: <function> = fn_decl @F
 // CHECK:STDOUT: }

+ 1 - 1
toolchain/check/testdata/class/init.carbon

@@ -26,7 +26,7 @@ fn MakeReorder(n: i32, next: Class*) -> Class {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %Make: <function> = fn_decl @Make
 // CHECK:STDOUT:   %MakeReorder: <function> = fn_decl @MakeReorder

+ 1 - 1
toolchain/check/testdata/class/init_as.carbon

@@ -21,7 +21,7 @@ fn F() -> i32 {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %F: <function> = fn_decl @F
 // CHECK:STDOUT: }

+ 2 - 2
toolchain/check/testdata/class/init_nested.carbon

@@ -32,10 +32,10 @@ fn MakeOuter() -> Outer {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Inner, ()
+// CHECK:STDOUT:   %Inner.decl = class_decl @Inner, ()
 // CHECK:STDOUT:   %Inner: type = class_type @Inner
 // CHECK:STDOUT:   %MakeInner: <function> = fn_decl @MakeInner
-// CHECK:STDOUT:   class_decl @Outer, ()
+// CHECK:STDOUT:   %Outer.decl = class_decl @Outer, ()
 // CHECK:STDOUT:   %Outer: type = class_type @Outer
 // CHECK:STDOUT:   %MakeOuter: <function> = fn_decl @MakeOuter
 // CHECK:STDOUT: }

+ 1 - 1
toolchain/check/testdata/class/method.carbon

@@ -52,7 +52,7 @@ fn CallGOnInitializingExpr() -> i32 {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %F: <function> = fn_decl @F
 // CHECK:STDOUT:   %Call: <function> = fn_decl @Call

+ 3 - 3
toolchain/check/testdata/class/nested.carbon

@@ -38,13 +38,13 @@ fn F(a: Outer*) {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Outer, ()
+// CHECK:STDOUT:   %Outer.decl = class_decl @Outer, ()
 // CHECK:STDOUT:   %Outer: type = class_type @Outer
 // CHECK:STDOUT:   %F: <function> = fn_decl @F
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: class @Outer {
-// CHECK:STDOUT:   class_decl @Inner, ()
+// CHECK:STDOUT:   %Inner.decl = class_decl @Inner, ()
 // CHECK:STDOUT:   %Inner: type = class_type @Inner
 // CHECK:STDOUT:   %Self.ref: type = name_ref Self, file.%Outer
 // CHECK:STDOUT:   %.loc14_15: type = ptr_type Outer
@@ -63,7 +63,7 @@ fn F(a: Outer*) {
 // CHECK:STDOUT:   %pi: <unbound field of class Outer> = bind_name pi, %.loc16_9.2
 // CHECK:STDOUT:
 // CHECK:STDOUT: !members:
-// CHECK:STDOUT:   .Inner = <unexpected instref inst+2>
+// CHECK:STDOUT:   .Inner = %Inner.decl
 // CHECK:STDOUT:   .po = %po
 // CHECK:STDOUT:   .qo = %qo
 // CHECK:STDOUT:   .pi = %pi

+ 3 - 3
toolchain/check/testdata/class/nested_name.carbon

@@ -29,18 +29,18 @@ fn G(o: Outer) {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Outer, ()
+// CHECK:STDOUT:   %Outer.decl = class_decl @Outer, ()
 // CHECK:STDOUT:   %Outer: type = class_type @Outer
 // CHECK:STDOUT:   %F: <function> = fn_decl @F
 // CHECK:STDOUT:   %G: <function> = fn_decl @G
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: class @Outer {
-// CHECK:STDOUT:   class_decl @Inner, ()
+// CHECK:STDOUT:   %Inner.decl = class_decl @Inner, ()
 // CHECK:STDOUT:   %Inner: type = class_type @Inner
 // CHECK:STDOUT:
 // CHECK:STDOUT: !members:
-// CHECK:STDOUT:   .Inner = <unexpected instref inst+2>
+// CHECK:STDOUT:   .Inner = %Inner.decl
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: class @Inner {

+ 1 - 1
toolchain/check/testdata/class/raw_self.carbon

@@ -29,7 +29,7 @@ fn Class.G[self: Class](r#self: i32) -> (i32, i32) {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %F: <function> = fn_decl @F
 // CHECK:STDOUT:   %G: <function> = fn_decl @G

+ 1 - 1
toolchain/check/testdata/class/raw_self_type.carbon

@@ -18,7 +18,7 @@ class Class {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT: }
 // CHECK:STDOUT:

+ 2 - 2
toolchain/check/testdata/class/redeclaration.carbon

@@ -19,9 +19,9 @@ fn Class.F() {}
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl.loc7 = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl.loc9 = class_decl @Class, ()
 // CHECK:STDOUT:   %F: <function> = fn_decl @F
 // CHECK:STDOUT: }
 // CHECK:STDOUT:

+ 6 - 6
toolchain/check/testdata/class/redeclaration_introducer.carbon

@@ -19,15 +19,15 @@ abstract class C {}
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @A, ()
+// CHECK:STDOUT:   %A.decl.loc7 = class_decl @A, ()
 // CHECK:STDOUT:   %A: type = class_type @A
-// CHECK:STDOUT:   class_decl @B, ()
+// CHECK:STDOUT:   %B.decl.loc8 = class_decl @B, ()
 // CHECK:STDOUT:   %B: type = class_type @B
-// CHECK:STDOUT:   class_decl @C, ()
+// CHECK:STDOUT:   %C.decl.loc9 = class_decl @C, ()
 // CHECK:STDOUT:   %C: type = class_type @C
-// CHECK:STDOUT:   class_decl @A, ()
-// CHECK:STDOUT:   class_decl @B, ()
-// CHECK:STDOUT:   class_decl @C, ()
+// CHECK:STDOUT:   %A.decl.loc11 = class_decl @A, ()
+// CHECK:STDOUT:   %B.decl.loc12 = class_decl @B, ()
+// CHECK:STDOUT:   %C.decl.loc13 = class_decl @C, ()
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: class @A {

+ 1 - 1
toolchain/check/testdata/class/reenter_scope.carbon

@@ -20,7 +20,7 @@ fn Class.F() -> i32 {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %F: <function> = fn_decl @F
 // CHECK:STDOUT: }

+ 1 - 1
toolchain/check/testdata/class/scope.carbon

@@ -29,7 +29,7 @@ fn Run() -> i32 {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %F: <function> = fn_decl @F.2
 // CHECK:STDOUT:   %Run: <function> = fn_decl @Run

+ 1 - 1
toolchain/check/testdata/class/self.carbon

@@ -27,7 +27,7 @@ fn Class.G[addr self: Class*]() -> i32 {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %F: <function> = fn_decl @F
 // CHECK:STDOUT:   %G: <function> = fn_decl @G

+ 1 - 1
toolchain/check/testdata/class/self_type.carbon

@@ -24,7 +24,7 @@ fn Class.F[self: Class]() -> i32 {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %F: <function> = fn_decl @F
 // CHECK:STDOUT: }

+ 1 - 1
toolchain/check/testdata/class/static_method.carbon

@@ -22,7 +22,7 @@ fn Run() -> i32 {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Class, ()
+// CHECK:STDOUT:   %Class.decl = class_decl @Class, ()
 // CHECK:STDOUT:   %Class: type = class_type @Class
 // CHECK:STDOUT:   %Run: <function> = fn_decl @Run
 // CHECK:STDOUT: }

+ 1 - 1
toolchain/check/testdata/if_expr/fail_not_in_function.carbon

@@ -42,7 +42,7 @@ class C {
 // CHECK:STDOUT: file {
 // CHECK:STDOUT:   %.loc17: i32 = block_arg <unexpected instblockref block4>
 // CHECK:STDOUT:   %x: i32 = bind_name x, %.loc17
-// CHECK:STDOUT:   class_decl @C, ()
+// CHECK:STDOUT:   %C.decl = class_decl @C, ()
 // CHECK:STDOUT:   %C: type = class_type @C
 // CHECK:STDOUT: }
 // CHECK:STDOUT:

+ 1 - 1
toolchain/check/testdata/return/fail_return_with_returned_var.carbon

@@ -36,7 +36,7 @@ fn G() -> C {
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
 // CHECK:STDOUT:   %F: <function> = fn_decl @F
-// CHECK:STDOUT:   class_decl @C, ()
+// CHECK:STDOUT:   %C.decl = class_decl @C, ()
 // CHECK:STDOUT:   %C: type = class_type @C
 // CHECK:STDOUT:   %G: <function> = fn_decl @G
 // CHECK:STDOUT: }

+ 1 - 1
toolchain/check/testdata/return/returned_var.carbon

@@ -27,7 +27,7 @@ fn G() -> i32 {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @C, ()
+// CHECK:STDOUT:   %C.decl = class_decl @C, ()
 // CHECK:STDOUT:   %C: type = class_type @C
 // CHECK:STDOUT:   %F: <function> = fn_decl @F
 // CHECK:STDOUT:   %G: <function> = fn_decl @G

+ 1 - 1
toolchain/check/testdata/struct/fail_nested_incomplete.carbon

@@ -26,7 +26,7 @@ var p: Incomplete* = &s.a;
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Incomplete, ()
+// CHECK:STDOUT:   %Incomplete.decl = class_decl @Incomplete, ()
 // CHECK:STDOUT:   %Incomplete: type = class_type @Incomplete
 // CHECK:STDOUT:   %Incomplete.ref.loc15: type = name_ref Incomplete, %Incomplete
 // CHECK:STDOUT:   %.loc15: type = struct_type {.a: Incomplete}

+ 1 - 1
toolchain/check/testdata/tuples/fail_nested_incomplete.carbon

@@ -28,7 +28,7 @@ var p: Incomplete* = &t[1];
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @Incomplete, ()
+// CHECK:STDOUT:   %Incomplete.decl = class_decl @Incomplete, ()
 // CHECK:STDOUT:   %Incomplete: type = class_type @Incomplete
 // CHECK:STDOUT:   %Incomplete.ref.loc15: type = name_ref Incomplete, %Incomplete
 // CHECK:STDOUT:   %.loc15_24.1: (type, type) = tuple_literal (i32, %Incomplete.ref.loc15)

+ 1 - 1
toolchain/check/testdata/var/fail_not_copyable.carbon

@@ -32,7 +32,7 @@ fn F(x: X) {
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: file {
-// CHECK:STDOUT:   class_decl @X, ()
+// CHECK:STDOUT:   %X.decl = class_decl @X, ()
 // CHECK:STDOUT:   %X: type = class_type @X
 // CHECK:STDOUT:   %F: <function> = fn_decl @F
 // CHECK:STDOUT: }

+ 12 - 0
toolchain/sem_ir/formatter.cpp

@@ -437,6 +437,12 @@ class InstNamer {
                                .name_id);
           continue;
         }
+        case ClassDecl::Kind: {
+          add_inst_name_id(
+              sem_ir_.classes().Get(inst.As<ClassDecl>().class_id).name_id,
+              ".decl");
+          continue;
+        }
         case ClassType::Kind: {
           add_inst_name_id(
               sem_ir_.classes().Get(inst.As<ClassType>().class_id).name_id);
@@ -710,6 +716,12 @@ class Formatter {
     }
   }
 
+  // Print ClassDecl with type-like semantics even though it lacks a type_id.
+  auto FormatInstructionLHS(InstId inst_id, ClassDecl /*inst*/) -> void {
+    FormatInstName(inst_id);
+    out_ << " = ";
+  }
+
   template <typename InstT>
   auto FormatInstructionRHS(InstT inst) -> void {
     // By default, an instruction has a comma-separated argument list.