May 12, 2023
https://issues.dlang.org/show_bug.cgi?id=23918

          Issue ID: 23918
           Summary: Lambdas declared as "function" should be static and
                    not have a context
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Keywords: rejects-valid
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody@puremagic.com
          Reporter: dlang-bugzilla@thecybershadow.net

/////////////////// test.d ///////////////////
struct BobsContext
{
    void bobWhoAlreadyHasAContext(alias fun)()
    {
        fun(1);
    }
}

void main()
{
    BobsContext b;

    // Works:
    {
        void fun(X)(X x) {}
        b.bobWhoAlreadyHasAContext!fun();
    }

    // Doesn't work:
    {
        alias fun = function (x) {};
        b.bobWhoAlreadyHasAContext!fun();
    }
}
//////////////////////////////////////////////

(DMD currently produces the "function requires a dual-context" deprecation)

Leaving aside the question of why lambdas don't have their need for context auto-detected like normal template functions... if the user writes the keyword "function", that should effectively make the lambda static and not require a context.

If this somehow ends up too much of a breaking change... the "static" keyword is currently not accepted in lambda / anonymous function literals, but it could be.

--