From fdef3b1924f1645f793b3b64b03bce809fa3eca5 Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Fri, 7 Mar 2008 15:51:27 +0000 Subject: [PATCH] Corrected genVariable to obey checkValid when working out the types for array slices --- backends/GenerateC.hs | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/backends/GenerateC.hs b/backends/GenerateC.hs index 1649517..2e17b46 100644 --- a/backends/GenerateC.hs +++ b/backends/GenerateC.hs @@ -696,9 +696,11 @@ cgenVariable' checkValid v inner ind (A.DirectedVariable _ dir v) mt = do (cg,n) <- (inner ind v mt) return (call genDirectedVariable (addPrefix cg n) dir, 0) - inner ind sv@(A.SubscriptedVariable _ (A.Subscript _ _) _) mt - = do let (es, v) = collectSubs sv - t <- typeOfVariable sv + inner ind sv@(A.SubscriptedVariable m (A.Subscript _ _) _) mt + = do (es, v, t') <- collectSubs sv + t <- if checkValid + then typeOfVariable sv + else return t' (cg, n) <- inner ind v (Just t) return (cg >> call genArraySubscript checkValid v es, n) inner ind sv@(A.SubscriptedVariable _ (A.SubscriptField m n) v) mt @@ -729,12 +731,13 @@ cgenVariable' checkValid v getPrefix n = if n > 0 then replicate n '*' else "#error Negative prefix lower than -1" -- | Collect all the plain subscripts on a variable, so we can combine them. - collectSubs :: A.Variable -> ([A.Expression], A.Variable) - collectSubs (A.SubscriptedVariable _ (A.Subscript _ e) v) - = (es' ++ [e], v') - where - (es', v') = collectSubs v - collectSubs v = ([], v) + collectSubs :: A.Variable -> CGen ([A.Expression], A.Variable, A.Type) + collectSubs (A.SubscriptedVariable m (A.Subscript _ e) v) + = do (es', v', t') <- collectSubs v + t <- trivialSubscriptType m t' + return (es' ++ [e], v', t) + collectSubs v = do t <- typeOfVariable v + return ([], v, t) cgenDirectedVariable :: CGen () -> A.Direction -> CGen ()