don't think we're providing a new one in an update record adding a definition
to another declaration of the same class.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@228104
91177308-0d34-0410-b5e6-
96231b3b80d8
auto *RD = cast<CXXRecordDecl>(D);
auto *OldDD = RD->DefinitionData.getNotUpdated();
bool HadRealDefinition =
- OldDD && !Reader.PendingFakeDefinitionData.count(OldDD);
+ OldDD && (OldDD->Definition != RD ||
+ !Reader.PendingFakeDefinitionData.count(OldDD));
ReadCXXRecordDefinition(RD, /*Update*/true);
// Visible update is handled separately.
--- /dev/null
+namespace N {
+ template <typename> struct A {
+ int n;
+ A() : n() {}
+ };
+
+ // Create declaration of A<int>.
+ typedef A<int> AI;
+}
+++ /dev/null
-#include "a.h"
-
-// Add update record for definition of A<int> and constructors.
-// We need an eagerly-emitted function here to get the problematic
-// deserialization ordering.
-void foobar() { N::A<int> x; }
--- /dev/null
+#include "a1.h"
+
+// Add update record for definition of A<int> and constructors.
+// We need an eagerly-emitted use here to get the problematic
+// deserialization ordering.
+N::A<int> b1;
--- /dev/null
+#include "a2.h"
+
+// Add update record for definition of A<int> and constructors.
+// We need an eagerly-emitted use here to get the problematic
+// deserialization ordering.
+N::A<int> b2;
}
// Merge in another declaration and update records.
-#include "b.h"
+#include "b1.h"
module def { header "def.h" export * }
module update { header "update.h" export * }
-module a { header "a.h" export * }
-module b { header "b.h" export * }
+module a1 { header "a1.h" export * }
+module a2 { header "a2.h" export * }
+module b1 { header "b1.h" export * }
+module b2 { header "b2.h" export * }
+module merge { header "merge.h" export * }
module c { header "c.h" export * }
// RUN: rm -rf %t
-// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -I%S/Inputs/merge-template-members -verify -emit-llvm-only %s
+// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -I%S/Inputs/merge-template-members -verify -emit-llvm-only %s -DTEST=1
+// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -I%S/Inputs/merge-template-members -verify -emit-llvm-only %s -DTEST=2
+// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -I%S/Inputs/merge-template-members -verify -emit-llvm-only %s -DTEST=3
// expected-no-diagnostics
-#include "c.h"
-N::A<int> ai;
+#if TEST == 1
template<typename> struct A { int n; };
template<typename> struct B { typedef A<void> C; };
#include "update.h"
B<int>::C use2;
+
+#elif TEST == 2
+
+#include "c.h"
+N::A<int> ai;
+
+#elif TEST == 3
+
+#include "merge.h"
+
+#else
+#error Unknown test
+#endif