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).
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.
The code now compiles fine and outputs "5 1 2". Closing as fixed.