[clang] [Clang][C++26] Implement "Ordering of constraints involving fold expressions (PR #98160)
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Tue Jul 9 09:07:05 PDT 2024
================
@@ -1390,17 +1577,82 @@ NormalizedConstraint::fromConstraintExpr(Sema &S, NamedDecl *D, const Expr *E) {
return std::nullopt;
return New;
+ } else if (auto *FE = dyn_cast<const CXXFoldExpr>(E);
+ FE && S.getLangOpts().CPlusPlus26 &&
+ (FE->getOperator() == BinaryOperatorKind::BO_LAnd ||
+ FE->getOperator() == BinaryOperatorKind::BO_LOr)) {
+
+ FoldExpandedConstraint::FoldOperatorKind Kind =
+ FE->getOperator() == BinaryOperatorKind::BO_LAnd
+ ? FoldExpandedConstraint::FoldOperatorKind::FoAnd
+ : FoldExpandedConstraint::FoldOperatorKind::FoOr;
+
+ if (FE->getInit()) {
+ auto LHS = fromConstraintExpr(S, D, FE->getLHS());
+ auto RHS = fromConstraintExpr(S, D, FE->getRHS());
+ if (!LHS || !RHS)
+ return std::nullopt;
+
+ if (FE->isRightFold())
+ RHS = NormalizedConstraint{new (S.Context) FoldExpandedConstraint{
+ Kind, std::move(*RHS), FE->getPattern()}};
+ else
+ LHS = NormalizedConstraint{new (S.Context) FoldExpandedConstraint{
+ Kind, std::move(*LHS), FE->getPattern()}};
+
+ return NormalizedConstraint(
+ S.Context, std::move(*LHS), std::move(*RHS),
+ FE->getOperator() == BinaryOperatorKind::BO_LAnd ? CCK_Conjunction
+ : CCK_Disjunction);
+ }
+ auto Sub = fromConstraintExpr(S, D, FE->getPattern());
+ return NormalizedConstraint{new (S.Context) FoldExpandedConstraint{
+ Kind, std::move(*Sub), FE->getPattern()}};
}
+
return NormalizedConstraint{new (S.Context) AtomicConstraint(S, E)};
}
-using NormalForm =
- llvm::SmallVector<llvm::SmallVector<AtomicConstraint *, 2>, 4>;
+/*static void CollectConstraintParams(const AtomicConstraint& C,
----------------
AaronBallman wrote:
Dead code?
https://github.com/llvm/llvm-project/pull/98160
More information about the cfe-commits
mailing list