diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Serialization/ASTReaderDecl.cpp | 30 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/PR25501/Vector.h | 5 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/PR25501/a0.h | 1 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/PR25501/a1.h | 1 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/PR25501/a2.h | 3 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/PR25501/b.h | 2 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/PR25501/module.modulemap | 4 | ||||
-rw-r--r-- | clang/test/Modules/pr25501.cpp | 9 |
8 files changed, 40 insertions, 15 deletions
diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index 47ac4076757..efb7793ef61 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -3436,20 +3436,6 @@ Decl *ASTReader::ReadDeclRecord(DeclID ID) { } void ASTReader::loadDeclUpdateRecords(serialization::DeclID ID, Decl *D) { - // Load the pending visible updates for this decl context, if it has any. - auto I = PendingVisibleUpdates.find(ID); - if (I != PendingVisibleUpdates.end()) { - auto VisibleUpdates = std::move(I->second); - PendingVisibleUpdates.erase(I); - - auto *DC = cast<DeclContext>(D)->getPrimaryContext(); - for (const PendingVisibleUpdate &Update : VisibleUpdates) - Lookups[DC].Table.add( - Update.Mod, Update.Data, - reader::ASTDeclContextNameLookupTrait(*this, *Update.Mod)); - DC->setHasExternalVisibleStorage(true); - } - // The declaration may have been modified by files later in the chain. // If this is the case, read the record containing the updates from each file // and pass it to ASTDeclReader to make the modifications. @@ -3485,6 +3471,20 @@ void ASTReader::loadDeclUpdateRecords(serialization::DeclID ID, Decl *D) { } } } + + // Load the pending visible updates for this decl context, if it has any. + auto I = PendingVisibleUpdates.find(ID); + if (I != PendingVisibleUpdates.end()) { + auto VisibleUpdates = std::move(I->second); + PendingVisibleUpdates.erase(I); + + auto *DC = cast<DeclContext>(D)->getPrimaryContext(); + for (const PendingVisibleUpdate &Update : VisibleUpdates) + Lookups[DC].Table.add( + Update.Mod, Update.Data, + reader::ASTDeclContextNameLookupTrait(*this, *Update.Mod)); + DC->setHasExternalVisibleStorage(true); + } } void ASTReader::loadPendingDeclChain(Decl *FirstLocal, uint64_t LocalOffset) { @@ -3757,7 +3757,7 @@ void ASTDeclReader::UpdateDecl(Decl *D, ModuleFile &ModuleFile, case UPD_CXX_INSTANTIATED_CLASS_DEFINITION: { auto *RD = cast<CXXRecordDecl>(D); - auto *OldDD = RD->DefinitionData.getNotUpdated(); + auto *OldDD = RD->getCanonicalDecl()->DefinitionData.getNotUpdated(); bool HadRealDefinition = OldDD && (OldDD->Definition != RD || !Reader.PendingFakeDefinitionData.count(OldDD)); diff --git a/clang/test/Modules/Inputs/PR25501/Vector.h b/clang/test/Modules/Inputs/PR25501/Vector.h new file mode 100644 index 00000000000..9da48303a3a --- /dev/null +++ b/clang/test/Modules/Inputs/PR25501/Vector.h @@ -0,0 +1,5 @@ +template <typename> struct _Vector_base {}; +struct vector { + vector() {} + vector(_Vector_base<int>); +}; diff --git a/clang/test/Modules/Inputs/PR25501/a0.h b/clang/test/Modules/Inputs/PR25501/a0.h new file mode 100644 index 00000000000..1a0d306ca7c --- /dev/null +++ b/clang/test/Modules/Inputs/PR25501/a0.h @@ -0,0 +1 @@ +#include "Vector.h" diff --git a/clang/test/Modules/Inputs/PR25501/a1.h b/clang/test/Modules/Inputs/PR25501/a1.h new file mode 100644 index 00000000000..1a0d306ca7c --- /dev/null +++ b/clang/test/Modules/Inputs/PR25501/a1.h @@ -0,0 +1 @@ +#include "Vector.h" diff --git a/clang/test/Modules/Inputs/PR25501/a2.h b/clang/test/Modules/Inputs/PR25501/a2.h new file mode 100644 index 00000000000..7876f310e85 --- /dev/null +++ b/clang/test/Modules/Inputs/PR25501/a2.h @@ -0,0 +1,3 @@ +#include "a0.h" +vector aaa = vector(); +#include "a1.h" diff --git a/clang/test/Modules/Inputs/PR25501/b.h b/clang/test/Modules/Inputs/PR25501/b.h new file mode 100644 index 00000000000..7b519836953 --- /dev/null +++ b/clang/test/Modules/Inputs/PR25501/b.h @@ -0,0 +1,2 @@ +#include "Vector.h" +vector aaa = vector(); diff --git a/clang/test/Modules/Inputs/PR25501/module.modulemap b/clang/test/Modules/Inputs/PR25501/module.modulemap new file mode 100644 index 00000000000..c6c8d5ca40f --- /dev/null +++ b/clang/test/Modules/Inputs/PR25501/module.modulemap @@ -0,0 +1,4 @@ +module "a0" { header "a0.h" export * } +module "a1" { header "a1.h" export * } +module "a2" { header "a2.h" export * } +module "b" { header "b.h" export * } diff --git a/clang/test/Modules/pr25501.cpp b/clang/test/Modules/pr25501.cpp new file mode 100644 index 00000000000..18002d6dff3 --- /dev/null +++ b/clang/test/Modules/pr25501.cpp @@ -0,0 +1,9 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -std=c++11 -fmodules -fmodule-map-file=%S/Inputs/PR25501/module.modulemap -fmodules-cache-path=%t -I%S/Inputs/PR25501 -verify %s + +#include "a2.h" +#include "b.h" + +auto use = aaa; + +// expected-no-diagnostics |