mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
Make identifying a facet type an operation on a (self+facet type) pair (#6592)
Identifying a facet type takes both a self and facet type as a pair, and then encode the self into the IdentifiedFacetType. This makes a constraint that requires some _other_ type implements an interface visible in the IdentifiedFacetType. And it will help to enable facet types with `where T impls Z` for `T` that is not `.Self` in the future. IdentifiedFacetTypes are now stored in a CanonicalValueStore instead of a RelationalValueStore as they key is the combination of self and (declared) facet type together now. When the self-type is a facet value (has type FacetType) this is most straightforward. But when it's a type we need to construct a FacetValue to construct a specific for a require decl, to replace the generic binding of the symbolic `Self`, which has type FacetType. To do so, we make a FacetValue with an empty FacetType (equivalent to TypeType). This prevents any looking for witnesses through the FacetType, which matches what you can get from a type directly, requiring witnesses to come from finding an `impl` decl. Add additional InstNamer logic for such empty facet types so they print as `<typename>.type.facet` if possible instead of as just `facet_value`.
This commit is contained in:
@@ -1327,7 +1327,8 @@ static auto PerformBuiltinConversion(
|
||||
// Note that `FacetValue`'s type is the same `FacetType` that was used
|
||||
// to construct the set of witnesses, ie. the query to
|
||||
// `LookupImplWitness()`. This ensures that the witnesses are in the
|
||||
// same order as the `required_interfaces()` in the `FacetValue`'s type.
|
||||
// same order as the `required_impls()` in the `IdentifiedFacetType` of
|
||||
// the `FacetValue`'s type.
|
||||
return AddInst<SemIR::FacetValue>(
|
||||
context, loc_id,
|
||||
{.type_id = target.type_id,
|
||||
|
||||
Reference in New Issue
Block a user