[clang] 63814be - [modules] Merge variable template specializations.
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Tue Apr 19 14:48:52 PDT 2022
Author: Richard Smith
Date: 2022-04-19T14:48:42-07:00
New Revision: 63814be4fa23ef9b36cf2d14388c7f6ba591d3b6
URL: https://github.com/llvm/llvm-project/commit/63814be4fa23ef9b36cf2d14388c7f6ba591d3b6
DIFF: https://github.com/llvm/llvm-project/commit/63814be4fa23ef9b36cf2d14388c7f6ba591d3b6.diff
LOG: [modules] Merge variable template specializations.
Added:
Modified:
clang/lib/Serialization/ASTReaderDecl.cpp
clang/test/Modules/Inputs/merge-template-specializations/a.h
clang/test/Modules/Inputs/merge-template-specializations/b.h
clang/test/Modules/Inputs/merge-template-specializations/c.h
clang/test/Modules/merge-template-specializations.cpp
Removed:
################################################################################
diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp
index 43aacdeda9987..9e0c3d558323f 100644
--- a/clang/lib/Serialization/ASTReaderDecl.cpp
+++ b/clang/lib/Serialization/ASTReaderDecl.cpp
@@ -2382,13 +2382,17 @@ ASTDeclReader::VisitVarTemplateSpecializationDeclImpl(
if (writtenAsCanonicalDecl) {
auto *CanonPattern = readDeclAs<VarTemplateDecl>();
if (D->isCanonicalDecl()) { // It's kept in the folding set.
- // FIXME: If it's already present, merge it.
+ VarTemplateSpecializationDecl *CanonSpec;
if (auto *Partial = dyn_cast<VarTemplatePartialSpecializationDecl>(D)) {
- CanonPattern->getCommonPtr()->PartialSpecializations
- .GetOrInsertNode(Partial);
+ CanonSpec = CanonPattern->getCommonPtr()
+ ->PartialSpecializations.GetOrInsertNode(Partial);
} else {
- CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
+ CanonSpec =
+ CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
}
+ // If we already have a matching specialization, merge it.
+ if (CanonSpec != D)
+ mergeRedeclarable<VarDecl>(D, CanonSpec, Redecl);
}
}
diff --git a/clang/test/Modules/Inputs/merge-template-specializations/a.h b/clang/test/Modules/Inputs/merge-template-specializations/a.h
index fb05647c0aa93..00426af2b1d59 100644
--- a/clang/test/Modules/Inputs/merge-template-specializations/a.h
+++ b/clang/test/Modules/Inputs/merge-template-specializations/a.h
@@ -1 +1,3 @@
template<unsigned> class SmallString {};
+
+template<int> int var_template = 0;
diff --git a/clang/test/Modules/Inputs/merge-template-specializations/b.h b/clang/test/Modules/Inputs/merge-template-specializations/b.h
index 96ce2bb1d8d6a..89d0e36d6c964 100644
--- a/clang/test/Modules/Inputs/merge-template-specializations/b.h
+++ b/clang/test/Modules/Inputs/merge-template-specializations/b.h
@@ -1,2 +1,4 @@
#include "a.h"
void f(SmallString<256>&);
+
+template<typename T> void use_var_template(decltype(T() + var_template<0>)) {}
diff --git a/clang/test/Modules/Inputs/merge-template-specializations/c.h b/clang/test/Modules/Inputs/merge-template-specializations/c.h
index 100463a2f7f28..44fe4925d7c2d 100644
--- a/clang/test/Modules/Inputs/merge-template-specializations/c.h
+++ b/clang/test/Modules/Inputs/merge-template-specializations/c.h
@@ -1,3 +1,6 @@
#include "a.h"
struct X { SmallString<256> ss; };
+
+template<typename T> void use_var_template(decltype(T() + var_template<0>));
+
#include "b.h"
diff --git a/clang/test/Modules/merge-template-specializations.cpp b/clang/test/Modules/merge-template-specializations.cpp
index 25db93fbbb206..1f8e68a2e925a 100644
--- a/clang/test/Modules/merge-template-specializations.cpp
+++ b/clang/test/Modules/merge-template-specializations.cpp
@@ -3,3 +3,7 @@
// expected-no-diagnostics
#include "c.h"
X x;
+
+void test_var_template() {
+ use_var_template<int>(0);
+}
More information about the cfe-commits
mailing list