From f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Fri, 1 Feb 2013 23:45:03 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@174234 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Serialization/ASTReader.cpp | 20 ++++++++++++++++++-- test/Modules/Inputs/module.map | 4 ++++ test/Modules/Inputs/weird_objc.h | 1 + test/Modules/objc_redef.m | 13 +++++++++++++ 4 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 test/Modules/Inputs/weird_objc.h create mode 100644 test/Modules/objc_redef.m 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 + -- 2.40.0