D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 20308 - frame access regression
Summary: frame access regression
Status: NEW
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: All All
: P1 regression
Assignee: No Owner
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2019-10-20 20:56 UTC by John Colvin
Modified: 2024-12-13 19:05 UTC (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description John Colvin 2019-10-20 20:56:51 UTC
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 timon.gehr 2019-12-13 01:45:19 UTC
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 dlangBugzillaToGithub 2024-12-13 19:05:56 UTC
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