diff options
-rw-r--r-- | lib/Serialization/ASTReader.cpp | 20 | ||||
-rw-r--r-- | test/Modules/Inputs/module.map | 4 | ||||
-rw-r--r-- | test/Modules/Inputs/weird_objc.h | 1 | ||||
-rw-r--r-- | test/Modules/objc_redef.m | 13 |
4 files changed, 36 insertions, 2 deletions
diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 604b23143e..92dcc7d703 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/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: diff --git a/test/Modules/Inputs/module.map b/test/Modules/Inputs/module.map index 5ec595c9e1..55496fa35a 100644 --- a/test/Modules/Inputs/module.map +++ b/test/Modules/Inputs/module.map @@ -155,3 +155,7 @@ module autolink { link framework "autolink_framework" } } + +module weird_objc { + header "weird_objc.h" +} diff --git a/test/Modules/Inputs/weird_objc.h b/test/Modules/Inputs/weird_objc.h new file mode 100644 index 0000000000..8acaf746e8 --- /dev/null +++ b/test/Modules/Inputs/weird_objc.h @@ -0,0 +1 @@ +typedef struct objc_object { void *super; int wibble; } *id; diff --git a/test/Modules/objc_redef.m b/test/Modules/objc_redef.m new file mode 100644 index 0000000000..13a5b1d9cc --- /dev/null +++ b/test/Modules/objc_redef.m @@ -0,0 +1,13 @@ +@import redeclarations_left; +@import weird_objc; + +int test(id x) { + return x->wibble; +} + +// RUN: rm -rf %t +// RUN: %clang_cc1 -fmodules -x objective-c -fmodule-cache-path %t -emit-module -fmodule-name=redeclarations_left %S/Inputs/module.map +// RUN: %clang_cc1 -fmodules -x objective-c -fmodule-cache-path %t -emit-module -fmodule-name=weird_objc %S/Inputs/module.map +// RUN: %clang_cc1 -fmodules -fmodule-cache-path %t %s -verify +// expected-no-diagnostics + |