Use the correct type for Self in generic classes and generic interfaces (#4087)

In a `class C(T:! type)`, the type `Self` should be `C(T)`, not merely
`C`. Similarly, in an `interface I(T:! type)`, the type of self should
be `I(T)`, not merely `I`.
This commit is contained in:
Richard Smith
2024-06-28 20:20:40 +00:00
committed by GitHub
parent 19c5596fd8
commit 10a198a9e6
24 changed files with 395 additions and 224 deletions
+11 -11
View File
@@ -28,13 +28,13 @@ class C {
// CHECK:STDOUT: %GenericInterface.type: type = generic_interface_type @GenericInterface [template]
// CHECK:STDOUT: %.1: type = tuple_type () [template]
// CHECK:STDOUT: %GenericInterface: %GenericInterface.type = struct_value () [template]
// CHECK:STDOUT: %Self: %GenericInterface = bind_symbolic_name Self 1 [symbolic]
// CHECK:STDOUT: %.2: type = interface_type @GenericInterface, (%T) [symbolic]
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 1 [symbolic]
// CHECK:STDOUT: %F.type.1: type = fn_type @F.1 [template]
// CHECK:STDOUT: %F.1: %F.type.1 = struct_value () [template]
// CHECK:STDOUT: %.2: type = assoc_entity_type @GenericInterface, %F.type.1 [template]
// CHECK:STDOUT: %.3: %.2 = assoc_entity element0, @GenericInterface.%F.decl [template]
// CHECK:STDOUT: %.3: type = assoc_entity_type @GenericInterface, %F.type.1 [template]
// CHECK:STDOUT: %.4: %.3 = assoc_entity element0, @GenericInterface.%F.decl [template]
// CHECK:STDOUT: %C: type = class_type @C [template]
// CHECK:STDOUT: %.4: type = interface_type @GenericInterface, (%T) [symbolic]
// CHECK:STDOUT: %F.type.2: type = fn_type @F.2 [template]
// CHECK:STDOUT: %F.2: %F.type.2 = struct_value () [template]
// CHECK:STDOUT: %.5: <witness> = interface_witness (%F.2) [template]
@@ -57,13 +57,13 @@ class C {
// CHECK:STDOUT:
// CHECK:STDOUT: interface @GenericInterface
// CHECK:STDOUT: generic [file.%T.loc11_28.2: type] {
// CHECK:STDOUT: %Self: %GenericInterface = bind_symbolic_name Self 1 [symbolic = constants.%Self]
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 1 [symbolic = constants.%Self]
// CHECK:STDOUT: %F.decl: %F.type.1 = fn_decl @F.1 [template = constants.%F.1] {
// CHECK:STDOUT: %T.ref: type = name_ref T, file.%T.loc11_28.2 [symbolic = constants.%T]
// CHECK:STDOUT: %x.loc12_8.1: %T = param x
// CHECK:STDOUT: %x.loc12_8.2: %T = bind_name x, %x.loc12_8.1
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc12: %.2 = assoc_entity element0, %F.decl [template = constants.%.3]
// CHECK:STDOUT: %.loc12: %.3 = assoc_entity element0, %F.decl [template = constants.%.4]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
// CHECK:STDOUT: .Self = %Self
@@ -71,7 +71,7 @@ class C {
// CHECK:STDOUT: witness = (%F.decl)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.4 {
// CHECK:STDOUT: impl @impl: %C as %.2 {
// CHECK:STDOUT: %F.decl: %F.type.2 = fn_decl @F.2 [template = constants.%F.2] {
// CHECK:STDOUT: %T.ref: type = name_ref T, @C.%T.loc19_23.2 [symbolic = constants.%T]
// CHECK:STDOUT: %x.loc20_10.1: %T = param x
@@ -85,14 +85,14 @@ class C {
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: class @C {
// CHECK:STDOUT: %.loc19_54.1: type = value_of_initializer %.loc19_52 [symbolic = constants.%.4]
// CHECK:STDOUT: %.loc19_54.2: type = converted %.loc19_52, %.loc19_54.1 [symbolic = constants.%.4]
// CHECK:STDOUT: %.loc19_54.1: type = value_of_initializer %.loc19_52 [symbolic = constants.%.2]
// CHECK:STDOUT: %.loc19_54.2: type = converted %.loc19_52, %.loc19_54.1 [symbolic = constants.%.2]
// CHECK:STDOUT: impl_decl @impl {
// CHECK:STDOUT: %T.loc19_23.1: type = param T
// CHECK:STDOUT: %T.loc19_23.2: type = bind_symbolic_name T 0, %T.loc19_23.1 [symbolic = constants.%T]
// CHECK:STDOUT: %GenericInterface.ref: %GenericInterface.type = name_ref GenericInterface, file.%GenericInterface.decl [template = constants.%GenericInterface]
// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc19_23.2 [symbolic = constants.%T]
// CHECK:STDOUT: %.loc19_52: init type = call %GenericInterface.ref(%T.ref) [symbolic = constants.%.4]
// CHECK:STDOUT: %.loc19_52: init type = call %GenericInterface.ref(%T.ref) [symbolic = constants.%.2]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
@@ -101,7 +101,7 @@ class C {
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F.1(@GenericInterface.%x.loc12_8.2: %T)
// CHECK:STDOUT: generic [file.%T.loc11_28.2: type, @GenericInterface.%Self: %GenericInterface];
// CHECK:STDOUT: generic [file.%T.loc11_28.2: type, @GenericInterface.%Self: %.2];
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F.2(@impl.%x.loc20_10.2: %T)
// CHECK:STDOUT: generic [@C.%T.loc19_23.2: type] {