Hi Jason, I did find some code in the end but it wasn't much use due to the changes in gcc/cp since the old lambda branch from which the original patch was based.
I've since been finding 10 minutes here and there to have a hack about and have finally got the first stage of generic lambda support functional against GCC's trunk. It currently only supports the explicit template-style syntax of the second (non approved) paper (and my original patch) but I believe this is good place to start even if it is considered a GNU extension for now. I will try to reapply the 'auto' syntax patch at some point but that is syntactic rather than a behavioral. I want to fix up the stateless lambda ptr-to-fn conversion-op stuff next which, I think, is currently the biggest wheel off mechanically. I've no idea how well this will deal with parameter packs or more exotic use cases than the simple test program below but I'd welcome any feedback at this stage. I do feel like I've gone backward with this but I think it's worth getting the mechanical side working right with the latest GCC before integrating the 'auto' parameter patch. Cheers, Adam ########## begin test program ############## // to check generated asm // volatile int E = 1; volatile int F = 2; volatile int G = 3; volatile int H = 4; // instantiation generates a -Wwrite-strings warning showing the type // bindings for T and U (currently not displayed in generic lambda // diagnostics) as part of the synthesized constructor. // template <typename T, typename U> struct diagnostic { char* x = ""; }; int main() { int i = 1; // e: monomorphic stateless lambda // f: monomorphic closure // g: polymorphic stateless lambda // (Note: explicit return type specified to avoid current // conversion-op bug) // h: polymorphic closure // auto e = [] (char a, char b) { return E + a + b; }; auto f = [i] (char a, char b) { return F + i + a + b; }; auto g = [] <typename T, typename U> (T a, U b) -> double { diagnostic<T,U>(); return G + a + b; }; auto h = [i] <typename T, typename U> (T a, U b) { diagnostic<T,U>(); return H + i + a + b; }; // SEGV currently: conversion-op not implemented correctly yet: // int (*p) (char, float) = g; // int (*q) (int, double) = g; return g (1.0, 2) + h (2.f, '\003'); } ########## end test program ##############