aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Serialization/ASTReader.cpp20
-rw-r--r--test/Modules/Inputs/module.map4
-rw-r--r--test/Modules/Inputs/weird_objc.h1
-rw-r--r--test/Modules/objc_redef.m13
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
+