Bug 20308 – frame access regression

Status
NEW
Severity
regression
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2019-10-20T20:56:51Z
Last change time
2024-12-13T19:05:56Z
Assigned to
No Owner
Creator
John Colvin
Moved to GitHub: dmd#19631 →

Comments

Comment #0 by john.loughran.colvin — 2019-10-20T20:56:51Z
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.1
Comment #1 by timon.gehr — 2019-12-13T01:45:19Z
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.
Comment #2 by robert.schadek — 2024-12-13T19:05:56Z
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/19631 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB