mirror of https://github.com/microsoft/clang.git
PR25501: Delay loading visible updates for a declaration until after we've
processed update records. If an update record adds a definition, we need to merge that with any pre-existing definition to determine which the canonical definition is before we apply the visible update, otherwise we wouldn't know where to apply it. Thanks to Vassil Vassilev for help reducing this and tracking down the problem. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@265848 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a9e0771f90
commit
7bcddb410f
|
@ -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));
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
template <typename> struct _Vector_base {};
|
||||
struct vector {
|
||||
vector() {}
|
||||
vector(_Vector_base<int>);
|
||||
};
|
|
@ -0,0 +1 @@
|
|||
#include "Vector.h"
|
|
@ -0,0 +1 @@
|
|||
#include "Vector.h"
|
|
@ -0,0 +1,3 @@
|
|||
#include "a0.h"
|
||||
vector aaa = vector();
|
||||
#include "a1.h"
|
|
@ -0,0 +1,2 @@
|
|||
#include "Vector.h"
|
||||
vector aaa = vector();
|
|
@ -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 * }
|
|
@ -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
|
Loading…
Reference in New Issue