[clang] [Clang] Handle ?: operator in fold expression (PR #164019)
Azmat Yusuf via cfe-commits
cfe-commits at lists.llvm.org
Thu Nov 6 03:27:03 PST 2025
https://github.com/azmat-y updated https://github.com/llvm/llvm-project/pull/164019
>From 91bab06b2f61451819b157977a7190b76a62ebae Mon Sep 17 00:00:00 2001
From: Azmat Yusuf <azmatyusuf2022 at gmail.com>
Date: Sat, 18 Oct 2025 02:29:06 +0530
Subject: [PATCH] [Clang] Handle ?: operator in fold expression
---
clang/lib/Sema/SemaExpr.cpp | 3 +++
clang/lib/Sema/SemaTemplateVariadic.cpp | 2 +-
clang/test/SemaCXX/fold_expr_typo.cpp | 5 +++++
3 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index a50c27610dc96..5089a64e85316 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -8966,6 +8966,9 @@ ExprResult Sema::ActOnConditionalOp(SourceLocation QuestionLoc,
commonExpr = MatExpr.get();
}
+ if (commonExpr->getDependence() & ExprDependence::UnexpandedPack)
+ return ExprError();
+
opaqueValue = new (Context) OpaqueValueExpr(commonExpr->getExprLoc(),
commonExpr->getType(),
commonExpr->getValueKind(),
diff --git a/clang/lib/Sema/SemaTemplateVariadic.cpp b/clang/lib/Sema/SemaTemplateVariadic.cpp
index 0f72d6a13ae06..7f9f85e1a3c32 100644
--- a/clang/lib/Sema/SemaTemplateVariadic.cpp
+++ b/clang/lib/Sema/SemaTemplateVariadic.cpp
@@ -1510,7 +1510,7 @@ static void CheckFoldOperand(Sema &S, Expr *E) {
E = E->IgnoreImpCasts();
auto *OCE = dyn_cast<CXXOperatorCallExpr>(E);
if ((OCE && OCE->isInfixBinaryOp()) || isa<BinaryOperator>(E) ||
- isa<AbstractConditionalOperator>(E)) {
+ isa<AbstractConditionalOperator>(E) || isa<RecoveryExpr>(E)) {
S.Diag(E->getExprLoc(), diag::err_fold_expression_bad_operand)
<< E->getSourceRange()
<< FixItHint::CreateInsertion(E->getBeginLoc(), "(")
diff --git a/clang/test/SemaCXX/fold_expr_typo.cpp b/clang/test/SemaCXX/fold_expr_typo.cpp
index 0ef9c15b59476..2359d37740056 100644
--- a/clang/test/SemaCXX/fold_expr_typo.cpp
+++ b/clang/test/SemaCXX/fold_expr_typo.cpp
@@ -12,3 +12,8 @@ template <typename... U> struct A {
foo<T>((... + static_cast<U>(1))); // expected-error {{expression contains unexpanded parameter pack 'T'}}
}
};
+
+template <typename ... T>
+void foo(T... Params) {
+ (Params ?: 1, ...); // expected-error {{expression not permitted as operand of fold expression}}
+}
More information about the cfe-commits
mailing list