Skip to content

Commit 63814be

Browse files
committed
[modules] Merge variable template specializations.
1 parent 954ba60 commit 63814be

File tree

5 files changed

+19
-4
lines changed

5 files changed

+19
-4
lines changed

clang/lib/Serialization/ASTReaderDecl.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2382,13 +2382,17 @@ ASTDeclReader::VisitVarTemplateSpecializationDeclImpl(
23822382
if (writtenAsCanonicalDecl) {
23832383
auto *CanonPattern = readDeclAs<VarTemplateDecl>();
23842384
if (D->isCanonicalDecl()) { // It's kept in the folding set.
2385-
// FIXME: If it's already present, merge it.
2385+
VarTemplateSpecializationDecl *CanonSpec;
23862386
if (auto *Partial = dyn_cast<VarTemplatePartialSpecializationDecl>(D)) {
2387-
CanonPattern->getCommonPtr()->PartialSpecializations
2388-
.GetOrInsertNode(Partial);
2387+
CanonSpec = CanonPattern->getCommonPtr()
2388+
->PartialSpecializations.GetOrInsertNode(Partial);
23892389
} else {
2390-
CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
2390+
CanonSpec =
2391+
CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
23912392
}
2393+
// If we already have a matching specialization, merge it.
2394+
if (CanonSpec != D)
2395+
mergeRedeclarable<VarDecl>(D, CanonSpec, Redecl);
23922396
}
23932397
}
23942398

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
template<unsigned> class SmallString {};
2+
3+
template<int> int var_template = 0;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
#include "a.h"
22
void f(SmallString<256>&);
3+
4+
template<typename T> void use_var_template(decltype(T() + var_template<0>)) {}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
#include "a.h"
22
struct X { SmallString<256> ss; };
3+
4+
template<typename T> void use_var_template(decltype(T() + var_template<0>));
5+
36
#include "b.h"

clang/test/Modules/merge-template-specializations.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,7 @@
33
// expected-no-diagnostics
44
#include "c.h"
55
X x;
6+
7+
void test_var_template() {
8+
use_var_template<int>(0);
9+
}

0 commit comments

Comments
 (0)