@@ -241,6 +241,7 @@ lhsExprs x = concatMap lhsOfStmt (universeBi x)
241241 lhsOfStmt (StExpressionAssign _ _ e e') = e : onExprs e'
242242 lhsOfStmt (StCall _ _ _ (Just aexps)) = filter isLExpr argExps ++ concatMap onExprs argExps
243243 where argExps = map argExtractExpr . aStrip $ aexps
244+ lhsOfStmt s@ (StDo _ _ _ _ (Just dospec)) = lhsOfStmt (dospecAsStmt dospec) ++ onExprs s
244245 lhsOfStmt s = onExprs s
245246
246247 onExprs :: (Data a , Data (c a )) => c a -> [Expression a ]
@@ -273,19 +274,26 @@ allVars b = [ varName v | v@(ExpValue _ _ (ValVariable _)) <- uniBi b ]
273274analyseAllLhsVars :: forall a . Data a => ProgramFile (Analysis a ) -> ProgramFile (Analysis a )
274275analyseAllLhsVars = (transformBi :: TransFunc Block ProgramFile a ) analyseAllLhsVars1 .
275276 (transformBi :: TransFunc Statement ProgramFile a ) analyseAllLhsVars1 .
276- (transformBi :: TransFunc DoSpecification ProgramFile a ) analyseAllLhsVars1
277+ (transformBi :: TransFunc DoSpecification ProgramFile a ) analyseAllLhsVarsDoSpec
277278
278279analyseAllLhsVars1 :: (Annotated f , Data (f (Analysis a )), Data a ) => f (Analysis a ) -> f (Analysis a )
279280analyseAllLhsVars1 x = modifyAnnotation (\ a -> a { allLhsVarsAnn = computeAllLhsVars x }) x
280281
282+ analyseAllLhsVarsDoSpec :: Data a => DoSpecification (Analysis a ) -> DoSpecification (Analysis a )
283+ analyseAllLhsVarsDoSpec x = modifyAnnotation (\ a -> a { allLhsVarsAnn = allLhsVarsDoSpec x }) x
284+
285+ allLhsVarsDoSpec :: Data a => DoSpecification (Analysis a ) -> [Name ]
286+ allLhsVarsDoSpec = computeAllLhsVars . dospecAsStmt
287+
281288-- | Set of names found in the parts of an AST that are the target of
282289-- an assignment statement.
283290-- allLhsVars :: (Annotated b, Data a, Data (b (Analysis a))) => b (Analysis a) -> [Name]
284291allLhsVars :: Data a => Block (Analysis a ) -> [Name ]
285292allLhsVars = allLhsVarsAnn . getAnnotation
286293
287- allLhsVarsDoSpec :: Data a => DoSpecification (Analysis a ) -> [Name ]
288- allLhsVarsDoSpec = computeAllLhsVars
294+ dospecAsStmt :: DoSpecification a -> Statement a
295+ dospecAsStmt (DoSpecification a ss lhs rhs _e1 _me2) =
296+ StExpressionAssign a ss lhs rhs
289297
290298-- | Set of names found in the parts of an AST that are the target of
291299-- an assignment statement.
@@ -298,6 +306,7 @@ computeAllLhsVars = concatMap lhsOfStmt . universeBi
298306 lhsOfStmt (StCall _ _ f@ (ExpValue _ _ (ValIntrinsic _)) _)
299307 | Just defs <- intrinsicDefs f = defs
300308 lhsOfStmt (StCall _ _ _ (Just aexps)) = concatMap (match'' . argExtractExpr) (aStrip aexps)
309+ lhsOfStmt s@ (StDo _ _ _ _ (Just dospec)) = lhsOfStmt (dospecAsStmt dospec) ++ onExprs s
301310 lhsOfStmt s = onExprs s
302311
303312 lhsOfDecls (Declarator _ _ e _ _ (Just e')) = match' e : onExprs e'
@@ -331,7 +340,7 @@ computeAllLhsVars = concatMap lhsOfStmt . universeBi
331340-- | Set of expressions used -- not defined -- by an AST-block.
332341blockRhsExprs :: Data a => Block a -> [Expression a ]
333342blockRhsExprs (BlStatement _ _ _ s) = statementRhsExprs s
334- blockRhsExprs (BlDo _ _ _ _ _ (Just (DoSpecification _ _ ( StExpressionAssign _ _ lhs rhs) e1 e2)) _ _)
343+ blockRhsExprs (BlDo _ _ _ _ _ (Just (DoSpecification _ _ lhs rhs e1 e2)) _ _)
335344 | ExpSubscript _ _ _ subs <- lhs = universeBi (rhs, e1, e2) ++ universeBi subs
336345 | otherwise = universeBi (rhs, e1, e2)
337346blockRhsExprs (BlDoWhile _ _ e1 _ _ e2 _ _) = universeBi (e1, e2)
@@ -346,8 +355,8 @@ statementRhsExprs (StExpressionAssign _ _ lhs rhs)
346355statementRhsExprs StDeclaration {} = []
347356statementRhsExprs (StIfLogical _ _ _ s) = statementRhsExprs s
348357statementRhsExprs (StDo _ _ _ l s') = universeBi l ++ doSpecRhsExprs s'
349- where doSpecRhsExprs (Just (DoSpecification _ _ s e1 e2)) =
350- (e1 : universeBi e2) ++ statementRhsExprs s
358+ where doSpecRhsExprs (Just dospec @ (DoSpecification _ _ _lhs _rhs e1 e2)) =
359+ (e1 : universeBi e2) ++ statementRhsExprs (dospecAsStmt dospec)
351360 doSpecRhsExprs Nothing = []
352361statementRhsExprs s = universeBi s
353362
@@ -356,7 +365,7 @@ blockVarUses :: forall a. Data a => Block (Analysis a) -> [Name]
356365blockVarUses (BlStatement _ _ _ (StExpressionAssign _ _ lhs rhs))
357366 | ExpSubscript _ _ _ subs <- lhs = allVars rhs ++ concatMap allVars (aStrip subs)
358367 | otherwise = allVars rhs
359- blockVarUses (BlDo _ _ _ _ _ (Just (DoSpecification _ _ ( StExpressionAssign _ _ lhs rhs) e1 e2)) _ _)
368+ blockVarUses (BlDo _ _ _ _ _ (Just (DoSpecification _ _ lhs rhs e1 e2)) _ _)
360369 | ExpSubscript _ _ _ subs <- lhs = allVars rhs ++ allVars e1 ++ maybe [] allVars e2 ++ concatMap allVars (aStrip subs)
361370 | otherwise = allVars rhs ++ allVars e1 ++ maybe [] allVars e2
362371blockVarUses (BlStatement _ _ _ st@ StDeclaration {}) = concat [ rhsOfDecls d | d <- universeBi st ]
0 commit comments