From b3458ec54199e8a752da67dd496182e430227ebe Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Thu, 28 Feb 2008 16:08:06 +0000 Subject: [PATCH] Corrected the pointer indirection for records inside records --- backends/GenerateC.hs | 6 ++++-- backends/GenerateCTest.hs | 5 +++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/backends/GenerateC.hs b/backends/GenerateC.hs index 589c347..138a5d5 100644 --- a/backends/GenerateC.hs +++ b/backends/GenerateC.hs @@ -677,9 +677,11 @@ cgenVariable' checkValid v t <- typeOfVariable sv (cg, n) <- inner ind v (Just t) return (cg >> call genArraySubscript checkValid v es, n) - inner ind (A.SubscriptedVariable _ (A.SubscriptField m n) v) mt + inner ind sv@(A.SubscriptedVariable _ (A.SubscriptField m n) v) mt = do (cg, ind') <- inner ind v mt - return (addPrefix cg ind' >> tell ["->"] >> genName n, 0) + t <- typeOfVariable sv + let outerInd = if indirectedType t then -1 else 0 + return (addPrefix (addPrefix cg ind' >> tell ["->"] >> genName n) outerInd, 0) inner ind (A.SubscriptedVariable m (A.SubscriptFromFor m' start _) v) mt = inner ind (A.SubscriptedVariable m (A.Subscript m' start) v) mt inner ind (A.SubscriptedVariable m (A.SubscriptFrom m' start) v) mt diff --git a/backends/GenerateCTest.hs b/backends/GenerateCTest.hs index e0c875b..dd4984c 100644 --- a/backends/GenerateCTest.hs +++ b/backends/GenerateCTest.hs @@ -773,6 +773,9 @@ testGenVariable = TestList ,testSameA 200 ("(&foo)->x","foo->x","foo->x") fieldX (A.Record bar) ,testSameA2 210 ("foo->x","(*foo)->x") (fieldX . deref) (A.Mobile $ A.Record bar) + ,testSameA 220 ("(&(&foo)->y)","(&foo->y)","(&foo->y)") fieldY (A.Record $ simpleName "barbar") + ,testSameA 230 ("(&(&foo)->y)->x","(&foo->y)->x","(&foo->y)->x") (fieldX . fieldY) (A.Record $ simpleName "barbar") + -- Fully subscripted array: ,testAC 300 ("foo@C4","foo@U4") (sub 4) (A.Array [A.Dimension 8] A.Int) ,testAC 305 ("foo@C4,5,6","foo@U4,5,6") ((sub 6) . (sub 5) . (sub 4)) (A.Array [A.Dimension 8,A.Dimension 9,A.Dimension 10] A.Int) @@ -798,6 +801,7 @@ testGenVariable = TestList deref = A.DerefVariable emptyMeta dir = A.DirectedVariable emptyMeta A.DirInput fieldX = A.SubscriptedVariable emptyMeta (A.SubscriptField emptyMeta $ simpleName "x") + fieldY = A.SubscriptedVariable emptyMeta (A.SubscriptField emptyMeta $ simpleName "y") sub n = A.SubscriptedVariable emptyMeta (A.Subscript emptyMeta $ intLiteral n) test :: Int -> (String,String) -> (String,String) -> (A.Variable -> A.Variable) -> A.AbbrevMode -> A.Type -> Test @@ -809,6 +813,7 @@ testGenVariable = TestList where state = do defineName (simpleName "foo") $ A.NameDef emptyMeta "foo" "foo" A.VariableName (A.Declaration emptyMeta t Nothing) am A.Unplaced defRecord "bar" "x" $ A.Array [A.Dimension 7] A.Int + defRecord "barbar" "y" $ A.Record bar over :: Override over = local $ \ops -> ops {genArraySubscript = (\b _ subs -> at >> (tell [if b then "C" else "U"]) >> (seqComma $ map (call genExpression) subs)) ,genDirectedVariable = (\cg _ -> dollar >> cg >> dollar)}