diff options
author | Douglas Gregor <dgregor@apple.com> | 2013-02-01 23:45:03 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2013-02-01 23:45:03 +0000 |
commit | 44180f8f6d5d55ba69764bb8eb9d89aee0c4d5eb (patch) | |
tree | fb03a95d745f922b0b81f5fcedfae548ff71a185 /clang/lib/Serialization/ASTReader.cpp | |
parent | 6bade327dccc44ca8ab82ef5381441a390d97a9a (diff) | |
download | bcm5719-llvm-44180f8f6d5d55ba69764bb8eb9d89aee0c4d5eb.tar.gz bcm5719-llvm-44180f8f6d5d55ba69764bb8eb9d89aee0c4d5eb.zip |
Merge "special" types from different modules in the AST reader.
Different modules may have different views of the various "special"
types in the AST, such as the redefinition type for "id". Merge those
types rather than only considering the redefinition types for the
first AST file loaded.
llvm-svn: 174234
Diffstat (limited to 'clang/lib/Serialization/ASTReader.cpp')
-rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 604b23143e9..92dcc7d7032 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -2053,8 +2053,24 @@ bool ASTReader::ReadASTBlock(ModuleFile &F) { break; case SPECIAL_TYPES: - for (unsigned I = 0, N = Record.size(); I != N; ++I) - SpecialTypes.push_back(getGlobalTypeID(F, Record[I])); + if (SpecialTypes.empty()) { + for (unsigned I = 0, N = Record.size(); I != N; ++I) + SpecialTypes.push_back(getGlobalTypeID(F, Record[I])); + break; + } + + if (SpecialTypes.size() != Record.size()) { + Error("invalid special-types record"); + return true; + } + + for (unsigned I = 0, N = Record.size(); I != N; ++I) { + serialization::TypeID ID = getGlobalTypeID(F, Record[I]); + if (!SpecialTypes[I]) + SpecialTypes[I] = ID; + // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate + // merge step? + } break; case STATISTICS: |