mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 22:02:23 +01:00
In order to verify rewrite constraints at the end of `LookupImplWitness()` we need to replace references to associated constants in the query facet type with values that come from the query's self. To do this, we find any `ImplWitnessAccess` that is a reference to `.Self` and replace its witness with the witness found through the impl lookup process, if the interfaces match. This allows the `ImplWitnessAccess` to resolve to a concrete value if that witness was concrete. Then we just need to compare that for each rewrite constraint the lhs and rhs are the same constant value. If they differ, the self provided a different value for one side (either through its own facet value constraints or through an associated impl), or the self did not provide a value at all. For now, only .Self references in the top-level facet type are rewritten. Nested facet types are not, even if they contain a .Self reference up to the top level facet value. This will be addressed by adding numbering to the EntityName of of .Self in a BindSymbolicName. See the third model in https://docs.google.com/document/d/1Yt-i5AmF76LSvD4TrWRIAE_92kii6j5yFiW-S7ahzlg/edit?tab=t.0 for the plan. For now, there is a TODO addressing this.