This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix PR c++/70121 (premature folding of const var that was implicitly captured)

On Thu, Mar 10, 2016 at 5:58 PM, Patrick Palka <> wrote:
> Within a lambda we should implicitly capture an outer const variable
> only if it's odr-used in the body of the lambda.  But we are currently
> making the decision of whether to capture such a variable, or else to
> fold it to a constant, too early -- before we can know whether it's
> being odr-used or not.  So we currently always fold a const variable to
> a constant if possible instead of otherwise capturing it, but of course
> doing this is wrong if e.g. the address of this variable is taken inside
> the lambda's body.
> This patch reverses the behavior of process_outer_var_ref, so that we
> always implicitly capture a const variable if it's capturable, instead
> of always trying to first fold it to a constant.  This behavior however
> is wrong too, and introduces a different but perhaps less important
> regression: if we implicitly capture by value a const object that is not
> actually odr-used within the body of the lambda, we may introduce a
> redundant call to its copy/move constructor, see pr70121-2.C.
> Ideally we should be capturing a variable only if it's not odr-used

Er, this sentence should read

  Ideally we should be _implicitly_ capturing a variable only if it
_is_ odr-used ...

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]