opaque enum declaration

gccメーリングリストに、enum の前方宣言に関するパッチが、未完成ながらも投げられています。簡単そうなので enum class と一緒に実装されててもいいのに、と思っていたんですが、割合面倒なようです。

gcc の現在のツリー構造では「まだ enumrator list を取っていない状態」を表すことができない、というのが一番大きい問題のようです。現在は enumrator list が空かどうかで前方宣言かどうかを判定しているようですが、これは当然下のようなコードで問題となります。

enum class E {};
enum class E { A, B, C };

もう一つ、デバッグ情報が前方宣言の位置で生成されてしまう(enumrator list が空の enum として扱われてしまう)問題があるようです。現在の実装だと、前方宣言か enumrator list を含む定義かどうかでツリーの種類が変わらないせいな気がしますね。

前者はともかく、後者の問題を考えると、結局ツリーの定義を弄るしかないんじゃないかなあ、という感じですが、今の所、既存のフラグを利用して判別しようとしているようです。

あとこのパッチ、unscoped enum の前方宣言で underlying がない(enum-base がない)時のエラーが "different underlying type in enum ..." なのはちょっとイマイチなんじゃないかなあ…