Missing Key Function
====================

If your build failed with a linker error something like this::

  foo.cc:28: error: undefined reference to 'vtable for C'
  the vtable symbol may be undefined because the class is missing its key function (see https://lld.llvm.org/missingkeyfunction)

it's likely that your class C has a key function (defined by the ABI as the first
non-pure, non-inline, virtual method), but you haven't actually defined it.

When a class has a key function, the compiler emits the vtable (and some other
things as well) only in the translation unit that defines that key function. Thus,
if you're missing the key function, you'll also be missing the vtable. If no other
function calls your missing method, you won't see any undefined reference errors
for it, but you will see undefined references to the vtable symbol.

When a class has no non-pure, non-inline, virtual methods, there is no key
method, and the compiler is forced to emit the vtable in every translation unit
that references the class. In this case, it is emitted in a COMDAT section,
which allows the linker to eliminate all duplicate copies. This is still
wasteful in terms of object file size and link time, so it's always advisable to
ensure there is at least one eligible method that can serve as the key function.

Here are the most common mistakes that lead to this error:

Failing to define a virtual destructor
--------------------------------------

Say you have a base class declared in a header file::

  class B {
  public:
    B();
    virtual ~B();
    ...
  };

Here, ``~B`` is the first non-pure, non-inline, virtual method, so it is the key
method. If you forget to define ``B::~B`` in your source file, the compiler will
not emit the vtable for ``B``, and you'll get an undefined reference to "vtable
for B".

This is just an example of the more general mistake of forgetting to define the
key function, but it's quite common because virtual destructors are likely to be
the first eligible key function and it's easy to forget to implement them. It's
also more likely that you won't have any direct references to the destructor, so
you won't see any undefined reference errors that point directly to the problem.

The solution in this case is to implement the missing method.

Forgetting to declare a virtual method in an abstract class as pure
-------------------------------------------------------------------

Say you have an abstract base class declared in a header file::

  class A {
  public:
    A();
    virtual ~A() {}
    virtual int foo() = 0;
    ...
    virtual int bar();
    ...
  };

This base class is intended to be abstract, but you forgot to mark one of the
methods pure. Here, ``A::bar``, being non-pure, is nominated as the key function,
and as a result, the vtable for ``A`` is not emitted, because the compiler is
waiting for a translation unit that defines ``A::bar``.

The solution in this case is to add the missing ``= 0`` to the declaration of
``A::bar``.

Key method is defined, but the linker doesn't see it
----------------------------------------------------

It's also possible that you have defined the key function somewhere, but the
object file containing the definition of that method isn't being linked into
your application.

The solution in this case is to check your dependencies to make sure that
the object file or the library file containing the key function is given to
the linker.
