[clang] 89c1a7a - [ASTImporter] Import the default argument of NonTypeTemplateParmDecl
Raphael Isemann via cfe-commits
cfe-commits at lists.llvm.org
Fri Nov 27 02:40:31 PST 2020
Author: Raphael Isemann
Date: 2020-11-27T11:40:07+01:00
New Revision: 89c1a7a67d6947f56dc2db189d3872626f5a8609
URL: https://github.com/llvm/llvm-project/commit/89c1a7a67d6947f56dc2db189d3872626f5a8609
DIFF: https://github.com/llvm/llvm-project/commit/89c1a7a67d6947f56dc2db189d3872626f5a8609.diff
LOG: [ASTImporter] Import the default argument of NonTypeTemplateParmDecl
The test case isn't using the AST matchers for all checks as there doesn't seem to be support for
matching NonTypeTemplateParmDecl default arguments. Otherwise this is simply importing the
default arguments.
Reviewed By: martong
Differential Revision: https://reviews.llvm.org/D92106
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 5159682da85f..01ee8d275af1 100644
--- a/clang/lib/AST/ASTImporter.cpp
+++ b/clang/lib/AST/ASTImporter.cpp
@@ -5227,15 +5227,22 @@ ASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
if (Err)
return std::move(Err);
- // FIXME: Import default argument.
-
NonTypeTemplateParmDecl *ToD = nullptr;
- (void)GetImportedOrCreateDecl(
- ToD, D, Importer.getToContext(),
- Importer.getToContext().getTranslationUnitDecl(),
- ToInnerLocStart, ToLocation, D->getDepth(),
- D->getPosition(), ToDeclName.getAsIdentifierInfo(), ToType,
- D->isParameterPack(), ToTypeSourceInfo);
+ if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(),
+ Importer.getToContext().getTranslationUnitDecl(),
+ ToInnerLocStart, ToLocation, D->getDepth(),
+ D->getPosition(),
+ ToDeclName.getAsIdentifierInfo(), ToType,
+ D->isParameterPack(), ToTypeSourceInfo))
+ return ToD;
+
+ if (D->hasDefaultArgument()) {
+ ExpectedExpr ToDefaultArgOrErr = import(D->getDefaultArgument());
+ if (!ToDefaultArgOrErr)
+ return ToDefaultArgOrErr.takeError();
+ ToD->setDefaultArgument(*ToDefaultArgOrErr);
+ }
+
return ToD;
}
diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp
index 5a93a7348e7a..81a92a10f48d 100644
--- a/clang/unittests/AST/ASTImporterTest.cpp
+++ b/clang/unittests/AST/ASTImporterTest.cpp
@@ -953,6 +953,27 @@ TEST_P(ASTImporterOptionSpecificTestBase, TemplateTemplateParmDeclDefaultArg) {
ASSERT_EQ(ToTemplate, ToExpectedDecl);
}
+TEST_P(ASTImporterOptionSpecificTestBase, NonTypeTemplateParmDeclNoDefaultArg) {
+ Decl *FromTU = getTuDecl("template<int N> struct X {};", Lang_CXX03);
+ auto From = FirstDeclMatcher<NonTypeTemplateParmDecl>().match(
+ FromTU, nonTypeTemplateParmDecl(hasName("N")));
+ NonTypeTemplateParmDecl *To = Import(From, Lang_CXX03);
+ ASSERT_FALSE(To->hasDefaultArgument());
+}
+
+TEST_P(ASTImporterOptionSpecificTestBase, NonTypeTemplateParmDeclDefaultArg) {
+ Decl *FromTU = getTuDecl("template<int S = 1> struct X {};", Lang_CXX03);
+ auto From = FirstDeclMatcher<NonTypeTemplateParmDecl>().match(
+ FromTU, nonTypeTemplateParmDecl(hasName("S")));
+ NonTypeTemplateParmDecl *To = Import(From, Lang_CXX03);
+ ASSERT_TRUE(To->hasDefaultArgument());
+ Stmt *ToArg = To->getDefaultArgument();
+ ASSERT_TRUE(isa<ConstantExpr>(ToArg));
+ ToArg = *ToArg->child_begin();
+ ASSERT_TRUE(isa<IntegerLiteral>(ToArg));
+ ASSERT_EQ(cast<IntegerLiteral>(ToArg)->getValue().getLimitedValue(), 1U);
+}
+
TEST_P(ASTImporterOptionSpecificTestBase,
ImportOfTemplatedDeclOfClassTemplateDecl) {
Decl *FromTU = getTuDecl("template<class X> struct S{};", Lang_CXX03);
More information about the cfe-commits
mailing list