[PATCH] D36915: [Sema] Diagnose local variables and parameters captured by lambda and block expressions in a default argument

Faisal Vali via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Aug 28 13:00:58 PDT 2017

faisalv added a comment.

In https://reviews.llvm.org/D36915#854317, @ahatanak wrote:

> In https://reviews.llvm.org/D36915#849622, @faisalv wrote:
> > I don't think this approach is entirely correct for at least the following reasons:
> >
> > 1. in the lambda case the machinery that diagnoses capture failures should be the machinery erroring on the lambda (when the parameter is odr-used)
> Does this mean that it is OK to have a parameter or local variable appear in a potentially-evaluated expression as long as it is not odr-used? I think this is slightly different from the standard, which says a parameter or local variable cannot appear as a potentially-evaluated expression in a default argument.
> For example:
>   void foo2(int);
>   void func() {
>     const int a = 1;
>     void foo1(S s = [](){ foo2(a); }); // "a" is not in an unevaluated context and is not odr-used.
>   }
> I think I need clarification as it will affect how or where we detect this error.

'a' is not captured (and does not need to be captured) above, so I think that code should be ok.

But I also think the following code should be ok at local scope within func.
void foo(int = a);

I thought there was a DR against the standard-draft with the intent of making these valid (if they are not already so)?


More information about the cfe-commits mailing list