Facet types support rewrite (where .A =...) constraints (#4613)

* Rewrite constraints are stored in a facet type, substituted, imported,
and formatted.
* We now distinguish `.Self` from other symbolic bindings in two ways:
* `.Self` itself now has an invalid compile time binding index (since it
doesn't bind to any of the generic parameters). As a result, we no
longer need to create a generic region in `handle_where.cpp`.
* There is a new phase tracking values that are only symbolic because
they transitively depend on `.Self`. This allows us to give the result
of a `where` expression template phase as long as it doesn't use any
symbolic constants other than `.Self` or other designators.
* `AddConstant` has been removed from `check/context` since it was only
used from `eval`. This meant less plumbing of the phase change.
* Evaluation of `BindSymbolicName` now also performs substitution into
its type.
* Include a bit more information in some diagnostics.
* `StringifyTypeExpr` outputs rewrites, which required adding support
for associated entities as well.
  * Associated entities now have an entity name set when importing.
* Adds tests for some interesting cases with rewrites and uses of
`.Self` mixed with other symbolic constants.

Still to do:
* There is no validation that any particular type satisfies rewrite
constraints.
  * Access to members of a facet type do not see the rewritten values.
* Impls don't recognize whether associated constants have rewrites
setting their values.
  * No support for resolving facet types.

---------

Co-authored-by: Josh L <josh11b@users.noreply.github.com>
Co-authored-by: Richard Smith <richard@metafoo.co.uk>
This commit is contained in:
josh11b
2024-12-03 22:44:39 +00:00
committed by GitHub
co-authored by Josh L Richard Smith
parent dc5edb88fb
commit 33110d096c
44 changed files with 3113 additions and 1446 deletions
+6 -3
View File
@@ -200,11 +200,14 @@ static auto BuildInterfaceWitness(
}
break;
}
case SemIR::AssociatedConstantDecl::Kind:
case CARBON_KIND(SemIR::AssociatedConstantDecl associated): {
// TODO: Check we have a value for this constant in the constraint.
context.TODO(impl.definition_id,
"impl of interface with associated constant");
context.TODO(
impl.definition_id,
"impl of interface with associated constant " +
context.names().GetFormatted(associated.name_id).str());
return SemIR::InstId::BuiltinErrorInst;
}
default:
CARBON_CHECK(decl_id == SemIR::InstId::BuiltinErrorInst,
"Unexpected kind of associated entity {0}", decl);