Commit to a primary definition for a class when we load its first
authorRichard Smith <richard@metafoo.co.uk>
Tue, 25 Jul 2023 00:34:08 +0000 (17:34 -0700)
committerTobias Hieta <tobias@hieta.se>
Mon, 7 Aug 2023 07:04:02 +0000 (09:04 +0200)
commit44ce1f829921b63712ed43ad743680a75befcf6d
tree73039d8ddddb39e435c9614fa351fb7107d86f90
parente4ea24d2ab6e032263bf4c95022e5610b0c89c9f
Commit to a primary definition for a class when we load its first
member.

Previously, we wouldn't do this if the first member loaded is within a
definition that's added to a class via an update record, which happens
when template instantiation adds a class definition to a declaration
that was imported from an AST file.

This would lead to classes having member functions whose getParent
returned a class declaration that wasn't the primary definition, which
in turn caused the vtable builder to build broken vtables.

I don't yet have a reduced testcase for the wrong-code bug here, because
the setup required to get us into the broken state is very subtle, but
have confirmed that this fixes it.

(cherry picked from commit 61c7a9140becb19c5b1bc644e54452c6f782f5d5)
clang/docs/ReleaseNotes.rst
clang/lib/Serialization/ASTReaderDecl.cpp