[PATCH] D109237: [clang][AST] Add support for SubstTemplateTypeParmPackType to ASTImporter
Balázs Benics via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sat Sep 4 01:21:18 PDT 2021
This revision was automatically updated to reflect the committed changes.
Closed by commit rGd6ca91ea4245: [clang][AST] Add support for SubstTemplateTypeParmPackType to ASTImporter (authored by steakhal).
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D109237/new/
https://reviews.llvm.org/D109237
Files:
clang/lib/AST/ASTImporter.cpp
clang/unittests/AST/ASTImporterTest.cpp
Index: clang/unittests/AST/ASTImporterTest.cpp
===================================================================
--- clang/unittests/AST/ASTImporterTest.cpp
+++ clang/unittests/AST/ASTImporterTest.cpp
@@ -4693,6 +4693,57 @@
ToD2->getDeclContext(), ToD2->getTemplateParameters()->getParam(0)));
}
+const AstTypeMatcher<SubstTemplateTypeParmPackType>
+ substTemplateTypeParmPackType;
+
+TEST_P(ASTImporterOptionSpecificTestBase, ImportSubstTemplateTypeParmPackType) {
+ constexpr auto Code = R"(
+ template<typename ...T> struct D {
+ template<typename... U> using B = int(int (*...p)(T, U));
+ template<typename U1, typename U2> D(B<U1, U2>*);
+ };
+ int f(int(int, int), int(int, int));
+
+ using asd = D<float, double, float>::B<int, long, int>;
+ )";
+ Decl *FromTU = getTuDecl(Code, Lang_CXX11, "input.cpp");
+ auto *FromClass = FirstDeclMatcher<ClassTemplateSpecializationDecl>().match(
+ FromTU, classTemplateSpecializationDecl());
+
+ {
+ ASTContext &FromCtx = FromTU->getASTContext();
+ const auto *FromSubstPack = selectFirst<SubstTemplateTypeParmPackType>(
+ "pack", match(substTemplateTypeParmPackType().bind("pack"), FromCtx));
+
+ ASSERT_TRUE(FromSubstPack);
+ ASSERT_EQ(FromSubstPack->getIdentifier()->getName(), "T");
+ ArrayRef<TemplateArgument> FromArgPack =
+ FromSubstPack->getArgumentPack().pack_elements();
+ ASSERT_EQ(FromArgPack.size(), 3u);
+ ASSERT_EQ(FromArgPack[0].getAsType(), FromCtx.FloatTy);
+ ASSERT_EQ(FromArgPack[1].getAsType(), FromCtx.DoubleTy);
+ ASSERT_EQ(FromArgPack[2].getAsType(), FromCtx.FloatTy);
+ }
+ {
+ // Let's do the import.
+ ClassTemplateSpecializationDecl *ToClass = Import(FromClass, Lang_CXX11);
+ ASTContext &ToCtx = ToClass->getASTContext();
+
+ const auto *ToSubstPack = selectFirst<SubstTemplateTypeParmPackType>(
+ "pack", match(substTemplateTypeParmPackType().bind("pack"), ToCtx));
+
+ // Check if it meets the requirements.
+ ASSERT_TRUE(ToSubstPack);
+ ASSERT_EQ(ToSubstPack->getIdentifier()->getName(), "T");
+ ArrayRef<TemplateArgument> ToArgPack =
+ ToSubstPack->getArgumentPack().pack_elements();
+ ASSERT_EQ(ToArgPack.size(), 3u);
+ ASSERT_EQ(ToArgPack[0].getAsType(), ToCtx.FloatTy);
+ ASSERT_EQ(ToArgPack[1].getAsType(), ToCtx.DoubleTy);
+ ASSERT_EQ(ToArgPack[2].getAsType(), ToCtx.FloatTy);
+ }
+}
+
struct ASTImporterLookupTableTest : ASTImporterOptionSpecificTestBase {};
TEST_P(ASTImporterLookupTableTest, OneDecl) {
Index: clang/lib/AST/ASTImporter.cpp
===================================================================
--- clang/lib/AST/ASTImporter.cpp
+++ clang/lib/AST/ASTImporter.cpp
@@ -383,6 +383,8 @@
ExpectedType VisitTemplateTypeParmType(const TemplateTypeParmType *T);
ExpectedType VisitSubstTemplateTypeParmType(
const SubstTemplateTypeParmType *T);
+ ExpectedType
+ VisitSubstTemplateTypeParmPackType(const SubstTemplateTypeParmPackType *T);
ExpectedType VisitTemplateSpecializationType(
const TemplateSpecializationType *T);
ExpectedType VisitElaboratedType(const ElaboratedType *T);
@@ -1486,6 +1488,22 @@
Replaced, (*ToReplacementTypeOrErr).getCanonicalType());
}
+ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmPackType(
+ const SubstTemplateTypeParmPackType *T) {
+ ExpectedType ReplacedOrErr = import(QualType(T->getReplacedParameter(), 0));
+ if (!ReplacedOrErr)
+ return ReplacedOrErr.takeError();
+ const TemplateTypeParmType *Replaced =
+ cast<TemplateTypeParmType>(ReplacedOrErr->getTypePtr());
+
+ Expected<TemplateArgument> ToArgumentPack = import(T->getArgumentPack());
+ if (!ToArgumentPack)
+ return ToArgumentPack.takeError();
+
+ return Importer.getToContext().getSubstTemplateTypeParmPackType(
+ Replaced, *ToArgumentPack);
+}
+
ExpectedType ASTNodeImporter::VisitTemplateSpecializationType(
const TemplateSpecializationType *T) {
auto ToTemplateOrErr = import(T->getTemplateName());
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D109237.370709.patch
Type: text/x-patch
Size: 4071 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210904/836c84f5/attachment.bin>
More information about the cfe-commits
mailing list