Make type contexts expect a value of type Type. (#2357)

In particular, this means that a type can implement `ImplicitAs(Type)` and have values of that type behave like types.

This implies that `()` and `{}` are no longer types. They are now values whose type is the result of converting `()` or `{}` to type `Type`, as has been discussed recently and seems to be the supported direction. This fixes various cases where these types were previously mishandled.
This commit is contained in:
Richard Smith
2022-10-28 08:20:49 -07:00
committed by GitHub
parent f46eaf49a2
commit 0219218b01
40 changed files with 674 additions and 319 deletions
+2 -2
View File
@@ -71,7 +71,7 @@ void AbstractPattern::AppendElementsTo(
}
} else if (const auto* value = value_.dyn_cast<const Value*>()) {
if (const auto* tuple = dyn_cast<TupleValue>(value)) {
const auto* tuple_type = cast<TupleValue>(type_);
const auto* tuple_type = cast<TupleType>(type_);
CARBON_CHECK(tuple->elements().size() == tuple_type->elements().size());
for (size_t i = 0; i != tuple->elements().size(); ++i) {
out.push_back(
@@ -180,7 +180,7 @@ auto PatternMatrix::FirstColumnDiscriminators() const -> DiscriminatorSet {
continue;
case AbstractPattern::Compound: {
const Value& type = row[0].type();
if (const auto* tuple = dyn_cast<TupleValue>(&type)) {
if (const auto* tuple = dyn_cast<TupleType>(&type)) {
// If we find a tuple match, we've found all constructors (there's
// only one!) and none were missing.
return {