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:
@@ -94,6 +94,7 @@ impl {.a: bool} as type where .Self impls I {}
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: impl @i32.as.<error>.impl: %i32 as <error> {
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: extend <error>
|
||||
// CHECK:STDOUT: witness = <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -126,6 +127,7 @@ impl {.a: bool} as type where .Self impls I {}
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: impl @bool.as.<error>.impl: %.loc8_6 as <error> {
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: extend <error>
|
||||
// CHECK:STDOUT: witness = <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -172,6 +174,7 @@ impl {.a: bool} as type where .Self impls I {}
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: impl @f64.as.<error>.impl: %f64 as <error> {
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: extend <error>
|
||||
// CHECK:STDOUT: witness = <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -234,6 +237,7 @@ impl {.a: bool} as type where .Self impls I {}
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: impl @struct_type.a.as.<error>.impl: %struct_type.a as <error> {
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: extend <error>
|
||||
// CHECK:STDOUT: witness = <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
Reference in New Issue
Block a user