mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 22:02:23 +01:00
Add a Vtable typed inst with a type_id (of the type this vtable applies to) and list of virtual function decls (or import refs to function object constants). This doesn't add lowering/emission of the vtable, or usage when initializing objects of the type. Some questions in case they're interesting to discuss: * is it right/worth having the type_id in the vtable? (probably makes it easier to emit - using the type to get the class name to figure out the mangled name for the vtable) perhaps it should be a ClassId? * I'm thinking the logic in CheckCompleteClassType could be the place we handle diagnostics for mismatched keywords (virtual/abstract for a function that's already virtual/abstract, maybe checking for non-virtual functions with the same name in a base class, or derived class functions without `impl`, etc) - but we could move some of that to the moment we walk the function decl, and record our findings in the function decl (record the base function it overrides, or the index of the vtable to slot to use when building the vtable at the end of the class) * the Vtable typed inst has `constant_kind = InstConstantKind::Always` and `is_lowered = false`, I think I added that in to workaround/address some failures in lowering. And seems correct for this intermediate step - I'll add lowering in a follow-up patch. But the constant_kind - what should this be? We can just say all vtables are of VtableType (in which case the `Always` constant kind sounds right to me) or we could have them introduce a type with each virtual function as a named member, even? --------- Co-authored-by: Richard Smith <richard@metafoo.co.uk> Co-authored-by: Jon Ross-Perkins <jperkins@google.com>