summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Serialization/ASTReaderDecl.cpp30
-rw-r--r--clang/test/Modules/Inputs/PR25501/Vector.h5
-rw-r--r--clang/test/Modules/Inputs/PR25501/a0.h1
-rw-r--r--clang/test/Modules/Inputs/PR25501/a1.h1
-rw-r--r--clang/test/Modules/Inputs/PR25501/a2.h3
-rw-r--r--clang/test/Modules/Inputs/PR25501/b.h2
-rw-r--r--clang/test/Modules/Inputs/PR25501/module.modulemap4
-rw-r--r--clang/test/Modules/pr25501.cpp9
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
OpenPOWER on IntegriCloud