Bug 4606 – access modifier causes failure to find stack pointer for template delegate
Status
RESOLVED
Resolution
FIXED
Severity
major
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2010-08-09T09:40:36Z
Last change time
2019-12-10T13:40:52Z
Keywords
rejects-valid
Assigned to
No Owner
Creator
andy
Comments
Comment #0 by andy — 2010-08-09T09:40:36Z
I encountered a problem while trying to change the less template parameter of the setIntersection function in std.algorithm. I finally distilled the problem down to a simple example.
<code>
#!/usr/bin/env rdmd
import std.stdio;
struct Test(alias less)
{
public:
void doit()
{
less(1, 2);
}
}
void main()
{
int x = 5;
auto f = delegate bool(int a, int b){ writefln("%s %s %s", x, a, b); return a < b; };
auto d = Test!(f)();
d.doit();
}
</code>
In this case, I should see output of "5 1 2", but instead I get a runtime error:
./test.d(10): Error: function test.main.Test!(f).Test.doit cannot access frame of function main
./test.d(19): Error: template instance test.main.Test!(f) error instantiating
If I remove the unneeded "public:" access modifier, the test works as expected. I'm using dmd v2.047 for Mac OS X downloaded from digitalmars.com.
This seems related to the post from Andrei to the d-announce mailing list back in 07-Mar-2009 (http://www.mail-archive.com/[email protected]/msg01332.html).
Comment #1 by yebblies — 2011-07-10T01:06:08Z
The problem is that when trying to decide if a struct is nested or not, StructDeclaration::semantic only checks top-level symbols for functions. It should check inside nested symbols as well.
Comment #2 by razvan.nitu1305 — 2019-12-10T13:40:52Z
The code now compiles fine and outputs "5 1 2". Closing as fixed.