diff --git a/checks/Check.hs b/checks/Check.hs index 054da06..e103434 100644 --- a/checks/Check.hs +++ b/checks/Check.hs @@ -23,6 +23,7 @@ with this program. If not, see . module Check (checkInitVar, usageCheckPass) where import Control.Monad.Identity +import Data.Generics import Data.Graph.Inductive import Data.List hiding (union) import qualified Data.Map as Map @@ -30,6 +31,7 @@ import Data.Maybe import qualified Data.Set as Set import ArrayUsageCheck +import qualified AST as A import CompState import Errors import FlowAlgorithms @@ -46,6 +48,7 @@ usageCheckPass t = do g' <- buildFlowGraph labelFunctions t Left err -> dieP (findMeta t) err Right g -> return g sequence_ $ checkPar (joinCheckParFunctions checkArrayUsage checkPlainVarUsage) g + checkParAssignUsage t -- TODO add checkInitVar here (need to find roots in the tree) return t @@ -169,3 +172,20 @@ checkInitVar m graph startNode do readVars <- showCodeExSet v writtenVars <- showCodeExSet vs dieP (getMeta n) $ "Variable read from is not written to before-hand, sets are read: " ++ show readVars ++ " and written: " ++ show writtenVars + +checkParAssignUsage :: forall m t. (CSM m, Die m, Data t) => t -> m () +checkParAssignUsage = mapM_ checkParAssign . listify isParAssign + where + isParAssign :: A.Process -> Bool + isParAssign (A.Assign _ vs _) = length vs >= 2 + isParAssign _ = False + + -- | Need to check that all the destinations in a parallel assignment + -- are distinct. So we check plain variables, and array variables + checkParAssign :: A.Process -> m () + checkParAssign (A.Assign m vs _) + = do checkPlainVarUsage (m, mockedupParItems) + checkArrayUsage (m, mockedupParItems) + where + mockedupParItems :: ParItems (Maybe Decl, Vars) + mockedupParItems = ParItems [SeqItems [(Nothing, processVarW v)] | v <- vs] diff --git a/checks/UsageCheckUtils.hs b/checks/UsageCheckUtils.hs index 5da5153..172f9e9 100644 --- a/checks/UsageCheckUtils.hs +++ b/checks/UsageCheckUtils.hs @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . -} -module UsageCheckUtils (customVarCompare, Decl(..), emptyVars, foldUnionVars, getVarProc, labelFunctions, ParItems(..), transformParItems, Var(..), Vars(..), vars) where +module UsageCheckUtils (customVarCompare, Decl(..), emptyVars, foldUnionVars, getVarProc, labelFunctions, mapUnionVars, ParItems(..), processVarW, transformParItems, Var(..), Vars(..), vars) where import Data.Generics hiding (GT) import Data.List @@ -109,7 +109,7 @@ getVarProc (A.Assign _ vars expList) --Join together: = unionVars --The written-to variables on the LHS: - (foldUnionVars (map processVarW vars)) + (mapUnionVars processVarW vars) --All variables read on the RHS: (getVarExpList expList) getVarProc (A.GetTime _ v) = processVarW v