On Thu, Mar 10, 2016 at 6:06 PM, Patrick Palka <patr...@parcs.ath.cx> wrote: > On Thu, Mar 10, 2016 at 5:58 PM, Patrick Palka <patr...@parcs.ath.cx> 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 ...
Ping.