古いNimでSegmentation Faultがコンパイル時に出るコード
type Test = concept x Obj[T: Test] = object proc f[T: Test](): Obj[T]
理由はわからないが、古いNimではセグフォが出る。Wandboxというサイト(オンラインでプログラムが実行できて、言語やバージョンも選べる)を使って調べたところ、0.17.0ではセグフォが発生するが、0.17.2ではimplementation of 'f()' expected
(一部省略)と怒られるだけである。謎だ。
以下おまけ(見なくてもよい)
このままだとモヤモヤするので、調べてみることにする。すると、今回のケースにマッチするissueと、その修正commitが見つかった。
どうやら、sigmatch.nim
に一行追加があったらしい。(色が非常に見にくいのは許してほしい)
of tyUserTypeClass, tyUserTypeClassInst: - # consider this: 'var g: Node' *within* a concept where 'Node' - # is a concept too (tgraph) - let x = typeRel(c, a, f, flags + {trDontBind}) - if x >= isGeneric: - return isGeneric + if c.c.matchedConcept != nil: + # consider this: 'var g: Node' *within* a concept where 'Node' + # is a concept too (tgraph) + let x = typeRel(c, a, f, flags + {trDontBind}) + if x >= isGeneric: + return isGeneric
うーむ、なんのこっちゃわからん。このc.c.matchedConcept
が重要らしいが、よくわからない。sigmatch.nim
を見てもわからないので、諦める。モヤモヤするが、仕方のないことだ。
残念ながら、俺にわかったのはここまで。非常に中途半端な終わりだが、しょうがない。この調査ログはメモとして残しておくので、有識者の方はいろいろ教えてほしい。