Skip to content

Commit 98a8344

Browse files
committed
[clang][ASTImporter] Add support for importing CXXFoldExpr.
Reviewed By: shafik, martong Differential Revision: https://reviews.llvm.org/D94786
1 parent af03324 commit 98a8344

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

clang/lib/AST/ASTImporter.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,7 @@ namespace clang {
644644
ExpectedStmt VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E);
645645
ExpectedStmt VisitTypeTraitExpr(TypeTraitExpr *E);
646646
ExpectedStmt VisitCXXTypeidExpr(CXXTypeidExpr *E);
647+
ExpectedStmt VisitCXXFoldExpr(CXXFoldExpr *E);
647648

648649
template<typename IIter, typename OIter>
649650
Error ImportArrayChecked(IIter Ibegin, IIter Iend, OIter Obegin) {
@@ -8011,6 +8012,25 @@ ExpectedStmt ASTNodeImporter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
80118012
*ToTypeOrErr, *ToExprOperandOrErr, *ToSourceRangeOrErr);
80128013
}
80138014

8015+
ExpectedStmt ASTNodeImporter::VisitCXXFoldExpr(CXXFoldExpr *E) {
8016+
Error Err = Error::success();
8017+
8018+
QualType ToType = importChecked(Err, E->getType());
8019+
UnresolvedLookupExpr *ToCallee = importChecked(Err, E->getCallee());
8020+
SourceLocation ToLParenLoc = importChecked(Err, E->getLParenLoc());
8021+
Expr *ToLHS = importChecked(Err, E->getLHS());
8022+
SourceLocation ToEllipsisLoc = importChecked(Err, E->getEllipsisLoc());
8023+
Expr *ToRHS = importChecked(Err, E->getRHS());
8024+
SourceLocation ToRParenLoc = importChecked(Err, E->getRParenLoc());
8025+
8026+
if (Err)
8027+
return std::move(Err);
8028+
8029+
return new (Importer.getToContext())
8030+
CXXFoldExpr(ToType, ToCallee, ToLParenLoc, ToLHS, E->getOperator(),
8031+
ToEllipsisLoc, ToRHS, ToRParenLoc, E->getNumExpansions());
8032+
}
8033+
80148034
Error ASTNodeImporter::ImportOverriddenMethods(CXXMethodDecl *ToMethod,
80158035
CXXMethodDecl *FromMethod) {
80168036
Error ImportErrors = Error::success();

clang/unittests/AST/ASTImporterTest.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,38 @@ TEST_P(ImportExpr, ImportSizeOfPackExpr) {
639639
hasUnqualifiedDesugaredType(constantArrayType(hasSize(7))))))))));
640640
}
641641

642+
const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFoldExpr> cxxFoldExpr;
643+
644+
AST_MATCHER_P(CXXFoldExpr, hasOperator, BinaryOperatorKind, Op) {
645+
return Node.getOperator() == Op;
646+
}
647+
AST_MATCHER(CXXFoldExpr, hasInit) { return Node.getInit(); }
648+
AST_MATCHER(CXXFoldExpr, isRightFold) { return Node.isRightFold(); }
649+
AST_MATCHER(CXXFoldExpr, isLeftFold) { return Node.isLeftFold(); }
650+
651+
TEST_P(ImportExpr, ImportCXXFoldExpr) {
652+
auto Match1 =
653+
cxxFoldExpr(hasOperator(BO_Add), isLeftFold(), unless(hasInit()));
654+
auto Match2 = cxxFoldExpr(hasOperator(BO_Sub), isLeftFold(), hasInit());
655+
auto Match3 =
656+
cxxFoldExpr(hasOperator(BO_Mul), isRightFold(), unless(hasInit()));
657+
auto Match4 = cxxFoldExpr(hasOperator(BO_Div), isRightFold(), hasInit());
658+
659+
MatchVerifier<Decl> Verifier;
660+
testImport("template <typename... Ts>"
661+
"void declToImport(Ts... args) {"
662+
" const int i1 = (... + args);"
663+
" const int i2 = (1 - ... - args);"
664+
" const int i3 = (args * ...);"
665+
" const int i4 = (args / ... / 1);"
666+
"};"
667+
"void g() { declToImport(1, 2, 3, 4, 5); }",
668+
Lang_CXX17, "", Lang_CXX17, Verifier,
669+
functionTemplateDecl(hasDescendant(Match1), hasDescendant(Match2),
670+
hasDescendant(Match3),
671+
hasDescendant(Match4)));
672+
}
673+
642674
/// \brief Matches __builtin_types_compatible_p:
643675
/// GNU extension to check equivalent types
644676
/// Given

0 commit comments

Comments
 (0)