Files
carbon-lang/toolchain/sem_ir/class.cpp
T
Richard Smith 2044366652 Support initialization of specific classes from struct literals (#4320)
Add support for initializing types like `GenericClass(i32)` from a
struct literal. A new kind of instruction, `complete_type_witness`, is
added to the class definition to track the object representation type so
that it's visible to the generics machinery. Accesses to the object
representation of a class have all been updated to pass in the class's
`SpecificId` so that the types of the fields of the specific class are
used instead of the types of the fields of the generic class in places
that look at the object representation -- primarily class
initialization.
2024-09-19 19:18:32 +00:00

29 lines
861 B
C++

// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#include "toolchain/sem_ir/class.h"
#include "toolchain/sem_ir/file.h"
#include "toolchain/sem_ir/generic.h"
#include "toolchain/sem_ir/ids.h"
namespace Carbon::SemIR {
auto Class::GetObjectRepr(const File& file, SpecificId specific_id) const
-> TypeId {
if (!complete_type_witness_id.is_valid()) {
return TypeId::Invalid;
}
auto witness_id =
GetConstantValueInSpecific(file, specific_id, complete_type_witness_id);
if (witness_id == ConstantId::Error) {
return TypeId::Error;
}
return file.insts()
.GetAs<CompleteTypeWitness>(file.constant_values().GetInstId(witness_id))
.object_repr_id;
}
} // namespace Carbon::SemIR