# 071: regFixity で qname 登録するのはイマイチっぽい [↑up](bunny_notes) - issued: 2020-05-10 - 分類: 分類:D 要調査 - status: Open ## 概要 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 宣言は省略されてもいいわけなので、これに依存するのはよくない。

### 2020-05-11

infix 宣言時に qname 登録するしかしようがない気がする。

基本は(いままではすべて)vardecl の rename 時という考えなのだけど、
vardecl をただしくするには、fixity resolution が必要。
つまり、vardecl で qname を登録できるより早く fixity resolution を解決しないと
いけないので、infix 宣言がある場合には、ここでただしく lookup できないといけない。
なお、fixity resolution で lookup 以前に qname が引けなかったケースは、
デフォルトの fixity としなければならない(qname not found でエラーしてはダメ)。