Michael137 created this revision. Michael137 added reviewers: martong, aprantl. Herald added a subscriber: rnkovacs. Herald added a reviewer: a.sidorin. Herald added a reviewer: shafik. Herald added a project: All. Michael137 requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
With https://reviews.llvm.org/D141826 `TemplateArgument`s have an additional field that indicates their defaulted-ness. This gets used during debug-info generation and in the `clang::TypePrinter`. This patch copies the field during the import process so consumers of the ASTImporter can benefit from the other Clang components that read the field. **Testing** - Added unit-test - Checked that this fixes (in addition to a follow-up LLDB patch) fix current test failures in LLDB Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D142713 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 @@ -1158,6 +1158,25 @@ ASSERT_EQ(cast<IntegerLiteral>(ToArg)->getValue().getLimitedValue(), 1U); } +TEST_P(ASTImporterOptionSpecificTestBase, TemplateArgumentsDefaulted) { + Decl *FromTU = getTuDecl(R"( + template<typename T> struct X {}; + template<typename TP = double, + int NTTP = 50, + template<typename> typename TT = X> struct S {}; + S<> s; + )", Lang_CXX17); + auto *FromSpec = FirstDeclMatcher<ClassTemplateSpecializationDecl>().match( + FromTU, classTemplateSpecializationDecl(hasName("S"))); + ASSERT_TRUE(FromSpec); + auto *ToSpec = Import(FromSpec, Lang_CXX03); + ASSERT_TRUE(ToSpec); + auto const& TList = ToSpec->getTemplateArgs(); + for (auto const& Arg : TList.asArray()) { + ASSERT_TRUE(Arg.getIsDefaulted()); + } +} + TEST_P(ASTImporterOptionSpecificTestBase, ImportOfTemplatedDeclOfClassTemplateDecl) { Decl *FromTU = getTuDecl("template<class X> struct S{};", Lang_CXX03); Index: clang/lib/AST/ASTImporter.cpp =================================================================== --- clang/lib/AST/ASTImporter.cpp +++ clang/lib/AST/ASTImporter.cpp @@ -836,7 +836,7 @@ ExpectedType ToTypeOrErr = import(From.getAsType()); if (!ToTypeOrErr) return ToTypeOrErr.takeError(); - return TemplateArgument(*ToTypeOrErr); + return TemplateArgument(*ToTypeOrErr, /*isNullPtr*/false, From.getIsDefaulted()); } case TemplateArgument::Integral: { @@ -853,14 +853,14 @@ ExpectedType ToTypeOrErr = import(From.getParamTypeForDecl()); if (!ToTypeOrErr) return ToTypeOrErr.takeError(); - return TemplateArgument(*ToOrErr, *ToTypeOrErr); + return TemplateArgument(*ToOrErr, *ToTypeOrErr, From.getIsDefaulted()); } case TemplateArgument::NullPtr: { ExpectedType ToTypeOrErr = import(From.getNullPtrType()); if (!ToTypeOrErr) return ToTypeOrErr.takeError(); - return TemplateArgument(*ToTypeOrErr, /*isNullPtr*/true); + return TemplateArgument(*ToTypeOrErr, /*isNullPtr*/true, From.getIsDefaulted()); } case TemplateArgument::Template: { @@ -868,7 +868,7 @@ if (!ToTemplateOrErr) return ToTemplateOrErr.takeError(); - return TemplateArgument(*ToTemplateOrErr); + return TemplateArgument(*ToTemplateOrErr, From.getIsDefaulted()); } case TemplateArgument::TemplateExpansion: { @@ -878,12 +878,12 @@ return ToTemplateOrErr.takeError(); return TemplateArgument( - *ToTemplateOrErr, From.getNumTemplateExpansions()); + *ToTemplateOrErr, From.getNumTemplateExpansions(), From.getIsDefaulted()); } case TemplateArgument::Expression: if (ExpectedExpr ToExpr = import(From.getAsExpr())) - return TemplateArgument(*ToExpr); + return TemplateArgument(*ToExpr, From.getIsDefaulted()); else return ToExpr.takeError();
Index: clang/unittests/AST/ASTImporterTest.cpp =================================================================== --- clang/unittests/AST/ASTImporterTest.cpp +++ clang/unittests/AST/ASTImporterTest.cpp @@ -1158,6 +1158,25 @@ ASSERT_EQ(cast<IntegerLiteral>(ToArg)->getValue().getLimitedValue(), 1U); } +TEST_P(ASTImporterOptionSpecificTestBase, TemplateArgumentsDefaulted) { + Decl *FromTU = getTuDecl(R"( + template<typename T> struct X {}; + template<typename TP = double, + int NTTP = 50, + template<typename> typename TT = X> struct S {}; + S<> s; + )", Lang_CXX17); + auto *FromSpec = FirstDeclMatcher<ClassTemplateSpecializationDecl>().match( + FromTU, classTemplateSpecializationDecl(hasName("S"))); + ASSERT_TRUE(FromSpec); + auto *ToSpec = Import(FromSpec, Lang_CXX03); + ASSERT_TRUE(ToSpec); + auto const& TList = ToSpec->getTemplateArgs(); + for (auto const& Arg : TList.asArray()) { + ASSERT_TRUE(Arg.getIsDefaulted()); + } +} + TEST_P(ASTImporterOptionSpecificTestBase, ImportOfTemplatedDeclOfClassTemplateDecl) { Decl *FromTU = getTuDecl("template<class X> struct S{};", Lang_CXX03); Index: clang/lib/AST/ASTImporter.cpp =================================================================== --- clang/lib/AST/ASTImporter.cpp +++ clang/lib/AST/ASTImporter.cpp @@ -836,7 +836,7 @@ ExpectedType ToTypeOrErr = import(From.getAsType()); if (!ToTypeOrErr) return ToTypeOrErr.takeError(); - return TemplateArgument(*ToTypeOrErr); + return TemplateArgument(*ToTypeOrErr, /*isNullPtr*/false, From.getIsDefaulted()); } case TemplateArgument::Integral: { @@ -853,14 +853,14 @@ ExpectedType ToTypeOrErr = import(From.getParamTypeForDecl()); if (!ToTypeOrErr) return ToTypeOrErr.takeError(); - return TemplateArgument(*ToOrErr, *ToTypeOrErr); + return TemplateArgument(*ToOrErr, *ToTypeOrErr, From.getIsDefaulted()); } case TemplateArgument::NullPtr: { ExpectedType ToTypeOrErr = import(From.getNullPtrType()); if (!ToTypeOrErr) return ToTypeOrErr.takeError(); - return TemplateArgument(*ToTypeOrErr, /*isNullPtr*/true); + return TemplateArgument(*ToTypeOrErr, /*isNullPtr*/true, From.getIsDefaulted()); } case TemplateArgument::Template: { @@ -868,7 +868,7 @@ if (!ToTemplateOrErr) return ToTemplateOrErr.takeError(); - return TemplateArgument(*ToTemplateOrErr); + return TemplateArgument(*ToTemplateOrErr, From.getIsDefaulted()); } case TemplateArgument::TemplateExpansion: { @@ -878,12 +878,12 @@ return ToTemplateOrErr.takeError(); return TemplateArgument( - *ToTemplateOrErr, From.getNumTemplateExpansions()); + *ToTemplateOrErr, From.getNumTemplateExpansions(), From.getIsDefaulted()); } case TemplateArgument::Expression: if (ExpectedExpr ToExpr = import(From.getAsExpr())) - return TemplateArgument(*ToExpr); + return TemplateArgument(*ToExpr, From.getIsDefaulted()); else return ToExpr.takeError();
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits