llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Azmat Yusuf (azmat-y) <details> <summary>Changes</summary> Emit diagnostic when the fold operand produces a RecoveryExpr. This solves #<!-- -->162198 @<!-- -->shafik --- Full diff: https://github.com/llvm/llvm-project/pull/164019.diff 3 Files Affected: - (modified) clang/lib/Sema/SemaExpr.cpp (+3) - (modified) clang/lib/Sema/SemaTemplateVariadic.cpp (+1-1) - (modified) clang/test/SemaCXX/fold_expr_typo.cpp (+5) ``````````diff 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}} +} `````````` </details> https://github.com/llvm/llvm-project/pull/164019 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
