t4.3.3.1a.hs:
$ cat testcases/t4.4.3.1a.hs infixr 5 ## a ## b : xs = a : xs main = print $ 'z' ## "abc"
これをコンパイルしたときに、qname not found : ## となった。これは、 Rename.resolveFixity で、lookupInfixOp の際に ## の qname が見つからなかったのが原因だったので、ひとまず、infixr 5 ## のときに qname が登録されるようにしてみたが…
--- a/compiler/src/RenUtil.hs +++ b/compiler/src/RenUtil.hs @@ -155,10 +155,9 @@ regFixity f i (n:ns) = do reg (trFixity f i) n; regFixity f i ns trFixity A.Infixr = Fixity RightAssoc trFixity A.Infix = Fixity NoAssoc reg finfo name = do - (lv:_) <- getLvs ifxenv <- getIfxenv - let qn = lvPrefix lv ++ "." ++ origName name - ifxenv' = insert qn finfo ifxenv + qn <- renameVar name + let ifxenv' = insert qn finfo ifxenv if defined (tabLookup qn ifxenv) then fail $ "duplicate fixity declaration:" ++ qn else putIfxenv ifxenv'
infix 宣言は省略されてもいいわけなので、これに依存するのはよくない。
infix 宣言時に qname 登録するしかしようがない気がする。
基本は(いままではすべて)vardecl の rename 時という考えなのだけど、 vardecl をただしくするには、fixity resolution が必要。 つまり、vardecl で qname を登録できるより早く fixity resolution を解決しないと いけないので、infix 宣言がある場合には、ここでただしく lookup できないといけない。 なお、fixity resolution で lookup 以前に qname が引けなかったケースは、 デフォルトの fixity としなければならない(qname not found でエラーしてはダメ)。