]> granicus.if.org Git - clang/commit
Fix a marvelous chained AST writing bug, where we end up with the
authorDouglas Gregor <dgregor@apple.com>
Tue, 5 Oct 2010 18:37:06 +0000 (18:37 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 5 Oct 2010 18:37:06 +0000 (18:37 +0000)
commit97475834207bf5abb5b58534f783c9b71d4b9df1
tree2acc4654dec4e3dbbd77ab0950a82661dbd391f0
parent92c8568856bf24360f0a90a2161b9962263d4994
Fix a marvelous chained AST writing bug, where we end up with the
following amusing sequence:
  - AST writing schedules writing a type X* that it had never seen
  before
  - AST writing starts writing another declaration, ends up
  deserializing X* from a prior AST file. Now we have two type IDs for
  the same type!
  - AST writer tries to write X*. It only has the lower-numbered ID
  from the the prior AST file, so references to the higher-numbered ID
  that was scheduled for writing go off into lalaland.

To fix this, keep the higher-numbered ID so we end up writing the type
twice. Since this issue occurs so rarely, and type records are
generally rather small, I deemed this better than the alternative: to
keep a separate mapping from the higher-numbered IDs to the
lower-numbered IDs, which we would end up having to check whenever we
want to deserialize any type.

Fixes <rdar://problem/8511624>, I think.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@115647 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Serialization/ASTReader.cpp
lib/Serialization/ASTWriter.cpp
test/PCH/Inputs/chain-remap-types1.h [new file with mode: 0644]
test/PCH/Inputs/chain-remap-types2.h [new file with mode: 0644]
test/PCH/chain-remap-types.m [new file with mode: 0644]
tools/libclang/CIndexUSRs.cpp