diff --git a/lib/std/core/unsafe.kk b/lib/std/core/unsafe.kk index 54901d825..418596e33 100644 --- a/lib/std/core/unsafe.kk +++ b/lib/std/core/unsafe.kk @@ -10,6 +10,7 @@ module std/core/unsafe import std/core/types +import std/core/hnd // _Unsafe_. This function calls a function and pretends it did not have any effect at all. // Use with utmost care as it should not be used to dismiss user-defined effects that need diff --git a/src/Core/OpenResolve.hs b/src/Core/OpenResolve.hs index 323b00202..3520d9441 100644 --- a/src/Core/OpenResolve.hs +++ b/src/Core/OpenResolve.hs @@ -177,13 +177,13 @@ resOpen (Env penv gamma) eopen effFrom effTo tpFrom tpTo@(TFun targs _ tres) exp in case lsFrom of [] -> -- no handled effect, use cast case lsTo of - [] -> trace (" no handled effect, in no handled effect context: use cast") + [] | matchType tlFrom tlTo -> trace (" no handled effect, in no handled effect context: use cast") expr - _ -> trace (" no handled effect; use none: " ++ show expr) $ - if (isHandlerFree expr) - then trace ("*** remove open-none") $ -- fully total with using any operations that need evidence; just leave it as is - expr - else if (n <= 4) + _ -> + trace (" different effects: " ++ show (ppType penv tlFrom) ++ ", to " ++ show (ppType penv tlTo) + ++ " with effects: " ++ show (map (ppType penv) lsFrom, map (ppType penv) lsTo)) $ + if isHandlerFree expr then expr + else if (n <= 4) then wrapper (resolve (nameOpenNone n)) [] -- fails in perf1c with exceeded stack size if --optmaxdup < 500 (since it prevents a tailcall) -- expr -- fails in nim as it evidence is not cleared else wrapperThunk (resolve (nameOpenNone 0)) [] @@ -236,9 +236,10 @@ isHandlerFree expr -> case handlerFreeFunType (typeOf vname) of Nothing -> True Just ok -> ok - Var vname _ -> case handlerFreeFunType (typeOf vname) of - Nothing -> True - Just ok -> ok && (isSystemCoreName (getName vname)) + Var vname _ -> case handlerFreeFunType (typeOf vname) of + Nothing -> True -- Simple vars are handler free + -- We cannot assume function types are handler free (since they can use handlers internally without an effect type) + _ -> False Con{} -> True Lit{} -> True _ -> False diff --git a/test/cgen/open-resolve.kk b/test/cgen/open-resolve.kk new file mode 100644 index 000000000..0c254cdc6 --- /dev/null +++ b/test/cgen/open-resolve.kk @@ -0,0 +1,13 @@ +import std/os/path +import std/os/env + +effect val package-root: path + +fun main() + println("Expecting :" ++ (cwd() / ".kokac").show) + with set-package-root(cwd()) + println(package-root) + +noinline fun set-package-root(root: path, f: () -> a): a + with val package-root = root / ".kokac" + f() \ No newline at end of file diff --git a/test/cgen/open-resolve.kk.out b/test/cgen/open-resolve.kk.out new file mode 100644 index 000000000..af5feab76 --- /dev/null +++ b/test/cgen/open-resolve.kk.out @@ -0,0 +1,2 @@ +Expecting :"@@@/@kokac" +"@@@/@kokac" \ No newline at end of file