================
@@ -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

Reply via email to