================
@@ -15512,6 +15512,8 @@ TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr 
*E) {
     DC = DC->getParent();
   if ((getSema().isUnevaluatedContext() ||
        getSema().isConstantEvaluatedContext()) &&
+      !(dyn_cast_or_null<CXXRecordDecl>(DC->getParent()) &&
+        cast<CXXRecordDecl>(DC->getParent())->isGenericLambda()) &&
       (DC->isFileContext() || !DC->getParent()->isDependentContext()))
----------------
zyn0217 wrote:

So if I understand correctly, the inner generic lambda was previously caught by 
`!DC->getParent()->isDependentContext()` because its parent, despite it being a 
generic, is living in a non-dependent context such that the parent is never 
dependent which entails !isDependentContext()?

I am not quite sure if the approach is correct because the semantic of the 
dependency kind for lambda is sometimes counter-intuitive. For example, we even 
consider a generic lambda non-dependent if it lives in e.g. a namespace scope.

On the other hand, if the outer lambda (assuming it is generic) gets 
instantiated, then the 'generic' flag on it is still preserved, see 
`TransformTemplateParameterList()` in this function below and 
`CompleteLambdaCallOperator`, so at the time when the nested lambdas are 
half-transformed, the inner dependency kind might still be unexpected.

@mizvekov has been working on the removal of the DependencyKind and he might 
have some ideas too.


https://github.com/llvm/llvm-project/pull/149121
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to