clash-lang / clash-compiler

Haskell to VHDL/Verilog/SystemVerilog compiler
https://clash-lang.org/
Other
1.43k stars 152 forks source link

Evaluator fails impredicative type instantiation of error values #2272

Closed christiaanb closed 2 years ago

christiaanb commented 2 years ago
{-# LANGUAGE ImpredicativeTypes, TypeApplications, GADTs #-}
module ImpredErr where

import Clash.Prelude

data Ex where
  ExT :: (forall a . String -> a) -> Ex

f :: Ex
f = ExT (errorX @(forall b . String -> b) "qq")
{-# NOINLINE f #-}

topEntity :: Int
topEntity = case f of
  ExT h -> h "kk"

fails with:

    Clash error call:
    Evaluator.instantiate: Not a tylambda: PrimVal (PrimInfo {primName = "Clash.XException.errorX", primType = ForAllTy (TyVar {varName = Name {nameSort = User, nameOcc = "a", nameUniq = 6989586621679042592, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}, varUniq = 6989586621679042592, varType = AppTy (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Prim.TYPE", nameUniq = 3674937295934324912, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}))) (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Types.LiftedRep", nameUniq = 3891110078048108766, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48})))}) (AppTy (AppTy (ConstTy Arrow) (AppTy (AppTy (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Classes.IP", nameUniq = 3602879701896396848, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}))) (LitTy (SymTy "callStack"))) (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Stack.Types.CallStack", nameUniq = 3674937295934325108, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}))))) (AppTy (AppTy (ConstTy Arrow) (AppTy (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Types.[]", nameUniq = 3674937295934324788, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}))) (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Types.Char", nameUniq = 3674937295934324752, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}))))) (VarTy (TyVar {varName = Name {nameSort = User, nameOcc = "a", nameUniq = 6989586621679042592, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}, varUniq = 6989586621679042592, varType = AppTy (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Prim.TYPE", nameUniq = 3674937295934324912, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}))) (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Types.LiftedRep", nameUniq = 3891110078048108766, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48})))})))), primWorkInfo = WorkConstant, primMultiResult = SingleResult, primUnfolding = Unfolding (Id {varName = Name {nameSort = User, nameOcc = "Clash.XException.errorX", nameUniq = 8214565720323787764, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}, varUniq = 8214565720323787764, varType = ForAllTy (TyVar {varName = Name {nameSort = User, nameOcc = "a", nameUniq = 6989586621679042592, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}, varUniq = 6989586621679042592, varType = AppTy (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Prim.TYPE", nameUniq = 3674937295934324912, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}))) (ConstTy (TyCon (Name {nameSort = User, 
nameOcc = "GHC.Types.LiftedRep", nameUniq = 3891110078048108766, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48})))}) (AppTy (AppTy (ConstTy Arrow) (AppTy (AppTy (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Classes.IP", nameUniq = 3602879701896396848, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}))) (LitTy (SymTy "callStack"))) (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Stack.Types.CallStack", nameUniq = 3674937295934325108, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}))))) (AppTy (AppTy (ConstTy Arrow) (AppTy (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Types.[]", nameUniq = 3674937295934324788, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}))) (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Types.Char", nameUniq = 3674937295934324752, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}))))) (VarTy (TyVar {varName = Name {nameSort = User, nameOcc = "a", nameUniq = 6989586621679042592, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}, varUniq = 6989586621679042592, varType = AppTy (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Prim.TYPE", nameUniq = 3674937295934324912, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}))) (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Types.LiftedRep", nameUniq = 3891110078048108766, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48})))})))), idScope = GlobalId})}) [ForAllTy (TyVar {varName = Name {nameSort = User, nameOcc = "b", nameUniq = 6989586621679042239, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 26 27}, varUniq = 6989586621679042239, varType = AppTy (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Prim.TYPE", nameUniq = 3674937295934324912, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}))) (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Types.LiftedRep", nameUniq = 3891110078048108766, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48})))}) (AppTy (AppTy (ConstTy Arrow) (AppTy (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Types.[]", nameUniq = 3674937295934324788, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}))) (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Types.Char", nameUniq = 3674937295934324752, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}))))) (VarTy (TyVar {varName = Name {nameSort = User, nameOcc = "b", nameUniq = 6989586621679042239, 
nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 26 27}, varUniq = 6989586621679042239, varType = AppTy (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Prim.TYPE", nameUniq = 3674937295934324912, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}))) (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Types.LiftedRep", nameUniq = 3891110078048108766, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48})))})))] [Suspend (TyApp (Prim (PrimInfo {primName = "Clash.Normalize.Primitives.removedArg", primType = ForAllTy (TyVar {varName = Name {nameSort = System, nameOcc = "a", nameUniq = 0, nameLoc = UnhelpfulSpan "<no location info>"}, varUniq = 0, varType = ConstTy (TyCon (Name {nameSort = System, nameOcc = "Type", nameUniq = 3674937295934324910, nameLoc = UnhelpfulSpan "<no location info>"}))}) (VarTy (TyVar {varName = Name {nameSort = System, nameOcc = "a", nameUniq = 0, nameLoc = UnhelpfulSpan "<no location info>"}, varUniq = 0, varType = ConstTy (TyCon (Name {nameSort = System, nameOcc = "Type", nameUniq = 3674937295934324910, nameLoc = UnhelpfulSpan "<no location info>"}))})), primWorkInfo = WorkNever, primMultiResult = SingleResult, primUnfolding = NoUnfolding})) (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Stack.Types.CallStack", nameUniq = 3674937295934325108, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48})))),Suspend (TyApp (Prim (PrimInfo {primName = "Clash.Normalize.Primitives.removedArg", primType = ForAllTy (TyVar {varName = Name {nameSort = System, nameOcc = "a", nameUniq = 0, nameLoc = UnhelpfulSpan "<no location info>"}, varUniq = 0, 
varType = ConstTy (TyCon (Name {nameSort = System, nameOcc = "Type", nameUniq = 3674937295934324910, nameLoc = UnhelpfulSpan "<no location info>"}))}) (VarTy (TyVar {varName = Name {nameSort = System, 
nameOcc = "a", nameUniq = 0, nameLoc = UnhelpfulSpan "<no location info>"}, varUniq = 0, varType = ConstTy (TyCon (Name {nameSort = System, nameOcc = "Type", nameUniq = 3674937295934324910, nameLoc = UnhelpfulSpan "<no location info>"}))})), primWorkInfo = WorkNever, primMultiResult = SingleResult, primUnfolding = NoUnfolding})) (AppTy (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Types.[]", nameUniq = 3674937295934324788, nameLoc = RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48}))) (ConstTy (TyCon (Name {nameSort = User, nameOcc = "GHC.Types.Char", nameUniq = 3674937295934324752, nameLoc 
= RealSrcSpan SrcSpanOneLine "Test.hs" 10 9 48})))))]
    CallStack (from HasCallStack):
      error, called at src-ghc\\Clash\\GHC\\Evaluator.hs:348:23 in clash-ghc-1.7.0-inplace:Clash.GHC.Evaluator
martijnbastiaan commented 2 years ago

We've released v1.6.4, which includes a fix for this issue.