D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 4606 - access modifier causes failure to find stack pointer for template delegate
Summary: access modifier causes failure to find stack pointer for template delegate
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: All All
: P2 major
Assignee: No Owner
URL:
Keywords: rejects-valid
Depends on:
Blocks:
 
Reported: 2010-08-09 09:40 UTC by andy
Modified: 2019-12-10 13:40 UTC (History)
4 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description andy 2010-08-09 09:40:36 UTC
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/digitalmars-d-announce@puremagic.com/msg01332.html).
Comment 1 yebblies 2011-07-10 01:06:08 UTC
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 RazvanN 2019-12-10 13:40:52 UTC
The code now compiles fine and outputs "5 1 2". Closing as fixed.