r230834 - [modules] Deduplicate when merging lists of template specializations from imported modules.
Richard Smith
richard-llvm at metafoo.co.uk
Fri Feb 27 17:45:19 PST 2015
Author: rsmith
Date: Fri Feb 27 19:45:19 2015
New Revision: 230834
URL: http://llvm.org/viewvc/llvm-project?rev=230834&view=rev
Log:
[modules] Deduplicate when merging lists of template specializations from imported modules.
Modified:
cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
cfe/trunk/test/Modules/exponential-paths.cpp
Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=230834&r1=230833&r2=230834&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Fri Feb 27 19:45:19 2015
@@ -1729,15 +1729,15 @@ ASTDeclReader::VisitRedeclarableTemplate
static DeclID *newDeclIDList(ASTContext &Context, DeclID *Old,
SmallVectorImpl<DeclID> &IDs) {
assert(!IDs.empty() && "no IDs to add to list");
+ if (Old) {
+ IDs.insert(IDs.end(), Old + 1, Old + 1 + Old[0]);
+ std::sort(IDs.begin(), IDs.end());
+ IDs.erase(std::unique(IDs.begin(), IDs.end()), IDs.end());
+ }
- size_t OldCount = Old ? *Old : 0;
- size_t NewCount = OldCount + IDs.size();
- auto *Result = new (Context) DeclID[1 + NewCount];
- auto *Pos = Result;
- *Pos++ = NewCount;
- if (OldCount)
- Pos = std::copy(Old + 1, Old + 1 + OldCount, Pos);
- std::copy(IDs.begin(), IDs.end(), Pos);
+ auto *Result = new (Context) DeclID[1 + IDs.size()];
+ *Result = IDs.size();
+ std::copy(IDs.begin(), IDs.end(), Result + 1);
return Result;
}
Modified: cfe/trunk/test/Modules/exponential-paths.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/exponential-paths.cpp?rev=230834&r1=230833&r2=230834&view=diff
==============================================================================
--- cfe/trunk/test/Modules/exponential-paths.cpp (original)
+++ cfe/trunk/test/Modules/exponential-paths.cpp Fri Feb 27 19:45:19 2015
@@ -51,66 +51,87 @@
//
// Build the corresponding headers.
//
+// RUN: echo 'template<int> struct X {}; extern X<0> x0;' > %t/x.h
// RUN: echo 'extern int n;' > %t/a0.h
// RUN: cp %t/a0.h %t/b0.h
-// RUN: echo '#include "a0.h"' > %t/a1.h
+// RUN: echo '#include "x.h"' > %t/a1.h
+// RUN: echo '#include "a0.h"' >> %t/a1.h
// RUN: echo '#include "b0.h"' >> %t/a1.h
// RUN: cp %t/a1.h %t/b1.h
-// RUN: echo '#include "a1.h"' > %t/a2.h
+// RUN: echo '#include "x.h"' > %t/a2.h
+// RUN: echo '#include "a1.h"' >> %t/a2.h
// RUN: echo '#include "b1.h"' >> %t/a2.h
// RUN: cp %t/a2.h %t/b2.h
-// RUN: echo '#include "a2.h"' > %t/a3.h
+// RUN: echo '#include "x.h"' > %t/a3.h
+// RUN: echo '#include "a2.h"' >> %t/a3.h
// RUN: echo '#include "b2.h"' >> %t/a3.h
// RUN: cp %t/a3.h %t/b3.h
-// RUN: echo '#include "a3.h"' > %t/a4.h
+// RUN: echo '#include "x.h"' > %t/a4.h
+// RUN: echo '#include "a3.h"' >> %t/a4.h
// RUN: echo '#include "b3.h"' >> %t/a4.h
// RUN: cp %t/a4.h %t/b4.h
-// RUN: echo '#include "a4.h"' > %t/a5.h
+// RUN: echo '#include "x.h"' > %t/a5.h
+// RUN: echo '#include "a4.h"' >> %t/a5.h
// RUN: echo '#include "b4.h"' >> %t/a5.h
// RUN: cp %t/a5.h %t/b5.h
-// RUN: echo '#include "a5.h"' > %t/a6.h
+// RUN: echo '#include "x.h"' > %t/a6.h
+// RUN: echo '#include "a5.h"' >> %t/a6.h
// RUN: echo '#include "b5.h"' >> %t/a6.h
// RUN: cp %t/a6.h %t/b6.h
-// RUN: echo '#include "a6.h"' > %t/a7.h
+// RUN: echo '#include "x.h"' > %t/a7.h
+// RUN: echo '#include "a6.h"' >> %t/a7.h
// RUN: echo '#include "b6.h"' >> %t/a7.h
// RUN: cp %t/a7.h %t/b7.h
-// RUN: echo '#include "a7.h"' > %t/a8.h
+// RUN: echo '#include "x.h"' > %t/a8.h
+// RUN: echo '#include "a7.h"' >> %t/a8.h
// RUN: echo '#include "b7.h"' >> %t/a8.h
// RUN: cp %t/a8.h %t/b8.h
-// RUN: echo '#include "a8.h"' > %t/a9.h
+// RUN: echo '#include "x.h"' > %t/a9.h
+// RUN: echo '#include "a8.h"' >> %t/a9.h
// RUN: echo '#include "b8.h"' >> %t/a9.h
// RUN: cp %t/a9.h %t/b9.h
-// RUN: echo '#include "a9.h"' > %t/a10.h
+// RUN: echo '#include "x.h"' > %t/a10.h
+// RUN: echo '#include "a9.h"' >> %t/a10.h
// RUN: echo '#include "b9.h"' >> %t/a10.h
// RUN: cp %t/a10.h %t/b10.h
-// RUN: echo '#include "a10.h"' > %t/a11.h
+// RUN: echo '#include "x.h"' > %t/a11.h
+// RUN: echo '#include "a10.h"' >> %t/a11.h
// RUN: echo '#include "b10.h"' >> %t/a11.h
// RUN: cp %t/a11.h %t/b11.h
-// RUN: echo '#include "a11.h"' > %t/a12.h
+// RUN: echo '#include "x.h"' > %t/a12.h
+// RUN: echo '#include "a11.h"' >> %t/a12.h
// RUN: echo '#include "b11.h"' >> %t/a12.h
// RUN: cp %t/a12.h %t/b12.h
-// RUN: echo '#include "a12.h"' > %t/a13.h
+// RUN: echo '#include "x.h"' > %t/a13.h
+// RUN: echo '#include "a12.h"' >> %t/a13.h
// RUN: echo '#include "b12.h"' >> %t/a13.h
// RUN: cp %t/a13.h %t/b13.h
-// RUN: echo '#include "a13.h"' > %t/a14.h
+// RUN: echo '#include "x.h"' > %t/a14.h
+// RUN: echo '#include "a13.h"' >> %t/a14.h
// RUN: echo '#include "b13.h"' >> %t/a14.h
// RUN: cp %t/a14.h %t/b14.h
-// RUN: echo '#include "a14.h"' > %t/a15.h
+// RUN: echo '#include "x.h"' > %t/a15.h
+// RUN: echo '#include "a14.h"' >> %t/a15.h
// RUN: echo '#include "b14.h"' >> %t/a15.h
// RUN: cp %t/a15.h %t/b15.h
-// RUN: echo '#include "a15.h"' > %t/a16.h
+// RUN: echo '#include "x.h"' > %t/a16.h
+// RUN: echo '#include "a15.h"' >> %t/a16.h
// RUN: echo '#include "b15.h"' >> %t/a16.h
// RUN: cp %t/a16.h %t/b16.h
-// RUN: echo '#include "a16.h"' > %t/a17.h
+// RUN: echo '#include "x.h"' > %t/a17.h
+// RUN: echo '#include "a16.h"' >> %t/a17.h
// RUN: echo '#include "b16.h"' >> %t/a17.h
// RUN: cp %t/a17.h %t/b17.h
-// RUN: echo '#include "a17.h"' > %t/a18.h
+// RUN: echo '#include "x.h"' > %t/a18.h
+// RUN: echo '#include "a17.h"' >> %t/a18.h
// RUN: echo '#include "b17.h"' >> %t/a18.h
// RUN: cp %t/a18.h %t/b18.h
-// RUN: echo '#include "a18.h"' > %t/a19.h
+// RUN: echo '#include "x.h"' > %t/a19.h
+// RUN: echo '#include "a18.h"' >> %t/a19.h
// RUN: echo '#include "b18.h"' >> %t/a19.h
// RUN: cp %t/a19.h %t/b19.h
-// RUN: echo '#include "a19.h"' > %t/a20.h
+// RUN: echo '#include "x.h"' > %t/a20.h
+// RUN: echo '#include "a19.h"' >> %t/a20.h
// RUN: echo '#include "b19.h"' >> %t/a20.h
// RUN: cp %t/a20.h %t/b20.h
//
More information about the cfe-commits
mailing list