mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-06 09:14:42 +01:00
Remove all remaining uses of TypeIds as instruction operands. (#5280)
In preparation for shifting from `TypeId`s potentially representing attached types to always representing unattached types, using [terminology suggested on Discord](https://discord.com/channels/655572317891461132/963846118964350976/1359286326779973712). This change causes us to track slightly more type spelling information through SemIR. One change that has significant impact on the SemIR output is that we now build a `struct_type` instruction in each class representing the types of the fields, including the spelling used for those types. This is now no longer always identical to the corresponding canonical `struct_type` for the object representation, so it's built separately and owned by the class. Also remove `TypeBlock` support entirely, as its only use was representing `TupleType`s, which now use an `InstBlock`.
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
#include <variant>
|
||||
|
||||
#include "toolchain/check/action.h"
|
||||
#include "toolchain/check/diagnostic_helpers.h"
|
||||
#include "toolchain/check/facet_type.h"
|
||||
#include "toolchain/check/generic.h"
|
||||
#include "toolchain/check/impl_lookup.h"
|
||||
@@ -312,24 +313,26 @@ auto EvalConstantInst(Context& context, SemIR::InstId inst_id,
|
||||
GetSingletonType(context, SemIR::WitnessType::SingletonInstId);
|
||||
|
||||
// If the type is a concrete constant, require it to be complete now.
|
||||
auto complete_type_id = inst.complete_type_id;
|
||||
if (context.types().GetConstantId(complete_type_id).is_concrete()) {
|
||||
auto complete_type_id =
|
||||
context.types().GetTypeIdForTypeInstId(inst.complete_type_inst_id);
|
||||
if (complete_type_id.is_concrete()) {
|
||||
if (!TryToCompleteType(context, complete_type_id, inst_id, [&] {
|
||||
CARBON_DIAGNOSTIC(IncompleteTypeInMonomorphization, Error,
|
||||
"{0} evaluates to incomplete type {1}",
|
||||
SemIR::TypeId, SemIR::TypeId);
|
||||
InstIdAsType, InstIdAsType);
|
||||
return context.emitter().Build(
|
||||
inst_id, IncompleteTypeInMonomorphization,
|
||||
context.insts()
|
||||
.GetAs<SemIR::RequireCompleteType>(inst_id)
|
||||
.complete_type_id,
|
||||
complete_type_id);
|
||||
.complete_type_inst_id,
|
||||
inst.complete_type_inst_id);
|
||||
})) {
|
||||
return ConstantEvalResult::Error;
|
||||
}
|
||||
return ConstantEvalResult::NewSamePhase(SemIR::CompleteTypeWitness{
|
||||
.type_id = witness_type_id,
|
||||
.object_repr_id = context.types().GetObjectRepr(complete_type_id)});
|
||||
.object_repr_type_inst_id = context.types().GetInstId(
|
||||
context.types().GetObjectRepr(complete_type_id))});
|
||||
}
|
||||
|
||||
// If it's not a concrete constant, require it to be complete once it
|
||||
|
||||
Reference in New Issue
Block a user