Author: Balázs Kéri Date: 2021-01-22T15:20:55+01:00 New Revision: 98a8344895a8e1f2cfa98b664b50fb7b864afa52
URL: https://github.com/llvm/llvm-project/commit/98a8344895a8e1f2cfa98b664b50fb7b864afa52 DIFF: https://github.com/llvm/llvm-project/commit/98a8344895a8e1f2cfa98b664b50fb7b864afa52.diff LOG: [clang][ASTImporter] Add support for importing CXXFoldExpr. Reviewed By: shafik, martong Differential Revision: https://reviews.llvm.org/D94786 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 5c6aa5d3c015..085c50c0667b 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -644,6 +644,7 @@ namespace clang { ExpectedStmt VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E); ExpectedStmt VisitTypeTraitExpr(TypeTraitExpr *E); ExpectedStmt VisitCXXTypeidExpr(CXXTypeidExpr *E); + ExpectedStmt VisitCXXFoldExpr(CXXFoldExpr *E); template<typename IIter, typename OIter> Error ImportArrayChecked(IIter Ibegin, IIter Iend, OIter Obegin) { @@ -8011,6 +8012,25 @@ ExpectedStmt ASTNodeImporter::VisitCXXTypeidExpr(CXXTypeidExpr *E) { *ToTypeOrErr, *ToExprOperandOrErr, *ToSourceRangeOrErr); } +ExpectedStmt ASTNodeImporter::VisitCXXFoldExpr(CXXFoldExpr *E) { + Error Err = Error::success(); + + QualType ToType = importChecked(Err, E->getType()); + UnresolvedLookupExpr *ToCallee = importChecked(Err, E->getCallee()); + SourceLocation ToLParenLoc = importChecked(Err, E->getLParenLoc()); + Expr *ToLHS = importChecked(Err, E->getLHS()); + SourceLocation ToEllipsisLoc = importChecked(Err, E->getEllipsisLoc()); + Expr *ToRHS = importChecked(Err, E->getRHS()); + SourceLocation ToRParenLoc = importChecked(Err, E->getRParenLoc()); + + if (Err) + return std::move(Err); + + return new (Importer.getToContext()) + CXXFoldExpr(ToType, ToCallee, ToLParenLoc, ToLHS, E->getOperator(), + ToEllipsisLoc, ToRHS, ToRParenLoc, E->getNumExpansions()); +} + Error ASTNodeImporter::ImportOverriddenMethods(CXXMethodDecl *ToMethod, CXXMethodDecl *FromMethod) { Error ImportErrors = Error::success(); diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp index 8a07a5b8e0df..193523f2fc51 100644 --- a/clang/unittests/AST/ASTImporterTest.cpp +++ b/clang/unittests/AST/ASTImporterTest.cpp @@ -639,6 +639,38 @@ TEST_P(ImportExpr, ImportSizeOfPackExpr) { hasUnqualifiedDesugaredType(constantArrayType(hasSize(7)))))))))); } +const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFoldExpr> cxxFoldExpr; + +AST_MATCHER_P(CXXFoldExpr, hasOperator, BinaryOperatorKind, Op) { + return Node.getOperator() == Op; +} +AST_MATCHER(CXXFoldExpr, hasInit) { return Node.getInit(); } +AST_MATCHER(CXXFoldExpr, isRightFold) { return Node.isRightFold(); } +AST_MATCHER(CXXFoldExpr, isLeftFold) { return Node.isLeftFold(); } + +TEST_P(ImportExpr, ImportCXXFoldExpr) { + auto Match1 = + cxxFoldExpr(hasOperator(BO_Add), isLeftFold(), unless(hasInit())); + auto Match2 = cxxFoldExpr(hasOperator(BO_Sub), isLeftFold(), hasInit()); + auto Match3 = + cxxFoldExpr(hasOperator(BO_Mul), isRightFold(), unless(hasInit())); + auto Match4 = cxxFoldExpr(hasOperator(BO_Div), isRightFold(), hasInit()); + + MatchVerifier<Decl> Verifier; + testImport("template <typename... Ts>" + "void declToImport(Ts... args) {" + " const int i1 = (... + args);" + " const int i2 = (1 - ... - args);" + " const int i3 = (args * ...);" + " const int i4 = (args / ... / 1);" + "};" + "void g() { declToImport(1, 2, 3, 4, 5); }", + Lang_CXX17, "", Lang_CXX17, Verifier, + functionTemplateDecl(hasDescendant(Match1), hasDescendant(Match2), + hasDescendant(Match3), + hasDescendant(Match4))); +} + /// \brief Matches __builtin_types_compatible_p: /// GNU extension to check equivalent types /// Given _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits