[PATCH] D62550: [coroutines][PR41909] Don't build dependent coroutine statements for generic lambda

Richard Smith - zygoloid via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Jun 2 23:44:29 PDT 2019

rsmith added inline comments.

Comment at: cfe/trunk/lib/Sema/TreeTransform.h:7173
+    auto *MD = dyn_cast_or_null<CXXMethodDecl>(FD);
+    if (!MD || !MD->getParent()->isGenericLambda()) {
+      assert(!Promise->getType()->isDependentType() &&
This assert doesn't seem correct to me; there's no reason to assume we have a generic lambda here. (A non-generic lambda inside a generic lambda, whose parameter types are dependent on the generic lambda's parameters, would hit exactly the same issue, for instance.)

Generally we should write the template instantiation code so it could be used to substitute into the definition of a function template to produce another function template, even if we happen to never call it that way right now (though deduction guide processing gets pretty close). The right thing to do here is to either substitute into the representation we already formed (building a dependent representation if it's still dependent and a non-dependent representation otherwise) or to rebuild the coroutine body from scratch (again, creating a dependent representation if the result is still dependent).




More information about the llvm-commits mailing list