[clang] [clang][ASTImporter] Add import of node 'TemplateParamObjectDecl' (PR #193492)
Balázs Kéri via cfe-commits
cfe-commits at lists.llvm.org
Thu May 7 09:23:37 PDT 2026
https://github.com/balazske updated https://github.com/llvm/llvm-project/pull/193492
>From 97bbe02913f5103a567e9832d1b38c5a0f7ee875 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bal=C3=A1zs=20K=C3=A9ri?= <balazs.keri at ericsson.com>
Date: Wed, 22 Apr 2026 15:03:10 +0200
Subject: [PATCH 1/3] [clang][ASTImporter] Add import of node
'TemplateParamObjectDecl'
---
clang/lib/AST/ASTImporter.cpp | 17 ++++++++++++
clang/unittests/AST/ASTImporterTest.cpp | 35 +++++++++++++++++++++++++
2 files changed, 52 insertions(+)
diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp
index 41ba98c53247d..94a7f742a53d7 100644
--- a/clang/lib/AST/ASTImporter.cpp
+++ b/clang/lib/AST/ASTImporter.cpp
@@ -566,6 +566,7 @@ namespace clang {
ExpectedDecl VisitObjCImplementationDecl(ObjCImplementationDecl *D);
ExpectedDecl VisitObjCPropertyDecl(ObjCPropertyDecl *D);
ExpectedDecl VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
+ ExpectedDecl VisitTemplateParamObjectDecl(TemplateParamObjectDecl *D);
ExpectedDecl VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
ExpectedDecl VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
ExpectedDecl VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
@@ -6137,6 +6138,22 @@ ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
return ToImpl;
}
+ExpectedDecl
+ASTNodeImporter::VisitTemplateParamObjectDecl(TemplateParamObjectDecl *D) {
+ Error Err = Error::success();
+ auto ToType = importChecked(Err, D->getType());
+ auto ToValue = importChecked(Err, D->getValue());
+ if (Err)
+ return std::move(Err);
+
+ TemplateParamObjectDecl *ToD;
+ auto Create = [this](QualType T, const APValue &V) {
+ return Importer.ToContext.getTemplateParamObjectDecl(T, V);
+ };
+ (void)GetImportedOrCreateSpecialDecl(ToD, Create, D, ToType, ToValue);
+ return ToD;
+}
+
ExpectedDecl
ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
// For template arguments, we adopt the translation unit as our declaration
diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp
index d1d6ea94d3154..f59edb26d73fb 100644
--- a/clang/unittests/AST/ASTImporterTest.cpp
+++ b/clang/unittests/AST/ASTImporterTest.cpp
@@ -4099,6 +4099,41 @@ TEST_P(ASTImporterOptionSpecificTestBase,
unless(classTemplatePartialSpecializationDecl()))));
}
+TEST_P(ASTImporterOptionSpecificTestBase, ImportTemplateParamObjectDecl) {
+ const char *Code = R"(
+ struct A { int x, y; };
+ template<A> struct S1 {};
+ template<A, int> struct S2 {};
+ S1<A{1, 2}> s1;
+ S2<A{1, 2}, 3> s2;
+ )";
+ Decl *TU = getTuDecl(Code, Lang_CXX20, "input.cc");
+
+ auto *FromFirstSpec =
+ FirstDeclMatcher<ClassTemplateSpecializationDecl>().match(
+ TU, classTemplateSpecializationDecl());
+ auto *FromLastSpec =
+ FirstDeclMatcher<ClassTemplateSpecializationDecl>().match(
+ TU, classTemplateSpecializationDecl());
+ auto *FromFirstParamObject = dyn_cast<TemplateParamObjectDecl>(
+ FromFirstSpec->getTemplateArgs().get(0).getAsDecl());
+ auto *FromLastParamObject = dyn_cast<TemplateParamObjectDecl>(
+ FromLastSpec->getTemplateArgs().get(0).getAsDecl());
+ ASSERT_TRUE(FromFirstParamObject);
+ ASSERT_EQ(FromFirstParamObject, FromLastParamObject);
+
+ auto *ToFirstSpec = Import(FromFirstSpec, Lang_CXX20);
+ EXPECT_TRUE(ToFirstSpec);
+ auto *ToLastSpec = Import(FromLastSpec, Lang_CXX20);
+ EXPECT_TRUE(ToLastSpec);
+ auto *ToFirstParamObject = dyn_cast<TemplateParamObjectDecl>(
+ ToFirstSpec->getTemplateArgs().get(0).getAsDecl());
+ auto *ToLastParamObject = dyn_cast<TemplateParamObjectDecl>(
+ ToLastSpec->getTemplateArgs().get(0).getAsDecl());
+ EXPECT_NE(FromFirstParamObject, ToFirstParamObject);
+ EXPECT_EQ(ToFirstParamObject, ToLastParamObject);
+}
+
TEST_P(ASTImporterOptionSpecificTestBase,
InitListExprValueKindShouldBeImported) {
Decl *TU = getTuDecl(
>From 8a36334df684a223fc91bbc2be806d1d3e84ccd9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bal=C3=A1zs=20K=C3=A9ri?= <balazs.keri at ericsson.com>
Date: Thu, 7 May 2026 16:55:41 +0200
Subject: [PATCH 2/3] fixed test
---
clang/unittests/AST/ASTImporterTest.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp
index f59edb26d73fb..ba9892d498af4 100644
--- a/clang/unittests/AST/ASTImporterTest.cpp
+++ b/clang/unittests/AST/ASTImporterTest.cpp
@@ -4113,7 +4113,7 @@ TEST_P(ASTImporterOptionSpecificTestBase, ImportTemplateParamObjectDecl) {
FirstDeclMatcher<ClassTemplateSpecializationDecl>().match(
TU, classTemplateSpecializationDecl());
auto *FromLastSpec =
- FirstDeclMatcher<ClassTemplateSpecializationDecl>().match(
+ LastDeclMatcher<ClassTemplateSpecializationDecl>().match(
TU, classTemplateSpecializationDecl());
auto *FromFirstParamObject = dyn_cast<TemplateParamObjectDecl>(
FromFirstSpec->getTemplateArgs().get(0).getAsDecl());
>From 70c3ab518945cb1e35d3640d2a8750eccbaf3612 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bal=C3=A1zs=20K=C3=A9ri?= <balazs.keri at ericsson.com>
Date: Thu, 7 May 2026 18:23:13 +0200
Subject: [PATCH 3/3] fixed formatting error
---
clang/unittests/AST/ASTImporterTest.cpp | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp
index ba9892d498af4..3ef11a25a4d1d 100644
--- a/clang/unittests/AST/ASTImporterTest.cpp
+++ b/clang/unittests/AST/ASTImporterTest.cpp
@@ -4112,9 +4112,8 @@ TEST_P(ASTImporterOptionSpecificTestBase, ImportTemplateParamObjectDecl) {
auto *FromFirstSpec =
FirstDeclMatcher<ClassTemplateSpecializationDecl>().match(
TU, classTemplateSpecializationDecl());
- auto *FromLastSpec =
- LastDeclMatcher<ClassTemplateSpecializationDecl>().match(
- TU, classTemplateSpecializationDecl());
+ auto *FromLastSpec = LastDeclMatcher<ClassTemplateSpecializationDecl>().match(
+ TU, classTemplateSpecializationDecl());
auto *FromFirstParamObject = dyn_cast<TemplateParamObjectDecl>(
FromFirstSpec->getTemplateArgs().get(0).getAsDecl());
auto *FromLastParamObject = dyn_cast<TemplateParamObjectDecl>(
More information about the cfe-commits
mailing list