https://issues.dlang.org/show_bug.cgi?id=15389
Walter Bright <[email protected]> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |[email protected] --- Comment #2 from Walter Bright <[email protected]> --- (In reply to Manu from comment #1) > This may be related to apparent circular referencing issues: > > module x; > import y; > extern(C++, ns) class X { Y v; } > > > module y; > import x; > extern(C++, ns) class Y { X v; } > > y.d(3): Error: undefined identifier 'X' A misunderstanding of how namespace lookup works in D. Namespaces in D: 1. follow D lookup rules 2. follow C++ mangling rules The example of: Y y; is clearly assuming that C++ namespace lookup rules are being followed. They are not, D lookup rules are. Y is declared in x.y.ns, not x.x.ns. As far as the compiler is concerned, x.y.ns and x.x.ns are different namespaces (although they will mangle the same). Thus, "Y" should be "x.y.ns.Y". You can see this if you replace "extern(C++, ns)" with "struct ns". You'll get the SAME error message! Not a D bug. > extern(C++, ns) class Y { x.X v; } > > y.d(3): Error: undefined identifier 'X' in module 'x' Same issue. Should be "x.ns.X", as X is in the scope of x.ns. Not a D bug. > extern(C++, ns) class Y { x.ns.X v; } > > y.d(3): Error: identifier 'X' of 'x.ns.X' is not defined > y.d(3): Error: x.ns.X is used as a type Filed as https://issues.dlang.org/show_bug.cgi?id=15503 > import x : XX = X; > extern(C++, ns) class Y { XX v; } > > y.d(2): Error: module x import 'X' not found Because it's ns.X, not X. Not a D bug. > import x : NS = ns; > extern(C++, ns) class Y { NS.X v; } > > y.d(3): Error: identifier 'X' of 'NS.X' is not defined > y.d(3): Error: NS.X is used as a type Probably the same issue as https://issues.dlang.org/show_bug.cgi?id=15503 > import x : XX = ns.X; > extern(C++, ns) class Y { XX v; } > > y.d(2): Error: ';' expected > y.d(2): Error: no identifier for declarator X Supporting the . in the import would be an enhancement request. --
