diff --git a/backends/GenerateC.hs b/backends/GenerateC.hs index d9c5efd..6b7f0af 100644 --- a/backends/GenerateC.hs +++ b/backends/GenerateC.hs @@ -904,6 +904,10 @@ cgenExpression (A.BytesInType m t) = call genBytesIn m t (Left False) --cgenExpression (A.ExprConstr {}) cgenExpression (A.AllocMobile m t me) = call genAllocMobile m t me cgenExpression (A.CloneMobile m e) = call genCloneMobile m e +cgenExpression (A.IsDefined m (A.ExprVariable _ (A.DerefVariable _ v))) + = tell ["("] >> call genVariable v A.Original >> tell ["!=NULL)"] +cgenExpression (A.IsDefined m e) + = tell ["("] >> call genExpression e >> tell ["!=NULL)"] cgenExpression (A.SubscriptedExpr m sub (A.ExprVariable _ v)) = call genVariable (A.SubscriptedVariable m sub v) A.Original cgenExpression (A.SubscriptedExpr m (A.SubscriptFromFor _ _ start _) e@(A.AllSizesVariable {})) diff --git a/transformations/SimplifyExprs.hs b/transformations/SimplifyExprs.hs index 1593ed6..9379714 100644 --- a/transformations/SimplifyExprs.hs +++ b/transformations/SimplifyExprs.hs @@ -399,6 +399,8 @@ pullUp pullUpArraysInsideRecords = pass "Pull up definitions" -- | Pull array expressions that aren't already non-subscripted variables. -- Also pull lists that are literals or constructed doExpression :: A.Expression -> PassM A.Expression + -- For is-defined, we don't want to pull up: + doExpression e@(A.IsDefined {}) = return e doExpression e -- This part handles recursing into the expression first: = do e' <- doExpression' e