-- For all type variables a, we require (CNode a)
-- If we have a data constructor
-- X a_1 .. a_n, and exactly one a_k is a Language.C.Data.NodeInfo, then return that a_k
data Test1 = X Int NodeInfo | Y NodeInfo String | Z Int NodeInfo Integer
-- If we have a data constructor
-- X a, then return nodeInfo a
data Test2 = U Test1 | V Test1
-- If we have a data constructor
-- X a_1 .. a_n, and exactly one a_k is a polymorphic variable, then return (nodeInfo a_k)
data Test3 a = A a Test1 | B Test2 a | C (Test3 a) a (Test3 a) | D (Test4 a) a
data Test4 a = Test4 NodeInfo (Test3 a)