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

Doug Gregor doug.gregor at gmail.com
Wed Dec 17 17:05:51 UTC 2008


On Wed, Dec 17, 2008 at 8:46 AM, David Vandevoorde <daveed at edg.com> wrote:
>
> On Dec 17, 2008, at 11:40 AM, Doug Gregor wrote:
>
>> 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.
>
>
> But that call and construct is internal to whatever TU x is defined in, no?

Ah, right. Well, decltype will surely get us into trouble:

  template<typename Lambda> struct Y { };

  Y<decltype([](int x) -> int { return x; })> y;

  - Doug



More information about the cxx-abi-dev mailing list