古い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が見つかった。

github.com

github.com

どうやら、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を見てもわからないので、諦める。モヤモヤするが、仕方のないことだ。

残念ながら、俺にわかったのはここまで。非常に中途半端な終わりだが、しょうがない。この調査ログはメモとして残しておくので、有識者の方はいろいろ教えてほしい。