[clang] [Clang] Handle ?: operator in fold expression (PR #164019)

Azmat Yusuf via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 17 14:21:12 PDT 2025


https://github.com/azmat-y created https://github.com/llvm/llvm-project/pull/164019

Emit diagnostic when the fold operand produces a RecoveryExpr. This solves #162198 @shafik

>From 8c59af5c6e77f40151290e1b4e4e4894d080ee08 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 +-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index dca9d6e7ea358..48cfb250b6579 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(), "(")



More information about the cfe-commits mailing list