//related to: http://dstress.kuehne.cn/run/forward_reference_[07-11].d //doesn't work in almost all contexts interface Test { Policy fn(); } //same for classes, unions and structs enum Policy {Default, Cached, Direct} void main() { }
the simplest test case is something like this: X x; enum X { Y }; Fails to compile with 'enum is forward referenced' error. This issue came up on IRC and I decided to take a look what was going on. The issue is that the basetype cannot be resolved. A working workaround is: X x; enum X : int { Y }; This patch (against LLVMDC, might not match 100%) ... Index: dmd/declaration.c =================================================================== --- dmd/declaration.c (revision 135) +++ dmd/declaration.c (working copy) @@ -642,6 +642,7 @@ Dsymbol *parent = toParent(); FuncDeclaration *fd = parent->isFuncDeclaration(); + type->semantic(loc,sc); Type *tb = type->toBasetype(); if (tb->ty == Tvoid && !(storage_class & STClazy)) { error("voids have no value"); ... also fixes the problem. I have no idea what other problems it might introduce though... Also I doubt it will fix all the variations of this issue. I haven't looked enough at the semantics code in DMD to fix this properly. However, this seems like something that shouldn't be *that* hard to fix... Why not put in the works for Type::toBaseType to be able to run semantics? Please enlighten me (us) as to why this is implemented as it is right now!
The patch doesn't work generally because the context (sc) for the type may be very different from the context for the enum.
Changeset 318
Fixed dmd 1.054 and 2.038
AltStyle によって変換されたページ (->オリジナル) / アドレス: モード: デフォルト 音声ブラウザ ルビ付き 配色反転 文字拡大 モバイル