Bug 3286 – Default parameter prevents to resolve inter-module circular dependency

Status
RESOLVED
Resolution
FIXED
Severity
major
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2009-09-03T07:57:00Z
Last change time
2015-06-09T01:26:48Z
Keywords
patch, rejects-valid
Assigned to
nobody
Creator
hskwk

Comments

Comment #0 by hskwk — 2009-09-03T07:57:52Z
module a; import b; import c; class A { static __gshared A a; void f(B b) {} void g(C c) {} // <- Error: identifier 'C' is not defined } //////////// module b; import a; class B { void f(A x = A.a) {} } //////////// module c; import a; class C { void f(A x = A.a) {} } There is no problem if class A, B and C are in the same module. So this dependency is valid and the error is specific for inter-module circular dependency. If default parameter "= A.a" for B.f is removed, it goes well. There is no problem if A.a appeared in the body of B.f. It seems that the compiler tries to recognize the semantics of default parameter A.a when it is reading declaration of B.f. Default parameters are usually hint for the expressions which call the functions with default parameters, this behavior is inexplicable. This error is a regression between 2.031 and 2.032.
Comment #1 by hskwk — 2009-09-03T08:22:24Z
Sorry, this error is NOT a regression between 2.031 and 2.032. This error is occur with 2.031. I found similar error which is a regression between 2.031 and 2.032, and I was confused. Sorry.
Comment #2 by r.sagitario — 2009-09-18T00:49:24Z
The patch in issue 3301 also fixes this issue.
Comment #3 by bugzilla — 2009-10-13T13:47:07Z
Fixed dmd 1.049 and 2.034