You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Unfortunately the reason for this regression is that the bug I fixed was masking another unrelated bug. I.e., this is not my fault and I cannot fix it very easily. DMD doesn't know that your handler lambdas do not need a frame pointer at the time it checks for frame pointer accessibility. Due to the bug fixed in https://github.com/dlang/dmd/pull/10214, DMD used to think that the lambdas are not nested in a function.
The following workaround makes the code compile:
void main(){
static handler0(double z){ return z; }
static handler1(T)(T y){ return y; }
assert(
S!(handler0, handler1)
.call!(r => r(1))()
== 1);
}
This allows DMD to see that the handlers are static functions without analyzing their bodies.
John Colvin (@John-Colvin) reported this on 2019-10-20T20:56:51Z
Transferred from https://issues.dlang.org/show_bug.cgi?id=20308
CC List
Description
template OverloadSet(Args ...) { static foreach (Arg; Args) alias overloads = Arg; } struct S(handlers ...) { static struct HandlerGroup { static opCall(int a) { return OverloadSet!(handlers).overloads(a); } } static auto ref call(alias f)() { return f(HandlerGroup.init); } } void main() { assert( S!((double z) => z, y => y) .call!(r => r(1))() == 1); } onlineapp.d(13): Error: static function onlineapp.main.S!(function (double z) => z, (y) => y).S.HandlerGroup.opCall cannot access frame of function D main onlineapp.d(26): Error: template instance `onlineapp.main.S!(function (double z) => z, (y) => y)` error instantiating The regression was introduced by https://github.com/dlang/dmd/pull/10214 and was released in 2.087.1The text was updated successfully, but these errors were encountered: