================ @@ -7963,6 +7967,148 @@ static Attr *getCCTypeAttr(ASTContext &Ctx, ParsedAttr &Attr) { llvm_unreachable("unexpected attribute kind!"); } +ExprResult Sema::ActOnEffectExpression(Expr *CondExpr, FunctionEffectMode &Mode, + bool RequireConstexpr) { + // see checkFunctionConditionAttr, Sema::CheckCXXBooleanCondition + if (RequireConstexpr || !CondExpr->isTypeDependent()) { + ExprResult E = PerformContextuallyConvertToBool(CondExpr); + if (E.isInvalid()) + return E; + CondExpr = E.get(); + if (RequireConstexpr || !CondExpr->isValueDependent()) { + llvm::APSInt CondInt; + E = VerifyIntegerConstantExpression( ---------------- dougsonos wrote:
Thanks. With the unexpanded pack: During initial parsing of the function type, it's seen as dependent and represented that way, holding onto the condition. Is there a way at this time to detect that the expression is not only dependent but an unexpanded pack? Maybe it's as simple as `E->containsUnexpandedParameterPack()`? That looks promising, but it's bugging me that there are no (obvious) precedents for this. If I add `void g() { f<true, false>(); }` there is a second attempt to resolve the expression but it is still dependent, so clearly there is an error here. But I can imagine cases where it takes more than one level of template instantiation for a dependent expression to be resolved. https://github.com/llvm/llvm-project/pull/84983 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits