mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
Support unqualified lookup into extended interfaces from classes and impls (#7217)
When a class extends an interface, referring to a member name of the interface as an unqualified name should refer to the class's corresponding associated entity value, not to the associated entity itself. Similarly, in an `impl`, unqualified names of associated entities should refer to the `impl`'s corresponding value for that entity. To support this, we treat `impl`s as `extend`ing their implemented facet type, and we make lookups into an extended facet type use the `Self` type of the extending `impl` or `class` if lookup finds an associated entity. We already did the latter if the extending entity was an interface; this extends the existing support for these other cases.
This commit is contained in:
@@ -112,6 +112,7 @@ fn F(T:! Empty) {
|
||||
// CHECK:STDOUT: %Empty.impl_witness: <witness> = impl_witness %Empty.impl_witness_table [concrete = constants.%Empty.impl_witness]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: extend %Empty.ref
|
||||
// CHECK:STDOUT: witness = %Empty.impl_witness
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -1379,6 +1379,7 @@ fn Works() {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: .G = %C.as.A.impl.G.decl
|
||||
// CHECK:STDOUT: extend %A.ref
|
||||
// CHECK:STDOUT: witness = %A.impl_witness
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -1563,6 +1564,7 @@ fn Works() {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: .G = %C.as.A.impl.G.decl
|
||||
// CHECK:STDOUT: extend %A.ref
|
||||
// CHECK:STDOUT: witness = %A.impl_witness
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -121,6 +121,7 @@ class C {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: .F = %C.as.I.impl.F.decl
|
||||
// CHECK:STDOUT: extend %I.ref
|
||||
// CHECK:STDOUT: witness = %I.impl_witness
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -189,6 +189,7 @@ fn Use() { UseJ(C); }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: .F = %T.as_type.as.I.impl.F.decl
|
||||
// CHECK:STDOUT: extend %I.ref
|
||||
// CHECK:STDOUT: witness = %I.impl_witness.loc7_34.1
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: }
|
||||
@@ -198,6 +199,7 @@ fn Use() { UseJ(C); }
|
||||
// CHECK:STDOUT: %J.impl_witness: <witness> = impl_witness %J.impl_witness_table [concrete = constants.%J.impl_witness]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: extend %J.ref
|
||||
// CHECK:STDOUT: witness = %J.impl_witness
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -269,6 +269,7 @@ fn F(unused T:! Generic((), ())) {}
|
||||
// CHECK:STDOUT: %Simple.impl_witness: <witness> = impl_witness %Simple.impl_witness_table [concrete = constants.%Simple.impl_witness]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: extend %Simple.type
|
||||
// CHECK:STDOUT: witness = %Simple.impl_witness
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -288,6 +289,7 @@ fn F(unused T:! Generic((), ())) {}
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: .X = <poisoned>
|
||||
// CHECK:STDOUT: .F = %C.as.WithAssocFn.impl.F.decl
|
||||
// CHECK:STDOUT: extend %WithAssocFn.type
|
||||
// CHECK:STDOUT: witness = %WithAssocFn.impl_witness
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -176,6 +176,7 @@ impl C as AddWith(C) {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: .F = %C.as.AddWith.impl.F.decl
|
||||
// CHECK:STDOUT: extend %AddWith.type
|
||||
// CHECK:STDOUT: witness = %AddWith.impl_witness
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -359,6 +359,8 @@ fn CallIndirect() {
|
||||
// CHECK:STDOUT: .T = <poisoned>
|
||||
// CHECK:STDOUT: .T = <poisoned>
|
||||
// CHECK:STDOUT: .F = @A.WithSelf.%assoc0.loc6_41.1
|
||||
// CHECK:STDOUT: .X = <poisoned>
|
||||
// CHECK:STDOUT: .Y = <poisoned>
|
||||
// CHECK:STDOUT: witness = (@A.WithSelf.%A.WithSelf.F.decl)
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !requires:
|
||||
@@ -401,6 +403,7 @@ fn CallIndirect() {
|
||||
// CHECK:STDOUT: .X = <poisoned>
|
||||
// CHECK:STDOUT: .Y = <poisoned>
|
||||
// CHECK:STDOUT: .F = %Y.as.A.impl.F.decl
|
||||
// CHECK:STDOUT: extend %A.type
|
||||
// CHECK:STDOUT: witness = %A.impl_witness
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -1085,6 +1088,9 @@ fn CallIndirect() {
|
||||
// CHECK:STDOUT: .T = <poisoned>
|
||||
// CHECK:STDOUT: .T = <poisoned>
|
||||
// CHECK:STDOUT: .F = @A.WithSelf.%assoc0.loc6_39.1
|
||||
// CHECK:STDOUT: .W = <poisoned>
|
||||
// CHECK:STDOUT: .V1 = <poisoned>
|
||||
// CHECK:STDOUT: .V2 = <poisoned>
|
||||
// CHECK:STDOUT: witness = (@A.WithSelf.%A.WithSelf.F.decl)
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !requires:
|
||||
@@ -1141,6 +1147,7 @@ fn CallIndirect() {
|
||||
// CHECK:STDOUT: .V1 = <poisoned>
|
||||
// CHECK:STDOUT: .V2 = <poisoned>
|
||||
// CHECK:STDOUT: .F = %tuple.type.as.A.impl.F.decl
|
||||
// CHECK:STDOUT: extend %A.type.loc14_61.2
|
||||
// CHECK:STDOUT: witness = %A.impl_witness.loc14_63.1
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: }
|
||||
|
||||
@@ -271,6 +271,7 @@ interface Bar[T:! type] {}
|
||||
// CHECK:STDOUT: %NotGenericNoParams.impl_witness: <witness> = impl_witness %NotGenericNoParams.impl_witness_table [concrete = constants.%NotGenericNoParams.impl_witness]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: extend %NotGenericNoParams.ref
|
||||
// CHECK:STDOUT: witness = %NotGenericNoParams.impl_witness
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -279,6 +280,7 @@ interface Bar[T:! type] {}
|
||||
// CHECK:STDOUT: %NotGenericButParams.impl_witness: <witness> = impl_witness %NotGenericButParams.impl_witness_table [concrete = constants.%NotGenericButParams.impl_witness]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: extend %NotGenericButParams.type
|
||||
// CHECK:STDOUT: witness = %NotGenericButParams.impl_witness
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -287,6 +289,7 @@ interface Bar[T:! type] {}
|
||||
// CHECK:STDOUT: %GenericAndParams.impl_witness: <witness> = impl_witness %GenericAndParams.impl_witness_table [concrete = constants.%GenericAndParams.impl_witness.12e]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: extend %GenericAndParams.type
|
||||
// CHECK:STDOUT: witness = %GenericAndParams.impl_witness
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -295,6 +298,7 @@ interface Bar[T:! type] {}
|
||||
// CHECK:STDOUT: %GenericNoParams.impl_witness: <witness> = impl_witness %GenericNoParams.impl_witness_table [concrete = constants.%GenericNoParams.impl_witness]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: extend %GenericNoParams.ref
|
||||
// CHECK:STDOUT: witness = %GenericNoParams.impl_witness
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -303,6 +307,7 @@ interface Bar[T:! type] {}
|
||||
// CHECK:STDOUT: %GenericAndParams.impl_witness: <witness> = impl_witness %GenericAndParams.impl_witness_table [concrete = constants.%GenericAndParams.impl_witness.e7f]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: extend %GenericAndParams.type
|
||||
// CHECK:STDOUT: witness = %GenericAndParams.impl_witness
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -202,6 +202,7 @@ interface A(T:! type) {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: impl @empty_struct_type.as.<error>.impl: %.loc16_7.2 as <error> {
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: extend <error>
|
||||
// CHECK:STDOUT: witness = <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -96,6 +96,7 @@ fn F() {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: .G = %empty_tuple.type.as.I.impl.G.decl
|
||||
// CHECK:STDOUT: extend %I.ref
|
||||
// CHECK:STDOUT: witness = %I.impl_witness
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
Reference in New Issue
Block a user