On Friday, December 04, 2015 08:12:05 Andre via Digitalmars-d-learn wrote: > Hi, > > I have a strange issue with following coding. > > void baz(); // forward declaration > > void foo() > { > void bar() > { > baz(); // (1) without f.d. syntax error > } > > void baz() > { > bar(); > } > > baz(); // (2) No linker error if line is removed > } > > void main() > { > foo(); > } > > Without the forward declaration, there is a syntax error at (1) > With the forward declaration there is no syntax error but > a linker error at (2). This linker error disappears if line at (2) > is removed. > It looks like a bug, is it?
You cannot use symbols before you declare them in a function (even if they're nested functions), and you can't forward declare them. When you declare baz outside of foo, bar is now trying to use a different baz from the one that you declare after it. Rather, it's trying to use one that's at the module-level, not a nested function. And you never defined that baz. So, you get a linker error when you use it. What's going on would be clearer if you used distinct names: void module_baz(); void foo() { void bar() { module_baz(); } void baz() { bar(); } baz(); } While that may not be what you're trying to do, it's what you're actually doing. Mutually recursive nested functions aren't possible in D. - Jonathan M Davis