mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 21:40:12 +01:00
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.
29 lines
861 B
C++
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
|