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 ...