[cxx-abi-dev] Mangling C++0x Lambdas

Doug Gregor doug.gregor at gmail.com
Wed Dec 17 16:40:08 UTC 2008


On Wed, Dec 17, 2008 at 8:28 AM, David Vandevoorde <daveed at edg.com> wrote:
>
> On Dec 17, 2008, at 11:17 AM, Doug Gregor wrote:
>
>> On Wed, Dec 17, 2008 at 8:00 AM, David Vandevoorde <daveed at edg.com> wrote:
>>>
>>> On Dec 17, 2008, at 10:39 AM, John Freeman wrote:
>>>
>>>> Doug Gregor wrote:
>>>>>
>>>>> We need something that encodes the context of the lambda (function
>>>>> "::foo" with no parameters) followed by, perhaps, a numbering scheme
>>>>> within that context. The context encoding needs to account for (at
>>>>> least) inline functions, classes, and namespaces.
>>>>>
>>>>
>>>> This sounds like a problem that must have been encountered before.  Is
>>>> there already a solution for it?  At least for the unnumbered portion?
>>>
>>>
>>> Yes, see 5.1.6.  We can reuse that general scheme for local lambdas.
>>>  E.g.:
>>>
>>>      <local-lambda-name> := Z <function encoding> E l [<discriminator>]
>>>
>>> and maybe introduce something similar for local unnamed classes:
>>>
>>>      <local-unnamed-class_name> := Z <function encoding> E u
>>> [<discriminator>]
>>>
>>>
>>> A tougher problem are namespace-scope lambdas (e.g., in initializers or
>>> default arguments).
>>
>> In an initializer, we could mangle the name of the entity being
>> initialized (and then a counter, in case there are multiple lambdas in
>> the initializer).
>
>
> I'm not sure that we need to deal with the initializer case at all, because
> I _think_ that such a lambda would only be referenced internally.

  struct X {
    template <typename Lambda> X(Lambda);
  };

  X x = [](int x) -> int { return x; };

We'll need to mangle X's constructor with the name of the lambda.

>> In a default argument, we could mangle it as if it's part of the
>> entity where the default argument lives (in a function or template).
>
>
> I believe it would require a different code from the entities local to that
> function/template, though (since the the two might not coexist in the same
> translation unit).

Ah, right. So we need to have a separate mangling scheme and counter
for the default arguments and for the entities local to that
function/template.

> I'm concerned that there might be other contexts where there isn't a
> "top-level" entity to key off from.  For example, explicit template
> instantiations are such a context.

Oh, yuck.

  - Doug



More information about the cxx-abi-dev mailing list