[llvm-branch-commits] [clang] 39a5dd1 - [ASTImporter] Import the default argument of TemplateTemplateParmDecl
Raphael Isemann via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Nov 26 06:17:50 PST 2020
Author: Raphael Isemann
Date: 2020-11-26T15:12:45+01:00
New Revision: 39a5dd164ca8648e24525869c934c9137c4887ef
URL: https://github.com/llvm/llvm-project/commit/39a5dd164ca8648e24525869c934c9137c4887ef
DIFF: https://github.com/llvm/llvm-project/commit/39a5dd164ca8648e24525869c934c9137c4887ef.diff
LOG: [ASTImporter] Import the default argument of TemplateTemplateParmDecl
Same idea as in D92103 and D92106, but I realised after creating those reviews that there are
also TemplateTemplateParmDecls that can have default arguments, so here's hopefully the
last patch for default template arguments.
Reviewed By: martong
Differential Revision: https://reviews.llvm.org/D92119
Added:
Modified:
clang/lib/AST/ASTImporter.cpp
clang/unittests/AST/ASTImporterTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp
index 0886980fe905..835551528e0d 100644
--- a/clang/lib/AST/ASTImporter.cpp
+++ b/clang/lib/AST/ASTImporter.cpp
@@ -5250,15 +5250,22 @@ ASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
if (!TemplateParamsOrErr)
return TemplateParamsOrErr.takeError();
- // FIXME: Import default argument.
-
TemplateTemplateParmDecl *ToD = nullptr;
- (void)GetImportedOrCreateDecl(
- ToD, D, Importer.getToContext(),
- Importer.getToContext().getTranslationUnitDecl(), *LocationOrErr,
- D->getDepth(), D->getPosition(), D->isParameterPack(),
- (*NameOrErr).getAsIdentifierInfo(),
- *TemplateParamsOrErr);
+ if (GetImportedOrCreateDecl(
+ ToD, D, Importer.getToContext(),
+ Importer.getToContext().getTranslationUnitDecl(), *LocationOrErr,
+ D->getDepth(), D->getPosition(), D->isParameterPack(),
+ (*NameOrErr).getAsIdentifierInfo(), *TemplateParamsOrErr))
+ return ToD;
+
+ if (D->hasDefaultArgument()) {
+ Expected<TemplateArgumentLoc> ToDefaultArgOrErr =
+ import(D->getDefaultArgument());
+ if (!ToDefaultArgOrErr)
+ return ToDefaultArgOrErr.takeError();
+ ToD->setDefaultArgument(Importer.getToContext(), *ToDefaultArgOrErr);
+ }
+
return ToD;
}
diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp
index 97a18a76622b..33e4b7226fba 100644
--- a/clang/unittests/AST/ASTImporterTest.cpp
+++ b/clang/unittests/AST/ASTImporterTest.cpp
@@ -901,6 +901,39 @@ TEST_P(ASTImporterOptionSpecificTestBase, ImportBeginLocOfDeclRefExpr) {
.isValid());
}
+TEST_P(ASTImporterOptionSpecificTestBase,
+ TemplateTemplateParmDeclNoDefaultArg) {
+ Decl *FromTU = getTuDecl(R"(
+ template<template<typename> typename TT> struct Y {};
+ )",
+ Lang_CXX17);
+ auto From = FirstDeclMatcher<TemplateTemplateParmDecl>().match(
+ FromTU, templateTemplateParmDecl(hasName("TT")));
+ TemplateTemplateParmDecl *To = Import(From, Lang_CXX17);
+ ASSERT_FALSE(To->hasDefaultArgument());
+}
+
+TEST_P(ASTImporterOptionSpecificTestBase, TemplateTemplateParmDeclDefaultArg) {
+ Decl *FromTU = getTuDecl(R"(
+ template<typename T> struct X {};
+ template<template<typename> typename TT = X> struct Y {};
+ )",
+ Lang_CXX17);
+ auto From = FirstDeclMatcher<TemplateTemplateParmDecl>().match(
+ FromTU, templateTemplateParmDecl(hasName("TT")));
+ TemplateTemplateParmDecl *To = Import(From, Lang_CXX17);
+ ASSERT_TRUE(To->hasDefaultArgument());
+ const TemplateArgument &ToDefaultArg = To->getDefaultArgument().getArgument();
+ ASSERT_TRUE(To->isTemplateDecl());
+ TemplateDecl *ToTemplate = ToDefaultArg.getAsTemplate().getAsTemplateDecl();
+
+ // Find the default argument template 'X' in the AST and compare it against
+ // the default argument we got.
+ auto ToExpectedDecl = FirstDeclMatcher<ClassTemplateDecl>().match(
+ To->getTranslationUnitDecl(), classTemplateDecl(hasName("X")));
+ ASSERT_EQ(ToTemplate, ToExpectedDecl);
+}
+
TEST_P(ASTImporterOptionSpecificTestBase,
ImportOfTemplatedDeclOfClassTemplateDecl) {
Decl *FromTU = getTuDecl("template<class X> struct S{};", Lang_CXX03);
More information about the llvm-branch-commits
mailing list