Index: src/Tests/Parser/Array.c
===================================================================
--- src/Tests/Parser/Array.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Array.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,33 @@
+int a1[];
+int a2[*];
+int a4[3];
+
+int m1[][3];
+int m2[*][*];
+int m4[3][3];
+
+typedef int T;
+
+int fred() {
+    int a1[];
+    int a2[*];
+    int a4[3];
+    int T[3];
+}
+
+int mary( int T[3],
+	  int p1[const 3],
+	  int p2[static 3],
+	  int p3[static const 3]
+    ) {
+}
+
+int (*tom())[3] {
+}
+
+int (*(jane)())( int T[3],
+		 int p1[const 3],
+		 int p2[static 3],
+		 int p3[static const 3]
+    ) {
+}
Index: src/Tests/Parser/Constant0-1.c
===================================================================
--- src/Tests/Parser/Constant0-1.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Constant0-1.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,40 @@
+// Cforall extension
+
+// value
+
+int 0;
+const int 0;
+//static const int 0;
+int 1;
+const int 1;
+//static const int 1;
+int 0, 1;
+const int 0, 1;
+//static const int 0, 1;
+struct { int i; } 0;
+const struct { int i; } 1;
+static const struct { int i; } 1;
+
+// pointer
+
+int 1, * 0;
+int (1), ((1)), * (0), (* 0), ((* 0));
+int * const (0), (* const 0), ((* const 0));
+struct { int i; } * 0;
+
+// Cforall style
+
+* int x, 0;
+const * int x, 0;
+//static const * int x, 0;
+* struct { int i; } 0;
+const * struct { int i; } 0;
+static const * struct { int i; } 0;
+//static * int x, 0;
+//static const * int x, 0;
+const * * int x, 0;
+
+int main() {
+//int 1, * 0;
+//* int x, 0;
+}
Index: src/Tests/Parser/DeclarationSpecifier.c
===================================================================
--- src/Tests/Parser/DeclarationSpecifier.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/DeclarationSpecifier.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,90 @@
+typedef short int Int;
+
+
+const short int volatile x1;
+static const short int volatile x2;
+const static short int volatile x3;
+const short static int volatile x4;
+const static volatile short int x4;
+const short int static volatile x5;
+const short int volatile static x6;
+const short volatile int static x7;
+short int volatile static const x8;
+static short int volatile static const x9;		// duplicate static
+
+const volatile struct { int i; } x10;
+const struct { int i; } volatile x11;
+struct { int i; } const volatile x12;
+static const volatile struct { int i; } x13;
+const static struct { int i; } volatile x14;
+struct { int i; } static const volatile x15;
+struct { int i; } const static volatile x16;
+struct { int i; } const volatile static x17;
+struct { int i; } const static volatile static x18;	// duplicate static
+struct { int i; } const static volatile static volatile x19; // duplicate static & volatile
+
+const Int volatile x20;
+static const Int volatile x21;
+const static Int volatile x22;
+const static Int volatile x23;
+const Int static volatile x24;
+const Int volatile static x25;
+const volatile Int static x26;
+Int volatile static const x27;
+static Int volatile static const x28;			// duplicate static
+
+const volatile struct { Int i; } x29;
+const struct { Int i; } volatile x30;
+struct { Int i; } const volatile x31;
+static const volatile struct { Int i; } x32;
+const static struct { Int i; } volatile x33;
+struct { Int i; } static const volatile x34;
+struct { Int i; } const static volatile x35;
+struct { Int i; } const volatile static x36;
+
+
+const static inline const volatile int f01();		// duplicate const
+volatile inline const volatile static int f02();	// duplicate volatile
+const inline const volatile int static f03();		// duplicate const
+volatile inline static const volatile int f04();	// duplicate volatile
+const static const inline volatile int f05();		// duplicate const
+volatile static const volatile inline int f06();	// duplicate volatile
+const static const volatile int inline f07();		// duplicate const
+volatile static const int inline volatile f08();	// duplicate volatile
+
+static inline const volatile int f11();
+inline const volatile static int f12();
+inline const volatile int static f13();
+inline static const volatile int f14();
+static const inline volatile int f15();
+static const volatile inline int f16();
+static const volatile int inline f17();
+static const int inline volatile f18();
+
+short static inline const volatile int f21();
+inline short const volatile static int f22();
+inline const short volatile int static f23();
+inline static const short volatile int f24();
+static const inline volatile short int f25();
+static const volatile inline int short f26();
+static const volatile int inline short f27();
+static const int inline volatile short f28();
+
+static inline const volatile struct { int i; } f31();
+inline const volatile static struct { int i; } f32();
+inline const volatile struct { int i; } static f33();
+inline static const volatile struct { int i; } f34();
+static const inline volatile struct { int i; } f35();
+static const volatile inline struct { int i; } f36();
+static const volatile struct { int i; } inline f37();
+static const struct { int i; } inline volatile f38();
+
+static inline const volatile Int f41();
+inline const volatile static Int f42();
+inline const volatile Int static f43();
+inline static const volatile Int f44();
+static const inline volatile Int f45();
+static const volatile inline Int f46();
+static const volatile Int inline f47();
+static const Int inline volatile f48();
+
Index: src/Tests/Parser/Expected/Array.tst
===================================================================
--- src/Tests/Parser/Expected/Array.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Expected/Array.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,48 @@
+a1: a open array of int 
+a2: a variable-length array of int 
+a4: a array of 3 int 
+m1: a open array of array of 3 int 
+m2: a variable-length array of variable-length array of int 
+m4: a array of 3 array of 3 int 
+T: a typedef definition for int 
+fred: a function
+  with no parameters 
+  returning int 
+  with body 
+    a1: a open array of int 
+    a2: a variable-length array of int 
+    a4: a array of     3 int 
+    T: a array of     3 int 
+
+mary: a function
+  with parameters 
+    T: a array of     3 int 
+    p1: a const array of     3 int 
+    p2: a static array of     3 int 
+    p3: a const static array of     3 int 
+  returning int 
+  with body 
+
+  Null Statement:
+
+tom: a function
+  with no parameters 
+  returning pointer to array of     3 int 
+  with body 
+
+  Null Statement:
+
+jane: a function
+  with no parameters 
+  returning pointer to function
+      with parameters 
+        T: a array of         3 int 
+        p1: a const array of         3 int 
+        p2: a static array of         3 int 
+        p3: a const static array of         3 int 
+      returning int 
+
+  with body 
+
+  Null Statement:
+
Index: src/Tests/Parser/Expected/Constant0-1.tst
===================================================================
--- src/Tests/Parser/Expected/Constant0-1.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Expected/Constant0-1.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,62 @@
+0: a int 
+0: a const int 
+0: a static const int 
+1: a int 
+1: a const int 
+1: a static const int 
+0: a int 
+1: a int 
+0: a const int 
+1: a const int 
+0: a static const int 
+1: a static const int 
+0: a instance of struct __anonymous0
+  with members 
+    i: a int 
+
+1: a const instance of struct __anonymous1
+  with members 
+    i: a int 
+
+1: a static const instance of struct __anonymous2
+  with members 
+    i: a int 
+
+1: a int 
+0: a pointer to int 
+1: a int 
+1: a int 
+0: a pointer to int 
+0: a pointer to int 
+0: a pointer to int 
+0: a const pointer to int 
+0: a const pointer to int 
+0: a const pointer to int 
+0: a pointer to instance of struct __anonymous3
+  with members 
+    i: a int 
+
+x: a pointer to int 
+0: a pointer to int 
+x: a const pointer to int 
+0: a const pointer to int 
+x: a static const pointer to int 
+0: a static const pointer to int 
+0: a pointer to instance of struct __anonymous4
+  with members 
+    i: a int 
+
+0: a const pointer to instance of struct __anonymous5
+  with members 
+    i: a int 
+
+0: a static const pointer to instance of struct __anonymous6
+  with members 
+    i: a int 
+
+x: a static pointer to int 
+0: a static pointer to int 
+x: a static const pointer to int 
+0: a static const pointer to int 
+x: a const pointer to pointer to int 
+0: a const pointer to pointer to int 
Index: src/Tests/Parser/Expected/DeclarationSpecifier.tst
===================================================================
--- src/Tests/Parser/Expected/DeclarationSpecifier.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Expected/DeclarationSpecifier.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,276 @@
+Int: a typedef definition for short int 
+x1: a const volatile short int 
+x2: a static const volatile short int 
+x3: a static volatile const short int 
+x4: a static volatile const short int 
+x4: a static volatile const short int 
+x5: a static const volatile short int 
+x6: a static const volatile short int 
+x7: a static const volatile short int 
+x8: a static volatile const short int 
+x9: a static static volatile const short int 
+x10: a const volatile instance of struct __anonymous0
+  with members 
+    i: a int 
+
+x11: a const volatile instance of struct __anonymous1
+  with members 
+    i: a int 
+
+x12: a const volatile instance of struct __anonymous2
+  with members 
+    i: a int 
+
+x13: a static const volatile instance of struct __anonymous3
+  with members 
+    i: a int 
+
+x14: a static volatile const instance of struct __anonymous4
+  with members 
+    i: a int 
+
+x15: a static const volatile instance of struct __anonymous5
+  with members 
+    i: a int 
+
+x16: a static const volatile instance of struct __anonymous6
+  with members 
+    i: a int 
+
+x17: a static const volatile instance of struct __anonymous7
+  with members 
+    i: a int 
+
+x18: a static static const volatile instance of struct __anonymous8
+  with members 
+    i: a int 
+
+x19: a static static const volatile volatile instance of struct __anonymous9
+  with members 
+    i: a int 
+
+x20: a const volatile instance of type Int
+x21: a static const volatile instance of type Int
+x22: a static volatile const instance of type Int
+x23: a static volatile const instance of type Int
+x24: a static const volatile instance of type Int
+x25: a static const volatile instance of type Int
+x26: a static const volatile instance of type Int
+x27: a static volatile const instance of type Int
+x28: a static static volatile const instance of type Int
+x29: a const volatile instance of struct __anonymous10
+  with members 
+    i: a instance of type Int
+
+x30: a const volatile instance of struct __anonymous11
+  with members 
+    i: a instance of type Int
+
+x31: a const volatile instance of struct __anonymous12
+  with members 
+    i: a instance of type Int
+
+x32: a static const volatile instance of struct __anonymous13
+  with members 
+    i: a instance of type Int
+
+x33: a static volatile const instance of struct __anonymous14
+  with members 
+    i: a instance of type Int
+
+x34: a static const volatile instance of struct __anonymous15
+  with members 
+    i: a instance of type Int
+
+x35: a static const volatile instance of struct __anonymous16
+  with members 
+    i: a instance of type Int
+
+x36: a static const volatile instance of struct __anonymous17
+  with members 
+    i: a instance of type Int
+
+f01: a static inline function
+  with no parameters 
+  returning const volatile const int 
+
+f02: a inline static function
+  with no parameters 
+  returning volatile const volatile int 
+
+f03: a inline static function
+  with no parameters 
+  returning const volatile const int 
+
+f04: a inline static function
+  with no parameters 
+  returning const volatile volatile int 
+
+f05: a static inline function
+  with no parameters 
+  returning volatile const const int 
+
+f06: a static inline function
+  with no parameters 
+  returning volatile const volatile int 
+
+f07: a static inline function
+  with no parameters 
+  returning const volatile const int 
+
+f08: a static inline function
+  with no parameters 
+  returning const volatile volatile int 
+
+f11: a static inline function
+  with no parameters 
+  returning const volatile int 
+
+f12: a inline static function
+  with no parameters 
+  returning const volatile int 
+
+f13: a inline static function
+  with no parameters 
+  returning const volatile int 
+
+f14: a inline static function
+  with no parameters 
+  returning const volatile int 
+
+f15: a static inline function
+  with no parameters 
+  returning volatile const int 
+
+f16: a static inline function
+  with no parameters 
+  returning const volatile int 
+
+f17: a static inline function
+  with no parameters 
+  returning const volatile int 
+
+f18: a static inline function
+  with no parameters 
+  returning const volatile int 
+
+f21: a inline static function
+  with no parameters 
+  returning const volatile short int 
+
+f22: a static inline function
+  with no parameters 
+  returning const volatile short int 
+
+f23: a inline static function
+  with no parameters 
+  returning const volatile short int 
+
+f24: a inline static function
+  with no parameters 
+  returning const volatile short int 
+
+f25: a static inline function
+  with no parameters 
+  returning volatile const short int 
+
+f26: a static inline function
+  with no parameters 
+  returning const volatile short int 
+
+f27: a inline static function
+  with no parameters 
+  returning const volatile short int 
+
+f28: a inline static function
+  with no parameters 
+  returning volatile const short int 
+
+f31: a static inline function
+  with no parameters 
+  returning const volatile instance of struct __anonymous18
+      with members 
+        i: a int 
+
+
+f32: a inline static function
+  with no parameters 
+  returning const volatile instance of struct __anonymous19
+      with members 
+        i: a int 
+
+
+f33: a inline static function
+  with no parameters 
+  returning const volatile instance of struct __anonymous20
+      with members 
+        i: a int 
+
+
+f34: a inline static function
+  with no parameters 
+  returning const volatile instance of struct __anonymous21
+      with members 
+        i: a int 
+
+
+f35: a static inline function
+  with no parameters 
+  returning volatile const instance of struct __anonymous22
+      with members 
+        i: a int 
+
+
+f36: a static inline function
+  with no parameters 
+  returning const volatile instance of struct __anonymous23
+      with members 
+        i: a int 
+
+
+f37: a static inline function
+  with no parameters 
+  returning const volatile instance of struct __anonymous24
+      with members 
+        i: a int 
+
+
+f38: a static inline function
+  with no parameters 
+  returning const volatile instance of struct __anonymous25
+      with members 
+        i: a int 
+
+
+f41: a static inline function
+  with no parameters 
+  returning const volatile instance of type Int
+
+f42: a inline static function
+  with no parameters 
+  returning const volatile instance of type Int
+
+f43: a inline static function
+  with no parameters 
+  returning const volatile instance of type Int
+
+f44: a inline static function
+  with no parameters 
+  returning const volatile instance of type Int
+
+f45: a static inline function
+  with no parameters 
+  returning volatile const instance of type Int
+
+f46: a static inline function
+  with no parameters 
+  returning const volatile instance of type Int
+
+f47: a static inline function
+  with no parameters 
+  returning const volatile instance of type Int
+
+f48: a static inline function
+  with no parameters 
+  returning const volatile instance of type Int
+
Index: src/Tests/Parser/Expected/Forall.tst
===================================================================
--- src/Tests/Parser/Expected/Forall.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Expected/Forall.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,319 @@
+f: a typedef definition for pointer to forall 
+      T: a type variable 
+function
+    with parameters 
+      int 
+    returning int 
+
+swap: a forall 
+    T: a type variable 
+function
+  with parameters 
+    left: a instance of type T
+    right: a instance of type T
+  returning void 
+  with body 
+    temp: a instance of type T
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Referencing: Variable: left
+
+        Referencing: Variable: right
+
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Referencing: Variable: right
+
+        Referencing: Variable: temp
+
+
+context sumable
+  with type parameters 
+    T: a type variable 
+  with members 
+    0: a const instance of type T
+    ?+?: a function
+      with parameters 
+        instance of type T
+        instance of type T
+      returning instance of type T
+
+    ?++: a function
+      with parameters 
+        instance of type T
+      returning instance of type T
+
+    ?+=?: a function
+      with parameters 
+        instance of type T
+        instance of type T
+      returning tuple with members 
+          instance of type T
+
+
+
+T1: a type definition 
+  with assertions
+    0: a const instance of type T1
+    ?+?: a function
+      with parameters 
+        instance of type T1
+        instance of type T1
+      returning instance of type T1
+
+    ?++: a function
+      with parameters 
+        instance of type T1
+      returning instance of type T1
+
+    ?+=?: a function
+      with parameters 
+        instance of type T1
+        instance of type T1
+      returning tuple with members 
+          instance of type T1
+
+
+  
+T2: a type definition 
+  with parameters
+  P1: a type variable 
+  P2: a type variable 
+
+T3: a type definition 
+  with assertions
+    instance of context sumable
+      with parameters 
+      Type:        instance of type T3
+
+  
+T2: a type definition 
+  with parameters
+  P1: a type variable 
+  P2: a type variable 
+
+  with assertions
+    instance of context sumable
+      with parameters 
+      Type:        instance of type T2 with parameters
+          Type:            instance of type P1
+          Type:            instance of type P2
+
+
+  for instance of struct __anonymous0
+    with members 
+      i: a instance of type P1
+      j: a instance of type P2
+
+w1: a instance of type T2 with parameters
+  Type:    int 
+  Type:    int 
+
+w2: a typedef definition for instance of type T2 with parameters
+    Type:      int 
+    Type:      int 
+
+g2: a instance of type w2
+w3: a type definition for instance of type T2 with parameters
+    Type:      int 
+    Type:      int 
+
+g3: a instance of type w3
+sum: a forall 
+    T: a type variable 
+      with assertions
+        instance of context sumable
+          with parameters 
+          Type:            instance of type T
+
+      
+function
+  with parameters 
+    n: a int 
+    a: a open array of instance of type T
+  returning instance of type T
+  with body 
+    total: a instance of type T
+    i: a int 
+
+    For
+
+        Expression: 
+
+            Application of: 
+
+                Operator: Assign
+
+            ... on arguments: 
+
+                Referencing: Variable: i
+
+                Referencing: Variable: 0
+
+            Application of: 
+
+                Operator: LThan
+
+            ... on arguments: 
+
+                Referencing: Variable: i
+
+                Referencing: Variable: n
+
+            Application of: 
+
+                Operator: PlusAssn
+
+            ... on arguments: 
+
+                Referencing: Variable: i
+
+                Referencing: Variable: 1
+
+        Branches of execution: 
+            
+            Application of: 
+
+                Operator: Assign
+
+            ... on arguments: 
+
+                Referencing: Variable: total
+
+                Application of: 
+
+                    Operator: Plus
+
+                ... on arguments: 
+
+                    Referencing: Variable: total
+
+                    Application of: 
+
+                        Operator: Index
+
+                    ... on arguments: 
+
+                        Referencing: Variable: a
+
+                        Referencing: Variable: i
+
+
+    Return
+
+        Expression: 
+
+            Referencing: Variable: total
+
+twice: a forall 
+    T: a type variable 
+      with assertions
+        0: a const instance of type T
+        ?+?: a function
+          with parameters 
+            instance of type T
+            instance of type T
+          returning instance of type T
+
+        ?++: a function
+          with parameters 
+            instance of type T
+          returning instance of type T
+
+        ?+=?: a function
+          with parameters 
+            instance of type T
+            instance of type T
+          returning tuple with members 
+              instance of type T
+
+
+      
+function
+  with parameters 
+    t: a instance of type T
+  returning instance of type T
+  with body 
+
+    Return
+
+        Expression: 
+
+            Application of: 
+
+                Operator: Plus
+
+            ... on arguments: 
+
+                Referencing: Variable: t
+
+                Referencing: Variable: t
+
+main: a function
+  with no parameters 
+  returning int 
+  with body 
+    x: a int 
+    y: a int 
+    a: a array of     10 int 
+    f: a float 
+    
+    Application of: 
+
+        Referencing: Variable: swap
+
+    ... on arguments: 
+
+        Referencing: Variable: x
+
+        Referencing: Variable: y
+
+    
+    Application of: 
+
+        Referencing: Variable: twice
+
+    ... on arguments: 
+
+        Referencing: Variable: x
+
+        Referencing: Variable: y
+
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Referencing: Variable: f
+
+        Application of: 
+
+            Referencing: Variable: min
+
+        ... on arguments: 
+            4.0 
+            3.0 
+
+    
+    Application of: 
+
+        Referencing: Variable: sum
+
+    ... on arguments: 
+        10 
+
+        Referencing: Variable: a
+
+
Index: src/Tests/Parser/Expected/Functions.tst
===================================================================
--- src/Tests/Parser/Expected/Functions.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Expected/Functions.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,741 @@
+h: a function
+  with parameters 
+    void 
+  returning void 
+  with body 
+
+  Null Statement:
+
+f: a function
+  with parameters 
+    function
+      with parameters 
+        void 
+      returning int 
+
+    function
+      with parameters 
+        int 
+      returning int 
+
+    function
+      with parameters 
+        void 
+      returning int 
+
+    function
+      with parameters 
+        int 
+      returning int 
+
+    g: a function
+      with parameters 
+        void 
+      returning void 
+
+  returning int 
+  with body 
+    
+    Application of: 
+
+        Application of: 
+
+            Operator: PointTo
+
+        ... on arguments: 
+
+            Referencing: Variable: g
+
+    ... on no arguments: 
+
+    
+    Application of: 
+
+        Referencing: Variable: g
+
+    ... on no arguments: 
+
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Referencing: Variable: g
+
+        Referencing: Variable: h
+
+
+f1: a function
+  with no parameters 
+  returning int 
+  with body 
+
+  Null Statement:
+
+f2: a function
+  with no parameters 
+  returning int 
+  with body 
+
+  Null Statement:
+
+f3: a function
+  with no parameters 
+  returning pointer to function
+      with no parameters 
+      returning int 
+
+  with body 
+
+  Null Statement:
+
+f4: a function
+  with no parameters 
+  returning pointer to int 
+  with body 
+
+  Null Statement:
+
+f5: a function
+  with no parameters 
+  returning pointer to function
+      with no parameters 
+      returning int 
+
+  with body 
+
+  Null Statement:
+
+f6: a function
+  with no parameters 
+  returning pointer to int 
+  with body 
+
+  Null Statement:
+
+f7: a function
+  with no parameters 
+  returning pointer to int 
+  with body 
+
+  Null Statement:
+
+f8: a function
+  with no parameters 
+  returning pointer to pointer to int 
+  with body 
+
+  Null Statement:
+
+f9: a function
+  with no parameters 
+  returning pointer to const pointer to int 
+  with body 
+
+  Null Statement:
+
+f10: a function
+  with no parameters 
+  returning pointer to open array of int 
+  with body 
+
+  Null Statement:
+
+f11: a function
+  with no parameters 
+  returning pointer to open array of array of     3 int 
+  with body 
+
+  Null Statement:
+
+f12: a function
+  with no parameters 
+  returning pointer to open array of array of     3 int 
+  with body 
+
+  Null Statement:
+
+fII1: a function
+  with parameters 
+    i: a int 
+  returning nothing 
+  with body 
+
+  Null Statement:
+
+fII2: a function
+  with parameters 
+    i: a int 
+  returning const entity of unknown type 
+  with body 
+
+  Null Statement:
+
+fII3: a extern function
+  with parameters 
+    i: a int 
+  returning nothing 
+  with body 
+
+  Null Statement:
+
+fII4: a extern function
+  with parameters 
+    i: a int 
+  returning const entity of unknown type 
+  with body 
+
+  Null Statement:
+
+fII5: a function
+  with no parameters 
+  returning pointer 
+  with body 
+
+  Null Statement:
+
+fII6: a function
+  with no parameters 
+  returning const pointer 
+  with body 
+
+  Null Statement:
+
+fII7: a function
+  with no parameters 
+  returning pointer to const long 
+  with body 
+
+  Null Statement:
+
+fII8: a static function
+  with no parameters 
+  returning pointer to const long 
+  with body 
+
+  Null Statement:
+
+fII9: a static function
+  with no parameters 
+  returning pointer to const long 
+  with body 
+
+  Null Statement:
+
+fO1: a function
+  with no parameters 
+  with old-style identifier list 
+    i: a untyped entity 
+  with old-style declaration list 
+    i: a int 
+  returning nothing 
+  with body 
+
+  Null Statement:
+
+fO2: a function
+  with no parameters 
+  with old-style identifier list 
+    i: a untyped entity 
+  with old-style declaration list 
+    i: a int 
+  returning int 
+  with body 
+
+  Null Statement:
+
+fO3: a function
+  with no parameters 
+  with old-style identifier list 
+    i: a untyped entity 
+  with old-style declaration list 
+    i: a int 
+  returning const entity of unknown type 
+  with body 
+
+  Null Statement:
+
+fO4: a extern function
+  with no parameters 
+  with old-style identifier list 
+    i: a untyped entity 
+  with old-style declaration list 
+    i: a int 
+  returning nothing 
+  with body 
+
+  Null Statement:
+
+fO5: a extern function
+  with no parameters 
+  with old-style identifier list 
+    i: a untyped entity 
+  with old-style declaration list 
+    i: a int 
+  returning const entity of unknown type 
+  with body 
+
+  Null Statement:
+
+f: a function
+  with no parameters 
+  returning tuple 
+
+f: a function
+  with no parameters 
+  returning tuple with members 
+      int 
+
+
+f: a function
+  with parameters 
+    int 
+  returning tuple 
+
+f: a function
+  with parameters 
+    int 
+  returning tuple with members 
+      int 
+
+
+f: a function
+  with no parameters 
+  returning tuple 
+  with body 
+
+  Null Statement:
+
+f: a function
+  with no parameters 
+  returning tuple with members 
+      int 
+
+  with body 
+
+  Null Statement:
+
+f: a function
+  with parameters 
+    int 
+  returning tuple 
+  with body 
+
+  Null Statement:
+
+f: a function
+  with parameters 
+    int 
+  returning tuple with members 
+      int 
+
+  with body 
+
+  Null Statement:
+
+f: a function
+  with no parameters 
+  returning tuple with members 
+      x: a int 
+
+
+f: a function
+  with parameters 
+    x: a int 
+  returning tuple 
+
+f: a function
+  with parameters 
+    x: a int 
+  returning tuple with members 
+      x: a int 
+
+
+f: a function
+  with no parameters 
+  returning tuple with members 
+      x: a int 
+
+  with body 
+
+  Null Statement:
+
+f: a function
+  with parameters 
+    x: a int 
+  returning tuple 
+  with body 
+
+  Null Statement:
+
+f: a function
+  with parameters 
+    x: a int 
+  returning tuple with members 
+      x: a int 
+
+  with body 
+
+  Null Statement:
+
+f: a function
+  with no parameters 
+  returning tuple with members 
+      int 
+      x: a int 
+
+
+f: a function
+  with parameters 
+    int 
+    x: a int 
+  returning tuple 
+
+f: a function
+  with parameters 
+    int 
+    x: a int 
+  returning tuple with members 
+      int 
+      x: a int 
+
+
+f: a function
+  with no parameters 
+  returning tuple with members 
+      int 
+      x: a int 
+
+  with body 
+
+  Null Statement:
+
+f: a function
+  with parameters 
+    int 
+    x: a int 
+  returning tuple 
+  with body 
+
+  Null Statement:
+
+f: a function
+  with parameters 
+    int 
+    x: a int 
+  returning tuple with members 
+      int 
+      x: a int 
+
+  with body 
+
+  Null Statement:
+
+f: a function
+  with no parameters 
+  returning tuple with members 
+      int 
+      x: a int 
+      int 
+
+
+f: a function
+  with parameters 
+    int 
+    x: a int 
+    int 
+  returning tuple 
+
+f: a function
+  with parameters 
+    int 
+    x: a int 
+    int 
+  returning tuple with members 
+      int 
+      x: a int 
+      int 
+
+
+f: a function
+  with no parameters 
+  returning tuple with members 
+      int 
+      x: a int 
+      int 
+
+  with body 
+
+  Null Statement:
+
+f: a function
+  with parameters 
+    int 
+    x: a int 
+    int 
+  returning tuple 
+  with body 
+
+  Null Statement:
+
+f: a function
+  with parameters 
+    int 
+    x: a int 
+    int 
+  returning tuple with members 
+      int 
+      x: a int 
+      int 
+
+  with body 
+
+  Null Statement:
+
+f: a function
+  with no parameters 
+  returning tuple with members 
+      int 
+      x: a int 
+      y: a pointer to int 
+
+
+f: a function
+  with parameters 
+    int 
+    x: a int 
+    y: a pointer to int 
+  returning tuple 
+
+f: a function
+  with parameters 
+    int 
+    x: a int 
+    y: a pointer to int 
+  returning tuple with members 
+      int 
+      x: a int 
+      y: a pointer to int 
+
+
+f: a function
+  with no parameters 
+  returning tuple with members 
+      int 
+      x: a int 
+      y: a pointer to int 
+
+  with body 
+
+  Null Statement:
+
+f: a function
+  with parameters 
+    int 
+    x: a int 
+    y: a pointer to int 
+  returning tuple 
+  with body 
+
+  Null Statement:
+
+f: a function
+  with parameters 
+    int 
+    x: a int 
+    y: a pointer to int 
+  returning tuple with members 
+      int 
+      x: a int 
+      y: a pointer to int 
+
+  with body 
+
+  Null Statement:
+
+f11: a function
+  with parameters 
+    int 
+  returning tuple with members 
+      int 
+
+
+f12: a function
+  with parameters 
+    int 
+  returning tuple with members 
+      int 
+
+
+f: a function
+  with parameters 
+    function
+      with parameters 
+        int 
+        p: a int 
+      returning int 
+
+    function
+      with parameters 
+        int 
+      returning tuple with members 
+          int 
+
+
+  returning tuple with members 
+      int 
+
+  with body 
+    p: a pointer to open array of array of     10 pointer to open array of array of     3 int 
+    p: a pointer to open array of array of     10 pointer to open array of array of     3 int 
+    p: a pointer to open array of pointer to function
+      with parameters 
+        int 
+      returning tuple with members 
+          int 
+
+
+
+f1: a static function
+  with no parameters 
+  returning pointer to const int 
+  with body 
+
+  Null Statement:
+
+f2: a static function
+  with no parameters 
+  returning tuple with members 
+      const int 
+
+  with body 
+
+  Null Statement:
+
+f3: a static inline function
+  with no parameters 
+  returning tuple with members 
+      const pointer to int 
+
+  with body 
+
+  Null Statement:
+
+f4: a static inline function
+  with no parameters 
+  returning tuple with members 
+      const tuple with members 
+        pointer to int 
+        int 
+
+
+  with body 
+
+  Null Statement:
+
+f5: a static function
+  with no parameters 
+  returning tuple with members 
+      const tuple with members 
+        pointer to int 
+        const int 
+
+
+  with body 
+
+  Null Statement:
+
+f: a function
+  with parameters 
+    function
+      with no parameters 
+      returning int 
+
+    function
+      with no parameters 
+      returning pointer to int 
+
+    function
+      with no parameters 
+      returning pointer to pointer to int 
+
+    function
+      with no parameters 
+      returning pointer to const pointer to int 
+
+    function
+      with no parameters 
+      returning const pointer to const pointer to int 
+
+    open array of int 
+    array of     10 int 
+    open array of pointer to int 
+    array of     10 pointer to int 
+    open array of pointer to pointer to int 
+    array of     10 pointer to pointer to int 
+    open array of pointer to const pointer to int 
+    array of     10 pointer to const pointer to int 
+    open array of const pointer to const pointer to int 
+    array of     10 const pointer to const pointer to int 
+  returning int 
+
+f: a function
+  with parameters 
+    function
+      with no parameters 
+      returning int 
+
+    function
+      with no parameters 
+      returning pointer to int 
+
+    function
+      with no parameters 
+      returning pointer to pointer to int 
+
+    function
+      with no parameters 
+      returning pointer to const pointer to int 
+
+    function
+      with no parameters 
+      returning const pointer to const pointer to int 
+
+    open array of int 
+    array of     10 int 
+    open array of pointer to int 
+    array of     10 pointer to int 
+    open array of pointer to pointer to int 
+    array of     10 pointer to pointer to int 
+    open array of pointer to const pointer to int 
+    array of     10 pointer to const pointer to int 
+    open array of const pointer to const pointer to int 
+    array of     10 const pointer to const pointer to int 
+  returning int 
+  with body 
+
+  Null Statement:
+
+T: a typedef definition for int 
+f: a function
+  with parameters 
+    function
+      with parameters 
+        instance of type T
+      returning instance of type T
+
+    T: a instance of type T
+  returning int 
+  with body 
+    
+    Application of: 
+
+        Referencing: Variable: T
+
+    ... on arguments: 
+
+        Referencing: Variable: T
+
+
Index: src/Tests/Parser/Expected/IdentFuncDeclarator.tst
===================================================================
--- src/Tests/Parser/Expected/IdentFuncDeclarator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Expected/IdentFuncDeclarator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,163 @@
+main: a function
+  with no parameters 
+  returning int 
+  with body 
+    f1: a int 
+    f2: a int 
+    f3: a pointer to int 
+    f4: a pointer to pointer to int 
+    f5: a pointer to const pointer to int 
+    f6: a const pointer to const pointer to int 
+    f7: a pointer to int 
+    f8: a pointer to pointer to int 
+    f9: a pointer to const pointer to int 
+    f10: a const pointer to const pointer to int 
+    f11: a pointer to int 
+    f12: a pointer to pointer to int 
+    f13: a pointer to const pointer to int 
+    f14: a const pointer to const pointer to int 
+    f15: a open array of int 
+    f16: a array of     10 int 
+    f17: a open array of int 
+    f18: a array of     10 int 
+    f19: a open array of pointer to int 
+    f20: a array of     10 pointer to int 
+    f21: a open array of pointer to pointer to int 
+    f22: a array of     10 pointer to pointer to int 
+    f23: a open array of pointer to const pointer to int 
+    f24: a array of     10 pointer to const pointer to int 
+    f25: a open array of const pointer to const pointer to int 
+    f26: a array of     10 const pointer to const pointer to int 
+    f27: a open array of pointer to int 
+    f28: a array of     10 pointer to int 
+    f29: a open array of pointer to pointer to int 
+    f30: a array of     10 pointer to pointer to int 
+    f31: a open array of pointer to const pointer to int 
+    f32: a array of     10 pointer to const pointer to int 
+    f33: a open array of const pointer to const pointer to int 
+    f34: a array of     10 const pointer to const pointer to int 
+    f35: a open array of pointer to int 
+    f36: a array of     10 pointer to int 
+    f37: a open array of pointer to pointer to int 
+    f38: a array of     10 pointer to pointer to int 
+    f39: a open array of pointer to const pointer to int 
+    f40: a array of     10 pointer to const pointer to int 
+    f41: a open array of const pointer to const pointer to int 
+    f42: a array of     10 const pointer to const pointer to int 
+    f43: a open array of array of     3 int 
+    f44: a array of     3 array of     3 int 
+    f45: a open array of array of     3 int 
+    f46: a array of     3 array of     3 int 
+    f47: a open array of array of     3 int 
+    f48: a array of     3 array of     3 int 
+    f49: a open array of array of     3 pointer to int 
+    f50: a array of     3 array of     3 pointer to int 
+    f51: a open array of array of     3 pointer to pointer to int 
+    f52: a array of     3 array of     3 pointer to pointer to int 
+    f53: a open array of array of     3 pointer to const pointer to int 
+    f54: a array of     3 array of     3 pointer to const pointer to int 
+    f55: a open array of array of     3 const pointer to const pointer to int 
+    f56: a array of     3 array of     3 const pointer to const pointer to int 
+    f57: a open array of array of     3 pointer to int 
+    f58: a array of     3 array of     3 pointer to int 
+    f59: a open array of array of     3 pointer to pointer to int 
+    f60: a array of     3 array of     3 pointer to pointer to int 
+    f61: a open array of array of     3 pointer to const pointer to int 
+    f62: a array of     3 array of     3 pointer to const pointer to int 
+    f63: a open array of array of     3 const pointer to const pointer to int 
+    f64: a array of     3 array of     3 const pointer to const pointer to int 
+    f65: a function
+      with parameters 
+        int 
+      returning int 
+
+    f66: a function
+      with parameters 
+        int 
+      returning int 
+
+    f67: a function
+      with parameters 
+        int 
+      returning pointer to int 
+
+    f68: a function
+      with parameters 
+        int 
+      returning pointer to pointer to int 
+
+    f69: a function
+      with parameters 
+        int 
+      returning pointer to const pointer to int 
+
+    f70: a function
+      with parameters 
+        int 
+      returning const pointer to const pointer to int 
+
+    f71: a function
+      with parameters 
+        int 
+      returning pointer to int 
+
+    f72: a function
+      with parameters 
+        int 
+      returning pointer to pointer to int 
+
+    f73: a function
+      with parameters 
+        int 
+      returning pointer to const pointer to int 
+
+    f74: a function
+      with parameters 
+        int 
+      returning const pointer to const pointer to int 
+
+    f75: a pointer to function
+      with parameters 
+        int 
+      returning int 
+
+    f76: a pointer to pointer to function
+      with parameters 
+        int 
+      returning int 
+
+    f77: a pointer to const pointer to function
+      with parameters 
+        int 
+      returning int 
+
+    f78: a const pointer to const pointer to function
+      with parameters 
+        int 
+      returning int 
+
+    f79: a pointer to function
+      with parameters 
+        int 
+      returning pointer to function
+          with no parameters 
+          returning int 
+
+
+    f80: a const pointer to function
+      with parameters 
+        int 
+      returning pointer to function
+          with no parameters 
+          returning int 
+
+
+    f81: a const pointer to function
+      with parameters 
+        int 
+      returning const pointer to function
+          with no parameters 
+          returning int 
+
+
+
Index: src/Tests/Parser/Expected/IdentFuncParamDeclarator.tst
===================================================================
--- src/Tests/Parser/Expected/IdentFuncParamDeclarator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Expected/IdentFuncParamDeclarator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,199 @@
+fred: a function
+  with parameters 
+    f1: a int 
+    f2: a int 
+    f3: a pointer to int 
+    f4: a pointer to pointer to int 
+    f5: a pointer to const pointer to int 
+    f6: a const pointer to const pointer to int 
+    f7: a pointer to int 
+    f8: a pointer to pointer to int 
+    f9: a pointer to const pointer to int 
+    f10: a const pointer to const pointer to int 
+    f11: a pointer to int 
+    f12: a pointer to pointer to int 
+    f13: a pointer to const pointer to int 
+    f14: a const pointer to const pointer to int 
+    f15: a open array of int 
+    f16: a array of     10 int 
+    f17: a open array of int 
+    f18: a array of     10 int 
+    f19: a open array of pointer to int 
+    f20: a array of     10 pointer to int 
+    f21: a open array of pointer to pointer to int 
+    f22: a array of     10 pointer to pointer to int 
+    f23: a open array of pointer to const pointer to int 
+    f24: a array of     10 pointer to const pointer to int 
+    f25: a open array of const pointer to const pointer to int 
+    f26: a array of     10 const pointer to const pointer to int 
+    f27: a open array of pointer to int 
+    f28: a array of     10 pointer to int 
+    f29: a open array of pointer to pointer to int 
+    f30: a array of     10 pointer to pointer to int 
+    f31: a open array of pointer to const pointer to int 
+    f32: a array of     10 pointer to const pointer to int 
+    f33: a open array of const pointer to const pointer to int 
+    f34: a array of     10 const pointer to const pointer to int 
+    f35: a open array of pointer to int 
+    f36: a array of     10 pointer to int 
+    f37: a open array of pointer to pointer to int 
+    f38: a array of     10 pointer to pointer to int 
+    f39: a open array of pointer to const pointer to int 
+    f40: a array of     10 pointer to const pointer to int 
+    f41: a open array of const pointer to const pointer to int 
+    f42: a array of     10 const pointer to const pointer to int 
+    f43: a open array of array of     3 int 
+    f44: a array of     3 array of     3 int 
+    f45: a open array of array of     3 int 
+    f46: a array of     3 array of     3 int 
+    f47: a open array of array of     3 int 
+    f48: a array of     3 array of     3 int 
+    f49: a open array of array of     3 pointer to int 
+    f50: a array of     3 array of     3 pointer to int 
+    f51: a open array of array of     3 pointer to pointer to int 
+    f52: a array of     3 array of     3 pointer to pointer to int 
+    f53: a open array of array of     3 pointer to const pointer to int 
+    f54: a array of     3 array of     3 pointer to const pointer to int 
+    f55: a open array of array of     3 const pointer to const pointer to int 
+    f56: a array of     3 array of     3 const pointer to const pointer to int 
+    f57: a open array of array of     3 pointer to int 
+    f58: a array of     3 array of     3 pointer to int 
+    f59: a open array of array of     3 pointer to pointer to int 
+    f60: a array of     3 array of     3 pointer to pointer to int 
+    f61: a open array of array of     3 pointer to const pointer to int 
+    f62: a array of     3 array of     3 pointer to const pointer to int 
+    f63: a open array of array of     3 const pointer to const pointer to int 
+    f64: a array of     3 array of     3 const pointer to const pointer to int 
+    f65: a function
+      with parameters 
+        int 
+      returning int 
+
+    f66: a function
+      with parameters 
+        int 
+      returning int 
+
+    f67: a function
+      with parameters 
+        int 
+      returning pointer to int 
+
+    f68: a function
+      with parameters 
+        int 
+      returning pointer to pointer to int 
+
+    f69: a function
+      with parameters 
+        int 
+      returning pointer to const pointer to int 
+
+    f70: a function
+      with parameters 
+        int 
+      returning const pointer to const pointer to int 
+
+    f71: a function
+      with parameters 
+        int 
+      returning pointer to int 
+
+    f72: a function
+      with parameters 
+        int 
+      returning pointer to pointer to int 
+
+    f73: a function
+      with parameters 
+        int 
+      returning pointer to const pointer to int 
+
+    f74: a function
+      with parameters 
+        int 
+      returning const pointer to const pointer to int 
+
+    f75: a pointer to function
+      with parameters 
+        int 
+      returning int 
+
+    f76: a pointer to pointer to function
+      with parameters 
+        int 
+      returning int 
+
+    f77: a pointer to const pointer to function
+      with parameters 
+        int 
+      returning int 
+
+    f78: a const pointer to const pointer to function
+      with parameters 
+        int 
+      returning int 
+
+    f79: a pointer to function
+      with parameters 
+        int 
+      returning pointer to function
+          with no parameters 
+          returning int 
+
+
+    f80: a const pointer to function
+      with parameters 
+        int 
+      returning pointer to function
+          with no parameters 
+          returning int 
+
+
+    f81: a const pointer to function
+      with parameters 
+        int 
+      returning const pointer to function
+          with no parameters 
+          returning int 
+
+
+    f82: a const variable-length array of int 
+    f83: a const array of     3 int 
+    f84: a static array of     3 int 
+    f85: a const static array of     3 int 
+    f86: a const variable-length array of int 
+    f87: a const array of     3 int 
+    f88: a static array of     3 int 
+    f89: a const static array of     3 int 
+    f90: a const variable-length array of pointer to int 
+    f91: a const array of     3 pointer to int 
+    f92: a static array of     3 pointer to pointer to int 
+    f93: a const static array of     3 pointer to const pointer to int 
+    f94: a const static array of     3 const pointer to const pointer to int 
+    f95: a const variable-length array of pointer to int 
+    f96: a const array of     3 pointer to int 
+    f97: a static array of     3 pointer to pointer to int 
+    f98: a const static array of     3 pointer to const pointer to int 
+    f99: a const static array of     3 const pointer to const pointer to int 
+    f100: a const variable-length array of array of     3 int 
+    f101: a const array of     3 array of     3 int 
+    f102: a static array of     3 array of     3 int 
+    f103: a const static array of     3 array of     3 int 
+    f104: a const variable-length array of array of     3 int 
+    f105: a const array of     3 array of     3 int 
+    f106: a static array of     3 array of     3 int 
+    f107: a const static array of     3 array of     3 int 
+    f108: a const variable-length array of array of     3 pointer to int 
+    f109: a const array of     3 array of     3 pointer to int 
+    f110: a static array of     3 array of     3 pointer to pointer to int 
+    f111: a const static array of     3 array of     3 pointer to const pointer to int 
+    f112: a const static array of     3 array of     3 const pointer to const pointer to int 
+    f113: a const variable-length array of array of     3 pointer to int 
+    f114: a const array of     3 array of     3 pointer to int 
+    f115: a static array of     3 array of     3 pointer to pointer to int 
+    f116: a const static array of     3 array of     3 pointer to const pointer to int 
+    f117: a const static array of     3 array of     3 const pointer to const pointer to int 
+  returning int 
+  with body 
+
Index: src/Tests/Parser/Expected/Initialization.tst
===================================================================
--- src/Tests/Parser/Expected/Initialization.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Expected/Initialization.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,29 @@
+x21: a pointer to int 
+x22: a int 
+x21: a pointer to int 
+x22: a int 
+y1: a array of 20 int 
+y2: a array of 20 int 
+a: a instance of struct __anonymous0
+  with members 
+    w: a tuple with members 
+      int 
+
+
+w: a open array of instance of struct __anonymous1
+  with members 
+    a: a array of     3 int 
+    b: a int 
+
+v7: a instance of struct __anonymous3
+  with members 
+    f1: a int 
+    f2: a int 
+    f3: a int 
+    f4: a array of     4 instance of struct __anonymous2
+      with members 
+        g1: a int 
+        g2: a int 
+        g3: a int 
+
+
Index: src/Tests/Parser/Expected/Scope.tst
===================================================================
--- src/Tests/Parser/Expected/Scope.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Expected/Scope.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,152 @@
+x: a int 
+y: a typedef definition for double 
+t: a typedef definition for float 
+z: a instance of type y
+u: a type definition for instance of struct __anonymous0
+    with members 
+      a: a int 
+      b: a double 
+
+f: a function
+  with parameters 
+    y: a int 
+  returning int 
+
+q: a instance of type y
+w: a function
+  with parameters 
+    y: a instance of type y
+    v: a instance of type u
+  returning instance of type y
+  with body 
+    x: a type definition 
+      with assertions
+        t: a function
+          with parameters 
+            instance of type u
+          returning instance of type x
+
+      
+    u: a instance of type u
+      with initializer y 
+    z: a instance of type x
+      with initializer ( t u ) 
+
+p: a instance of type y
+context has_u
+  with type parameters 
+    z: a type variable 
+  with members 
+    u: a function
+      with parameters 
+        instance of type z
+      returning instance of type z
+
+
+q: a forall 
+    t: a type variable 
+      with assertions
+        instance of context has_u
+          with parameters 
+          Type:            instance of type t
+
+      
+function
+  with parameters 
+    the_t: a instance of type t
+  returning instance of type y
+  with body 
+    y: a instance of type t
+      with initializer ( u the_t ) 
+
+f: a function
+  with parameters 
+    p: a instance of type y
+  returning instance of type t
+  with body 
+    y: a int 
+    x: a typedef definition for char 
+      y: a instance of type x
+      z: a typedef definition for instance of type x
+        x: a instance of type z
+        y: a typedef definition for instance of type z
+        z: a instance of type y
+          with initializer x 
+      x: a instance of type z
+        with initializer y 
+    q: a instance of type x
+      with initializer y 
+
+g: a function
+  with parameters 
+    void 
+  returning instance of type t
+  with body 
+    x: a typedef definition for char 
+
+    Try
+
+        Branches of execution: 
+              
+              Application of: 
+
+                  Referencing: Variable: some_func
+
+              ... on no arguments: 
+
+
+            Catch
+
+                Declaration: 
+                    x: a instance of type x
+
+                Branches of execution: 
+                      y: a instance of type t
+                        with initializer x 
+    z: a instance of type x
+
+q: a function
+  with no parameters 
+  with old-style identifier list 
+    i: a untyped entity 
+  with old-style declaration list 
+    i: a int 
+  returning instance of type y
+  with body 
+
+    Switch
+
+        Expression: 
+
+            Referencing: Variable: i
+
+        Branches of execution: 
+
+            Case
+
+                Expression: 
+
+                    Referencing: Variable: 0
+
+                Branches of execution: 
+
+                    Return
+
+                        Expression: 
+
+                            Referencing: Variable: q
+
+            Default
+
+                Expression: 
+
+                    Null Expression
+
+                Branches of execution: 
+
+                    Return
+
+                        Expression: 
+
+                            Referencing: Variable: i
+
Index: src/Tests/Parser/Expected/StructMember.tst
===================================================================
--- src/Tests/Parser/Expected/StructMember.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Expected/StructMember.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,73 @@
+T: a typedef definition for int 
+struct S
+  with members 
+    m1: a int 
+      with bitfield width 3 
+    m2: a int 
+      with bitfield width 4 
+    int 
+      with bitfield width 2 
+    int 
+      with bitfield width 3 
+    int 
+      with bitfield width 4 
+    m3: a int 
+    m4: a int 
+    m5: a int 
+    m6: a int 
+    m7: a pointer to int 
+    m8: a pointer to int 
+    m9: a pointer to int 
+    m10: a pointer to function
+      with no parameters 
+      returning int 
+
+    m11: a pointer to function
+      with parameters 
+        int 
+      returning pointer to int 
+
+    T: a instance of type T
+    T: a instance of type T
+    m12: a pointer to int 
+    m13: a pointer to int 
+    m14: a pointer to function
+      with parameters 
+        int 
+      returning tuple with members 
+          pointer to int 
+
+
+    int 
+    int 
+    int 
+    int 
+    pointer to int 
+    int 
+    int 
+    pointer to int 
+    pointer to int 
+    pointer to int 
+    pointer to int 
+    pointer to int 
+    pointer to int 
+    pointer to function
+      with no parameters 
+      returning int 
+
+    pointer to pointer to function
+      with parameters 
+        int 
+      returning int 
+
+    instance of type T
+
+s: a instance of struct S
+
+u: a instance of union U
+  with members 
+    m1: a array of     5 int 
+    m2: a array of     5 int 
+    m3: a pointer to int 
+    m4: a pointer to int 
+
Index: src/Tests/Parser/Expected/Tuple.tst
===================================================================
--- src/Tests/Parser/Expected/Tuple.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Expected/Tuple.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,788 @@
+f: a function
+  with parameters 
+    int 
+    int 
+  returning int 
+
+g: a function
+  with parameters 
+    int 
+    int 
+    int 
+  returning int 
+
+h: a static function
+  with parameters 
+    a: a int 
+    b: a int 
+    c: a pointer to int 
+    d: a open array of char 
+  returning tuple with members 
+      int 
+      pointer to int 
+      pointer to int 
+      int 
+
+
+struct inner
+  with members 
+    f2: a int 
+    f3: a int 
+
+s: a instance of struct outer
+  with members 
+    f1: a int 
+    i: a instance of struct inner
+
+    f4: a double 
+
+sp: a pointer to instance of struct outer
+
+t1: a const volatile tuple with members 
+  int 
+  int 
+
+t2: a static const tuple with members 
+  int 
+  const int 
+
+t3: a static const tuple with members 
+  int 
+  const int 
+
+printf: a function
+  with parameters 
+    fmt: a pointer to char 
+    and a variable number of other arguments
+  returning tuple with members 
+      rc: a int 
+
+
+printf: a function
+  with parameters 
+    fmt: a pointer to char 
+    and a variable number of other arguments
+  returning int 
+
+f1: a function
+  with parameters 
+    w: a int 
+  returning tuple with members 
+      x: a short 
+      y: a unsigned 
+
+  with body 
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Application of: 
+
+            Operator: TupleC
+
+        ... on arguments: 
+
+            Referencing: Variable: y
+
+            Referencing: Variable: x
+
+        Application of: 
+
+            Operator: Assign
+
+        ... on arguments: 
+
+            Application of: 
+
+                Operator: TupleC
+
+            ... on arguments: 
+
+                Referencing: Variable: x
+
+                Referencing: Variable: y
+
+            Application of: 
+
+                Operator: TupleC
+
+            ... on arguments: 
+
+                Referencing: Variable: w
+                23 
+
+
+g1: a function
+  with no parameters 
+  returning tuple with members 
+      r: a tuple with members 
+        int 
+        char 
+        long 
+        int 
+
+
+  with body 
+    x: a short 
+    p: a short 
+    y: a unsigned int 
+    z: a tuple with members 
+      int 
+      int 
+
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Application of: 
+
+            Operator: TupleC
+
+        ... on arguments: 
+
+            Referencing: Variable: x
+
+            Referencing: Variable: y
+
+            Referencing: Variable: z
+
+        Application of: 
+
+            Operator: Cast
+
+        ... on arguments: 
+            Type:              tuple with members 
+                short 
+                unsigned int 
+                tuple with members 
+                  int 
+                  int 
+
+
+
+            Application of: 
+
+                Operator: TupleC
+
+            ... on arguments: 
+
+                Referencing: Variable: p
+
+                Application of: 
+
+                    Referencing: Variable: f
+
+                ... on arguments: 
+                    17 
+                3 
+
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Referencing: Variable: r
+
+        Application of: 
+
+            Operator: TupleC
+
+        ... on arguments: 
+
+            Referencing: Variable: x
+
+            Referencing: Variable: y
+
+            Referencing: Variable: z
+
+
+main: a function
+  with parameters 
+    argc: a int 
+    argv: a pointer to pointer to char 
+  returning tuple with members 
+      rc: a int 
+
+  with body 
+    a: a int 
+    b: a int 
+    c: a int 
+    d: a int 
+    t: a instance of struct outer
+
+      with initializer [designated by: ()( TupleC 1 7.0 ) ]
+    
+    Application of: 
+
+        Referencing: Variable: f
+
+    ... on arguments: 
+
+        Application of: 
+
+            Operator: TupleC
+
+        ... on arguments: 
+            3 
+            5 
+
+    
+    Application of: 
+
+        Referencing: Variable: g
+
+    ... on arguments: 
+
+        Application of: 
+
+            Operator: TupleC
+
+        ... on arguments: 
+            3 
+            5 
+        3 
+
+    
+    Application of: 
+
+        Referencing: Variable: f
+
+    ... on arguments: 
+
+        Referencing: Variable: t1
+
+    
+    Application of: 
+
+        Referencing: Variable: g
+
+    ... on arguments: 
+
+        Referencing: Variable: t1
+        3 
+
+    
+    Application of: 
+
+        Operator: TupleC
+
+    ... on arguments: 
+        3 
+        5 
+
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Application of: 
+
+            Operator: TupleC
+
+        ... on arguments: 
+
+            Referencing: Variable: a
+
+            Referencing: Variable: b
+        3 
+
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Application of: 
+
+            Operator: TupleC
+
+        ... on arguments: 
+
+            Referencing: Variable: a
+
+            Referencing: Variable: b
+
+        Application of: 
+
+            Operator: TupleC
+
+        ... on arguments: 
+            4.6 
+
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Application of: 
+
+            Operator: TupleC
+
+        ... on arguments: 
+
+            Referencing: Variable: a
+
+            Referencing: Variable: b
+
+        Application of: 
+
+            Operator: Assign
+
+        ... on arguments: 
+
+            Application of: 
+
+                Operator: TupleC
+
+            ... on arguments: 
+
+                Referencing: Variable: c
+
+                Referencing: Variable: d
+
+            Application of: 
+
+                Operator: TupleC
+
+            ... on arguments: 
+                3 
+                5 
+
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Application of: 
+
+            Operator: TupleC
+
+        ... on arguments: 
+
+            Referencing: Variable: a
+
+            Referencing: Variable: b
+
+            Application of: 
+
+                Operator: TupleC
+
+            ... on arguments: 
+
+                Referencing: Variable: c
+
+        Application of: 
+
+            Operator: TupleC
+
+        ... on arguments: 
+            2 
+
+            Referencing: Variable: a
+
+            Referencing: Variable: b
+
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Application of: 
+
+            Operator: TupleC
+
+        ... on arguments: 
+
+            Referencing: Variable: a
+
+            Referencing: Variable: b
+
+        Application of: 
+
+            Operator: Cond
+
+        ... on arguments: 
+
+            Application of: 
+
+                Operator: GThan
+
+            ... on arguments: 
+                3 
+                4 
+
+            Application of: 
+
+                Operator: TupleC
+
+            ... on arguments: 
+
+                Referencing: Variable: b
+                6 
+
+            Application of: 
+
+                Operator: TupleC
+
+            ... on arguments: 
+                7 
+                8 
+
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Referencing: Variable: t1
+
+        Application of: 
+
+            Operator: TupleC
+
+        ... on arguments: 
+
+            Referencing: Variable: a
+
+            Referencing: Variable: b
+
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Referencing: Variable: t1
+
+        Application of: 
+
+            Operator: Assign
+
+        ... on arguments: 
+
+            Referencing: Variable: t2
+
+            Application of: 
+
+                Operator: TupleC
+
+            ... on arguments: 
+
+                Referencing: Variable: a
+
+                Referencing: Variable: b
+
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Application of: 
+
+            Operator: TupleC
+
+        ... on arguments: 
+
+            Referencing: Variable: a
+
+            Referencing: Variable: b
+
+        Application of: 
+
+            Operator: Assign
+
+        ... on arguments: 
+
+            Application of: 
+
+                Operator: TupleC
+
+            ... on arguments: 
+
+                Referencing: Variable: c
+
+                Referencing: Variable: d
+
+            Application of: 
+
+                Operator: PlusAssn
+
+            ... on arguments: 
+
+                Referencing: Variable: d
+
+                Application of: 
+
+                    Operator: PlusAssn
+
+                ... on arguments: 
+
+                    Referencing: Variable: c
+
+                    Referencing: Variable: 1
+
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Application of: 
+
+            Operator: TupleC
+
+        ... on arguments: 
+
+            Referencing: Variable: a
+
+            Referencing: Variable: b
+
+        Application of: 
+
+            Operator: Assign
+
+        ... on arguments: 
+
+            Application of: 
+
+                Operator: TupleC
+
+            ... on arguments: 
+
+                Referencing: Variable: c
+
+                Referencing: Variable: d
+
+            Referencing: Variable: t1
+
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Application of: 
+
+            Operator: TupleC
+
+        ... on arguments: 
+
+            Referencing: Variable: a
+
+            Referencing: Variable: b
+
+        Application of: 
+
+            Operator: Assign
+
+        ... on arguments: 
+
+            Referencing: Variable: t1
+
+            Application of: 
+
+                Operator: TupleC
+
+            ... on arguments: 
+
+                Referencing: Variable: c
+
+                Referencing: Variable: d
+
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Application of: 
+
+            Operator: TupleC
+
+        ... on arguments: 
+
+            Referencing: Variable: a
+
+            Referencing: Variable: b
+
+        Application of: 
+
+            Operator: Assign
+
+        ... on arguments: 
+
+            Referencing: Variable: t1
+
+            Application of: 
+
+                Operator: Assign
+
+            ... on arguments: 
+
+                Referencing: Variable: t2
+
+                Application of: 
+
+                    Operator: TupleC
+
+                ... on arguments: 
+
+                    Referencing: Variable: c
+
+                    Referencing: Variable: d
+
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Referencing: Variable: t1
+
+        Application of: 
+
+            Operator: Assign
+
+        ... on arguments: 
+
+            Application of: 
+
+                Operator: TupleC
+
+            ... on arguments: 
+                3 
+                4 
+
+            Application of: 
+
+                Operator: Assign
+
+            ... on arguments: 
+
+                Application of: 
+
+                    Operator: TupleC
+
+                ... on arguments: 
+                    3 
+                    4 
+
+                Application of: 
+
+                    Operator: Assign
+
+                ... on arguments: 
+
+                    Referencing: Variable: t1
+
+                    Application of: 
+
+                        Operator: TupleC
+
+                    ... on arguments: 
+                        3 
+                        4 
+
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Referencing: Variable: s
+
+        Application of: 
+
+            Operator: TupleC
+
+        ... on arguments: 
+            11 
+
+            Application of: 
+
+                Operator: Comma
+
+            ... on arguments: 
+                12 
+                13 
+            3.14159 
+
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Referencing: Variable: s
+
+        Application of: 
+
+            Referencing: Variable: h
+
+        ... on arguments: 
+            3 
+            3 
+
+            Referencing: Variable: 0
+            ""abc"" 
+
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Referencing: Variable: sp
+
+        Referencing: Variable: sp
+
+    
+    Application of: 
+
+        Referencing: Variable: printf
+
+    ... on arguments: 
+        ""expecting 3, 17, 23, 4; got %d, %d, %d, %d\n"" 
+
+        Referencing: Variable: s
+
+    
+    Application of: 
+
+        Operator: Assign
+
+    ... on arguments: 
+
+        Referencing: Variable: rc
+
+        Referencing: Variable: 0
+
+
Index: src/Tests/Parser/Expected/TypeGenerator.tst
===================================================================
--- src/Tests/Parser/Expected/TypeGenerator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Expected/TypeGenerator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,112 @@
+context addable
+  with type parameters 
+    T: a type variable 
+  with members 
+    ?+?: a function
+      with parameters 
+        instance of type T
+        instance of type T
+      returning instance of type T
+
+
+List: a type definition 
+  with parameters
+  T: a type variable 
+    with assertions
+      instance of context addable
+        with parameters 
+        Type:          instance of type T
+
+    
+
+  with assertions
+    instance of context addable
+      with parameters 
+      Type:        instance of type T
+
+  for pointer to instance of struct __anonymous0
+    with members 
+      data: a instance of type T
+      next: a pointer to instance of type List with parameters
+        Type:          instance of type T
+
+
+ListOfIntegers: a typedef definition for instance of type List with parameters
+    Type:      int 
+
+li: a instance of type ListOfIntegers
+f: a function
+  with parameters 
+    g: a pointer to function
+      with parameters 
+        int 
+      returning instance of type List with parameters
+          Type:            int 
+
+
+  returning int 
+
+h: a function
+  with parameters 
+    p: a pointer to instance of type List with parameters
+      Type:        int 
+
+  returning tuple with members 
+      int 
+
+
+struct node
+  with type parameters 
+    T: a type variable 
+      with assertions
+        instance of context addable
+          with parameters 
+          Type:            instance of type T
+
+      
+  with members 
+    data: a instance of type T
+    next: a pointer to instance of struct node
+      instantiated with actual parameters 
+        Type:          instance of type T
+      with parameters 
+      Type:        instance of type T
+
+
+List: a type definition 
+  with parameters
+  T: a type variable 
+for pointer to instance of struct node
+    instantiated with actual parameters 
+      Type:        instance of type T
+    with parameters 
+    Type:      instance of type T
+
+my_list: a instance of type List with parameters
+  Type:    int 
+
+Complex: a type definition 
+  with assertions
+    instance of context addable
+      with parameters 
+      Type:        instance of type Complex
+
+  
+main: a function
+  with no parameters 
+  returning int 
+  with body 
+    
+    Application of: 
+
+        Operator: Cast
+
+    ... on arguments: 
+        Type:          struct node
+            instantiated with actual parameters 
+              Type:                int 
+
+
+        Referencing: Variable: my_list
+
+
Index: src/Tests/Parser/Expected/Typedef.tst
===================================================================
--- src/Tests/Parser/Expected/Typedef.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Expected/Typedef.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,97 @@
+T: a typedef definition for int 
+f: a function
+  with parameters 
+    void 
+  returning void 
+  with body 
+    T: a function
+      with parameters 
+        instance of type T
+      returning int 
+
+    
+    Application of: 
+
+        Referencing: Variable: T
+
+    ... on arguments: 
+        3 
+
+
+fred: a instance of struct __anonymous0
+  with members 
+    T: a instance of type T
+
+  with initializer [3 ]
+a: a typedef definition for pointer to function
+    with parameters 
+      int 
+      char 
+    returning int 
+
+b: a instance of type a
+g: a function
+  with parameters 
+    void 
+  returning int 
+  with body 
+    a: a double 
+
+c: a instance of type a
+main: a function
+  with no parameters 
+  returning int 
+  with body 
+
+  Null Statement:
+
+arrayOf10Pointers: a typedef definition for array of   10 pointer to int 
+x: a instance of type arrayOf10Pointers
+constantPointer: a typedef definition for const pointer to int 
+funcPtr: a typedef definition for pointer to function
+    with parameters 
+      open array of int 
+    returning tuple with members 
+        int 
+
+
+funcProto: a typedef definition for function
+    with parameters 
+      open array of int 
+    returning tuple with members 
+        int 
+
+
+tupleType: a typedef definition for tuple with members 
+    int 
+    int 
+
+tupleTypePtr: a typedef definition for pointer to tuple with members 
+    int 
+    int 
+
+a: a typedef definition for pointer to int 
+b: a typedef definition for pointer to int 
+f: a typedef definition for function
+    with parameters 
+      pointer to int 
+    returning tuple with members 
+        int 
+
+
+g: a typedef definition for function
+    with parameters 
+      pointer to int 
+    returning tuple with members 
+        int 
+
+
+t: a typedef definition for tuple with members 
+    pointer to static array of     10 int 
+
+f: a typedef definition for function
+    with no parameters 
+    returning tuple with members 
+        x: a pointer to static array of         10 int 
+
+
Index: src/Tests/Parser/Expected/TypedefDeclarator.tst
===================================================================
--- src/Tests/Parser/Expected/TypedefDeclarator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Expected/TypedefDeclarator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,253 @@
+f0: a typedef definition for int 
+f1: a typedef definition for int 
+f2: a typedef definition for int 
+f3: a typedef definition for int 
+f4: a typedef definition for int 
+f5: a typedef definition for int 
+f6: a typedef definition for int 
+f7: a typedef definition for int 
+f8: a typedef definition for int 
+f9: a typedef definition for int 
+f10: a typedef definition for int 
+f11: a typedef definition for int 
+f12: a typedef definition for int 
+f13: a typedef definition for int 
+f14: a typedef definition for int 
+f15: a typedef definition for int 
+f16: a typedef definition for int 
+f17: a typedef definition for int 
+f18: a typedef definition for int 
+f19: a typedef definition for int 
+f20: a typedef definition for int 
+f21: a typedef definition for int 
+f22: a typedef definition for int 
+f23: a typedef definition for int 
+f24: a typedef definition for int 
+f25: a typedef definition for int 
+f26: a typedef definition for int 
+f27: a typedef definition for int 
+f28: a typedef definition for int 
+f29: a typedef definition for int 
+f30: a typedef definition for int 
+f31: a typedef definition for int 
+f32: a typedef definition for int 
+f33: a typedef definition for int 
+f34: a typedef definition for int 
+f35: a typedef definition for int 
+f36: a typedef definition for int 
+f37: a typedef definition for int 
+f38: a typedef definition for int 
+f39: a typedef definition for int 
+f40: a typedef definition for int 
+f41: a typedef definition for int 
+f42: a typedef definition for int 
+f43: a typedef definition for int 
+f44: a typedef definition for int 
+f45: a typedef definition for int 
+f46: a typedef definition for int 
+f47: a typedef definition for int 
+f48: a typedef definition for int 
+f49: a typedef definition for int 
+f50: a typedef definition for int 
+f51: a typedef definition for int 
+f52: a typedef definition for int 
+f53: a typedef definition for int 
+f54: a typedef definition for int 
+f55: a typedef definition for int 
+f56: a typedef definition for int 
+f57: a typedef definition for int 
+f58: a typedef definition for int 
+f59: a typedef definition for int 
+f60: a typedef definition for int 
+f61: a typedef definition for int 
+f62: a typedef definition for int 
+f63: a typedef definition for int 
+f64: a typedef definition for int 
+f65: a typedef definition for int 
+f66: a typedef definition for int 
+f67: a typedef definition for int 
+f68: a typedef definition for int 
+f69: a typedef definition for int 
+f70: a typedef definition for int 
+f71: a typedef definition for int 
+f72: a typedef definition for int 
+f73: a typedef definition for int 
+f74: a typedef definition for int 
+f75: a typedef definition for int 
+f76: a typedef definition for int 
+f77: a typedef definition for int 
+f78: a typedef definition for int 
+f79: a typedef definition for int 
+f80: a typedef definition for int 
+f81: a typedef definition for int 
+f82: a typedef definition for int 
+f83: a typedef definition for int 
+f84: a typedef definition for int 
+f85: a typedef definition for int 
+f86: a typedef definition for int 
+f87: a typedef definition for int 
+f88: a typedef definition for int 
+f89: a typedef definition for int 
+main: a function
+  with no parameters 
+  returning int 
+  with body 
+    f1: a int 
+    f2: a int 
+    f3: a pointer to int 
+    f4: a pointer to pointer to int 
+    f5: a pointer to const pointer to int 
+    f6: a const pointer to const pointer to int 
+    f7: a pointer to int 
+    f8: a pointer to pointer to int 
+    f9: a pointer to const pointer to int 
+    f10: a const pointer to const pointer to int 
+    f11: a pointer to int 
+    f12: a pointer to pointer to int 
+    f13: a pointer to const pointer to int 
+    f14: a const pointer to const pointer to int 
+    f15: a open array of int 
+    f16: a array of     10 int 
+    f17: a open array of int 
+    f18: a array of     10 int 
+    f19: a open array of pointer to int 
+    f20: a array of     10 pointer to int 
+    f21: a open array of pointer to pointer to int 
+    f22: a array of     10 pointer to pointer to int 
+    f23: a open array of pointer to const pointer to int 
+    f24: a array of     10 pointer to const pointer to int 
+    f25: a open array of const pointer to const pointer to int 
+    f26: a array of     10 const pointer to const pointer to int 
+    f27: a open array of pointer to int 
+    f28: a array of     10 pointer to int 
+    f29: a open array of pointer to pointer to int 
+    f30: a array of     10 pointer to pointer to int 
+    f31: a open array of pointer to const pointer to int 
+    f32: a array of     10 pointer to const pointer to int 
+    f33: a open array of const pointer to const pointer to int 
+    f34: a array of     10 const pointer to const pointer to int 
+    f35: a open array of pointer to int 
+    f36: a array of     10 pointer to int 
+    f37: a open array of pointer to pointer to int 
+    f38: a array of     10 pointer to pointer to int 
+    f39: a open array of pointer to const pointer to int 
+    f40: a array of     10 pointer to const pointer to int 
+    f41: a open array of const pointer to const pointer to int 
+    f42: a array of     10 const pointer to const pointer to int 
+    f43: a open array of array of     3 int 
+    f44: a array of     3 array of     3 int 
+    f45: a open array of array of     3 int 
+    f46: a array of     3 array of     3 int 
+    f47: a open array of array of     3 int 
+    f48: a array of     3 array of     3 int 
+    f49: a open array of array of     3 pointer to int 
+    f50: a array of     3 array of     3 pointer to int 
+    f51: a open array of array of     3 pointer to pointer to int 
+    f52: a array of     3 array of     3 pointer to pointer to int 
+    f53: a open array of array of     3 pointer to const pointer to int 
+    f54: a array of     3 array of     3 pointer to const pointer to int 
+    f55: a open array of array of     3 const pointer to const pointer to int 
+    f56: a array of     3 array of     3 const pointer to const pointer to int 
+    f57: a open array of array of     3 pointer to int 
+    f58: a array of     3 array of     3 pointer to int 
+    f59: a open array of array of     3 pointer to pointer to int 
+    f60: a array of     3 array of     3 pointer to pointer to int 
+    f61: a open array of array of     3 pointer to const pointer to int 
+    f62: a array of     3 array of     3 pointer to const pointer to int 
+    f63: a open array of array of     3 const pointer to const pointer to int 
+    f64: a array of     3 array of     3 const pointer to const pointer to int 
+    f65: a function
+      with parameters 
+        int 
+      returning int 
+
+    f66: a function
+      with parameters 
+        int 
+      returning int 
+
+    f67: a function
+      with parameters 
+        int 
+      returning pointer to int 
+
+    f68: a function
+      with parameters 
+        int 
+      returning pointer to pointer to int 
+
+    f69: a function
+      with parameters 
+        int 
+      returning pointer to const pointer to int 
+
+    f70: a function
+      with parameters 
+        int 
+      returning const pointer to const pointer to int 
+
+    f71: a function
+      with parameters 
+        int 
+      returning pointer to int 
+
+    f72: a function
+      with parameters 
+        int 
+      returning pointer to pointer to int 
+
+    f73: a function
+      with parameters 
+        int 
+      returning pointer to const pointer to int 
+
+    f74: a function
+      with parameters 
+        int 
+      returning const pointer to const pointer to int 
+
+    f75: a pointer to function
+      with parameters 
+        int 
+      returning int 
+
+    f76: a pointer to pointer to function
+      with parameters 
+        int 
+      returning int 
+
+    f77: a pointer to const pointer to function
+      with parameters 
+        int 
+      returning int 
+
+    f78: a const pointer to const pointer to function
+      with parameters 
+        int 
+      returning int 
+
+    f79: a pointer to function
+      with parameters 
+        int 
+      returning pointer to function
+          with no parameters 
+          returning int 
+
+
+    f80: a const pointer to function
+      with parameters 
+        int 
+      returning pointer to function
+          with no parameters 
+          returning int 
+
+
+    f81: a const pointer to function
+      with parameters 
+        int 
+      returning const pointer to function
+          with no parameters 
+          returning int 
+
+
+
Index: src/Tests/Parser/Expected/TypedefParamDeclarator.tst
===================================================================
--- src/Tests/Parser/Expected/TypedefParamDeclarator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Expected/TypedefParamDeclarator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,349 @@
+f0: a typedef definition for int 
+f1: a typedef definition for int 
+f2: a typedef definition for int 
+f3: a typedef definition for int 
+f4: a typedef definition for int 
+f5: a typedef definition for int 
+f6: a typedef definition for int 
+f7: a typedef definition for int 
+f8: a typedef definition for int 
+f9: a typedef definition for int 
+f10: a typedef definition for int 
+f11: a typedef definition for int 
+f12: a typedef definition for int 
+f13: a typedef definition for int 
+f14: a typedef definition for int 
+f15: a typedef definition for int 
+f16: a typedef definition for int 
+f17: a typedef definition for int 
+f18: a typedef definition for int 
+f19: a typedef definition for int 
+f20: a typedef definition for int 
+f21: a typedef definition for int 
+f22: a typedef definition for int 
+f23: a typedef definition for int 
+f24: a typedef definition for int 
+f25: a typedef definition for int 
+f26: a typedef definition for int 
+f27: a typedef definition for int 
+f28: a typedef definition for int 
+f29: a typedef definition for int 
+f30: a typedef definition for int 
+f31: a typedef definition for int 
+f32: a typedef definition for int 
+f33: a typedef definition for int 
+f34: a typedef definition for int 
+f35: a typedef definition for int 
+f36: a typedef definition for int 
+f37: a typedef definition for int 
+f38: a typedef definition for int 
+f39: a typedef definition for int 
+f40: a typedef definition for int 
+f41: a typedef definition for int 
+f42: a typedef definition for int 
+f43: a typedef definition for int 
+f44: a typedef definition for int 
+f45: a typedef definition for int 
+f46: a typedef definition for int 
+f47: a typedef definition for int 
+f48: a typedef definition for int 
+f49: a typedef definition for int 
+f50: a typedef definition for int 
+f51: a typedef definition for int 
+f52: a typedef definition for int 
+f53: a typedef definition for int 
+f54: a typedef definition for int 
+f55: a typedef definition for int 
+f56: a typedef definition for int 
+f57: a typedef definition for int 
+f58: a typedef definition for int 
+f59: a typedef definition for int 
+f60: a typedef definition for int 
+f61: a typedef definition for int 
+f62: a typedef definition for int 
+f63: a typedef definition for int 
+f64: a typedef definition for int 
+f65: a typedef definition for int 
+f66: a typedef definition for int 
+f67: a typedef definition for int 
+f68: a typedef definition for int 
+f69: a typedef definition for int 
+f70: a typedef definition for int 
+f71: a typedef definition for int 
+f72: a typedef definition for int 
+f73: a typedef definition for int 
+f74: a typedef definition for int 
+f75: a typedef definition for int 
+f76: a typedef definition for int 
+f77: a typedef definition for int 
+f78: a typedef definition for int 
+f79: a typedef definition for int 
+f80: a typedef definition for int 
+f81: a typedef definition for int 
+f82: a typedef definition for int 
+f83: a typedef definition for int 
+f84: a typedef definition for int 
+f85: a typedef definition for int 
+f86: a typedef definition for int 
+f87: a typedef definition for int 
+f88: a typedef definition for int 
+f89: a typedef definition for int 
+f90: a typedef definition for int 
+f91: a typedef definition for int 
+f92: a typedef definition for int 
+f93: a typedef definition for int 
+f94: a typedef definition for int 
+f95: a typedef definition for int 
+f96: a typedef definition for int 
+f97: a typedef definition for int 
+f98: a typedef definition for int 
+f99: a typedef definition for int 
+f100: a typedef definition for int 
+f101: a typedef definition for int 
+f102: a typedef definition for int 
+f103: a typedef definition for int 
+f104: a typedef definition for int 
+f105: a typedef definition for int 
+f106: a typedef definition for int 
+f107: a typedef definition for int 
+f108: a typedef definition for int 
+f109: a typedef definition for int 
+f110: a typedef definition for int 
+f111: a typedef definition for int 
+f112: a typedef definition for int 
+f113: a typedef definition for int 
+f114: a typedef definition for int 
+f115: a typedef definition for int 
+f116: a typedef definition for int 
+f117: a typedef definition for int 
+f118: a typedef definition for int 
+f119: a typedef definition for int 
+fred: a function
+  with parameters 
+    f1: a int 
+    f3: a pointer to int 
+    f4: a pointer to pointer to int 
+    f5: a pointer to const pointer to int 
+    f6: a const pointer to const pointer to int 
+    f11: a pointer to int 
+    f12: a pointer to pointer to int 
+    f13: a pointer to const pointer to int 
+    f14: a const pointer to const pointer to int 
+    f15: a open array of int 
+    f16: a array of     10 int 
+    f19: a open array of pointer to int 
+    f20: a array of     10 pointer to int 
+    f21: a open array of pointer to pointer to int 
+    f22: a array of     10 pointer to pointer to int 
+    f23: a open array of pointer to const pointer to int 
+    f24: a array of     10 pointer to const pointer to int 
+    f25: a open array of const pointer to const pointer to int 
+    f26: a array of     10 const pointer to const pointer to int 
+    f35: a open array of pointer to int 
+    f36: a array of     10 pointer to int 
+    f37: a open array of pointer to pointer to int 
+    f38: a array of     10 pointer to pointer to int 
+    f39: a open array of pointer to const pointer to int 
+    f40: a array of     10 pointer to const pointer to int 
+    f41: a open array of const pointer to const pointer to int 
+    f42: a array of     10 const pointer to const pointer to int 
+    f43: a open array of array of     3 int 
+    f44: a array of     3 array of     3 int 
+    f49: a open array of array of     3 pointer to int 
+    f50: a array of     3 array of     3 pointer to int 
+    f51: a open array of array of     3 pointer to pointer to int 
+    f52: a array of     3 array of     3 pointer to pointer to int 
+    f53: a open array of array of     3 pointer to const pointer to int 
+    f54: a array of     3 array of     3 pointer to const pointer to int 
+    f55: a open array of array of     3 const pointer to const pointer to int 
+    f56: a array of     3 array of     3 const pointer to const pointer to int 
+    f57: a open array of array of     3 pointer to int 
+    f58: a array of     3 array of     3 pointer to int 
+    f59: a open array of array of     3 pointer to pointer to int 
+    f60: a array of     3 array of     3 pointer to pointer to int 
+    f61: a open array of array of     3 pointer to const pointer to int 
+    f62: a array of     3 array of     3 pointer to const pointer to int 
+    f63: a open array of array of     3 const pointer to const pointer to int 
+    f64: a array of     3 array of     3 const pointer to const pointer to int 
+    f65: a function
+      with parameters 
+        int 
+      returning int 
+
+    f67: a function
+      with parameters 
+        int 
+      returning pointer to int 
+
+    f68: a function
+      with parameters 
+        int 
+      returning pointer to pointer to int 
+
+    f69: a function
+      with parameters 
+        int 
+      returning pointer to const pointer to int 
+
+    f70: a function
+      with parameters 
+        int 
+      returning const pointer to const pointer to int 
+
+    f75: a pointer to function
+      with parameters 
+        int 
+      returning int 
+
+    f76: a pointer to pointer to function
+      with parameters 
+        int 
+      returning int 
+
+    f77: a pointer to const pointer to function
+      with parameters 
+        int 
+      returning int 
+
+    f78: a const pointer to const pointer to function
+      with parameters 
+        int 
+      returning int 
+
+    f79: a pointer to function
+      with parameters 
+        int 
+      returning pointer to function
+          with no parameters 
+          returning int 
+
+
+    f80: a const pointer to function
+      with parameters 
+        int 
+      returning pointer to function
+          with no parameters 
+          returning int 
+
+
+    f81: a const pointer to function
+      with parameters 
+        int 
+      returning const pointer to function
+          with no parameters 
+          returning int 
+
+
+    f82: a const variable-length array of int 
+    f83: a const array of     3 int 
+    f84: a static array of     3 int 
+    f85: a const static array of     3 int 
+    function
+      with parameters 
+        const variable-length array of instance of type f86
+      returning int 
+
+    function
+      with parameters 
+        const array of         3 instance of type f87
+      returning int 
+
+    function
+      with parameters 
+        static array of         3 instance of type f88
+      returning int 
+
+    function
+      with parameters 
+        const static array of         3 instance of type f89
+      returning int 
+
+    f90: a const variable-length array of pointer to int 
+    f91: a const array of     3 pointer to int 
+    f92: a static array of     3 pointer to pointer to int 
+    f93: a const static array of     3 pointer to const pointer to int 
+    f94: a const static array of     3 const pointer to const pointer to int 
+    function
+      with parameters 
+        const variable-length array of instance of type f95
+      returning pointer to int 
+
+    function
+      with parameters 
+        const array of         3 instance of type f96
+      returning pointer to int 
+
+    function
+      with parameters 
+        static array of         3 instance of type f97
+      returning pointer to pointer to int 
+
+    function
+      with parameters 
+        const static array of         3 instance of type f98
+      returning pointer to const pointer to int 
+
+    function
+      with parameters 
+        const static array of         3 instance of type f99
+      returning const pointer to const pointer to int 
+
+    f100: a const variable-length array of array of     3 int 
+    f101: a const array of     3 array of     3 int 
+    f102: a static array of     3 array of     3 int 
+    f103: a const static array of     3 array of     3 int 
+    function
+      with parameters 
+        const variable-length array of array of         3 instance of type f104
+      returning int 
+
+    function
+      with parameters 
+        const array of         3 array of         3 instance of type f105
+      returning int 
+
+    function
+      with parameters 
+        static array of         3 array of         3 instance of type f106
+      returning int 
+
+    function
+      with parameters 
+        const static array of         3 array of         3 instance of type f107
+      returning int 
+
+    f108: a const variable-length array of array of     3 pointer to int 
+    f109: a const array of     3 array of     3 pointer to int 
+    f110: a static array of     3 array of     3 pointer to pointer to int 
+    f111: a const static array of     3 array of     3 pointer to const pointer to int 
+    f112: a const static array of     3 array of     3 const pointer to const pointer to int 
+    function
+      with parameters 
+        const variable-length array of array of         3 instance of type f113
+      returning pointer to int 
+
+    function
+      with parameters 
+        const array of         3 array of         3 instance of type f114
+      returning pointer to int 
+
+    function
+      with parameters 
+        static array of         3 array of         3 instance of type f115
+      returning pointer to pointer to int 
+
+    function
+      with parameters 
+        const static array of         3 array of         3 instance of type f116
+      returning pointer to const pointer to int 
+
+    function
+      with parameters 
+        const static array of         3 array of         3 instance of type f117
+      returning const pointer to const pointer to int 
+
+  returning int 
+  with body 
+
+  Null Statement:
+
Index: src/Tests/Parser/Expected/VariableDeclarator.tst
===================================================================
--- src/Tests/Parser/Expected/VariableDeclarator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Expected/VariableDeclarator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,168 @@
+f1: a int 
+f2: a int 
+f3: a pointer to int 
+f4: a pointer to pointer to int 
+f5: a pointer to const pointer to int 
+f6: a const pointer to const pointer to int 
+f7: a pointer to int 
+f8: a pointer to pointer to int 
+f9: a pointer to const pointer to int 
+f10: a const pointer to const pointer to int 
+f11: a pointer to int 
+f12: a pointer to pointer to int 
+f13: a pointer to const pointer to int 
+f14: a const pointer to const pointer to int 
+f15: a open array of int 
+f16: a array of 10 int 
+f17: a open array of int 
+f18: a array of 10 int 
+f19: a open array of pointer to int 
+f20: a array of 10 pointer to int 
+f21: a open array of pointer to pointer to int 
+f22: a array of 10 pointer to pointer to int 
+f23: a open array of pointer to const pointer to int 
+f24: a array of 10 pointer to const pointer to int 
+f25: a open array of const pointer to const pointer to int 
+f26: a array of 10 const pointer to const pointer to int 
+f27: a open array of pointer to int 
+f28: a array of 10 pointer to int 
+f29: a open array of pointer to pointer to int 
+f30: a array of 10 pointer to pointer to int 
+f31: a open array of pointer to const pointer to int 
+f32: a array of 10 pointer to const pointer to int 
+f33: a open array of const pointer to const pointer to int 
+f34: a array of 10 const pointer to const pointer to int 
+f35: a open array of pointer to int 
+f36: a array of 10 pointer to int 
+f37: a open array of pointer to pointer to int 
+f38: a array of 10 pointer to pointer to int 
+f39: a open array of pointer to const pointer to int 
+f40: a array of 10 pointer to const pointer to int 
+f41: a open array of const pointer to const pointer to int 
+f42: a array of 10 const pointer to const pointer to int 
+f43: a open array of array of 3 int 
+f44: a array of 3 array of 3 int 
+f45: a open array of array of 3 int 
+f46: a array of 3 array of 3 int 
+f47: a open array of array of 3 int 
+f48: a array of 3 array of 3 int 
+f49: a open array of array of 3 pointer to int 
+f50: a array of 3 array of 3 pointer to int 
+f51: a open array of array of 3 pointer to pointer to int 
+f52: a array of 3 array of 3 pointer to pointer to int 
+f53: a open array of array of 3 pointer to const pointer to int 
+f54: a array of 3 array of 3 pointer to const pointer to int 
+f55: a open array of array of 3 const pointer to const pointer to int 
+f56: a array of 3 array of 3 const pointer to const pointer to int 
+f57: a open array of array of 3 pointer to int 
+f58: a array of 3 array of 3 pointer to int 
+f59: a open array of array of 3 pointer to pointer to int 
+f60: a array of 3 array of 3 pointer to pointer to int 
+f61: a open array of array of 3 pointer to const pointer to int 
+f62: a array of 3 array of 3 pointer to const pointer to int 
+f63: a open array of array of 3 const pointer to const pointer to int 
+f64: a array of 3 array of 3 const pointer to const pointer to int 
+f65: a function
+  with parameters 
+    int 
+  returning int 
+
+f66: a function
+  with parameters 
+    int 
+  returning int 
+
+f67: a function
+  with parameters 
+    int 
+  returning pointer to int 
+
+f68: a function
+  with parameters 
+    int 
+  returning pointer to pointer to int 
+
+f69: a function
+  with parameters 
+    int 
+  returning pointer to const pointer to int 
+
+f70: a function
+  with parameters 
+    int 
+  returning const pointer to const pointer to int 
+
+f71: a function
+  with parameters 
+    int 
+  returning pointer to int 
+
+f72: a function
+  with parameters 
+    int 
+  returning pointer to pointer to int 
+
+f73: a function
+  with parameters 
+    int 
+  returning pointer to const pointer to int 
+
+f74: a function
+  with parameters 
+    int 
+  returning const pointer to const pointer to int 
+
+f75: a pointer to function
+  with parameters 
+    int 
+  returning int 
+
+f76: a pointer to pointer to function
+  with parameters 
+    int 
+  returning int 
+
+f77: a pointer to const pointer to function
+  with parameters 
+    int 
+  returning int 
+
+f78: a const pointer to const pointer to function
+  with parameters 
+    int 
+  returning int 
+
+f79: a pointer to function
+  with parameters 
+    int 
+  returning pointer to function
+      with no parameters 
+      returning int 
+
+
+f80: a const pointer to function
+  with parameters 
+    int 
+  returning pointer to function
+      with no parameters 
+      returning int 
+
+
+f81: a const pointer to function
+  with parameters 
+    int 
+  returning const pointer to function
+      with no parameters 
+      returning int 
+
+
+z: a pointer to array of 20 double 
+w: a array of 20 pointer to char 
+v3: a pointer to open array of pointer to open array of pointer to function
+  with parameters 
+    pointer to open array of pointer to open array of int 
+    pointer to open array of pointer to open array of int 
+  returning tuple with members 
+      pointer to open array of pointer to open array of int 
+
+
Index: src/Tests/Parser/Forall.c
===================================================================
--- src/Tests/Parser/Forall.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Forall.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,51 @@
+typedef forall ( type T ) int (*f)( int );
+
+forall( type T )
+    void swap( T left, T right ) {
+	T temp = left;
+	left = right;
+	right = temp;
+    }
+
+context sumable( type T ) {
+    const T 0;
+    T ?+?(T, T);
+    T ?++(T);
+    [T] ?+=?(T,T);
+};
+
+type T1 | { const T1 0; T1 ?+?(T1, T1); T1 ?++(T1); [T1] ?+=?(T1,T1); },
+     T2(type P1, type P2 ),
+     T3 | sumable(T3);
+
+type T2(type P1, type P2) | sumable(T2(P1,P2)) = struct { P1 i; P2 j; };
+
+T2(int, int) w1;
+typedef T2(int, int) w2;
+w2 g2;
+type w3 = T2(int, int);
+w3 g3;
+
+forall( type T | sumable( T ) )
+    T sum( int n, T a[] ) {
+	T total = 0;
+	int i;
+	for ( i = 0; i < n; i += 1 )
+	    total = total + a[i];
+	return total;
+    }
+
+forall( type T | { const T 0; T ?+?(T, T); T ?++(T); [T] ?+=?(T,T); } )
+    T twice( T t ) {
+	return t + t;
+    }
+
+int main() {
+    int x = 1, y = 2, a[10];
+    float f;
+
+    swap( x, y );
+    twice( x, y );
+    f = min( 4.0, 3.0 );
+    sum( 10, a );
+}
Index: src/Tests/Parser/Functions.c
===================================================================
--- src/Tests/Parser/Functions.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Functions.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,163 @@
+// ANSI function definitions
+
+void h(void) {}
+
+int f (
+    int (void),
+    int (int),
+    int ((void)),
+    int ((int)),
+    void g(void)
+  ) {
+    (*g)();
+    g();
+    g = h;
+}
+
+int f1() {}
+int (f2()) {}
+int (*f3())() {}
+int *((f4())) {}
+int ((*f5()))() {}
+int *f6() {}
+int *(f7)() {}
+int **f8() {}
+int * const *(f9)() {}
+int (*f10())[] {}
+int (*f11())[][3] {}
+int ((*f12())[])[3] {}
+
+// "implicit int" type specifier (not ANSI)
+
+fII1( int i ) {}
+const fII2( int i ) {}
+extern fII3( int i ) {}
+extern const fII4( int i ) {}
+
+*fII5() {}
+const *fII6() {}
+const long *fII7() {}
+static const long *fII8() {}
+const static long *fII9() {}
+
+// K&R function definitions
+
+fO1( i ) int i; {}
+int fO2( i ) int i; {}
+const fO3( i ) int i; {}
+extern fO4( i ) int i; {}
+extern const fO5( i ) int i; {}
+
+// Cforall extensions
+
+[] f( );
+[int] f( );
+[] f(int);
+[int] f(int);
+[] f( ) {}
+[int] f( ) {}
+[] f(int) {}
+[int] f(int) {}
+
+[int x] f( );
+[] f(int x);
+[int x] f(int x);
+[int x] f( ) {}
+[] f(int x) {}
+[int x] f(int x) {}
+
+[int, int x] f( );
+[] f(int, int x);
+[int, int x] f(int, int x);
+[int, int x] f( ) {}
+[] f(int, int x) {}
+[int, int x] f(int, int x) {}
+
+[int, int x, int] f( );
+[] f(int, int x, int);
+[int, int x, int] f(int, int x, int);
+[int, int x, int] f( ) {}
+[] f(int, int x, int) {}
+[int, int x, int] f(int, int x, int) {}
+
+[int, int x, * int y] f( );
+[] f(int, int x, * int y);
+[int, int x, * int y] f(int, int x, * int y);
+[int, int x, * int y] f( ) {}
+[] f(int, int x, * int y) {}
+[int, int x, * int y] f(int, int x, * int y) {}
+
+[ int ] f11( int ), f12;  // => int f11( int ), f12( int );
+
+[int] f(
+	int ( int, int p ),
+	[int](int)
+    ) {
+    int (*(*p)[][10])[][3];
+    * [][10] * [][3] int p;
+    * [] * [int](int) p;
+}
+
+static const int *f1() {}
+static [ const int ] f2() {}
+static inline [ const * int ] f3() {}
+static inline [ const [ * int, int ] ] f4() {}
+static [ const [ * int, const int ] ] f5() {}
+
+// unnamed parameter
+
+int f(
+    int (),
+
+    int *(),
+    int **(),
+    int * const *(),
+    int * const * const (),
+
+    int ([]),
+    int ([10]),
+
+    int *([]),
+    int *([10]),
+    int **([]),
+    int **([10]),
+    int * const *([]),
+    int * const *([10]),
+    int * const * const ([]),
+    int * const * const ([10])
+    );
+
+int f(
+    int (),
+
+    int *(),
+    int **(),
+    int * const *(),
+    int * const * const (),
+
+    int ([]),
+    int ([10]),
+
+    int *([]),
+    int *([10]),
+    int **([]),
+    int **([10]),
+    int * const *([]),
+    int * const *([10]),
+    int * const * const ([]),
+    int * const * const ([10])
+    ) {
+}
+
+typedef int T;
+
+int f( T (T), T T ) {
+    T (T);
+}
+
+// errors
+
+//int f()[] {}
+//int (f[])() {}
+//int f[]() {}
+//int ((*f15())())[] {}
Index: src/Tests/Parser/IdentFuncDeclarator.c
===================================================================
--- src/Tests/Parser/IdentFuncDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/IdentFuncDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,105 @@
+int main() {
+    //int f0[]();
+    //int (f0[])();
+    //int f0()[];
+    //int f0()();
+    //int (*f0)()();
+    //int ((*f0())())[];
+    
+    int f1;
+    int (f2);
+
+    int *f3;
+    int **f4;
+    int * const *f5;
+    int * const * const f6;
+
+    int *(f7);
+    int **(f8);
+    int * const *(f9);
+    int * const * const (f10);
+
+    int (*f11);
+    int (**f12);
+    int (* const *f13);
+    int (* const * const f14);
+
+    int f15[];
+    int f16[10];
+    int (f17[]);
+    int (f18[10]);
+
+    int *f19[];
+    int *f20[10];
+    int **f21[];
+    int **f22[10];
+    int * const *f23[];
+    int * const *f24[10];
+    int * const * const f25[];
+    int * const * const f26[10];
+
+    int *(f27[]);
+    int *(f28[10]);
+    int **(f29[]);
+    int **(f30[10]);
+    int * const *(f31[]);
+    int * const *(f32[10]);
+    int * const * const (f33[]);
+    int * const * const (f34[10]);
+
+    int (*f35[]);
+    int (*f36[10]);
+    int (**f37[]);
+    int (**f38[10]);
+    int (* const *f39[]);
+    int (* const *f40[10]);
+    int (* const * const f41[]);
+    int (* const * const f42[10]);
+
+    int f43[][3];
+    int f44[3][3];
+    int (f45[])[3];
+    int (f46[3])[3];
+    int ((f47[]))[3];
+    int ((f48[3]))[3];
+
+    int *f49[][3];
+    int *f50[3][3];
+    int **f51[][3];
+    int **f52[3][3];
+    int * const *f53[][3];
+    int * const *f54[3][3];
+    int * const * const f55[][3];
+    int * const * const f56[3][3];
+
+    int (*f57[][3]);
+    int (*f58[3][3]);
+    int (**f59[][3]);
+    int (**f60[3][3]);
+    int (* const *f61[][3]);
+    int (* const *f62[3][3]);
+    int (* const * const f63[][3]);
+    int (* const * const f64[3][3]);
+
+    int f65(int);
+    int (f66)(int);
+
+    int *f67(int);
+    int **f68(int);
+    int * const *f69(int);
+    int * const * const f70(int);
+
+    int *(f71)(int);
+    int **(f72)(int);
+    int * const *(f73)(int);
+    int * const * const (f74)(int);
+
+    int (*f75)(int);
+    int (**f76)(int);
+    int (* const *f77)(int);
+    int (* const * const f78)(int);
+
+    int (*(*f79)(int))();
+    int (*(* const f80)(int))();
+    int (* const(* const f81)(int))();
+}
Index: src/Tests/Parser/IdentFuncParamDeclarator.c
===================================================================
--- src/Tests/Parser/IdentFuncParamDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/IdentFuncParamDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,150 @@
+int fred(
+    //int f0[](),
+    //int (f0[])(),
+    //int f0()[],
+    //int f0()(),
+    //int (*f0)()(),
+    //int ((*f0())())[],
+    
+    int f1,
+    int (f2),
+
+    int *f3,
+    int **f4,
+    int * const *f5,
+    int * const * const f6,
+
+    int *(f7),
+    int **(f8),
+    int * const *(f9),
+    int * const * const (f10),
+
+    int (*f11),
+    int (**f12),
+    int (* const *f13),
+    int (* const * const f14),
+
+    int f15[],
+    int f16[10],
+    int (f17[]),
+    int (f18[10]),
+
+    int *f19[],
+    int *f20[10],
+    int **f21[],
+    int **f22[10],
+    int * const *f23[],
+    int * const *f24[10],
+    int * const * const f25[],
+    int * const * const f26[10],
+
+    int *(f27[]),
+    int *(f28[10]),
+    int **(f29[]),
+    int **(f30[10]),
+    int * const *(f31[]),
+    int * const *(f32[10]),
+    int * const * const (f33[]),
+    int * const * const (f34[10]),
+
+    int (*f35[]),
+    int (*f36[10]),
+    int (**f37[]),
+    int (**f38[10]),
+    int (* const *f39[]),
+    int (* const *f40[10]),
+    int (* const * const f41[]),
+    int (* const * const f42[10]),
+
+    int f43[][3],
+    int f44[3][3],
+    int (f45[])[3],
+    int (f46[3])[3],
+    int ((f47[]))[3],
+    int ((f48[3]))[3],
+
+    int *f49[][3],
+    int *f50[3][3],
+    int **f51[][3],
+    int **f52[3][3],
+    int * const *f53[][3],
+    int * const *f54[3][3],
+    int * const * const f55[][3],
+    int * const * const f56[3][3],
+
+    int (*f57[][3]),
+    int (*f58[3][3]),
+    int (**f59[][3]),
+    int (**f60[3][3]),
+    int (* const *f61[][3]),
+    int (* const *f62[3][3]),
+    int (* const * const f63[][3]),
+    int (* const * const f64[3][3]),
+
+    int f65(int),
+    int (f66)(int),
+
+    int *f67(int),
+    int **f68(int),
+    int * const *f69(int),
+    int * const * const f70(int),
+
+    int *(f71)(int),
+    int **(f72)(int),
+    int * const *(f73)(int),
+    int * const * const (f74)(int),
+
+    int (*f75)(int),
+    int (**f76)(int),
+    int (* const *f77)(int),
+    int (* const * const f78)(int),
+
+    int (*(*f79)(int))(),
+    int (*(* const f80)(int))(),
+    int (* const(* const f81)(int))(),
+
+    int f82[const *],
+    int f83[const 3],
+    int f84[static 3],
+    int f85[static const 3],
+
+    int (f86[const *]),
+    int (f87[const 3]),
+    int (f88[static 3]),
+    int (f89[static const 3]),
+
+    int *f90[const *],
+    int *f91[const 3],
+    int **f92[static 3],
+    int * const *f93[static const 3],
+    int * const * const f94[static const 3],
+
+    int *(f95[const *]),
+    int *(f96[const 3]),
+    int **(f97[static 3]),
+    int * const *(f98[static const 3]),
+    int * const * const (f99[static const 3]),
+
+    int f100[const *][3],
+    int f101[const 3][3],
+    int f102[static 3][3],
+    int f103[static const 3][3],
+
+    int (f104[const *][3]),
+    int (f105[const 3][3]),
+    int (f106[static 3][3]),
+    int (f107[static const 3][3]),
+
+    int *f108[const *][3],
+    int *f109[const 3][3],
+    int **f110[static 3][3],
+    int * const *f111[static const 3][3],
+    int * const * const f112[static const 3][3],
+
+    int *(f113[const *][3]),
+    int *(f114[const 3][3]),
+    int **(f115[static 3][3]),
+    int * const *(f116[static const 3][3]),
+    int * const * const (f117[static const 3][3])
+    ) {
+}
Index: src/Tests/Parser/Initialization.c
===================================================================
--- src/Tests/Parser/Initialization.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Initialization.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,27 @@
+// Cforall extensions
+
+int * x21 = 0, x22 = 0;
+int * x21 = 0, x22 = 0;
+
+[20] int y1, y2 = { 1, 2, 3 };
+
+// designators
+
+struct {
+    [int] w;
+} a = { .w : [2] };
+
+struct { int a[3], b; } w [] = { [0].a : {1}, [0].b : 1, [1].a[0] : 2 };
+
+struct {
+    int f1, f2, f3;
+    struct { int g1, g2, g3; } f4[4];
+} v7 = {
+    .f1 : 4,
+    f2 : 3,
+    .f4[2] : {
+	.g1 : 3,
+	g3 : 0,
+    },
+    .f4[3].g3 : 7,
+};
Index: src/Tests/Parser/Makefile
===================================================================
--- src/Tests/Parser/Makefile	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Makefile	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,19 @@
+CFA = ../../cfa-cpp
+
+EXPECTED = ${wildcard Expected/*.tst}
+TESTS = $(EXPECTED:Expected/%=%)
+TEST_IN = $(TESTS:.tst=.c)
+DIFF = diff
+
+%.tst:%.c $(CFA)
+	$(CFA) -nt < $< > $@ 2>&1
+
+report: $(CFA) $(TESTS) $(EXPECTED)
+	rm -f report
+	@for i in $(TESTS); do \
+	  echo "---$$i---" | tee -a report; \
+	  $(DIFF) -B -w Expected/$$i $$i | tee -a report; \
+	done
+
+clean:
+	rm -f *.tst
Index: src/Tests/Parser/Scope.c
===================================================================
--- src/Tests/Parser/Scope.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Scope.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,69 @@
+int x;
+typedef double y;
+typedef float t;
+y z;
+type u = struct { int a; double b; };
+int f( int y );
+y q;
+
+y w(y y, u v) {
+  type x | { x t(u); };
+  u u = y;
+  x z = t(u);
+}
+
+y p;
+
+context has_u( type z )
+{
+  z u(z);
+};
+
+forall( type t | has_u( t ) )
+y q( t the_t )
+{
+  t y = u( the_t );
+}
+
+t f( y p ) {
+  int y;
+  typedef char x;
+
+  {
+    x y;
+    typedef x z;
+
+    {
+      z x;
+      typedef z y;
+      y z = x;
+    }
+
+    z x = y;
+  }
+
+  x q = y;
+}
+
+t g( void ) {
+  typedef char x;
+  try {
+    some_func();
+  } catch ( x x ) {
+    t y = x;
+  }
+  x z;
+}
+
+y q(i)
+    int i;
+{
+  switch (i) {
+    y q = i;
+  case 0:
+    return q;
+  default:
+    return i;
+  }
+}
+
Index: src/Tests/Parser/StructMember.c
===================================================================
--- src/Tests/Parser/StructMember.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/StructMember.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,40 @@
+typedef int T;
+
+struct S {
+    int m1:3, m2:4;
+    int :2;
+    int :3, :4;
+    int m3;
+    int m4, m5, m6;
+    int *m7, *m8, *m9;
+    int (*m10)();
+    int *(*m11)(int);
+    T T;
+    T (T);
+
+// Cforall extensions
+
+    * int m12, m13;
+    * [ * int ] (int) m14;
+    int ;
+    int , , ;
+    int * , , ;
+    int *, *, *;
+    * int , , ;
+    int (*)();
+    int (**)( int );
+    T ;
+
+// errors
+
+//    void f(void);
+};
+
+struct S s;
+
+union U {
+    [5] int m1;
+    int m2[5];
+    * int m3;
+    int *m4;
+} u;
Index: src/Tests/Parser/Tuple.c
===================================================================
--- src/Tests/Parser/Tuple.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Tuple.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,62 @@
+int f( int, int );
+int g( int, int, int );
+static [ int, int *, * int, int ] h( int a, int b, * int c, [] char d );
+
+struct inner {
+    int f2, f3;
+};
+
+struct outer {
+    int f1;
+    struct inner i;
+    double f4;
+} s, *sp;
+
+const volatile [ int, int ] t1;
+static const [ int, const int ] t2;
+const static [ int, const int ] t3;
+
+[ int rc ] printf( * char fmt, ... );
+int printf( char *fmt, ... );
+
+[ short x, unsigned y ] f1( int w ) {
+    [ y, x ] = [ x, y ] = [ w, 23 ];
+}
+
+[ [ int, char, long, int ] r ] g1() {
+    short x, p;
+    unsigned int y;
+    [ int, int ] z;
+
+    [ x, y, z ] = ([short, unsigned int, [int, int]])([ p, f( 17 ), 3 ]);
+    r = [ x, y, z ];
+}
+
+[ int rc ] main( int argc, ** char argv ) {
+    int a, b, c, d;
+    struct outer t = { .[ f1,f4 ] : [ 1,7.0 ] };
+    f( [ 3,5 ] );
+    g( [ 3,5 ], 3 );
+    f( t1 );
+    g( t1, 3 );
+    [ 3,5 ];
+    [ a,b ] = 3;
+    [ a,b ] = [ 4.6 ];
+    [ a,b ] = [ c,d ] = [ 3,5 ];
+    [ a,b,[ c ] ] = [ 2,[ a,b ] ];
+    [ a,b ] = 3 > 4 ? [ b,6 ] : [ 7,8 ];
+
+    t1 = [ a,b ];
+    t1 = t2 = [ a,b ];
+    [ a,b ] = [ c,d ] = d += c += 1;
+    [ a,b ] = [ c,d ] = t1;
+    [ a,b ] = t1 = [ c,d ];
+    [ a,b ] = t1 = t2 = [ c,d ];
+    t1 = [ 3,4 ] = [ 3,4 ] = t1 = [ 3,4 ];
+
+    s.[ f1, i.[ f2, f3 ], f4 ] = [ 11, 12, 13, 3.14159 ];
+    s.[ f1, i.[ f2, f3 ], f4 ] = h( 3, 3, 0, "abc" );
+    sp->[ f4,f1 ] = sp->[ f1,f4 ];
+    printf( "expecting 3, 17, 23, 4; got %d, %d, %d, %d\n", s.[ f4, i.[ f3,f2 ], f1 ] );
+    rc = 0;
+}
Index: src/Tests/Parser/TypeGenerator.c
===================================================================
--- src/Tests/Parser/TypeGenerator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/TypeGenerator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,19 @@
+context addable(type T) {
+   T ?+?(T,T);
+};
+
+type List(type T | addable(T) ) | addable(T) = struct { T data; List(T) *next; } *;
+typedef List(int) ListOfIntegers;
+ListOfIntegers li;
+int f( List(int) ((*g))(int) );
+[int] h( * List(int) p ); // new declaration syntax
+
+struct(type T | addable(T) ) node { T data; struct(T) node *next; };
+type List(type T) = struct(T) node *;
+List(int) my_list;
+
+type Complex | addable(Complex);
+
+int main() {
+    (struct(int) node)my_list;
+}
Index: src/Tests/Parser/Typedef.c
===================================================================
--- src/Tests/Parser/Typedef.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/Typedef.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,41 @@
+typedef int T;
+
+void f( void ) {
+    int T( T );
+    T( 3 );
+}
+
+struct {
+    T (T);
+} fred = { 3 };
+
+typedef int (*a)(int, char);
+a b;
+
+int g(void) {
+    double a;
+}
+a c;
+
+// typedef x = 3, y = 3;  /* GCC */
+
+// x p;
+// y q;
+
+int main() {
+//    typedef z = p = 3;
+}
+
+/* new-style function definitions */
+
+typedef [10] * int arrayOf10Pointers;
+arrayOf10Pointers x;
+typedef const * int constantPointer;
+typedef * [ int ]( [] int ) funcPtr;
+typedef [ int ] funcProto( []  int );
+typedef [ int, int ] tupleType;
+typedef * [ int, int ] tupleTypePtr;
+typedef * int a, b;
+typedef [ int ] f( * int ), g;
+typedef [ * [static 10] int ] t;
+typedef [ * [static 10] int x ] f();
Index: src/Tests/Parser/TypedefDeclarator.c
===================================================================
--- src/Tests/Parser/TypedefDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/TypedefDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,116 @@
+typedef int
+     f0,  f1,  f2,  f3,  f4,  f5,  f6,  f7,  f8,  f9,
+    f10, f11, f12, f13, f14, f15, f16, f17, f18, f19,
+    f20, f21, f22, f23, f24, f25, f26, f27, f28, f29,
+    f30, f31, f32, f33, f34, f35, f36, f37, f38, f39,
+    f40, f41, f42, f43, f44, f45, f46, f47, f48, f49,
+    f50, f51, f52, f53, f54, f55, f56, f57, f58, f59,
+    f60, f61, f62, f63, f64, f65, f66, f67, f68, f69,
+    f70, f71, f72, f73, f74, f75, f76, f77, f78, f79,
+    f80, f81, f82, f83, f84, f85, f86, f87, f88, f89;
+
+int main() {
+    //int f0[]();
+    //int (f0[])();
+    //int f0()[];
+    //int f0()();
+    //int (*f0)()();
+    //int ((*f0())())[];
+    
+    int f1;
+    int (f2);
+
+    int *f3;
+    int **f4;
+    int * const *f5;
+    int * const * const f6;
+
+    int *(f7);
+    int **(f8);
+    int * const *(f9);
+    int * const * const (f10);
+
+    int (*f11);
+    int (**f12);
+    int (* const *f13);
+    int (* const * const f14);
+
+    int f15[];
+    int f16[10];
+    int (f17[]);
+    int (f18[10]);
+
+    int *f19[];
+    int *f20[10];
+    int **f21[];
+    int **f22[10];
+    int * const *f23[];
+    int * const *f24[10];
+    int * const * const f25[];
+    int * const * const f26[10];
+
+    int *(f27[]);
+    int *(f28[10]);
+    int **(f29[]);
+    int **(f30[10]);
+    int * const *(f31[]);
+    int * const *(f32[10]);
+    int * const * const (f33[]);
+    int * const * const (f34[10]);
+
+    int (*f35[]);
+    int (*f36[10]);
+    int (**f37[]);
+    int (**f38[10]);
+    int (* const *f39[]);
+    int (* const *f40[10]);
+    int (* const * const f41[]);
+    int (* const * const f42[10]);
+
+    int f43[][3];
+    int f44[3][3];
+    int (f45[])[3];
+    int (f46[3])[3];
+    int ((f47[]))[3];
+    int ((f48[3]))[3];
+
+    int *f49[][3];
+    int *f50[3][3];
+    int **f51[][3];
+    int **f52[3][3];
+    int * const *f53[][3];
+    int * const *f54[3][3];
+    int * const * const f55[][3];
+    int * const * const f56[3][3];
+
+    int (*f57[][3]);
+    int (*f58[3][3]);
+    int (**f59[][3]);
+    int (**f60[3][3]);
+    int (* const *f61[][3]);
+    int (* const *f62[3][3]);
+    int (* const * const f63[][3]);
+    int (* const * const f64[3][3]);
+
+    int f65(int);
+    int (f66)(int);
+
+    int *f67(int);
+    int **f68(int);
+    int * const *f69(int);
+    int * const * const f70(int);
+
+    int *(f71)(int);
+    int **(f72)(int);
+    int * const *(f73)(int);
+    int * const * const (f74)(int);
+
+    int (*f75)(int);
+    int (**f76)(int);
+    int (* const *f77)(int);
+    int (* const * const f78)(int);
+
+    int (*(*f79)(int))();
+    int (*(* const f80)(int))();
+    int (* const(* const f81)(int))();
+}
Index: src/Tests/Parser/TypedefParamDeclarator.c
===================================================================
--- src/Tests/Parser/TypedefParamDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/TypedefParamDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,150 @@
+typedef int
+     f0,   f1,   f2,   f3,   f4,   f5,   f6,   f7,   f8,   f9,
+    f10,  f11,  f12,  f13,  f14,  f15,  f16,  f17,  f18,  f19,
+    f20,  f21,  f22,  f23,  f24,  f25,  f26,  f27,  f28,  f29,
+    f30,  f31,  f32,  f33,  f34,  f35,  f36,  f37,  f38,  f39,
+    f40,  f41,  f42,  f43,  f44,  f45,  f46,  f47,  f48,  f49,
+    f50,  f51,  f52,  f53,  f54,  f55,  f56,  f57,  f58,  f59,
+    f60,  f61,  f62,  f63,  f64,  f65,  f66,  f67,  f68,  f69,
+    f70,  f71,  f72,  f73,  f74,  f75,  f76,  f77,  f78,  f79,
+    f80,  f81,  f82,  f83,  f84,  f85,  f86,  f87,  f88,  f89,
+    f90,  f91,  f92,  f93,  f94,  f95,  f96,  f97,  f98,  f99,
+    f100, f101, f102, f103, f104, f105, f106, f107, f108, f109,
+    f110, f111, f112, f113, f114, f115, f116, f117, f118, f119;
+
+int fred(
+/*
+    //int f0[](),
+    //int (f0[])(),
+    //int f0()[],
+    //int f0()(),
+    //int (*f0)()(),
+    //int ((*f0())())[],
+*/
+    int f1,
+
+    int *f3,
+    int **f4,
+    int * const *f5,
+    int * const * const f6,
+
+    int (*f11),
+    int (**f12),
+    int (* const *f13),
+    int (* const * const f14),
+
+    int f15[],
+    int f16[10],
+
+    int *f19[],
+    int *f20[10],
+    int **f21[],
+    int **f22[10],
+    int * const *f23[],
+    int * const *f24[10],
+    int * const * const f25[],
+    int * const * const f26[10],
+
+    int (*f35[]),
+    int (*f36[10]),
+    int (**f37[]),
+    int (**f38[10]),
+    int (* const *f39[]),
+    int (* const *f40[10]),
+    int (* const * const f41[]),
+    int (* const * const f42[10]),
+
+    int f43[][3],
+    int f44[3][3],
+/*
+    int (f45[])[3],
+    int (f46[3])[3],
+    int ((f47[]))[3],
+    int ((f48[3]))[3],
+*/
+    int *f49[][3],
+    int *f50[3][3],
+    int **f51[][3],
+    int **f52[3][3],
+    int * const *f53[][3],
+    int * const *f54[3][3],
+    int * const * const f55[][3],
+    int * const * const f56[3][3],
+
+    int (*f57[][3]),
+    int (*f58[3][3]),
+    int (**f59[][3]),
+    int (**f60[3][3]),
+    int (* const *f61[][3]),
+    int (* const *f62[3][3]),
+    int (* const * const f63[][3]),
+    int (* const * const f64[3][3]),
+
+    int f65(int),
+/*
+    int (f66)(int),
+*/
+    int *f67(int),
+    int **f68(int),
+    int * const *f69(int),
+    int * const * const f70(int),
+/*
+    int *(f71)(int),
+    int **(f72)(int),
+    int * const *(f73)(int),
+    int * const * const (f74)(int),
+*/
+    int (*f75)(int),
+    int (**f76)(int),
+    int (* const *f77)(int),
+    int (* const * const f78)(int),
+
+    int (*(*f79)(int))(),
+    int (*(* const f80)(int))(),
+    int (* const(* const f81)(int))(),
+
+    int f82[const *],
+    int f83[const 3],
+    int f84[static 3],
+    int f85[static const 3],
+
+    int (f86[const *]),
+    int (f87[const 3]),
+    int (f88[static 3]),
+    int (f89[static const 3]),
+
+    int *f90[const *],
+    int *f91[const 3],
+    int **f92[static 3],
+    int * const *f93[static const 3],
+    int * const * const f94[static const 3],
+
+    int *(f95[const *]),
+    int *(f96[const 3]),
+    int **(f97[static 3]),
+    int * const *(f98[static const 3]),
+    int * const * const (f99[static const 3]),
+
+    int f100[const *][3],
+    int f101[const 3][3],
+    int f102[static 3][3],
+    int f103[static const 3][3],
+
+    int (f104[const *][3]),
+    int (f105[const 3][3]),
+    int (f106[static 3][3]),
+    int (f107[static const 3][3]),
+
+    int *f108[const *][3],
+    int *f109[const 3][3],
+    int **f110[static 3][3],
+    int * const *f111[static const 3][3],
+    int * const * const f112[static const 3][3],
+
+    int *(f113[const *][3]),
+    int *(f114[const 3][3]),
+    int **(f115[static 3][3]),
+    int * const *(f116[static const 3][3]),
+    int * const * const (f117[static const 3][3])
+    ) {
+}
Index: src/Tests/Parser/VariableDeclarator.c
===================================================================
--- src/Tests/Parser/VariableDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Parser/VariableDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,115 @@
+int f1;
+int (f2);
+
+int *f3;
+int **f4;
+int * const *f5;
+int * const * const f6;
+
+int *(f7);
+int **(f8);
+int * const *(f9);
+int * const * const (f10);
+
+int (*f11);
+int (**f12);
+int (* const *f13);
+int (* const * const f14);
+
+int f15[];
+int f16[10];
+int (f17[]);
+int (f18[10]);
+
+int *f19[];
+int *f20[10];
+int **f21[];
+int **f22[10];
+int * const *f23[];
+int * const *f24[10];
+int * const * const f25[];
+int * const * const f26[10];
+
+int *(f27[]);
+int *(f28[10]);
+int **(f29[]);
+int **(f30[10]);
+int * const *(f31[]);
+int * const *(f32[10]);
+int * const * const (f33[]);
+int * const * const (f34[10]);
+
+int (*f35[]);
+int (*f36[10]);
+int (**f37[]);
+int (**f38[10]);
+int (* const *f39[]);
+int (* const *f40[10]);
+int (* const * const f41[]);
+int (* const * const f42[10]);
+
+int f43[][3];
+int f44[3][3];
+int (f45[])[3];
+int (f46[3])[3];
+int ((f47[]))[3];
+int ((f48[3]))[3];
+
+int *f49[][3];
+int *f50[3][3];
+int **f51[][3];
+int **f52[3][3];
+int * const *f53[][3];
+int * const *f54[3][3];
+int * const * const f55[][3];
+int * const * const f56[3][3];
+
+int (*f57[][3]);
+int (*f58[3][3]);
+int (**f59[][3]);
+int (**f60[3][3]);
+int (* const *f61[][3]);
+int (* const *f62[3][3]);
+int (* const * const f63[][3]);
+int (* const * const f64[3][3]);
+
+int f65(int);
+int (f66)(int);
+
+int *f67(int);
+int **f68(int);
+int * const *f69(int);
+int * const * const f70(int);
+
+int *(f71)(int);
+int **(f72)(int);
+int * const *(f73)(int);
+
+int * const * const (f74)(int);
+
+int (*f75)(int);
+int (**f76)(int);
+int (* const *f77)(int);
+int (* const * const f78)(int);
+
+int (*(*f79)(int))();
+int (*(* const f80)(int))();
+int (* const(* const f81)(int))();
+
+// errors
+
+//int fe0[]();				// array of functions
+//int (fe1[])();				// array of functions
+//int fe2()[];				// returning an array
+//int fe3()();				// returning a function
+//int (*fe4)()();				// returning a function
+//int ((*fe5())())[];			// returning an array
+
+// Cforall extensions
+
+* [20] double z;
+[20] * char w;
+
+// function pointer
+
+*[]*[]* [ *[]*[] int ]( *[]*[] int, *[]*[] int ) v3;
Index: src/Tests/ResolvExpr/Abstype.c
===================================================================
--- src/Tests/ResolvExpr/Abstype.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Abstype.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,28 @@
+// "cfa-cpp -nx Abstype.c"
+
+type T | { T x( T ); };
+
+T y( T t )
+{
+	T t_instance;
+	return x( t );
+}
+
+forall(type T) lvalue T			*?(                T* );
+int		?++( int *);
+int ?=?( int*, int );
+forall(dtype DT) DT* 		   	?=?(                DT *          *,          DT* );
+
+type U = int*;
+
+U x( U u )
+{
+	U u_instance = u;
+	(*u)++;
+	return u;
+}
+
+int *break_abstraction( U u )
+{
+	return u;
+}
Index: src/Tests/ResolvExpr/Attributes.c
===================================================================
--- src/Tests/ResolvExpr/Attributes.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Attributes.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,19 @@
+// "cfa-cpp -ne simple.c"
+
+int @voon;
+double @voon;
+
+int @bort(int);
+int @bort(double);
+
+void g( int );
+
+void
+f()
+{
+  float x;
+  double x;
+  @bort(x);
+  @bort(int);
+  g( @voon );
+}
Index: src/Tests/ResolvExpr/Cast.c
===================================================================
--- src/Tests/ResolvExpr/Cast.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Cast.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,11 @@
+char f;
+void f()
+{
+  char f;
+  double f;
+  (int)f;
+  short f;
+  (int)f;
+  (void(*)())f;
+  ([long, long double, *[]()])([f, f, f]);
+}
Index: src/Tests/ResolvExpr/CastError.c
===================================================================
--- src/Tests/ResolvExpr/CastError.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/CastError.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,8 @@
+int f;
+void f()
+{
+  int f;
+  double f;
+  (char)f;
+  (int(*)())f;
+}
Index: src/Tests/ResolvExpr/Expected/Abstype.tst
===================================================================
--- src/Tests/ResolvExpr/Expected/Abstype.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Expected/Abstype.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,215 @@
+T: a type
+  with assertions
+    x: a function
+        with parameters
+          instance of type T 
+        returning 
+          instance of type T 
+
+
+?=?: a automatically generated function
+    with parameters
+      _dst: a pointer to instance of type T 
+      _src: a instance of type T 
+    returning 
+      instance of type T 
+
+y: a function
+    with parameters
+      t: a instance of type T 
+    returning 
+      instance of type T 
+    with body 
+      Declaration of t_instance: a instance of type T 
+      
+        Return Statement, returning: Cast of:
+  Application of
+    Variable Expression: x: a function
+        with parameters
+          instance of type T 
+        returning 
+          instance of type T 
+
+  to arguments
+          Variable Expression: t: a instance of type T 
+
+
+to:
+  instance of type T 
+with environment:
+  Types:
+  Non-types:
+
+
+
+*?: a forall
+      T: a type
+        with assertions
+          ?=?: a pointer to function
+              with parameters
+                pointer to instance of type T 
+                instance of type T 
+              returning 
+                instance of type T 
+
+
+    function
+    with parameters
+      pointer to instance of type T 
+    returning 
+      lvalue instance of type T 
+
+?++: a function
+    with parameters
+      pointer to signed int 
+    returning 
+      signed int 
+
+?=?: a function
+    with parameters
+      pointer to signed int 
+      signed int 
+    returning 
+      signed int 
+
+?=?: a forall
+      DT: a incomplete type
+    function
+    with parameters
+      pointer to pointer to instance of type DT 
+      pointer to instance of type DT 
+    returning 
+      pointer to instance of type DT 
+
+U: a type for pointer to signed int 
+?=?: a automatically generated function
+    with parameters
+      _dst: a pointer to instance of type U 
+      _src: a instance of type U 
+    returning 
+      instance of type U 
+    with body 
+      
+        Return Statement, returning: Cast of:
+  Application of
+    Variable Expression: ?=?: a forall
+          DT: a incomplete type
+        function
+        with parameters
+          pointer to pointer to instance of type DT 
+          pointer to instance of type DT 
+        returning 
+          pointer to instance of type DT 
+
+  to arguments
+          Cast of:
+        Variable Expression: _dst: a pointer to instance of type U 
+
+      to:
+        pointer to pointer to signed int 
+
+          Cast of:
+        Variable Expression: _src: a instance of type U 
+
+      to:
+        pointer to signed int 
+
+
+to:
+  instance of type U 
+with environment:
+  Types:
+    _0_DT -> signed int 
+  Non-types:
+
+
+
+x: a function
+    with parameters
+      u: a instance of type U 
+    returning 
+      instance of type U 
+    with body 
+      Declaration of u_instance: a instance of type U with initializer 
+        Simple Initializer:           Name: u
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: ?++: a function
+                with parameters
+                  pointer to signed int 
+                returning 
+                  signed int 
+
+          to arguments
+                          Address of:
+                Application of
+                  Variable Expression: *?: a forall
+                        T: a type
+                          with assertions
+                            ?=?: a pointer to function
+                                with parameters
+                                  pointer to instance of type T 
+                                  instance of type T 
+                                returning 
+                                  instance of type T 
+
+
+                      function
+                      with parameters
+                        pointer to instance of type T 
+                      returning 
+                        lvalue instance of type T 
+
+                to arguments
+                                      Cast of:
+                      Variable Expression: u: a instance of type U 
+
+                    to:
+                      pointer to signed int 
+
+                with inferred parameters:
+                  ?=?: a function
+                    with parameters
+                      pointer to signed int 
+                      signed int 
+                    returning 
+                      signed int 
+
+
+          with environment:
+            Types:
+              _0_T -> signed int 
+            Non-types:
+
+      
+        Return Statement, returning: Cast of:
+  Variable Expression: u: a instance of type U 
+
+to:
+  instance of type U 
+with environment:
+  Types:
+  Non-types:
+
+
+
+break_abstraction: a function
+    with parameters
+      u: a instance of type U 
+    returning 
+      pointer to signed int 
+    with body 
+      
+        Return Statement, returning: Cast of:
+  Variable Expression: u: a instance of type U 
+
+to:
+  pointer to signed int 
+with environment:
+  Types:
+  Non-types:
+
+
+
Index: src/Tests/ResolvExpr/Expected/Attributes.tst
===================================================================
--- src/Tests/ResolvExpr/Expected/Attributes.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Expected/Attributes.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,70 @@
+@voon: a signed int 
+@voon: a double 
+@bort: a function
+    with parameters
+      signed int 
+    returning 
+      signed int 
+
+@bort: a function
+    with parameters
+      double 
+    returning 
+      signed int 
+
+g: a function
+    with parameters
+      signed int 
+    returning 
+      nothing 
+
+f: a function
+      accepting unspecified arguments
+    returning 
+      nothing 
+    with body 
+      Declaration of x: a float 
+      Declaration of x: a double 
+      
+        Expression Statement:
+          Attr             Variable Expression: @bort: a function
+                with parameters
+                  double 
+                returning 
+                  signed int 
+
+applied to: lvalue double 
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Attr             Variable Expression: @bort: a function
+                with parameters
+                  signed int 
+                returning 
+                  signed int 
+
+applied to: signed int 
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: g: a function
+                with parameters
+                  signed int 
+                returning 
+                  nothing 
+
+          to arguments
+                          Variable Expression: @voon: a signed int 
+
+          with environment:
+            Types:
+            Non-types:
+
+
Index: src/Tests/ResolvExpr/Expected/Cast.tst
===================================================================
--- src/Tests/ResolvExpr/Expected/Cast.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Expected/Cast.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,78 @@
+f: a char 
+f: a function
+      accepting unspecified arguments
+    returning 
+      nothing 
+    with body 
+      Declaration of f: a char 
+      Declaration of f: a double 
+      
+        Expression Statement:
+          Cast of:
+            Variable Expression: f: a char 
+
+          to:
+            signed int 
+          with environment:
+            Types:
+            Non-types:
+
+      Declaration of f: a short signed int 
+      
+        Expression Statement:
+          Cast of:
+            Variable Expression: f: a short signed int 
+
+          to:
+            signed int 
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Cast of:
+            Variable Expression: f: a function
+                  accepting unspecified arguments
+                returning 
+                  nothing 
+
+
+          to:
+            pointer to function
+                  accepting unspecified arguments
+                returning 
+                  nothing 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Cast of:
+            Tuple:
+                              Variable Expression: f: a short signed int 
+
+                              Variable Expression: f: a double 
+
+                              Variable Expression: f: a function
+                      accepting unspecified arguments
+                    returning 
+                      nothing 
+
+
+
+          to:
+            long signed int 
+            long double 
+            pointer to function
+                  accepting unspecified arguments
+                returning 
+                  nothing 
+
+          with environment:
+            Types:
+            Non-types:
+
+
Index: src/Tests/ResolvExpr/Expected/CastError.tst
===================================================================
--- src/Tests/ResolvExpr/Expected/CastError.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Expected/CastError.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,94 @@
+Error: Can't choose between alternatives for expression Cast of:
+  Name: f
+
+to:
+  char 
+Alternatives are:        Cost ( 1, 0, 0 ):         Cast of:
+          Variable Expression: f: a signed int 
+
+        to:
+          char 
+(types:
+            char 
+)
+        Environment: 
+
+        Cost ( 1, 0, 0 ):         Cast of:
+          Variable Expression: f: a double 
+
+        to:
+          char 
+(types:
+            char 
+)
+        Environment: 
+
+
+Error: Can't choose between alternatives for expression Cast of:
+  Name: f
+
+to:
+  pointer to function
+        accepting unspecified arguments
+      returning 
+        signed int 
+
+Alternatives are:        Cost ( 1, 0, 0 ):         Cast of:
+          Variable Expression: f: a function
+                accepting unspecified arguments
+              returning 
+                nothing 
+
+
+        to:
+          pointer to function
+                accepting unspecified arguments
+              returning 
+                signed int 
+
+(types:
+            pointer to function
+                  accepting unspecified arguments
+                returning 
+                  signed int 
+
+)
+        Environment: 
+
+        Cost ( 1, 0, 0 ):         Cast of:
+          Variable Expression: f: a signed int 
+
+        to:
+          pointer to function
+                accepting unspecified arguments
+              returning 
+                signed int 
+
+(types:
+            pointer to function
+                  accepting unspecified arguments
+                returning 
+                  signed int 
+
+)
+        Environment: 
+
+        Cost ( 1, 0, 0 ):         Cast of:
+          Variable Expression: f: a double 
+
+        to:
+          pointer to function
+                accepting unspecified arguments
+              returning 
+                signed int 
+
+(types:
+            pointer to function
+                  accepting unspecified arguments
+                returning 
+                  signed int 
+
+)
+        Environment: 
+
+
Index: src/Tests/ResolvExpr/Expected/Forall.tst
===================================================================
--- src/Tests/ResolvExpr/Expected/Forall.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Expected/Forall.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,495 @@
+?=?: a function
+    with parameters
+      pointer to signed int 
+      signed int 
+    returning 
+      signed int 
+
+?=?: a function
+    with parameters
+      pointer to float 
+      float 
+    returning 
+      float 
+
+?=?: a function
+    with parameters
+      pointer to pointer to signed int 
+      pointer to signed int 
+    returning 
+      pointer to signed int 
+
+?=?: a function
+    with parameters
+      pointer to pointer to float 
+      pointer to float 
+    returning 
+      pointer to float 
+
+?=?: a function
+    with parameters
+      pointer to char 
+      char 
+    returning 
+      char 
+
+?=?: a function
+    with parameters
+      pointer to pointer to function
+          returning 
+            nothing 
+
+      pointer to function
+          returning 
+            nothing 
+
+    returning 
+      pointer to function
+          returning 
+            nothing 
+
+
+g1: a function
+      accepting unspecified arguments
+    returning 
+      nothing 
+    with body 
+      Declaration of f: a forall
+            T: a type
+              with assertions
+                ?=?: a pointer to function
+                    with parameters
+                      pointer to instance of type T 
+                      instance of type T 
+                    returning 
+                      instance of type T 
+
+
+          function
+          with parameters
+            instance of type T 
+          returning 
+            instance of type T 
+
+      Declaration of f: a function
+          with parameters
+            signed int 
+          returning 
+            nothing 
+
+      Declaration of h: a function
+          with parameters
+            p: a pointer to function
+                returning 
+                  nothing 
+
+          returning 
+            nothing 
+
+      Declaration of x: a signed int 
+      Declaration of y: a pointer to function
+          returning 
+            nothing 
+
+      Declaration of z: a char 
+      Declaration of w: a float 
+      
+        Expression Statement:
+          Application of
+            Variable Expression: f: a function
+                with parameters
+                  signed int 
+                returning 
+                  nothing 
+
+          to arguments
+                          Variable Expression: x: a signed int 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: f: a forall
+                  T: a type
+                    with assertions
+                      ?=?: a pointer to function
+                          with parameters
+                            pointer to instance of type T 
+                            instance of type T 
+                          returning 
+                            instance of type T 
+
+
+                function
+                with parameters
+                  instance of type T 
+                returning 
+                  instance of type T 
+
+          to arguments
+                          Variable Expression: y: a pointer to function
+                  returning 
+                    nothing 
+
+
+          with inferred parameters:
+            ?=?: a function
+              with parameters
+                pointer to pointer to function
+                    returning 
+                      nothing 
+
+                pointer to function
+                    returning 
+                      nothing 
+
+              returning 
+                pointer to function
+                    returning 
+                      nothing 
+
+
+          with environment:
+            Types:
+              _0_T -> pointer to function
+                  returning 
+                    nothing 
+
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: f: a function
+                with parameters
+                  signed int 
+                returning 
+                  nothing 
+
+          to arguments
+                          Cast of:
+                Variable Expression: z: a char 
+
+              to:
+                signed int 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: f: a forall
+                  T: a type
+                    with assertions
+                      ?=?: a pointer to function
+                          with parameters
+                            pointer to instance of type T 
+                            instance of type T 
+                          returning 
+                            instance of type T 
+
+
+                function
+                with parameters
+                  instance of type T 
+                returning 
+                  instance of type T 
+
+          to arguments
+                          Variable Expression: w: a float 
+
+          with inferred parameters:
+            ?=?: a function
+              with parameters
+                pointer to float 
+                float 
+              returning 
+                float 
+
+          with environment:
+            Types:
+              _0_T -> float 
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: h: a function
+                with parameters
+                  p: a pointer to function
+                      returning 
+                        nothing 
+
+                returning 
+                  nothing 
+
+          to arguments
+                          Application of
+                Variable Expression: f: a forall
+                      T: a type
+                        with assertions
+                          ?=?: a pointer to function
+                              with parameters
+                                pointer to instance of type T 
+                                instance of type T 
+                              returning 
+                                instance of type T 
+
+
+                    function
+                    with parameters
+                      instance of type T 
+                    returning 
+                      instance of type T 
+
+              to arguments
+                                  Variable Expression: y: a pointer to function
+                      returning 
+                        nothing 
+
+
+              with inferred parameters:
+                ?=?: a function
+                  with parameters
+                    pointer to pointer to function
+                        returning 
+                          nothing 
+
+                    pointer to function
+                        returning 
+                          nothing 
+
+                  returning 
+                    pointer to function
+                        returning 
+                          nothing 
+
+
+
+          with environment:
+            Types:
+              _0_T -> pointer to function
+                  returning 
+                    nothing 
+
+            Non-types:
+
+
+g2: a function
+      accepting unspecified arguments
+    returning 
+      nothing 
+    with body 
+      Declaration of f: a forall
+            T: a type
+              with assertions
+                ?=?: a pointer to function
+                    with parameters
+                      pointer to instance of type T 
+                      instance of type T 
+                    returning 
+                      instance of type T 
+
+
+          function
+          with parameters
+            instance of type T 
+            instance of type T 
+          returning 
+            nothing 
+
+      Declaration of f: a forall
+            T: a type
+              with assertions
+                ?=?: a pointer to function
+                    with parameters
+                      pointer to instance of type T 
+                      instance of type T 
+                    returning 
+                      instance of type T 
+
+
+            U: a type
+              with assertions
+                ?=?: a pointer to function
+                    with parameters
+                      pointer to instance of type U 
+                      instance of type U 
+                    returning 
+                      instance of type U 
+
+
+          function
+          with parameters
+            instance of type T 
+            instance of type U 
+          returning 
+            nothing 
+
+      Declaration of x: a signed int 
+      Declaration of y: a float 
+      Declaration of z: a pointer to signed int 
+      Declaration of w: a pointer to float 
+      
+        Expression Statement:
+          Application of
+            Variable Expression: f: a forall
+                  T: a type
+                    with assertions
+                      ?=?: a pointer to function
+                          with parameters
+                            pointer to instance of type T 
+                            instance of type T 
+                          returning 
+                            instance of type T 
+
+
+                function
+                with parameters
+                  instance of type T 
+                  instance of type T 
+                returning 
+                  nothing 
+
+          to arguments
+                          Cast of:
+                Variable Expression: x: a signed int 
+
+              to:
+                float 
+
+                          Variable Expression: y: a float 
+
+          with inferred parameters:
+            ?=?: a function
+              with parameters
+                pointer to float 
+                float 
+              returning 
+                float 
+
+          with environment:
+            Types:
+              _0_T -> float 
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: f: a forall
+                  T: a type
+                    with assertions
+                      ?=?: a pointer to function
+                          with parameters
+                            pointer to instance of type T 
+                            instance of type T 
+                          returning 
+                            instance of type T 
+
+
+                  U: a type
+                    with assertions
+                      ?=?: a pointer to function
+                          with parameters
+                            pointer to instance of type U 
+                            instance of type U 
+                          returning 
+                            instance of type U 
+
+
+                function
+                with parameters
+                  instance of type T 
+                  instance of type U 
+                returning 
+                  nothing 
+
+          to arguments
+                          Variable Expression: z: a pointer to signed int 
+
+                          Variable Expression: w: a pointer to float 
+
+          with inferred parameters:
+            ?=?: a function
+              with parameters
+                pointer to pointer to signed int 
+                pointer to signed int 
+              returning 
+                pointer to signed int 
+
+            ?=?: a function
+              with parameters
+                pointer to pointer to float 
+                pointer to float 
+              returning 
+                pointer to float 
+
+          with environment:
+            Types:
+              _1_T -> pointer to signed int 
+              _2_U -> pointer to float 
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: f: a forall
+                  T: a type
+                    with assertions
+                      ?=?: a pointer to function
+                          with parameters
+                            pointer to instance of type T 
+                            instance of type T 
+                          returning 
+                            instance of type T 
+
+
+                  U: a type
+                    with assertions
+                      ?=?: a pointer to function
+                          with parameters
+                            pointer to instance of type U 
+                            instance of type U 
+                          returning 
+                            instance of type U 
+
+
+                function
+                with parameters
+                  instance of type T 
+                  instance of type U 
+                returning 
+                  nothing 
+
+          to arguments
+                          Variable Expression: x: a signed int 
+
+                          Variable Expression: z: a pointer to signed int 
+
+          with inferred parameters:
+            ?=?: a function
+              with parameters
+                pointer to signed int 
+                signed int 
+              returning 
+                signed int 
+
+            ?=?: a function
+              with parameters
+                pointer to pointer to signed int 
+                pointer to signed int 
+              returning 
+                pointer to signed int 
+
+          with environment:
+            Types:
+              _1_T -> signed int 
+              _2_U -> pointer to signed int 
+            Non-types:
+
+
Index: src/Tests/ResolvExpr/Expected/Function.tst
===================================================================
--- src/Tests/ResolvExpr/Expected/Function.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Expected/Function.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,249 @@
+a: a signed int 
+a: a float 
+f: a function
+    with parameters
+      signed int 
+    returning 
+      signed int 
+
+f: a function
+    with parameters
+      float 
+    returning 
+      float 
+
+g: a function
+      accepting unspecified arguments
+    returning 
+      nothing 
+    with body 
+      
+        Expression Statement:
+          Application of
+            Variable Expression: f: a function
+                with parameters
+                  signed int 
+                returning 
+                  signed int 
+
+          to arguments
+                          Cast of:
+                Variable Expression: a: a signed int 
+
+              to:
+                signed int 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Cast of:
+            Application of
+              Variable Expression: f: a function
+                  with parameters
+                    signed int 
+                  returning 
+                    signed int 
+
+            to arguments
+                              Variable Expression: a: a signed int 
+
+
+          to:
+            signed int 
+          with environment:
+            Types:
+            Non-types:
+
+
+p: a tuple of types
+    signed int 
+
+p: a tuple of types
+    signed int 
+    double 
+
+p: a tuple of types
+    signed int 
+    signed int 
+    signed int 
+
+p: a tuple of types
+    signed int 
+    signed int 
+    signed int 
+    signed int 
+
+q: a tuple of types
+    char 
+
+q: a tuple of types
+    signed int 
+    signed int 
+
+q: a tuple of types
+    signed int 
+    signed int 
+    float 
+
+q: a tuple of types
+    signed int 
+    signed int 
+    signed int 
+    signed int 
+
+r: a function
+    with parameters
+      signed int 
+      signed int 
+      signed int 
+      signed int 
+    returning 
+      signed int 
+      signed int 
+
+s: a function
+      accepting unspecified arguments
+    returning 
+      nothing 
+    with body 
+      
+        Expression Statement:
+          Application of
+            Variable Expression: r: a function
+                with parameters
+                  signed int 
+                  signed int 
+                  signed int 
+                  signed int 
+                returning 
+                  signed int 
+                  signed int 
+
+          to arguments
+                          Variable Expression: p: a tuple of types
+                  signed int 
+                  signed int 
+                  signed int 
+
+
+                          Cast of:
+                Variable Expression: q: a tuple of types
+                    char 
+
+
+              to:
+                signed int 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: r: a function
+                with parameters
+                  signed int 
+                  signed int 
+                  signed int 
+                  signed int 
+                returning 
+                  signed int 
+                  signed int 
+
+          to arguments
+                          Cast of:
+                Tuple:
+                                      Variable Expression: q: a tuple of types
+                        char 
+
+
+                                      Variable Expression: p: a tuple of types
+                        signed int 
+                        signed int 
+                        signed int 
+
+
+
+              to:
+                signed int 
+                signed int 
+                signed int 
+                signed int 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: r: a function
+                with parameters
+                  signed int 
+                  signed int 
+                  signed int 
+                  signed int 
+                returning 
+                  signed int 
+                  signed int 
+
+          to arguments
+                          Application of
+                Variable Expression: r: a function
+                    with parameters
+                      signed int 
+                      signed int 
+                      signed int 
+                      signed int 
+                    returning 
+                      signed int 
+                      signed int 
+
+              to arguments
+                                  Variable Expression: p: a tuple of types
+                      signed int 
+                      signed int 
+                      signed int 
+
+
+                                  Cast of:
+                    Variable Expression: q: a tuple of types
+                        char 
+
+
+                  to:
+                    signed int 
+
+
+                          Application of
+                Variable Expression: r: a function
+                    with parameters
+                      signed int 
+                      signed int 
+                      signed int 
+                      signed int 
+                    returning 
+                      signed int 
+                      signed int 
+
+              to arguments
+                                  Variable Expression: q: a tuple of types
+                      signed int 
+                      signed int 
+
+
+                                  Variable Expression: q: a tuple of types
+                      signed int 
+                      signed int 
+
+
+
+          with environment:
+            Types:
+            Non-types:
+
+
Index: src/Tests/ResolvExpr/Expected/InferParam.tst
===================================================================
--- src/Tests/ResolvExpr/Expected/InferParam.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Expected/InferParam.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,317 @@
+?=?: a function
+    with parameters
+      pointer to signed int 
+      signed int 
+    returning 
+      signed int 
+
+?=?: a function
+    with parameters
+      pointer to float 
+      float 
+    returning 
+      float 
+
+?=?: a function
+    with parameters
+      pointer to double 
+      double 
+    returning 
+      double 
+
+g: a forall
+      T: a type
+        with assertions
+          ?=?: a pointer to function
+              with parameters
+                pointer to instance of type T 
+                instance of type T 
+              returning 
+                instance of type T 
+
+
+      U: a type
+        with assertions
+          ?=?: a pointer to function
+              with parameters
+                pointer to instance of type U 
+                instance of type U 
+              returning 
+                instance of type U 
+
+          f: a pointer to function
+              with parameters
+                instance of type T 
+              returning 
+                instance of type U 
+
+
+    function
+    with parameters
+      instance of type T 
+    returning 
+      instance of type U 
+
+f: a function
+    with parameters
+      signed int 
+    returning 
+      float 
+
+f: a function
+    with parameters
+      signed int 
+    returning 
+      double 
+
+i: a function
+    with parameters
+      float 
+    returning 
+      nothing 
+
+h: a function
+      accepting unspecified arguments
+    returning 
+      nothing 
+    with body 
+      Declaration of a: a signed int 
+      
+        Expression Statement:
+          Application of
+            Variable Expression: i: a function
+                with parameters
+                  float 
+                returning 
+                  nothing 
+
+          to arguments
+                          Application of
+                Variable Expression: g: a forall
+                      T: a type
+                        with assertions
+                          ?=?: a pointer to function
+                              with parameters
+                                pointer to instance of type T 
+                                instance of type T 
+                              returning 
+                                instance of type T 
+
+
+                      U: a type
+                        with assertions
+                          ?=?: a pointer to function
+                              with parameters
+                                pointer to instance of type U 
+                                instance of type U 
+                              returning 
+                                instance of type U 
+
+                          f: a pointer to function
+                              with parameters
+                                instance of type T 
+                              returning 
+                                instance of type U 
+
+
+                    function
+                    with parameters
+                      instance of type T 
+                    returning 
+                      instance of type U 
+
+              to arguments
+                                  Variable Expression: a: a signed int 
+
+              with inferred parameters:
+                ?=?: a function
+                  with parameters
+                    pointer to signed int 
+                    signed int 
+                  returning 
+                    signed int 
+
+                ?=?: a function
+                  with parameters
+                    pointer to float 
+                    float 
+                  returning 
+                    float 
+
+                f: a function
+                  with parameters
+                    signed int 
+                  returning 
+                    float 
+
+
+          with environment:
+            Types:
+              _0_T -> signed int 
+              _1_U -> float 
+            Non-types:
+
+
+context has_f_and_j
+    with parameters
+      T: a type
+      U: a type
+
+    with members
+      f: a function
+          with parameters
+            instance of type T 
+          returning 
+            instance of type U 
+
+      j: a function
+          with parameters
+            instance of type T 
+            instance of type U 
+          returning 
+            instance of type U 
+
+
+j: a function
+    with parameters
+      signed int 
+      float 
+    returning 
+      float 
+
+k: a forall
+      T: a type
+        with assertions
+          ?=?: a pointer to function
+              with parameters
+                pointer to instance of type T 
+                instance of type T 
+              returning 
+                instance of type T 
+
+
+      U: a type
+        with assertions
+          ?=?: a pointer to function
+              with parameters
+                pointer to instance of type U 
+                instance of type U 
+              returning 
+                instance of type U 
+
+          f: a pointer to function
+              with parameters
+                instance of type T 
+              returning 
+                instance of type U 
+
+          j: a pointer to function
+              with parameters
+                instance of type T 
+                instance of type U 
+              returning 
+                instance of type U 
+
+
+    function
+    with parameters
+      instance of type T 
+    returning 
+      instance of type U 
+
+l: a function
+      accepting unspecified arguments
+    returning 
+      nothing 
+    with body 
+      Declaration of b: a signed int 
+      
+        Expression Statement:
+          Application of
+            Variable Expression: i: a function
+                with parameters
+                  float 
+                returning 
+                  nothing 
+
+          to arguments
+                          Application of
+                Variable Expression: k: a forall
+                      T: a type
+                        with assertions
+                          ?=?: a pointer to function
+                              with parameters
+                                pointer to instance of type T 
+                                instance of type T 
+                              returning 
+                                instance of type T 
+
+
+                      U: a type
+                        with assertions
+                          ?=?: a pointer to function
+                              with parameters
+                                pointer to instance of type U 
+                                instance of type U 
+                              returning 
+                                instance of type U 
+
+                          f: a pointer to function
+                              with parameters
+                                instance of type T 
+                              returning 
+                                instance of type U 
+
+                          j: a pointer to function
+                              with parameters
+                                instance of type T 
+                                instance of type U 
+                              returning 
+                                instance of type U 
+
+
+                    function
+                    with parameters
+                      instance of type T 
+                    returning 
+                      instance of type U 
+
+              to arguments
+                                  Variable Expression: b: a signed int 
+
+              with inferred parameters:
+                ?=?: a function
+                  with parameters
+                    pointer to signed int 
+                    signed int 
+                  returning 
+                    signed int 
+
+                ?=?: a function
+                  with parameters
+                    pointer to float 
+                    float 
+                  returning 
+                    float 
+
+                f: a function
+                  with parameters
+                    signed int 
+                  returning 
+                    float 
+
+                j: a function
+                  with parameters
+                    signed int 
+                    float 
+                  returning 
+                    float 
+
+
+          with environment:
+            Types:
+              _0_T -> signed int 
+              _1_U -> float 
+            Non-types:
+
+
Index: src/Tests/ResolvExpr/Expected/Members.tst
===================================================================
--- src/Tests/ResolvExpr/Expected/Members.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Expected/Members.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,666 @@
+?=?: a function
+    with parameters
+      pointer to char 
+      char 
+    returning 
+      char 
+
+?=?: a function
+    with parameters
+      pointer to signed int 
+      signed int 
+    returning 
+      signed int 
+
+?=?: a function
+    with parameters
+      pointer to float 
+      float 
+    returning 
+      float 
+
+?=?: a forall
+      DT: a incomplete type
+    function
+    with parameters
+      pointer to pointer to instance of type DT 
+      pointer to instance of type DT 
+    returning 
+      pointer to instance of type DT 
+
+*?: a forall
+      T: a type
+        with assertions
+          ?=?: a pointer to function
+              with parameters
+                pointer to instance of type T 
+                instance of type T 
+              returning 
+                instance of type T 
+
+
+    function
+    with parameters
+      pointer to instance of type T 
+    returning 
+      lvalue instance of type T 
+
+__builtin_memcpy: a function
+      accepting unspecified arguments
+    returning 
+      pointer to char 
+
+a: a function
+    with parameters
+      char 
+    returning 
+      nothing 
+
+b: a function
+    with parameters
+      signed int 
+    returning 
+      nothing 
+
+c: a function
+    with parameters
+      pointer to signed int 
+    returning 
+      nothing 
+
+d: a function
+    with parameters
+      pointer to float 
+    returning 
+      nothing 
+
+struct a_struct
+    with members
+      a: a signed int 
+      a: a char 
+      a: a float 
+
+?=?: a automatically generated inline static function
+    with parameters
+      _dst: a pointer to instance of struct a_struct 
+      _src: a instance of struct a_struct 
+    returning 
+      instance of struct a_struct 
+    with body 
+      
+        Expression Statement:
+          Application of
+            Variable Expression: ?=?: a function
+                with parameters
+                  pointer to signed int 
+                  signed int 
+                returning 
+                  signed int 
+
+          to arguments
+                          Address of:
+                Member Expression, with field: 
+                  a: a signed int 
+                from aggregate: 
+                  Applying untyped: 
+                      Name: *?
+
+                  ...to: 
+                      Variable Expression: _dst: a pointer to instance of struct a_struct 
+
+                          Member Expression, with field: 
+                a: a signed int 
+              from aggregate: 
+                Variable Expression: _src: a instance of struct a_struct 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: ?=?: a function
+                with parameters
+                  pointer to char 
+                  char 
+                returning 
+                  char 
+
+          to arguments
+                          Address of:
+                Member Expression, with field: 
+                  a: a char 
+                from aggregate: 
+                  Applying untyped: 
+                      Name: *?
+
+                  ...to: 
+                      Variable Expression: _dst: a pointer to instance of struct a_struct 
+
+                          Member Expression, with field: 
+                a: a char 
+              from aggregate: 
+                Variable Expression: _src: a instance of struct a_struct 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: ?=?: a function
+                with parameters
+                  pointer to float 
+                  float 
+                returning 
+                  float 
+
+          to arguments
+                          Address of:
+                Member Expression, with field: 
+                  a: a float 
+                from aggregate: 
+                  Applying untyped: 
+                      Name: *?
+
+                  ...to: 
+                      Variable Expression: _dst: a pointer to instance of struct a_struct 
+
+                          Member Expression, with field: 
+                a: a float 
+              from aggregate: 
+                Variable Expression: _src: a instance of struct a_struct 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Return Statement, returning: Cast of:
+  Variable Expression: _src: a instance of struct a_struct 
+
+to:
+  instance of struct a_struct 
+with environment:
+  Types:
+  Non-types:
+
+
+
+union b_struct
+    with members
+      a: a pointer to signed int 
+      a: a pointer to char 
+      a: a pointer to float 
+
+?=?: a automatically generated inline static function
+    with parameters
+      _dst: a pointer to instance of union b_struct 
+      _src: a instance of union b_struct 
+    returning 
+      instance of union b_struct 
+    with body 
+      
+        Expression Statement:
+          Application of
+            Variable Expression: __builtin_memcpy: a function
+                  accepting unspecified arguments
+                returning 
+                  pointer to char 
+
+          to arguments
+                          Variable Expression: _dst: a pointer to instance of union b_struct 
+
+                          Address of:
+                Variable Expression: _src: a instance of union b_struct 
+
+                          Sizeof Expression on: instance of union b_struct 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Return Statement, returning: Cast of:
+  Variable Expression: _src: a instance of union b_struct 
+
+to:
+  instance of union b_struct 
+with environment:
+  Types:
+  Non-types:
+
+
+
+f: a function
+      accepting unspecified arguments
+    returning 
+      nothing 
+    with body 
+      Declaration of the_struct: a instance of struct a_struct 
+      Declaration of the_struct: a instance of union b_struct 
+      
+        Expression Statement:
+          Application of
+            Variable Expression: a: a function
+                with parameters
+                  char 
+                returning 
+                  nothing 
+
+          to arguments
+                          Member Expression, with field: 
+                a: a char 
+              from aggregate: 
+                Variable Expression: the_struct: a instance of struct a_struct 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: b: a function
+                with parameters
+                  signed int 
+                returning 
+                  nothing 
+
+          to arguments
+                          Member Expression, with field: 
+                a: a signed int 
+              from aggregate: 
+                Variable Expression: the_struct: a instance of struct a_struct 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: c: a function
+                with parameters
+                  pointer to signed int 
+                returning 
+                  nothing 
+
+          to arguments
+                          Member Expression, with field: 
+                a: a pointer to signed int 
+              from aggregate: 
+                Variable Expression: the_struct: a instance of union b_struct 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: d: a function
+                with parameters
+                  pointer to float 
+                returning 
+                  nothing 
+
+          to arguments
+                          Member Expression, with field: 
+                a: a pointer to float 
+              from aggregate: 
+                Variable Expression: the_struct: a instance of union b_struct 
+
+          with environment:
+            Types:
+            Non-types:
+
+
+struct c_struct
+    with members
+      signed int 
+      char 
+      float 
+
+?=?: a automatically generated inline static function
+    with parameters
+      _dst: a pointer to instance of struct c_struct 
+      _src: a instance of struct c_struct 
+    returning 
+      instance of struct c_struct 
+    with body 
+      
+        Expression Statement:
+          Application of
+            Variable Expression: ?=?: a function
+                with parameters
+                  pointer to signed int 
+                  signed int 
+                returning 
+                  signed int 
+
+          to arguments
+                          Address of:
+                Member Expression, with field: 
+                  signed int 
+                from aggregate: 
+                  Applying untyped: 
+                      Name: *?
+
+                  ...to: 
+                      Variable Expression: _dst: a pointer to instance of struct c_struct 
+
+                          Member Expression, with field: 
+                signed int 
+              from aggregate: 
+                Variable Expression: _src: a instance of struct c_struct 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: ?=?: a function
+                with parameters
+                  pointer to char 
+                  char 
+                returning 
+                  char 
+
+          to arguments
+                          Address of:
+                Member Expression, with field: 
+                  char 
+                from aggregate: 
+                  Applying untyped: 
+                      Name: *?
+
+                  ...to: 
+                      Variable Expression: _dst: a pointer to instance of struct c_struct 
+
+                          Member Expression, with field: 
+                char 
+              from aggregate: 
+                Variable Expression: _src: a instance of struct c_struct 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: ?=?: a function
+                with parameters
+                  pointer to float 
+                  float 
+                returning 
+                  float 
+
+          to arguments
+                          Address of:
+                Member Expression, with field: 
+                  float 
+                from aggregate: 
+                  Applying untyped: 
+                      Name: *?
+
+                  ...to: 
+                      Variable Expression: _dst: a pointer to instance of struct c_struct 
+
+                          Member Expression, with field: 
+                float 
+              from aggregate: 
+                Variable Expression: _src: a instance of struct c_struct 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Return Statement, returning: Cast of:
+  Variable Expression: _src: a instance of struct c_struct 
+
+to:
+  instance of struct c_struct 
+with environment:
+  Types:
+  Non-types:
+
+
+
+union d_struct
+    with members
+      pointer to signed int 
+      pointer to char 
+      pointer to float 
+
+?=?: a automatically generated inline static function
+    with parameters
+      _dst: a pointer to instance of union d_struct 
+      _src: a instance of union d_struct 
+    returning 
+      instance of union d_struct 
+    with body 
+      
+        Expression Statement:
+          Application of
+            Variable Expression: __builtin_memcpy: a function
+                  accepting unspecified arguments
+                returning 
+                  pointer to char 
+
+          to arguments
+                          Variable Expression: _dst: a pointer to instance of union d_struct 
+
+                          Address of:
+                Variable Expression: _src: a instance of union d_struct 
+
+                          Sizeof Expression on: instance of union d_struct 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Return Statement, returning: Cast of:
+  Variable Expression: _src: a instance of union d_struct 
+
+to:
+  instance of union d_struct 
+with environment:
+  Types:
+  Non-types:
+
+
+
+g: a function
+      accepting unspecified arguments
+    returning 
+      nothing 
+    with body 
+      Declaration of x: a short unsigned int 
+      Declaration of x: a instance of struct c_struct 
+      Declaration of x: a instance of union d_struct 
+      
+        Expression Statement:
+          Application of
+            Variable Expression: a: a function
+                with parameters
+                  char 
+                returning 
+                  nothing 
+
+          to arguments
+                          Cast of:
+                Variable Expression: x: a short unsigned int 
+
+              to:
+                char 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: b: a function
+                with parameters
+                  signed int 
+                returning 
+                  nothing 
+
+          to arguments
+                          Cast of:
+                Variable Expression: x: a short unsigned int 
+
+              to:
+                signed int 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: c: a function
+                with parameters
+                  pointer to signed int 
+                returning 
+                  nothing 
+
+          to arguments
+                          Member Expression, with field: 
+                pointer to signed int 
+              from aggregate: 
+                Variable Expression: x: a instance of union d_struct 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: d: a function
+                with parameters
+                  pointer to float 
+                returning 
+                  nothing 
+
+          to arguments
+                          Member Expression, with field: 
+                pointer to float 
+              from aggregate: 
+                Variable Expression: x: a instance of union d_struct 
+
+          with environment:
+            Types:
+            Non-types:
+
+
+struct forward
+q: a pointer to instance of struct forward 
+struct forward
+    with members
+      y: a signed int 
+
+?=?: a automatically generated inline static function
+    with parameters
+      _dst: a pointer to instance of struct forward 
+      _src: a instance of struct forward 
+    returning 
+      instance of struct forward 
+    with body 
+      
+        Expression Statement:
+          Application of
+            Variable Expression: ?=?: a function
+                with parameters
+                  pointer to signed int 
+                  signed int 
+                returning 
+                  signed int 
+
+          to arguments
+                          Address of:
+                Member Expression, with field: 
+                  y: a signed int 
+                from aggregate: 
+                  Applying untyped: 
+                      Name: *?
+
+                  ...to: 
+                      Variable Expression: _dst: a pointer to instance of struct forward 
+
+                          Member Expression, with field: 
+                y: a signed int 
+              from aggregate: 
+                Variable Expression: _src: a instance of struct forward 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Return Statement, returning: Cast of:
+  Variable Expression: _src: a instance of struct forward 
+
+to:
+  instance of struct forward 
+with environment:
+  Types:
+  Non-types:
+
+
+
+h: a function
+      accepting unspecified arguments
+    returning 
+      nothing 
+    with body 
+      
+        Expression Statement:
+          Member Expression, with field: 
+            y: a signed int 
+          from aggregate: 
+            Application of
+              Variable Expression: *?: a forall
+                    T: a type
+                      with assertions
+                        ?=?: a pointer to function
+                            with parameters
+                              pointer to instance of type T 
+                              instance of type T 
+                            returning 
+                              instance of type T 
+
+
+                  function
+                  with parameters
+                    pointer to instance of type T 
+                  returning 
+                    lvalue instance of type T 
+
+            to arguments
+                              Variable Expression: q: a pointer to instance of struct forward 
+
+            with inferred parameters:
+              ?=?: a inline static function
+                with parameters
+                  _dst: a pointer to instance of struct forward 
+                  _src: a instance of struct forward 
+                returning 
+                  instance of struct forward 
+
+          with environment:
+            Types:
+            Non-types:
+
+
Index: src/Tests/ResolvExpr/Expected/Misc.tst
===================================================================
--- src/Tests/ResolvExpr/Expected/Misc.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Expected/Misc.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,94 @@
+a: a signed int 
+b: a signed int 
+b: a float 
+g: a function
+    with parameters
+      signed int 
+    returning 
+      nothing 
+
+g: a function
+    with parameters
+      unsigned int 
+    returning 
+      nothing 
+
+f: a function
+    returning 
+      nothing 
+    with body 
+      
+        Expression Statement:
+          Application of
+            Variable Expression: g: a function
+                with parameters
+                  signed int 
+                returning 
+                  nothing 
+
+          to arguments
+                          Comma Expression:
+                Variable Expression: a: a signed int 
+
+                Variable Expression: b: a signed int 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: g: a function
+                with parameters
+                  signed int 
+                returning 
+                  nothing 
+
+          to arguments
+                          Comma Expression:
+                Comma Expression:
+                  Variable Expression: a: a signed int 
+
+                  Variable Expression: a: a signed int 
+
+                Variable Expression: b: a signed int 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: g: a function
+                with parameters
+                  unsigned int 
+                returning 
+                  nothing 
+
+          to arguments
+                          Sizeof Expression on:                 Variable Expression: a: a signed int 
+
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: g: a function
+                with parameters
+                  unsigned int 
+                returning 
+                  nothing 
+
+          to arguments
+                          Sizeof Expression on: signed int 
+
+          with environment:
+            Types:
+            Non-types:
+
+
Index: src/Tests/ResolvExpr/Expected/MiscError.tst
===================================================================
--- src/Tests/ResolvExpr/Expected/MiscError.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Expected/MiscError.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,83 @@
+Error: Can't choose between alternatives for expression Cast of:
+  Name: b
+
+to:
+  nothing
+Alternatives are:        Cost ( 0, 0, 1 ):         Cast of:
+          Variable Expression: b: a signed int 
+
+        to:
+          nothing
+(types:
+)
+        Environment: 
+
+        Cost ( 0, 0, 1 ):         Cast of:
+          Variable Expression: b: a float 
+
+        to:
+          nothing
+(types:
+)
+        Environment: 
+
+
+Error: Can't choose between alternatives for expression Cast of:
+  Name: b
+
+to:
+  nothing
+Alternatives are:        Cost ( 0, 0, 1 ):         Cast of:
+          Variable Expression: b: a signed int 
+
+        to:
+          nothing
+(types:
+)
+        Environment: 
+
+        Cost ( 0, 0, 1 ):         Cast of:
+          Variable Expression: b: a float 
+
+        to:
+          nothing
+(types:
+)
+        Environment: 
+
+
+Error: Can't choose between alternatives for expression Cast of:
+  Comma Expression:
+    Name: a
+
+    Name: b
+
+to:
+  nothing
+Alternatives are:        Cost ( 0, 0, 1 ):         Cast of:
+          Comma Expression:
+            Variable Expression: a: a signed int 
+
+            Variable Expression: b: a signed int 
+
+        to:
+          nothing
+(types:
+)
+        Environment: 
+
+        Cost ( 0, 0, 1 ):         Cast of:
+          Comma Expression:
+            Variable Expression: a: a signed int 
+
+            Variable Expression: b: a float 
+
+        to:
+          nothing
+(types:
+)
+        Environment: 
+
+
+Error: Ambiguous expression in sizeof operand: Name: b
+
Index: src/Tests/ResolvExpr/Expected/OccursError.tst
===================================================================
--- src/Tests/ResolvExpr/Expected/OccursError.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Expected/OccursError.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,6 @@
+Error: No reasonable alternatives for expression Applying untyped: 
+    Name: f
+
+...to: 
+    Name: g
+
Index: src/Tests/ResolvExpr/Expected/Operators.tst
===================================================================
--- src/Tests/ResolvExpr/Expected/Operators.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Expected/Operators.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,224 @@
+?*?: a function
+    with parameters
+      signed int 
+      signed int 
+    returning 
+      signed int 
+
+?(): a function
+    with parameters
+      number1: a signed int 
+      number2: a signed int 
+    returning 
+      signed int 
+    with body 
+      
+        Return Statement, returning: Cast of:
+  Application of
+    Variable Expression: ?*?: a function
+        with parameters
+          signed int 
+          signed int 
+        returning 
+          signed int 
+
+  to arguments
+          Variable Expression: number1: a signed int 
+
+          Variable Expression: number2: a signed int 
+
+
+to:
+  signed int 
+with environment:
+  Types:
+  Non-types:
+
+
+
+?+?: a function
+    with parameters
+      signed int 
+      signed int 
+    returning 
+      signed int 
+
+?=?: a function
+    with parameters
+      pointer to signed int 
+      signed int 
+    returning 
+      signed int 
+
+struct accumulator
+    with members
+      total: a signed int 
+
+?=?: a automatically generated inline static function
+    with parameters
+      _dst: a pointer to instance of struct accumulator 
+      _src: a instance of struct accumulator 
+    returning 
+      instance of struct accumulator 
+    with body 
+      
+        Expression Statement:
+          Application of
+            Variable Expression: ?=?: a function
+                with parameters
+                  pointer to signed int 
+                  signed int 
+                returning 
+                  signed int 
+
+          to arguments
+                          Address of:
+                Member Expression, with field: 
+                  total: a signed int 
+                from aggregate: 
+                  Applying untyped: 
+                      Name: *?
+
+                  ...to: 
+                      Variable Expression: _dst: a pointer to instance of struct accumulator 
+
+                          Member Expression, with field: 
+                total: a signed int 
+              from aggregate: 
+                Variable Expression: _src: a instance of struct accumulator 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Return Statement, returning: Cast of:
+  Variable Expression: _src: a instance of struct accumulator 
+
+to:
+  instance of struct accumulator 
+with environment:
+  Types:
+  Non-types:
+
+
+
+?(): a function
+    with parameters
+      a: a instance of struct accumulator 
+      number1: a char 
+      number2: a char 
+    returning 
+      char 
+
+f: a function
+    returning 
+      nothing 
+    with body 
+      Declaration of a: a char 
+      Declaration of b: a char 
+      
+        Expression Statement:
+          Application of
+            Variable Expression: ?(): a function
+                with parameters
+                  number1: a signed int 
+                  number2: a signed int 
+                returning 
+                  signed int 
+
+          to arguments
+                          Cast of:
+                Variable Expression: a: a char 
+
+              to:
+                signed int 
+
+                          Cast of:
+                Variable Expression: b: a char 
+
+              to:
+                signed int 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: ?(): a function
+                with parameters
+                  number1: a signed int 
+                  number2: a signed int 
+                returning 
+                  signed int 
+
+          to arguments
+                          Cast of:
+                Variable Expression: a: a char 
+
+              to:
+                signed int 
+
+                          Cast of:
+                Variable Expression: b: a char 
+
+              to:
+                signed int 
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: ?+?: a function
+                with parameters
+                  signed int 
+                  signed int 
+                returning 
+                  signed int 
+
+          to arguments
+                          Cast of:
+                Variable Expression: a: a char 
+
+              to:
+                signed int 
+
+                          Cast of:
+                Variable Expression: b: a char 
+
+              to:
+                signed int 
+
+          with environment:
+            Types:
+            Non-types:
+
+      Declaration of ?+?: a instance of struct accumulator 
+      
+        Expression Statement:
+          Application of
+            Variable Expression: ?(): a function
+                with parameters
+                  a: a instance of struct accumulator 
+                  number1: a char 
+                  number2: a char 
+                returning 
+                  char 
+
+          to arguments
+                          Variable Expression: ?+?: a instance of struct accumulator 
+
+                          Variable Expression: a: a char 
+
+                          Variable Expression: b: a char 
+
+          with environment:
+            Types:
+            Non-types:
+
+
Index: src/Tests/ResolvExpr/Expected/Quad.tst
===================================================================
--- src/Tests/ResolvExpr/Expected/Quad.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Expected/Quad.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,201 @@
+?=?: a function
+    with parameters
+      pointer to signed int 
+      signed int 
+    returning 
+      signed int 
+
+?*?: a function
+    with parameters
+      signed int 
+      signed int 
+    returning 
+      signed int 
+
+square: a forall
+      T: a type
+        with assertions
+          ?=?: a pointer to function
+              with parameters
+                pointer to instance of type T 
+                instance of type T 
+              returning 
+                instance of type T 
+
+          ?*?: a pointer to function
+              with parameters
+                instance of type T 
+                instance of type T 
+              returning 
+                instance of type T 
+
+
+    function
+    with parameters
+      t: a instance of type T 
+    returning 
+      instance of type T 
+    with body 
+      
+        Return Statement, returning: Cast of:
+  Application of
+    Variable Expression: ?*?: a pointer to function
+        with parameters
+          instance of type T 
+          instance of type T 
+        returning 
+          instance of type T 
+
+  to arguments
+          Variable Expression: t: a instance of type T 
+
+          Variable Expression: t: a instance of type T 
+
+
+to:
+  instance of type T 
+with environment:
+  Types:
+  Non-types:
+
+
+
+quad: a forall
+      U: a type
+        with assertions
+          ?=?: a pointer to function
+              with parameters
+                pointer to instance of type U 
+                instance of type U 
+              returning 
+                instance of type U 
+
+          square: a pointer to function
+              with parameters
+                instance of type U 
+              returning 
+                instance of type U 
+
+
+    function
+    with parameters
+      u: a instance of type U 
+    returning 
+      instance of type U 
+    with body 
+      
+        Return Statement, returning: Cast of:
+  Application of
+    Variable Expression: square: a pointer to function
+        with parameters
+          instance of type U 
+        returning 
+          instance of type U 
+
+  to arguments
+          Application of
+        Variable Expression: square: a pointer to function
+            with parameters
+              instance of type U 
+            returning 
+              instance of type U 
+
+      to arguments
+                  Variable Expression: u: a instance of type U 
+
+
+
+to:
+  instance of type U 
+with environment:
+  Types:
+  Non-types:
+
+
+
+f: a function
+      accepting unspecified arguments
+    returning 
+      nothing 
+    with body 
+      
+        Expression Statement:
+          Application of
+            Variable Expression: quad: a forall
+                  U: a type
+                    with assertions
+                      ?=?: a pointer to function
+                          with parameters
+                            pointer to instance of type U 
+                            instance of type U 
+                          returning 
+                            instance of type U 
+
+                      square: a pointer to function
+                          with parameters
+                            instance of type U 
+                          returning 
+                            instance of type U 
+
+
+                function
+                with parameters
+                  u: a instance of type U 
+                returning 
+                  instance of type U 
+
+          to arguments
+                          Constant Expression: 7 (type: signed int )
+          with inferred parameters:
+            ?=?: a function
+              with parameters
+                pointer to signed int 
+                signed int 
+              returning 
+                signed int 
+
+            ?*?: a function
+              with parameters
+                signed int 
+                signed int 
+              returning 
+                signed int 
+
+            ?=?: a function
+              with parameters
+                pointer to signed int 
+                signed int 
+              returning 
+                signed int 
+
+            square: a forall
+                T: a type
+                  with assertions
+                    ?=?: a pointer to function
+                        with parameters
+                          pointer to instance of type T 
+                          instance of type T 
+                        returning 
+                          instance of type T 
+
+                    ?*?: a pointer to function
+                        with parameters
+                          instance of type T 
+                          instance of type T 
+                        returning 
+                          instance of type T 
+
+
+              function
+              with parameters
+                t: a instance of type T 
+              returning 
+                instance of type T 
+
+          with environment:
+            Types:
+              _0_U -> signed int 
+              _1_T -> signed int 
+            Non-types:
+
+
Index: src/Tests/ResolvExpr/Expected/Rank2.tst
===================================================================
--- src/Tests/ResolvExpr/Expected/Rank2.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Expected/Rank2.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,272 @@
+?=?: a function
+    with parameters
+      pointer to signed int 
+      signed int 
+    returning 
+      signed int 
+
+?=?: a forall
+      DT: a incomplete type
+    function
+    with parameters
+      pointer to pointer to instance of type DT 
+      pointer to instance of type DT 
+    returning 
+      pointer to instance of type DT 
+
+a: a function
+      accepting unspecified arguments
+    returning 
+      nothing 
+    with body 
+      Declaration of f: a forall
+            T: a type
+              with assertions
+                ?=?: a pointer to function
+                    with parameters
+                      pointer to instance of type T 
+                      instance of type T 
+                    returning 
+                      instance of type T 
+
+
+          function
+          with parameters
+            instance of type T 
+          returning 
+            nothing 
+
+      Declaration of g: a function
+          with parameters
+            p: a pointer to forall
+                  U: a type
+                    with assertions
+                      ?=?: a pointer to function
+                          with parameters
+                            pointer to instance of type U 
+                            instance of type U 
+                          returning 
+                            instance of type U 
+
+
+                function
+                with parameters
+                  instance of type U 
+                returning 
+                  nothing 
+
+          returning 
+            nothing 
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: g: a function
+                with parameters
+                  p: a pointer to forall
+                        U: a type
+                          with assertions
+                            ?=?: a pointer to function
+                                with parameters
+                                  pointer to instance of type U 
+                                  instance of type U 
+                                returning 
+                                  instance of type U 
+
+
+                      function
+                      with parameters
+                        instance of type U 
+                      returning 
+                        nothing 
+
+                returning 
+                  nothing 
+
+          to arguments
+                          Variable Expression: f: a forall
+                    T: a type
+                      with assertions
+                        ?=?: a pointer to function
+                            with parameters
+                              pointer to instance of type T 
+                              instance of type T 
+                            returning 
+                              instance of type T 
+
+
+                  function
+                  with parameters
+                    instance of type T 
+                  returning 
+                    nothing 
+
+
+          with inferred parameters:
+            ?=?: a pointer to function
+              with parameters
+                pointer to instance of type U 
+                instance of type U 
+              returning 
+                instance of type U 
+
+          with environment:
+            Types:
+              _1_T -> instance of type _0_U 
+            Non-types:
+
+
+g: a function
+      accepting unspecified arguments
+    returning 
+      nothing 
+    with body 
+      Declaration of h: a function
+          with parameters
+            null: a pointer to signed int 
+          returning 
+            nothing 
+
+      Declaration of id: a forall
+            T: a type
+              with assertions
+                ?=?: a pointer to function
+                    with parameters
+                      pointer to instance of type T 
+                      instance of type T 
+                    returning 
+                      instance of type T 
+
+
+          function
+          with parameters
+            instance of type T 
+          returning 
+            instance of type T 
+
+      Declaration of 0: a forall
+            T: a incomplete type
+          pointer to instance of type T 
+      Declaration of 0: a signed int 
+      
+        Expression Statement:
+          Application of
+            Variable Expression: h: a function
+                with parameters
+                  null: a pointer to signed int 
+                returning 
+                  nothing 
+
+          to arguments
+                          Application of
+                Variable Expression: id: a forall
+                      T: a type
+                        with assertions
+                          ?=?: a pointer to function
+                              with parameters
+                                pointer to instance of type T 
+                                instance of type T 
+                              returning 
+                                instance of type T 
+
+
+                    function
+                    with parameters
+                      instance of type T 
+                    returning 
+                      instance of type T 
+
+              to arguments
+                                  Application of
+                    Variable Expression: id: a forall
+                          T: a type
+                            with assertions
+                              ?=?: a pointer to function
+                                  with parameters
+                                    pointer to instance of type T 
+                                    instance of type T 
+                                  returning 
+                                    instance of type T 
+
+
+                        function
+                        with parameters
+                          instance of type T 
+                        returning 
+                          instance of type T 
+
+                  to arguments
+                                          Application of
+                        Variable Expression: id: a forall
+                              T: a type
+                                with assertions
+                                  ?=?: a pointer to function
+                                      with parameters
+                                        pointer to instance of type T 
+                                        instance of type T 
+                                      returning 
+                                        instance of type T 
+
+
+                            function
+                            with parameters
+                              instance of type T 
+                            returning 
+                              instance of type T 
+
+                      to arguments
+                                                  Variable Expression: 0: a forall
+                                T: a incomplete type
+                              pointer to instance of type T 
+
+                      with inferred parameters:
+                        ?=?: a forall
+                            DT: a incomplete type
+                          function
+                          with parameters
+                            pointer to pointer to instance of type DT 
+                            pointer to instance of type DT 
+                          returning 
+                            pointer to instance of type DT 
+
+
+                  with inferred parameters:
+                    ?=?: a forall
+                        DT: a incomplete type
+                      function
+                      with parameters
+                        pointer to pointer to instance of type DT 
+                        pointer to instance of type DT 
+                      returning 
+                        pointer to instance of type DT 
+
+
+              with inferred parameters:
+                ?=?: a forall
+                    DT: a incomplete type
+                  function
+                  with parameters
+                    pointer to pointer to instance of type DT 
+                    pointer to instance of type DT 
+                  returning 
+                    pointer to instance of type DT 
+
+
+          with environment:
+            Types:
+              _0_T -> forall
+                    _3_T: a incomplete type
+                  pointer to instance of type _3_T 
+              _1_T -> forall
+                    _3_T: a incomplete type
+                  pointer to instance of type _3_T 
+              _2_T -> forall
+                    _3_T: a incomplete type
+                  pointer to instance of type _3_T 
+              _3_T -> signed int 
+              _5_DT -> signed int 
+              _7_DT -> signed int 
+              _9_DT -> signed int 
+            Non-types:
+
+
Index: src/Tests/ResolvExpr/Expected/ShortCircuit.tst
===================================================================
--- src/Tests/ResolvExpr/Expected/ShortCircuit.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Expected/ShortCircuit.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,178 @@
+?!=?: a function
+    with parameters
+      signed int 
+      signed int 
+    returning 
+      signed int 
+
+?!=?: a function
+    with parameters
+      float 
+      float 
+    returning 
+      signed int 
+
+0: a signed int 
+g: a function
+    with parameters
+      float 
+    returning 
+      nothing 
+
+g: a function
+    with parameters
+      signed int 
+    returning 
+      nothing 
+
+f: a function
+    with parameters
+      a: a signed int 
+    returning 
+      nothing 
+    with body 
+      Declaration of b: a signed int 
+      Declaration of c: a float 
+      
+        Expression Statement:
+          Application of
+            Variable Expression: g: a function
+                with parameters
+                  float 
+                returning 
+                  nothing 
+
+          to arguments
+                          Conditional expression on: 
+                Cast of:
+                  Application of
+                    Variable Expression: ?!=?: a function
+                        with parameters
+                          signed int 
+                          signed int 
+                        returning 
+                          signed int 
+
+                  to arguments
+                                          Variable Expression: a: a signed int 
+
+                                          Variable Expression: 0: a signed int 
+
+
+                to:
+                  signed int 
+              First alternative:
+                Variable Expression: b: a signed int 
+              Second alternative:
+                Variable Expression: c: a float 
+
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: g: a function
+                with parameters
+                  signed int 
+                returning 
+                  nothing 
+
+          to arguments
+                          Short-circuited operation (and) on: Cast of:
+  Application of
+    Variable Expression: ?!=?: a function
+        with parameters
+          signed int 
+          signed int 
+        returning 
+          signed int 
+
+  to arguments
+          Variable Expression: a: a signed int 
+
+          Variable Expression: 0: a signed int 
+
+
+to:
+  signed int 
+ and Cast of:
+  Application of
+    Variable Expression: ?!=?: a function
+        with parameters
+          float 
+          float 
+        returning 
+          signed int 
+
+  to arguments
+          Variable Expression: c: a float 
+
+          Cast of:
+        Variable Expression: 0: a signed int 
+
+      to:
+        float 
+
+
+to:
+  signed int 
+
+
+          with environment:
+            Types:
+            Non-types:
+
+      
+        Expression Statement:
+          Application of
+            Variable Expression: g: a function
+                with parameters
+                  signed int 
+                returning 
+                  nothing 
+
+          to arguments
+                          Short-circuited operation (or) on: Cast of:
+  Application of
+    Variable Expression: ?!=?: a function
+        with parameters
+          signed int 
+          signed int 
+        returning 
+          signed int 
+
+  to arguments
+          Variable Expression: a: a signed int 
+
+          Variable Expression: 0: a signed int 
+
+
+to:
+  signed int 
+ and Cast of:
+  Application of
+    Variable Expression: ?!=?: a function
+        with parameters
+          signed int 
+          signed int 
+        returning 
+          signed int 
+
+  to arguments
+          Variable Expression: b: a signed int 
+
+          Variable Expression: 0: a signed int 
+
+
+to:
+  signed int 
+
+
+          with environment:
+            Types:
+            Non-types:
+
+
Index: src/Tests/ResolvExpr/Expected/Statement.tst
===================================================================
--- src/Tests/ResolvExpr/Expected/Statement.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Expected/Statement.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,170 @@
+?=?: a function
+    with parameters
+      pointer to signed int 
+      signed int 
+    returning 
+      signed int 
+
+?!=?: a function
+    with parameters
+      signed int 
+      signed int 
+    returning 
+      signed int 
+
+0: a signed int 
+f: a function
+      accepting unspecified arguments
+    returning 
+      nothing 
+    with body 
+      Declaration of a: a signed int 
+      Declaration of struct __anonymous0
+          with members
+            b: a signed int 
+
+      Declaration of ?=?: a automatically generated inline static function
+          with parameters
+            _dst: a pointer to instance of struct __anonymous0 
+            _src: a instance of struct __anonymous0 
+          returning 
+            instance of struct __anonymous0 
+          with body 
+            
+              Expression Statement:
+                Application of
+                  Variable Expression: ?=?: a function
+                      with parameters
+                        pointer to signed int 
+                        signed int 
+                      returning 
+                        signed int 
+
+                to arguments
+                                      Address of:
+                      Member Expression, with field: 
+                        b: a signed int 
+                      from aggregate: 
+                        Applying untyped: 
+                            Name: *?
+
+                        ...to: 
+                            Variable Expression: _dst: a pointer to instance of struct __anonymous0 
+
+                                      Member Expression, with field: 
+                      b: a signed int 
+                    from aggregate: 
+                      Variable Expression: _src: a instance of struct __anonymous0 
+
+                with environment:
+                  Types:
+                  Non-types:
+
+            
+              Return Statement, returning: Cast of:
+  Variable Expression: _src: a instance of struct __anonymous0 
+
+to:
+  instance of struct __anonymous0 
+with environment:
+  Types:
+  Non-types:
+
+
+
+      Declaration of a: a instance of struct __anonymous0 
+      
+        If on condition: 
+            Cast of:
+              Application of
+                Variable Expression: ?!=?: a function
+                    with parameters
+                      signed int 
+                      signed int 
+                    returning 
+                      signed int 
+
+              to arguments
+                                  Variable Expression: a: a signed int 
+
+                                  Variable Expression: 0: a signed int 
+
+
+            to:
+              signed int 
+            with environment:
+              Types:
+              Non-types:
+        .... and branches: 
+            
+              While on condition: 
+                  Cast of:
+                    Application of
+                      Variable Expression: ?!=?: a function
+                          with parameters
+                            signed int 
+                            signed int 
+                          returning 
+                            signed int 
+
+                    to arguments
+                                              Variable Expression: a: a signed int 
+
+                                              Variable Expression: 0: a signed int 
+
+
+                  to:
+                    signed int 
+                  with environment:
+                    Types:
+                    Non-types:
+              .... with body: 
+                  Declaration of b: a pointer to signed int 
+                  
+                    For Statement
+
+                      initialization: 
+
+                        Expression Statement:
+                          Variable Expression: b: a pointer to signed int 
+                          with environment:
+                            Types:
+                            Non-types:
+
+
+                      condition: 
+                        Cast of:
+                          Application of
+                            Variable Expression: ?!=?: a function
+                                with parameters
+                                  signed int 
+                                  signed int 
+                                returning 
+                                  signed int 
+
+                          to arguments
+                                                          Variable Expression: a: a signed int 
+
+                                                          Variable Expression: 0: a signed int 
+
+
+                        to:
+                          signed int 
+                        with environment:
+                          Types:
+                          Non-types:
+
+
+                      increment: 
+                        Variable Expression: b: a pointer to signed int 
+                        with environment:
+                          Types:
+                          Non-types:
+
+
+                      statement block: 
+
+
+
+
+
Index: src/Tests/ResolvExpr/Forall.c
===================================================================
--- src/Tests/ResolvExpr/Forall.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Forall.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,39 @@
+int ?=?( int*, int );
+float ?=?( float*, float );
+int * ?=?( int **, int * );
+float * ?=?( float **, float * );
+char ?=?( char*, char );
+void (* ?=?( void (**)(void), void (*)(void) ))(void);
+
+void g1()
+{
+  forall( type T ) T f( T );
+  void f( int );
+  void h( void (*p)(void) );
+  
+  int x;
+  void (*y)(void);
+  char z;
+  float w;
+  
+  f( x );
+  f( y );
+  f( z );
+  f( w );
+  h( f( y ) );
+}
+
+void g2()
+{
+  forall( type T ) void f( T, T );
+  forall( type T, type U ) void f( T, U );
+  
+  int x;
+  float y;
+  int *z;
+  float *w;
+  
+  f( x, y );
+  f( z, w );
+  f( x, z );
+}
Index: src/Tests/ResolvExpr/Function.c
===================================================================
--- src/Tests/ResolvExpr/Function.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Function.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,31 @@
+int a;
+float a;
+int f( int );
+float f( float );
+
+void g()
+{
+  // selects the same f and a each time
+  // but without a cast would be ambiguous
+  f( (int)a );
+  (int)f( a );
+}
+
+[ int ] p;
+[ int, double ] p;
+[ int, int, int ] p;
+[ int, int, int, int ] p;
+
+[ char ] q;
+[ int, int ] q;
+[ int, int, float ] q;
+[ int, int, int, int ] q;
+
+[ int, int ] r( int, int, int, int );
+
+void s()
+{
+  r( p, q );
+  r( [ q, p ] );
+  r( r( p, q ), r( q, q ) );
+}
Index: src/Tests/ResolvExpr/InferParam.c
===================================================================
--- src/Tests/ResolvExpr/InferParam.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/InferParam.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,29 @@
+int ?=?( int*, int );
+float ?=?( float*, float );
+double ?=?( double*, double );
+
+forall( type T, type U | { U f(T); } ) U g(T);
+float f( int );
+double f( int );
+void i( float );
+
+void h()
+{
+  int a;
+  i( g( a ) );
+}
+
+context has_f_and_j( type T, type U )
+{
+  U f( T );
+  U j( T, U );
+};
+
+float j( int, float );
+forall( type T, type U | has_f_and_j( T, U ) ) U k( T );
+
+void l()
+{
+  int b;
+  i( k( b ) );
+}
Index: src/Tests/ResolvExpr/Makefile
===================================================================
--- src/Tests/ResolvExpr/Makefile	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Makefile	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,2 @@
+all:
+	sh run-tests.sh
Index: src/Tests/ResolvExpr/Members.c
===================================================================
--- src/Tests/ResolvExpr/Members.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Members.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,77 @@
+// "../../cfa-cpp -nc Members.c"
+
+char ?=?( char*, char );
+int ?=?( int*, int );
+float ?=?( float*, float );
+forall( dtype DT ) DT * ?=?( DT**, DT* );
+forall(type T) lvalue T *?( T* );
+char *__builtin_memcpy();
+
+void a( char );
+void b( int );
+void c( int* );
+void d( float* );
+
+struct a_struct
+{
+  int a;
+  char a;
+  float a;
+};
+
+union b_struct
+{
+  int *a;
+  char *a;
+  float *a;
+};
+
+void f()
+{
+  struct a_struct the_struct;
+  union b_struct the_struct;
+  
+  a( the_struct.a );
+  b( the_struct.a );
+  c( the_struct.a );
+  d( the_struct.a );
+}
+
+struct c_struct
+{
+  int;
+  char;
+  float;
+};
+
+union d_struct
+{
+  int*;
+  char*;
+  float*;
+};
+
+void g()
+{
+  unsigned short x;
+  struct c_struct x;
+  union d_struct x;
+  
+  a( x );	// the 'a' and 'b' calls resolve to the ushort
+  b( x );	// it's debatable whether this is good
+  c( x );
+  d( x );
+}
+
+// make sure that forward declarations work
+
+struct forward;
+
+struct forward *q;
+
+struct forward { int y; };
+
+void h()
+{
+	q->y;
+}
Index: src/Tests/ResolvExpr/Misc.c
===================================================================
--- src/Tests/ResolvExpr/Misc.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Misc.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,15 @@
+int a;
+int b;
+float b;
+
+void g( int );
+void g( unsigned );
+
+void
+f( void )
+{
+  g( (a, b) );
+  g( (a, a, b) );
+  g( sizeof a );
+  g( sizeof( int ) );
+}
Index: src/Tests/ResolvExpr/MiscError.c
===================================================================
--- src/Tests/ResolvExpr/MiscError.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/MiscError.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,14 @@
+int a;
+int b;
+float b;
+
+void g( int );
+
+void
+f( void )
+{
+  g( (b, a) );
+  g( (b, a, b) );
+  g( (a, b, b) );
+  sizeof b;
+}
Index: src/Tests/ResolvExpr/OccursError.c
===================================================================
--- src/Tests/ResolvExpr/OccursError.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/OccursError.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,11 @@
+// "./cfa-cpp -c simple.c"
+// "./cfa -v simple.c"
+// "./cfa -CFA simple.c > simple_out.c"
+
+forall( type T ) void f( void (*)( T, T* ) );
+forall( type U ) void g( U*, U );
+
+void test()
+{
+  f( g );
+}
Index: src/Tests/ResolvExpr/Operators.c
===================================================================
--- src/Tests/ResolvExpr/Operators.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Operators.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,28 @@
+int ?*?( int, int );
+
+int
+?()( int number1, int number2 )
+{
+  return number1 * number2;
+}
+
+int ?+?( int, int );
+
+int ?=?( int*, int );
+struct accumulator
+{
+  int total;
+};
+
+char ?()( struct accumulator a, char number1, char number2 );
+
+void
+f( void )
+{
+  char a, b;
+  ?()( a, b );
+  a(b);
+  a + b;
+  struct accumulator ?+?;	// why not, eh?
+  a + b;
+}
Index: src/Tests/ResolvExpr/Quad.c
===================================================================
--- src/Tests/ResolvExpr/Quad.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Quad.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,19 @@
+int ?=?( int*, int );
+int ?*?( int, int );
+
+forall( type T | { T ?*?( T, T ); } )
+T square( T t )
+{
+  return t * t;
+}
+
+forall( type U | { U square( U ); } )
+U quad( U u )
+{
+  return square( square( u ) );
+}
+
+void f()
+{
+  quad( 7 );
+}
Index: src/Tests/ResolvExpr/Rank2.c
===================================================================
--- src/Tests/ResolvExpr/Rank2.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Rank2.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,18 @@
+int ?=?( int*, int );
+forall(dtype DT) DT* 	   	?=?( DT *          *,            DT* );
+
+void a()
+{
+  forall( type T ) void f( T );
+  void g( forall( type U ) void p( U ) );
+  g( f );
+}
+
+void g()
+{
+  void h( int *null );
+  forall( type T ) T id( T );
+  forall( dtype T ) T *0;
+  int 0;
+  h( id( id( id( 0 ) ) ) );
+}
Index: src/Tests/ResolvExpr/ShortCircuit.c
===================================================================
--- src/Tests/ResolvExpr/ShortCircuit.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/ShortCircuit.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,15 @@
+int ?!=?( int, int );
+int ?!=?( float, float );
+int 0;
+
+void g( float );
+void g( int );
+
+void f( int a )
+{
+  int b;
+  float c;
+  g( a ? b : c );
+  g( a && c );
+  g( a || b );
+}
Index: src/Tests/ResolvExpr/Statement.c
===================================================================
--- src/Tests/ResolvExpr/Statement.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/Statement.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,16 @@
+int ?=?( int*, int );
+int ?!=?( int, int );
+int 0;
+
+void f()
+{
+    int a;
+    struct { int b; } a;
+    if ( a ) {
+      while ( a ) {
+        int *b;
+        for ( b; a; b ) {
+        }
+      }
+    }
+}
Index: src/Tests/ResolvExpr/make-rules
===================================================================
--- src/Tests/ResolvExpr/make-rules	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/make-rules	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,21 @@
+CFA = ../../cfa-cpp
+
+DIFF = /software/gnu/bin/diff
+
+# Basic SynTree printing
+EXPECTED := ${wildcard $(EXPECTDIR)/*.tst}
+TESTS := $(EXPECTED:$(EXPECTDIR)/%=$(OUTPUTDIR)/%)
+TEST_IN := $(TESTS:.tst=.c)
+
+$(OUTPUTDIR)/%.tst:%.c $(CFA)
+	-$(CFA) $(CFAOPT) < $< > $@ 2>&1
+
+$(OUTPUTDIR)/report: $(TESTS) $(EXPECTED)
+	rm -f $@
+	@for i in $(TESTS); do \
+	  echo "---"`basename $$i`"---" | tee -a $@; \
+	  $(DIFF) -B -w -u $(EXPECTDIR)/`basename $$i` $$i | tee -a $@; \
+	done
+
+clean:
+	rm -rf $(OUTPUTDIR)
Index: src/Tests/ResolvExpr/run-tests.sh
===================================================================
--- src/Tests/ResolvExpr/run-tests.sh	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/ResolvExpr/run-tests.sh	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,8 @@
+#!/bin/sh -v
+
+dotest() {
+  mkdir -p Output$1
+  OUTPUTDIR=Output$1 EXPECTDIR=Expected$1 CFAOPT=$2 gmake -f make-rules $3
+}
+
+dotest "" -ne "$*"
Index: src/Tests/SynTree/Array.c
===================================================================
--- src/Tests/SynTree/Array.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Array.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,33 @@
+int a1[];
+int a2[*];
+int a4[3];
+
+int m1[][3];
+int m2[*][*];
+int m4[3][3];
+
+typedef int T;
+
+int fred() {
+    int a1[];
+    int a2[*];
+    int a4[3];
+    int T[3];
+}
+
+int mary( int T[3],
+	  int p1[const 3],
+	  int p2[static 3],
+	  int p3[static const 3]
+    ) {
+}
+
+int (*tom())[3] {
+}
+
+int (*(jane)())( int T[3],
+		 int p1[const 3],
+		 int p2[static 3],
+		 int p3[static const 3]
+    ) {
+}
Index: src/Tests/SynTree/Constant0-1.c
===================================================================
--- src/Tests/SynTree/Constant0-1.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Constant0-1.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,35 @@
+// Cforall extension
+
+// value
+
+int 0;
+const int 0;
+static const int 0;
+int 1;
+const int 1;
+static const int 1;
+int 0, 1;
+const int 0, 1;
+static const int 0, 1;
+struct { int i; } 0;
+const struct { int i; } 1;
+static const struct { int i; } 1;
+
+// pointer
+
+int 1, * 0;
+int (1), ((1)), * (0), (* 0), ((* 0));
+int * const (0), (* const 0), ((* const 0));
+struct { int i; } * 0;
+
+// Cforall style
+
+* int x, 0;
+const * int x, 0;
+static const * int x, 0;
+* struct { int i; } 0;
+const * struct { int i; } 0;
+static const * struct { int i; } 0;
+static * int x, 0;
+static const * int x, 0;
+const * * int x, 0;
Index: src/Tests/SynTree/Context.c
===================================================================
--- src/Tests/SynTree/Context.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Context.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,16 @@
+context has_q( type T )
+{
+  T q( T );
+};
+
+forall( type z | has_q( z ) )
+void f()
+{
+  context has_r( type T, type U )
+  {
+    T r( T, T (T,U) );
+  };
+  
+  extern type x, y | has_r( x, y );
+  
+}
Index: src/Tests/SynTree/DeclarationErrors.c
===================================================================
--- src/Tests/SynTree/DeclarationErrors.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/DeclarationErrors.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,5 @@
+static short int volatile static const x9;		// duplicate static
+struct { int i; } const static volatile static x18;	// duplicate static
+struct { int i; } const static volatile static volatile x19; // duplicate static & volatile
+typedef int Int;
+static Int volatile static const x28;			// duplicate static
Index: src/Tests/SynTree/DeclarationSpecifier.c
===================================================================
--- src/Tests/SynTree/DeclarationSpecifier.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/DeclarationSpecifier.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,86 @@
+typedef short int Int;
+
+
+const short int volatile x1;
+static const short int volatile x2;
+const static short int volatile x3;
+const short static int volatile x4;
+const static volatile short int x4;
+const short int static volatile x5;
+const short int volatile static x6;
+const short volatile int static x7;
+short int volatile static const x8;
+
+const volatile struct { int i; } x10;
+const struct { int i; } volatile x11;
+struct { int i; } const volatile x12;
+static const volatile struct { int i; } x13;
+const static struct { int i; } volatile x14;
+struct { int i; } static const volatile x15;
+struct { int i; } const static volatile x16;
+struct { int i; } const volatile static x17;
+
+const Int volatile x20;
+static const Int volatile x21;
+const static Int volatile x22;
+const static Int volatile x23;
+const Int static volatile x24;
+const Int volatile static x25;
+const volatile Int static x26;
+Int volatile static const x27;
+
+const volatile struct { Int i; } x29;
+const struct { Int i; } volatile x30;
+struct { Int i; } const volatile x31;
+static const volatile struct { Int i; } x32;
+const static struct { Int i; } volatile x33;
+struct { Int i; } static const volatile x34;
+struct { Int i; } const static volatile x35;
+struct { Int i; } const volatile static x36;
+
+
+const static inline const volatile int f01();		// duplicate const
+volatile inline const volatile static int f02();	// duplicate volatile
+const inline const volatile int static f03();		// duplicate const
+volatile inline static const volatile int f04();	// duplicate volatile
+const static const inline volatile int f05();		// duplicate const
+volatile static const volatile inline int f06();	// duplicate volatile
+const static const volatile int inline f07();		// duplicate const
+volatile static const int inline volatile f08();	// duplicate volatile
+
+static inline const volatile int f11();
+inline const volatile static int f12();
+inline const volatile int static f13();
+inline static const volatile int f14();
+static const inline volatile int f15();
+static const volatile inline int f16();
+static const volatile int inline f17();
+static const int inline volatile f18();
+
+short static inline const volatile int f21();
+inline short const volatile static int f22();
+inline const short volatile int static f23();
+inline static const short volatile int f24();
+static const inline volatile short int f25();
+static const volatile inline int short f26();
+static const volatile int inline short f27();
+static const int inline volatile short f28();
+
+static inline const volatile struct { int i; } f31();
+inline const volatile static struct { int i; } f32();
+inline const volatile struct { int i; } static f33();
+inline static const volatile struct { int i; } f34();
+static const inline volatile struct { int i; } f35();
+static const volatile inline struct { int i; } f36();
+static const volatile struct { int i; } inline f37();
+static const struct { int i; } inline volatile f38();
+
+static inline const volatile Int f41();
+inline const volatile static Int f42();
+inline const volatile Int static f43();
+inline static const volatile Int f44();
+static const inline volatile Int f45();
+static const volatile inline Int f46();
+static const volatile Int inline f47();
+static const Int inline volatile f48();
+
Index: src/Tests/SynTree/Enum.c
===================================================================
--- src/Tests/SynTree/Enum.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Enum.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,20 @@
+enum Colors {
+  Red,
+  Yellow,
+  Pink,
+  Blue,
+  Purple,
+  Orange,
+  Green
+};
+
+
+void f( void )
+{
+  enum Fruits {
+    Apple,
+    Banana,
+    Pear,
+    Mango
+  } fruit = Mango;
+}
Index: src/Tests/SynTree/Expected-SymTab/Array.tst
===================================================================
--- src/Tests/SynTree/Expected-SymTab/Array.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected-SymTab/Array.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,53 @@
+Adding object a1
+Adding object a2
+Adding object a4
+Adding object m1
+Adding object m2
+Adding object m4
+Adding typedef T
+--- Entering scope
+--- Leaving scope containing
+Adding function fred
+--- Entering scope
+--- Entering scope
+Adding object a1
+Adding object a2
+Adding object a4
+Adding object T
+--- Leaving scope containing
+T (__T__A0i) (2)
+a1 (__a1__A0i) (2)
+a2 (__a2__A0i) (2)
+a4 (__a4__A0i) (2)
+--- Leaving scope containing
+Adding function mary
+--- Entering scope
+Adding object T
+Adding object p1
+Adding object p2
+Adding object p3
+--- Entering scope
+--- Leaving scope containing
+--- Leaving scope containing
+T (__T__Pi) (1)
+p1 (__p1__CPi) (1)
+p2 (__p2__Pi) (1)
+p3 (__p3__CPi) (1)
+Adding function tom
+--- Entering scope
+--- Entering scope
+--- Leaving scope containing
+--- Leaving scope containing
+Adding function jane
+--- Entering scope
+Adding object T
+Adding object p1
+Adding object p2
+Adding object p3
+--- Entering scope
+--- Leaving scope containing
+--- Leaving scope containing
+T (__T__Pi) (1)
+p1 (__p1__CPi) (1)
+p2 (__p2__Pi) (1)
+p3 (__p3__CPi) (1)
Index: src/Tests/SynTree/Expected-SymTab/Context.tst
===================================================================
--- src/Tests/SynTree/Expected-SymTab/Context.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected-SymTab/Context.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,52 @@
+Adding context has_q
+--- Entering scope
+Adding type T
+--- Entering scope
+--- Leaving scope containing
+Adding function q
+--- Entering scope
+--- Leaving scope containing
+--- Leaving scope containing
+q (__q__F_2tT_2tT_) (1)
+T
+Adding function f
+--- Entering scope
+Adding type z
+--- Entering scope
+--- Leaving scope containing
+Adding function q
+--- Entering scope
+--- Leaving scope containing
+--- Entering scope
+Adding context has_r
+--- Entering scope
+Adding type T
+--- Entering scope
+--- Leaving scope containing
+Adding type U
+--- Entering scope
+--- Leaving scope containing
+Adding function r
+--- Entering scope
+--- Leaving scope containing
+--- Leaving scope containing
+r (__r__F_2tT_2tTPF_2tT_2tT2tU__) (3)
+T
+U
+Adding type x
+--- Entering scope
+--- Leaving scope containing
+Adding type y
+--- Entering scope
+--- Leaving scope containing
+Adding function r
+--- Entering scope
+--- Leaving scope containing
+--- Leaving scope containing
+r (__r__F_2tx_2txPF_2tx_2tx2ty__) (2)
+x
+y
+has_r
+--- Leaving scope containing
+q (__q__F_2tz_2tz_) (1)
+z
Index: src/Tests/SynTree/Expected-SymTab/Enum.tst
===================================================================
--- src/Tests/SynTree/Expected-SymTab/Enum.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected-SymTab/Enum.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,25 @@
+Adding enum Colors
+Adding object Red
+Adding object Yellow
+Adding object Pink
+Adding object Blue
+Adding object Purple
+Adding object Orange
+Adding object Green
+Adding function f
+--- Entering scope
+--- Entering scope
+Adding enum Fruits
+Adding object Apple
+Adding object Banana
+Adding object Pear
+Adding object Mango
+Adding object fruit
+--- Leaving scope containing
+Apple (__Apple__C7eFruits) (2)
+Banana (__Banana__C7eFruits) (2)
+Mango (__Mango__C7eFruits) (2)
+Pear (__Pear__C7eFruits) (2)
+fruit (__fruit__7eFruits) (2)
+Fruits
+--- Leaving scope containing
Index: src/Tests/SynTree/Expected-SymTab/Forall.tst
===================================================================
--- src/Tests/SynTree/Expected-SymTab/Forall.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected-SymTab/Forall.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,188 @@
+in default case, (shouldn't be here)
+in default case, (shouldn't be here)
+Adding typedef f
+--- Entering scope
+Adding type T
+--- Entering scope
+--- Leaving scope containing
+--- Leaving scope containing
+T
+Adding function swap
+--- Entering scope
+Adding type T
+--- Entering scope
+--- Leaving scope containing
+Adding object left
+Adding object right
+--- Entering scope
+Adding object temp
+--- Leaving scope containing
+temp (__temp__2tT) (2)
+--- Leaving scope containing
+left (__left__2tT) (1)
+right (__right__2tT) (1)
+T
+Adding context sumable
+--- Entering scope
+Adding type T
+--- Entering scope
+--- Leaving scope containing
+Adding object 0
+Adding function ?+?
+--- Entering scope
+--- Leaving scope containing
+Adding function ?++
+--- Entering scope
+--- Leaving scope containing
+Adding function ?+=?
+--- Entering scope
+--- Leaving scope containing
+--- Leaving scope containing
+0 (__0__C2tT) (1)
+?++ (__?++__F_2tT_2tT_) (1)
+?+=? (__?+=?__F_2tT_2tT2tT_) (1)
+?+? (__?+?__F_2tT_2tT2tT_) (1)
+T
+Adding type T1
+--- Entering scope
+--- Leaving scope containing
+Adding object 0
+Adding function ?+?
+--- Entering scope
+--- Leaving scope containing
+Adding function ?++
+--- Entering scope
+--- Leaving scope containing
+Adding function ?+=?
+--- Entering scope
+--- Leaving scope containing
+Adding type T2
+--- Entering scope
+Adding type P1
+--- Entering scope
+--- Leaving scope containing
+Adding type P2
+--- Entering scope
+--- Leaving scope containing
+--- Leaving scope containing
+P1
+P2
+Adding type T3
+--- Entering scope
+--- Leaving scope containing
+Adding object 0
+Adding function ?+?
+--- Entering scope
+--- Leaving scope containing
+Adding function ?++
+--- Entering scope
+--- Leaving scope containing
+Adding function ?+=?
+--- Entering scope
+--- Leaving scope containing
+Adding struct __anonymous0
+--- Entering scope
+Adding object i
+Adding object j
+--- Leaving scope containing
+i (__i__3tP1) (1)
+j (__j__3tP2) (1)
+Adding type T2
+--- Entering scope
+Adding type P1
+--- Entering scope
+--- Leaving scope containing
+Adding type P2
+--- Entering scope
+--- Leaving scope containing
+--- Leaving scope containing
+P1
+P2
+Adding object 0
+Adding function ?+?
+--- Entering scope
+--- Leaving scope containing
+Adding function ?++
+--- Entering scope
+--- Leaving scope containing
+Adding function ?+=?
+--- Entering scope
+--- Leaving scope containing
+Adding object w1
+Adding typedef w2
+--- Entering scope
+--- Leaving scope containing
+Adding object g2
+Adding type w3
+--- Entering scope
+--- Leaving scope containing
+Adding object g3
+Adding function sum
+--- Entering scope
+Adding type T
+--- Entering scope
+--- Leaving scope containing
+Adding object 0
+Adding function ?+?
+--- Entering scope
+--- Leaving scope containing
+Adding function ?++
+--- Entering scope
+--- Leaving scope containing
+Adding function ?+=?
+--- Entering scope
+--- Leaving scope containing
+Adding object n
+Adding object a
+--- Entering scope
+Adding object total
+Adding object i
+--- Leaving scope containing
+i (__i__i) (2)
+total (__total__2tT) (2)
+--- Leaving scope containing
+0 (__0__2tT) (1)
+?++ (__?++__F_2tT_2tT_) (1)
+?+=? (__?+=?__F_2tT_2tT2tT_) (1)
+?+? (__?+?__F_2tT_2tT2tT_) (1)
+a (__a__P2tT) (1)
+n (__n__i) (1)
+T
+Adding function twice
+--- Entering scope
+Adding type T
+--- Entering scope
+--- Leaving scope containing
+Adding object 0
+Adding function ?+?
+--- Entering scope
+--- Leaving scope containing
+Adding function ?++
+--- Entering scope
+--- Leaving scope containing
+Adding function ?+=?
+--- Entering scope
+--- Leaving scope containing
+Adding object t
+--- Entering scope
+--- Leaving scope containing
+--- Leaving scope containing
+0 (__0__C2tT) (1)
+?++ (__?++__F_2tT_2tT_) (1)
+?+=? (__?+=?__F_2tT_2tT2tT_) (1)
+?+? (__?+?__F_2tT_2tT2tT_) (1)
+t (__t__2tT) (1)
+T
+Adding function main
+--- Entering scope
+--- Entering scope
+Adding object x
+Adding object y
+Adding object a
+Adding object f
+--- Leaving scope containing
+a (__a__A0i) (2)
+f (__f__f) (2)
+x (__x__i) (2)
+y (__y__i) (2)
+--- Leaving scope containing
Index: src/Tests/SynTree/Expected-SymTab/Scope.tst
===================================================================
--- src/Tests/SynTree/Expected-SymTab/Scope.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected-SymTab/Scope.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,130 @@
+in default case, (shouldn't be here)
+in default case, (shouldn't be here)
+in default case, (shouldn't be here)
+Adding object x
+Adding typedef y
+--- Entering scope
+--- Leaving scope containing
+Adding typedef t
+--- Entering scope
+--- Leaving scope containing
+Adding object z
+Adding struct __anonymous0
+--- Entering scope
+Adding object a
+Adding object b
+--- Leaving scope containing
+a (__a__i) (1)
+b (__b__d) (1)
+Adding type u
+--- Entering scope
+--- Leaving scope containing
+Adding function f
+--- Entering scope
+Adding object y
+--- Leaving scope containing
+y (__y__i) (1)
+Adding object q
+Adding function w
+--- Entering scope
+Adding object y
+Adding object v
+--- Entering scope
+Adding type x
+--- Entering scope
+--- Leaving scope containing
+Adding function t
+--- Entering scope
+--- Leaving scope containing
+Adding object u
+Adding object z
+--- Leaving scope containing
+t (__t__F_2tx_2tu_) (2)
+u (__u__2tu) (2)
+z (__z__2tx) (2)
+x
+--- Leaving scope containing
+v (__v__2tu) (1)
+y (__y__2ty) (1)
+Adding object p
+Adding context has_u
+--- Entering scope
+Adding type z
+--- Entering scope
+--- Leaving scope containing
+Adding function u
+--- Entering scope
+--- Leaving scope containing
+--- Leaving scope containing
+u (__u__F_2tz_2tz_) (1)
+z
+Adding function q
+--- Entering scope
+Adding type t
+--- Entering scope
+--- Leaving scope containing
+Adding function u
+--- Entering scope
+--- Leaving scope containing
+Adding object the_t
+--- Entering scope
+Adding object y
+--- Leaving scope containing
+y (__y__2tt) (2)
+--- Leaving scope containing
+the_t (__the_t__2tt) (1)
+u (__u__F_2tt_2tt_) (1)
+t
+Adding function f
+--- Entering scope
+Adding object p
+--- Entering scope
+Adding object y
+Adding typedef x
+--- Entering scope
+--- Leaving scope containing
+--- Entering scope
+Adding object y
+Adding typedef z
+--- Entering scope
+--- Leaving scope containing
+--- Entering scope
+Adding object x
+Adding typedef y
+--- Entering scope
+--- Leaving scope containing
+Adding object z
+--- Leaving scope containing
+x (__x__2tz) (4)
+z (__z__2ty) (4)
+y
+Adding object x
+--- Leaving scope containing
+x (__x__2tz) (3)
+y (__y__2tx) (3)
+z
+Adding object q
+--- Leaving scope containing
+q (__q__2tx) (2)
+y (__y__i) (2)
+x
+--- Leaving scope containing
+p (__p__2ty) (1)
+Adding function g
+--- Entering scope
+--- Entering scope
+Adding typedef x
+--- Entering scope
+--- Leaving scope containing
+Adding object z
+--- Leaving scope containing
+z (__z__2tx) (2)
+x
+--- Leaving scope containing
+Adding function q
+--- Entering scope
+Adding object i
+--- Entering scope
+--- Leaving scope containing
+--- Leaving scope containing
+i (__i__i) (1)
Index: src/Tests/SynTree/Expected-SymTab/ScopeErrors.tst
===================================================================
--- src/Tests/SynTree/Expected-SymTab/ScopeErrors.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected-SymTab/ScopeErrors.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,38 @@
+Adding object thisIsAnError
+Adding object thisIsAnError
+Adding object thisIsNotAnError
+Adding object thisIsNotAnError
+Adding function thisIsAlsoNotAnError
+--- Entering scope
+--- Entering scope
+Adding object thisIsNotAnError
+--- Leaving scope containing
+thisIsNotAnError (__thisIsNotAnError__i) (2)
+--- Leaving scope containing
+Adding function thisIsAlsoNotAnError
+--- Entering scope
+Adding object x
+--- Entering scope
+--- Leaving scope containing
+--- Leaving scope containing
+x (__x__d) (1)
+Adding function thisIsStillNotAnError
+--- Entering scope
+--- Leaving scope containing
+Adding function thisIsStillNotAnError
+--- Entering scope
+--- Leaving scope containing
+Adding function butThisIsAnError
+--- Entering scope
+--- Entering scope
+--- Leaving scope containing
+--- Leaving scope containing
+Adding function butThisIsAnError
+Error: duplicate definition for thisIsAnError: a signed int 
+Error: duplicate function definition for butThisIsAnError: a function
+  with parameters
+    double 
+  returning 
+    double 
+  with body 
+
Index: src/Tests/SynTree/Expected-SymTab/Tuple.tst
===================================================================
--- src/Tests/SynTree/Expected-SymTab/Tuple.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected-SymTab/Tuple.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,97 @@
+Adding function f
+--- Entering scope
+--- Leaving scope containing
+Adding function g
+--- Entering scope
+--- Leaving scope containing
+Adding function h
+--- Entering scope
+Adding object a
+Adding object b
+Adding object c
+Adding object d
+--- Leaving scope containing
+a (__a__i) (1)
+b (__b__i) (1)
+c (__c__Pi) (1)
+d (__d__Pc) (1)
+Adding struct inner
+--- Entering scope
+Adding object f2
+Adding object f3
+--- Leaving scope containing
+f2 (__f2__i) (1)
+f3 (__f3__i) (1)
+Adding struct outer
+--- Entering scope
+Adding object f1
+Adding object i
+Adding object f4
+--- Leaving scope containing
+f1 (__f1__i) (1)
+f4 (__f4__d) (1)
+i (__i__6sinner) (1)
+Adding object s
+Adding object sp
+Adding object t1
+Adding object t2
+Adding object t3
+Adding function printf
+--- Entering scope
+Adding object rc
+Adding object fmt
+--- Leaving scope containing
+fmt (__fmt__Pc) (1)
+rc (__rc__i) (1)
+Adding function printf
+--- Entering scope
+Adding object fmt
+--- Leaving scope containing
+fmt (__fmt__Pc) (1)
+Adding function f1
+--- Entering scope
+Adding object x
+Adding object y
+Adding object w
+--- Entering scope
+--- Leaving scope containing
+--- Leaving scope containing
+w (__w__i) (1)
+x (__x__s) (1)
+y (__y__Ui) (1)
+Adding function g1
+--- Entering scope
+Adding object r
+--- Entering scope
+Adding object x
+Adding object p
+Adding object y
+Adding object z
+--- Leaving scope containing
+p (__p__s) (2)
+x (__x__s) (2)
+y (__y__Ui) (2)
+z (__z__Tii_) (2)
+--- Leaving scope containing
+r (__r__Ticli_) (1)
+Adding function main
+--- Entering scope
+Adding object rc
+Adding object argc
+Adding object argv
+--- Entering scope
+Adding object a
+Adding object b
+Adding object c
+Adding object d
+Adding object t
+--- Leaving scope containing
+a (__a__i) (2)
+b (__b__i) (2)
+c (__c__i) (2)
+d (__d__i) (2)
+t (__t__6souter) (2)
+--- Leaving scope containing
+argc (__argc__i) (1)
+argv (__argv__PPc) (1)
+rc (__rc__i) (1)
Index: src/Tests/SynTree/Expected/Array.tst
===================================================================
--- src/Tests/SynTree/Expected/Array.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected/Array.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,50 @@
+a1: a open array of signed int 
+a2: a variable length array of signed int 
+a4: a array of   Constant Expression: 3signed int 
+m1: a open array of array of   Constant Expression: 3signed int 
+m2: a variable length array of variable length array of signed int 
+m4: a array of   Constant Expression: 3array of   Constant Expression: 3signed int 
+T: a typedef for signed int 
+fred: a function
+    returning 
+      signed int 
+    with body 
+      Declaration of a1: a open array of signed int 
+      Declaration of a2: a variable length array of signed int 
+      Declaration of a4: a array of         Constant Expression: 3signed int 
+      Declaration of T: a array of         Constant Expression: 3signed int 
+
+mary: a function
+    with parameters
+      T: a array of         Constant Expression: 3signed int 
+      p1: a const array of         Constant Expression: 3signed int 
+      p2: a static array of         Constant Expression: 3signed int 
+      p3: a const static array of         Constant Expression: 3signed int 
+    returning 
+      signed int 
+    with body 
+
+      Null Statement
+
+tom: a function
+    returning 
+      pointer to array of         Constant Expression: 3signed int 
+    with body 
+
+      Null Statement
+
+jane: a function
+    returning 
+      pointer to function
+          with parameters
+            T: a array of               Constant Expression: 3signed int 
+            p1: a const array of               Constant Expression: 3signed int 
+            p2: a static array of               Constant Expression: 3signed int 
+            p3: a const static array of               Constant Expression: 3signed int 
+          returning 
+            signed int 
+
+    with body 
+
+      Null Statement
+
Index: src/Tests/SynTree/Expected/Constant0-1.tst
===================================================================
--- src/Tests/SynTree/Expected/Constant0-1.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected/Constant0-1.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,69 @@
+0: a signed int 
+0: a const signed int 
+0: a static const signed int 
+1: a signed int 
+1: a const signed int 
+1: a static const signed int 
+0: a signed int 
+1: a signed int 
+0: a const signed int 
+1: a const signed int 
+0: a static const signed int 
+1: a static const signed int 
+struct __anonymous0
+    with members
+      i: a signed int 
+
+0: a instance of struct __anonymous0 
+struct __anonymous1
+    with members
+      i: a signed int 
+
+1: a const instance of struct __anonymous1 
+struct __anonymous2
+    with members
+      i: a signed int 
+
+1: a static const instance of struct __anonymous2 
+1: a signed int 
+0: a pointer to signed int 
+1: a signed int 
+1: a signed int 
+0: a pointer to signed int 
+0: a pointer to signed int 
+0: a pointer to signed int 
+0: a const pointer to signed int 
+0: a const pointer to signed int 
+0: a const pointer to signed int 
+struct __anonymous3
+    with members
+      i: a signed int 
+
+0: a pointer to instance of struct __anonymous3 
+x: a pointer to signed int 
+0: a pointer to signed int 
+x: a const pointer to signed int 
+0: a const pointer to signed int 
+x: a static const pointer to signed int 
+0: a static const pointer to signed int 
+struct __anonymous4
+    with members
+      i: a signed int 
+
+0: a pointer to instance of struct __anonymous4 
+struct __anonymous5
+    with members
+      i: a signed int 
+
+0: a const pointer to instance of struct __anonymous5 
+struct __anonymous6
+    with members
+      i: a signed int 
+
+0: a static const pointer to instance of struct __anonymous6 
+x: a static pointer to signed int 
+0: a static pointer to signed int 
+x: a static const pointer to signed int 
+0: a static const pointer to signed int 
+x: a const pointer to pointer to signed int 
+0: a const pointer to pointer to signed int 
Index: src/Tests/SynTree/Expected/Context.tst
===================================================================
--- src/Tests/SynTree/Expected/Context.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected/Context.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,54 @@
+context has_q
+    with parameters
+      T: a type
+
+    with members
+      q: a function
+          with parameters
+            instance of type T 
+          returning 
+            instance of type T 
+
+
+f: a function
+    with forall
+      z: a type
+        with assertions
+          instance of context has_q 
+            with parameters
+              instance of type z 
+
+
+    returning 
+      void 
+    with body 
+      Declaration of context has_r
+          with parameters
+            T: a type
+            U: a type
+
+          with members
+            r: a function
+                with parameters
+                  instance of type T 
+                  function
+                      with parameters
+                        instance of type T 
+                        instance of type U 
+                      returning 
+                        instance of type T 
+
+                returning 
+                  instance of type T 
+
+
+      Declaration of x: a extern type
+      Declaration of y: a extern type
+        with assertions
+          instance of context has_r 
+            with parameters
+              instance of type x 
+              instance of type y 
+
+
+
Index: src/Tests/SynTree/Expected/DeclarationSpecifier.tst
===================================================================
--- src/Tests/SynTree/Expected/DeclarationSpecifier.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected/DeclarationSpecifier.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,290 @@
+Int: a typedef for short signed int 
+x1: a const volatile short signed int 
+x2: a static const volatile short signed int 
+x3: a static const volatile short signed int 
+x4: a static const volatile short signed int 
+x4: a static const volatile short signed int 
+x5: a static const volatile short signed int 
+x6: a static const volatile short signed int 
+x7: a static const volatile short signed int 
+x8: a static const volatile short signed int 
+struct __anonymous0
+    with members
+      i: a signed int 
+
+x10: a const volatile instance of struct __anonymous0 
+struct __anonymous1
+    with members
+      i: a signed int 
+
+x11: a const volatile instance of struct __anonymous1 
+struct __anonymous2
+    with members
+      i: a signed int 
+
+x12: a const volatile instance of struct __anonymous2 
+struct __anonymous3
+    with members
+      i: a signed int 
+
+x13: a static const volatile instance of struct __anonymous3 
+struct __anonymous4
+    with members
+      i: a signed int 
+
+x14: a static const volatile instance of struct __anonymous4 
+struct __anonymous5
+    with members
+      i: a signed int 
+
+x15: a static const volatile instance of struct __anonymous5 
+struct __anonymous6
+    with members
+      i: a signed int 
+
+x16: a static const volatile instance of struct __anonymous6 
+struct __anonymous7
+    with members
+      i: a signed int 
+
+x17: a static const volatile instance of struct __anonymous7 
+x20: a const volatile instance of type Int 
+x21: a static const volatile instance of type Int 
+x22: a static const volatile instance of type Int 
+x23: a static const volatile instance of type Int 
+x24: a static const volatile instance of type Int 
+x25: a static const volatile instance of type Int 
+x26: a static const volatile instance of type Int 
+x27: a static const volatile instance of type Int 
+struct __anonymous8
+    with members
+      i: a instance of type Int 
+
+x29: a const volatile instance of struct __anonymous8 
+struct __anonymous9
+    with members
+      i: a instance of type Int 
+
+x30: a const volatile instance of struct __anonymous9 
+struct __anonymous10
+    with members
+      i: a instance of type Int 
+
+x31: a const volatile instance of struct __anonymous10 
+struct __anonymous11
+    with members
+      i: a instance of type Int 
+
+x32: a static const volatile instance of struct __anonymous11 
+struct __anonymous12
+    with members
+      i: a instance of type Int 
+
+x33: a static const volatile instance of struct __anonymous12 
+struct __anonymous13
+    with members
+      i: a instance of type Int 
+
+x34: a static const volatile instance of struct __anonymous13 
+struct __anonymous14
+    with members
+      i: a instance of type Int 
+
+x35: a static const volatile instance of struct __anonymous14 
+struct __anonymous15
+    with members
+      i: a instance of type Int 
+
+x36: a static const volatile instance of struct __anonymous15 
+f01: a inline static function
+    returning 
+      const volatile signed int 
+
+f02: a inline static function
+    returning 
+      const volatile signed int 
+
+f03: a inline static function
+    returning 
+      const volatile signed int 
+
+f04: a inline static function
+    returning 
+      const volatile signed int 
+
+f05: a inline static function
+    returning 
+      const volatile signed int 
+
+f06: a inline static function
+    returning 
+      const volatile signed int 
+
+f07: a inline static function
+    returning 
+      const volatile signed int 
+
+f08: a inline static function
+    returning 
+      const volatile signed int 
+
+f11: a inline static function
+    returning 
+      const volatile signed int 
+
+f12: a inline static function
+    returning 
+      const volatile signed int 
+
+f13: a inline static function
+    returning 
+      const volatile signed int 
+
+f14: a inline static function
+    returning 
+      const volatile signed int 
+
+f15: a inline static function
+    returning 
+      const volatile signed int 
+
+f16: a inline static function
+    returning 
+      const volatile signed int 
+
+f17: a inline static function
+    returning 
+      const volatile signed int 
+
+f18: a inline static function
+    returning 
+      const volatile signed int 
+
+f21: a inline static function
+    returning 
+      const volatile short signed int 
+
+f22: a inline static function
+    returning 
+      const volatile short signed int 
+
+f23: a inline static function
+    returning 
+      const volatile short signed int 
+
+f24: a inline static function
+    returning 
+      const volatile short signed int 
+
+f25: a inline static function
+    returning 
+      const volatile short signed int 
+
+f26: a inline static function
+    returning 
+      const volatile short signed int 
+
+f27: a inline static function
+    returning 
+      const volatile short signed int 
+
+f28: a inline static function
+    returning 
+      const volatile short signed int 
+
+struct __anonymous16
+    with members
+      i: a signed int 
+
+f31: a inline static function
+    returning 
+      const volatile instance of struct __anonymous16 
+
+struct __anonymous17
+    with members
+      i: a signed int 
+
+f32: a inline static function
+    returning 
+      const volatile instance of struct __anonymous17 
+
+struct __anonymous18
+    with members
+      i: a signed int 
+
+f33: a inline static function
+    returning 
+      const volatile instance of struct __anonymous18 
+
+struct __anonymous19
+    with members
+      i: a signed int 
+
+f34: a inline static function
+    returning 
+      const volatile instance of struct __anonymous19 
+
+struct __anonymous20
+    with members
+      i: a signed int 
+
+f35: a inline static function
+    returning 
+      const volatile instance of struct __anonymous20 
+
+struct __anonymous21
+    with members
+      i: a signed int 
+
+f36: a inline static function
+    returning 
+      const volatile instance of struct __anonymous21 
+
+struct __anonymous22
+    with members
+      i: a signed int 
+
+f37: a inline static function
+    returning 
+      const volatile instance of struct __anonymous22 
+
+struct __anonymous23
+    with members
+      i: a signed int 
+
+f38: a inline static function
+    returning 
+      const volatile instance of struct __anonymous23 
+
+f41: a inline static function
+    returning 
+      const volatile instance of type Int 
+
+f42: a inline static function
+    returning 
+      const volatile instance of type Int 
+
+f43: a inline static function
+    returning 
+      const volatile instance of type Int 
+
+f44: a inline static function
+    returning 
+      const volatile instance of type Int 
+
+f45: a inline static function
+    returning 
+      const volatile instance of type Int 
+
+f46: a inline static function
+    returning 
+      const volatile instance of type Int 
+
+f47: a inline static function
+    returning 
+      const volatile instance of type Int 
+
+f48: a inline static function
+    returning 
+      const volatile instance of type Int 
+
Index: src/Tests/SynTree/Expected/Enum.tst
===================================================================
--- src/Tests/SynTree/Expected/Enum.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected/Enum.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,25 @@
+enum Colors
+    with members
+      Red: a untyped entity 
+      Yellow: a untyped entity 
+      Pink: a untyped entity 
+      Blue: a untyped entity 
+      Purple: a untyped entity 
+      Orange: a untyped entity 
+      Green: a untyped entity 
+
+f: a function
+    with parameters
+      void 
+    returning 
+      void 
+    with body 
+      Declaration of enum Fruits
+          with members
+            Apple: a untyped entity 
+            Banana: a untyped entity 
+            Pear: a untyped entity 
+            Mango: a untyped entity 
+
+      Declaration of fruit: a instance of enum Fruits 
+
Index: src/Tests/SynTree/Expected/Forall.tst
===================================================================
--- src/Tests/SynTree/Expected/Forall.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected/Forall.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,229 @@
+in default case, (shouldn't be here)
+in default case, (shouldn't be here)
+f: a typedef for pointer to function
+    with parameters
+      signed int 
+    with forall
+      T: a type
+    returning 
+      signed int 
+
+swap: a function
+    with parameters
+      left: a instance of type T 
+      right: a instance of type T 
+    with forall
+      T: a type
+    returning 
+      void 
+    with body 
+      Declaration of temp: a instance of type T 
+      
+        Expression Statement:
+          Applying untyped: 
+              Name: ?=?
+ to: 
+              Name: left
+              Name: right
+
+      
+        Expression Statement:
+          Applying untyped: 
+              Name: ?=?
+ to: 
+              Name: right
+              Name: temp
+
+
+context sumable
+    with parameters
+      T: a type
+
+    with members
+      0: a const instance of type T 
+      ?+?: a function
+          with parameters
+            instance of type T 
+            instance of type T 
+          returning 
+            instance of type T 
+
+      ?++: a function
+          with parameters
+            instance of type T 
+          returning 
+            instance of type T 
+
+      ?+=?: a function
+          with parameters
+            instance of type T 
+            instance of type T 
+          returning 
+            instance of type T 
+
+
+T1: a type
+  with assertions
+    0: a const instance of type T1 
+    ?+?: a function
+        with parameters
+          instance of type T1 
+          instance of type T1 
+        returning 
+          instance of type T1 
+
+    ?++: a function
+        with parameters
+          instance of type T1 
+        returning 
+          instance of type T1 
+
+    ?+=?: a function
+        with parameters
+          instance of type T1 
+          instance of type T1 
+        returning 
+          instance of type T1 
+
+
+T2: a type
+  with parameters
+    P1: a type
+    P2: a type
+
+T3: a type
+  with assertions
+    instance of context sumable 
+      with parameters
+        instance of type T3 
+
+
+struct __anonymous0
+    with members
+      i: a instance of type P1 
+      j: a instance of type P2 
+
+T2: a type for instance of struct __anonymous0 
+  with parameters
+    P1: a type
+    P2: a type
+
+  with assertions
+    instance of context sumable 
+      with parameters
+        instance of type T2 
+          with parameters
+            instance of type P1 
+            instance of type P2 
+
+
+
+w1: a instance of type T2 
+  with parameters
+    signed int 
+    signed int 
+
+w2: a typedef for instance of type T2 
+  with parameters
+    signed int 
+    signed int 
+
+g2: a instance of type w2 
+w3: a type for instance of type T2 
+  with parameters
+    signed int 
+    signed int 
+
+g3: a instance of type w3 
+sum: a function
+    with parameters
+      n: a signed int 
+      a: a open array of instance of type T 
+    with forall
+      T: a type
+        with assertions
+          instance of context sumable 
+            with parameters
+              instance of type T 
+
+
+    returning 
+      instance of type T 
+    with body 
+      Declaration of total: a instance of type T 
+      Declaration of i: a signed int 
+
+twice: a function
+    with parameters
+      t: a instance of type T 
+    with forall
+      T: a type
+        with assertions
+          0: a const instance of type T 
+          ?+?: a function
+              with parameters
+                instance of type T 
+                instance of type T 
+              returning 
+                instance of type T 
+
+          ?++: a function
+              with parameters
+                instance of type T 
+              returning 
+                instance of type T 
+
+          ?+=?: a function
+              with parameters
+                instance of type T 
+                instance of type T 
+              returning 
+                instance of type T 
+
+
+    returning 
+      instance of type T 
+    with body 
+
+main: a function
+    returning 
+      signed int 
+    with body 
+      Declaration of x: a signed int 
+      Declaration of y: a signed int 
+      Declaration of a: a array of         Constant Expression: 10signed int 
+      Declaration of f: a float 
+      
+        Expression Statement:
+          Applying untyped: 
+              Name: swap
+ to: 
+              Name: x
+              Name: y
+
+      
+        Expression Statement:
+          Applying untyped: 
+              Name: twice
+ to: 
+              Name: x
+              Name: y
+
+      
+        Expression Statement:
+          Applying untyped: 
+              Name: ?=?
+ to: 
+              Name: f
+              Applying untyped: 
+                  Name: min
+ to: 
+                  Constant Expression: 4.0                  Constant Expression: 3.0
+      
+        Expression Statement:
+          Applying untyped: 
+              Name: sum
+ to: 
+              Constant Expression: 10              Name: a
+
+
Index: src/Tests/SynTree/Expected/Functions.tst
===================================================================
--- src/Tests/SynTree/Expected/Functions.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected/Functions.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,586 @@
+h: a function
+    with parameters
+      void 
+    returning 
+      void 
+    with body 
+
+f: a function
+    with parameters
+      function
+          with parameters
+            void 
+          returning 
+            signed int 
+
+      function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+      function
+          with parameters
+            void 
+          returning 
+            signed int 
+
+      function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+      g: a function
+          with parameters
+            void 
+          returning 
+            void 
+
+    returning 
+      signed int 
+    with body 
+
+f1: a function
+    returning 
+      signed int 
+    with body 
+
+f2: a function
+    returning 
+      signed int 
+    with body 
+
+f3: a function
+    returning 
+      pointer to function
+          returning 
+            signed int 
+
+    with body 
+
+f4: a function
+    returning 
+      pointer to signed int 
+    with body 
+
+f5: a function
+    returning 
+      pointer to function
+          returning 
+            signed int 
+
+    with body 
+
+f6: a function
+    returning 
+      pointer to signed int 
+    with body 
+
+f7: a function
+    returning 
+      pointer to signed int 
+    with body 
+
+f8: a function
+    returning 
+      pointer to pointer to signed int 
+    with body 
+
+f9: a function
+    returning 
+      pointer to const pointer to signed int 
+    with body 
+
+f10: a function
+    returning 
+      pointer to open array of signed int 
+    with body 
+
+f11: a function
+    returning 
+      pointer to open array of open array of signed int 
+    with body 
+
+f12: a function
+    returning 
+      pointer to open array of open array of signed int 
+    with body 
+
+fII1: a function
+    with parameters
+      i: a signed int 
+    returning 
+      signed int 
+    with body 
+
+fII2: a function
+    with parameters
+      i: a signed int 
+    returning 
+      const signed int 
+    with body 
+
+fII3: a extern function
+    with parameters
+      i: a signed int 
+    returning 
+      signed int 
+    with body 
+
+fII4: a extern function
+    with parameters
+      i: a signed int 
+    returning 
+      const signed int 
+    with body 
+
+fII5: a function
+    returning 
+      pointer to signed int 
+    with body 
+
+fII6: a function
+    returning 
+      const pointer to signed int 
+    with body 
+
+fII7: a function
+    returning 
+      pointer to const long signed int 
+    with body 
+
+fII8: a static function
+    returning 
+      pointer to const long signed int 
+    with body 
+
+fII9: a static function
+    returning 
+      pointer to const long signed int 
+    with body 
+
+fO1: a function
+    returning 
+      signed int 
+    with parameter names
+      i
+    with parameter declarations
+      i: a signed int 
+    with body 
+
+fO2: a function
+    returning 
+      signed int 
+    with parameter names
+      i
+    with parameter declarations
+      i: a signed int 
+    with body 
+
+fO3: a function
+    returning 
+      const signed int 
+    with parameter names
+      i
+    with parameter declarations
+      i: a signed int 
+    with body 
+
+fO4: a extern function
+    returning 
+      signed int 
+    with parameter names
+      i
+    with parameter declarations
+      i: a signed int 
+    with body 
+
+fO5: a extern function
+    returning 
+      const signed int 
+    with parameter names
+      i
+    with parameter declarations
+      i: a signed int 
+    with body 
+
+f: a function
+    returning 
+      nothing 
+
+f: a function
+    returning 
+      signed int 
+
+f: a function
+    with parameters
+      signed int 
+    returning 
+      nothing 
+
+f: a function
+    with parameters
+      signed int 
+    returning 
+      signed int 
+
+f: a function
+    returning 
+      nothing 
+    with body 
+
+f: a function
+    returning 
+      signed int 
+    with body 
+
+f: a function
+    with parameters
+      signed int 
+    returning 
+      nothing 
+    with body 
+
+f: a function
+    with parameters
+      signed int 
+    returning 
+      signed int 
+    with body 
+
+f: a function
+    returning 
+      x: a signed int 
+
+f: a function
+    with parameters
+      x: a signed int 
+    returning 
+      nothing 
+
+f: a function
+    with parameters
+      x: a signed int 
+    returning 
+      x: a signed int 
+
+f: a function
+    returning 
+      x: a signed int 
+    with body 
+
+f: a function
+    with parameters
+      x: a signed int 
+    returning 
+      nothing 
+    with body 
+
+f: a function
+    with parameters
+      x: a signed int 
+    returning 
+      x: a signed int 
+    with body 
+
+f: a function
+    returning 
+      signed int 
+      x: a signed int 
+
+f: a function
+    with parameters
+      signed int 
+      x: a signed int 
+    returning 
+      nothing 
+
+f: a function
+    with parameters
+      signed int 
+      x: a signed int 
+    returning 
+      signed int 
+      x: a signed int 
+
+f: a function
+    returning 
+      signed int 
+      x: a signed int 
+    with body 
+
+f: a function
+    with parameters
+      signed int 
+      x: a signed int 
+    returning 
+      nothing 
+    with body 
+
+f: a function
+    with parameters
+      signed int 
+      x: a signed int 
+    returning 
+      signed int 
+      x: a signed int 
+    with body 
+
+f: a function
+    returning 
+      signed int 
+      x: a signed int 
+      signed int 
+
+f: a function
+    with parameters
+      signed int 
+      x: a signed int 
+      signed int 
+    returning 
+      nothing 
+
+f: a function
+    with parameters
+      signed int 
+      x: a signed int 
+      signed int 
+    returning 
+      signed int 
+      x: a signed int 
+      signed int 
+
+f: a function
+    returning 
+      signed int 
+      x: a signed int 
+      signed int 
+    with body 
+
+f: a function
+    with parameters
+      signed int 
+      x: a signed int 
+      signed int 
+    returning 
+      nothing 
+    with body 
+
+f: a function
+    with parameters
+      signed int 
+      x: a signed int 
+      signed int 
+    returning 
+      signed int 
+      x: a signed int 
+      signed int 
+    with body 
+
+f: a function
+    returning 
+      signed int 
+      x: a signed int 
+      y: a pointer to signed int 
+
+f: a function
+    with parameters
+      signed int 
+      x: a signed int 
+      y: a pointer to signed int 
+    returning 
+      nothing 
+
+f: a function
+    with parameters
+      signed int 
+      x: a signed int 
+      y: a pointer to signed int 
+    returning 
+      signed int 
+      x: a signed int 
+      y: a pointer to signed int 
+
+f: a function
+    returning 
+      signed int 
+      x: a signed int 
+      y: a pointer to signed int 
+    with body 
+
+f: a function
+    with parameters
+      signed int 
+      x: a signed int 
+      y: a pointer to signed int 
+    returning 
+      nothing 
+    with body 
+
+f: a function
+    with parameters
+      signed int 
+      x: a signed int 
+      y: a pointer to signed int 
+    returning 
+      signed int 
+      x: a signed int 
+      y: a pointer to signed int 
+    with body 
+
+f11: a function
+    with parameters
+      signed int 
+    returning 
+      signed int 
+
+f12: a function
+    with parameters
+      signed int 
+    returning 
+      signed int 
+
+f: a function
+    with parameters
+      function
+          with parameters
+            signed int 
+            p: a signed int 
+          returning 
+            signed int 
+
+      function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+    returning 
+      signed int 
+    with body 
+      Declaration of p: a pointer to open array of open array of pointer to open array of open array of signed int 
+      Declaration of p: a pointer to open array of open array of pointer to open array of open array of signed int 
+      Declaration of p: a pointer to open array of pointer to function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+
+f1: a static function
+    returning 
+      pointer to const signed int 
+    with body 
+
+f2: a static function
+    returning 
+      const signed int 
+    with body 
+
+f3: a inline static function
+    returning 
+      const pointer to signed int 
+    with body 
+
+f4: a inline static function
+    returning 
+      const tuple of types
+          pointer to signed int 
+          signed int 
+
+    with body 
+
+f5: a static function
+    returning 
+      const tuple of types
+          pointer to signed int 
+          const signed int 
+
+    with body 
+
+f: a function
+    with parameters
+      function
+          returning 
+            signed int 
+
+      function
+          returning 
+            pointer to signed int 
+
+      function
+          returning 
+            pointer to pointer to signed int 
+
+      function
+          returning 
+            pointer to const pointer to signed int 
+
+      function
+          returning 
+            const pointer to const pointer to signed int 
+
+      open array of signed int 
+      open array of signed int 
+      open array of pointer to signed int 
+      open array of pointer to signed int 
+      open array of pointer to pointer to signed int 
+      open array of pointer to pointer to signed int 
+      open array of pointer to const pointer to signed int 
+      open array of pointer to const pointer to signed int 
+      open array of const pointer to const pointer to signed int 
+      open array of const pointer to const pointer to signed int 
+    returning 
+      signed int 
+
+f: a function
+    with parameters
+      function
+          returning 
+            signed int 
+
+      function
+          returning 
+            pointer to signed int 
+
+      function
+          returning 
+            pointer to pointer to signed int 
+
+      function
+          returning 
+            pointer to const pointer to signed int 
+
+      function
+          returning 
+            const pointer to const pointer to signed int 
+
+      open array of signed int 
+      open array of signed int 
+      open array of pointer to signed int 
+      open array of pointer to signed int 
+      open array of pointer to pointer to signed int 
+      open array of pointer to pointer to signed int 
+      open array of pointer to const pointer to signed int 
+      open array of pointer to const pointer to signed int 
+      open array of const pointer to const pointer to signed int 
+      open array of const pointer to const pointer to signed int 
+    returning 
+      signed int 
+    with body 
+
+T: a typedef for signed int 
+f: a function
+    with parameters
+      function
+          with parameters
+            instance of type T 
+          returning 
+            instance of type T 
+
+      T: a instance of type T 
+    returning 
+      signed int 
+    with body 
+
Index: src/Tests/SynTree/Expected/IdentFuncDeclarator.tst
===================================================================
--- src/Tests/SynTree/Expected/IdentFuncDeclarator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected/IdentFuncDeclarator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,180 @@
+main: a function
+    returning 
+      signed int 
+    with body 
+      Declaration of f1: a signed int 
+      Declaration of f2: a signed int 
+      Declaration of f3: a pointer to signed int 
+      Declaration of f4: a pointer to pointer to signed int 
+      Declaration of f5: a pointer to const pointer to signed int 
+      Declaration of f6: a const pointer to const pointer to signed int 
+      Declaration of f7: a pointer to signed int 
+      Declaration of f8: a pointer to pointer to signed int 
+      Declaration of f9: a pointer to const pointer to signed int 
+      Declaration of f10: a const pointer to const pointer to signed int 
+      Declaration of f11: a pointer to signed int 
+      Declaration of f12: a pointer to pointer to signed int 
+      Declaration of f13: a pointer to const pointer to signed int 
+      Declaration of f14: a const pointer to const pointer to signed int 
+      Declaration of f15: a open array of signed int 
+      Declaration of f16: a open array of signed int 
+      Declaration of f17: a open array of signed int 
+      Declaration of f18: a open array of signed int 
+      Declaration of f19: a open array of pointer to signed int 
+      Declaration of f20: a open array of pointer to signed int 
+      Declaration of f21: a open array of pointer to pointer to signed int 
+      Declaration of f22: a open array of pointer to pointer to signed int 
+      Declaration of f23: a open array of pointer to const pointer to signed int 
+      Declaration of f24: a open array of pointer to const pointer to signed int 
+      Declaration of f25: a open array of const pointer to const pointer to signed int 
+      Declaration of f26: a open array of const pointer to const pointer to signed int 
+      Declaration of f27: a open array of pointer to signed int 
+      Declaration of f28: a open array of pointer to signed int 
+      Declaration of f29: a open array of pointer to pointer to signed int 
+      Declaration of f30: a open array of pointer to pointer to signed int 
+      Declaration of f31: a open array of pointer to const pointer to signed int 
+      Declaration of f32: a open array of pointer to const pointer to signed int 
+      Declaration of f33: a open array of const pointer to const pointer to signed int 
+      Declaration of f34: a open array of const pointer to const pointer to signed int 
+      Declaration of f35: a open array of pointer to signed int 
+      Declaration of f36: a open array of pointer to signed int 
+      Declaration of f37: a open array of pointer to pointer to signed int 
+      Declaration of f38: a open array of pointer to pointer to signed int 
+      Declaration of f39: a open array of pointer to const pointer to signed int 
+      Declaration of f40: a open array of pointer to const pointer to signed int 
+      Declaration of f41: a open array of const pointer to const pointer to signed int 
+      Declaration of f42: a open array of const pointer to const pointer to signed int 
+      Declaration of f43: a open array of open array of signed int 
+      Declaration of f44: a open array of open array of signed int 
+      Declaration of f45: a open array of open array of signed int 
+      Declaration of f46: a open array of open array of signed int 
+      Declaration of f47: a open array of open array of signed int 
+      Declaration of f48: a open array of open array of signed int 
+      Declaration of f49: a open array of open array of pointer to signed int 
+      Declaration of f50: a open array of open array of pointer to signed int 
+      Declaration of f51: a open array of open array of pointer to pointer to signed int 
+      Declaration of f52: a open array of open array of pointer to pointer to signed int 
+      Declaration of f53: a open array of open array of pointer to const pointer to signed int 
+      Declaration of f54: a open array of open array of pointer to const pointer to signed int 
+      Declaration of f55: a open array of open array of const pointer to const pointer to signed int 
+      Declaration of f56: a open array of open array of const pointer to const pointer to signed int 
+      Declaration of f57: a open array of open array of pointer to signed int 
+      Declaration of f58: a open array of open array of pointer to signed int 
+      Declaration of f59: a open array of open array of pointer to pointer to signed int 
+      Declaration of f60: a open array of open array of pointer to pointer to signed int 
+      Declaration of f61: a open array of open array of pointer to const pointer to signed int 
+      Declaration of f62: a open array of open array of pointer to const pointer to signed int 
+      Declaration of f63: a open array of open array of const pointer to const pointer to signed int 
+      Declaration of f64: a open array of open array of const pointer to const pointer to signed int 
+      Declaration of f65: a function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+      Declaration of f66: a function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+      Declaration of f67: a function
+          with parameters
+            signed int 
+          returning 
+            pointer to signed int 
+
+      Declaration of f68: a function
+          with parameters
+            signed int 
+          returning 
+            pointer to pointer to signed int 
+
+      Declaration of f69: a function
+          with parameters
+            signed int 
+          returning 
+            pointer to const pointer to signed int 
+
+      Declaration of f70: a function
+          with parameters
+            signed int 
+          returning 
+            const pointer to const pointer to signed int 
+
+      Declaration of f71: a function
+          with parameters
+            signed int 
+          returning 
+            pointer to signed int 
+
+      Declaration of f72: a function
+          with parameters
+            signed int 
+          returning 
+            pointer to pointer to signed int 
+
+      Declaration of f73: a function
+          with parameters
+            signed int 
+          returning 
+            pointer to const pointer to signed int 
+
+      Declaration of f74: a function
+          with parameters
+            signed int 
+          returning 
+            const pointer to const pointer to signed int 
+
+      Declaration of f75: a pointer to function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+      Declaration of f76: a pointer to pointer to function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+      Declaration of f77: a pointer to const pointer to function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+      Declaration of f78: a const pointer to const pointer to function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+      Declaration of f79: a pointer to function
+          with parameters
+            signed int 
+          returning 
+            pointer to function
+                returning 
+                  signed int 
+
+
+      Declaration of f80: a const pointer to function
+          with parameters
+            signed int 
+          returning 
+            pointer to function
+                returning 
+                  signed int 
+
+
+      Declaration of f81: a const pointer to function
+          with parameters
+            signed int 
+          returning 
+            const pointer to function
+                returning 
+                  signed int 
+
+
+
Index: src/Tests/SynTree/Expected/Initialization.tst
===================================================================
--- src/Tests/SynTree/Expected/Initialization.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected/Initialization.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,33 @@
+x21: a pointer to signed int 
+x22: a signed int 
+x21: a pointer to signed int 
+x22: a signed int 
+y1: a open array of signed int 
+y2: a open array of signed int 
+struct __anonymous0
+    with members
+      w: a tuple of types
+          signed int 
+
+
+a: a instance of struct __anonymous0 
+struct __anonymous1
+    with members
+      a: a open array of signed int 
+      b: a signed int 
+
+w: a open array of instance of struct __anonymous1 
+struct __anonymous3
+    with members
+      f1: a signed int 
+      f2: a signed int 
+      f3: a signed int 
+      struct __anonymous2
+          with members
+            g1: a signed int 
+            g2: a signed int 
+            g3: a signed int 
+
+      f4: a open array of instance of struct __anonymous2 
+
+v7: a instance of struct __anonymous3 
Index: src/Tests/SynTree/Expected/Scope.tst
===================================================================
--- src/Tests/SynTree/Expected/Scope.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected/Scope.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,115 @@
+in default case, (shouldn't be here)
+in default case, (shouldn't be here)
+in default case, (shouldn't be here)
+x: a signed int 
+y: a typedef for double 
+t: a typedef for float 
+z: a instance of type y 
+struct __anonymous0
+    with members
+      a: a signed int 
+      b: a double 
+
+u: a type for instance of struct __anonymous0 
+f: a function
+    with parameters
+      y: a signed int 
+    returning 
+      signed int 
+
+q: a instance of type y 
+w: a function
+    with parameters
+      y: a instance of type y 
+      v: a instance of type u 
+    returning 
+      instance of type y 
+    with body 
+      Declaration of x: a type
+        with assertions
+          t: a function
+              with parameters
+                instance of type u 
+              returning 
+                instance of type x 
+
+
+      Declaration of u: a instance of type u 
+      Declaration of z: a instance of type x 
+
+p: a instance of type y 
+context has_u
+    with parameters
+      z: a type
+
+    with members
+      u: a function
+          with parameters
+            instance of type z 
+          returning 
+            instance of type z 
+
+
+q: a function
+    with parameters
+      the_t: a instance of type t 
+    with forall
+      t: a type
+        with assertions
+          instance of context has_u 
+            with parameters
+              instance of type t 
+
+
+    returning 
+      instance of type y 
+    with body 
+      Declaration of y: a instance of type t 
+
+f: a function
+    with parameters
+      p: a instance of type y 
+    returning 
+      instance of type t 
+    with body 
+      Declaration of y: a signed int 
+      Declaration of x: a typedef for char 
+              Declaration of y: a instance of type x 
+        Declaration of z: a typedef for instance of type x 
+                  Declaration of x: a instance of type z 
+          Declaration of y: a typedef for instance of type z 
+          Declaration of z: a instance of type y 
+
+        Declaration of x: a instance of type z 
+
+      Declaration of q: a instance of type x 
+
+g: a function
+    with parameters
+      void 
+    returning 
+      instance of type t 
+    with body 
+      Declaration of x: a typedef for char 
+      Declaration of z: a instance of type x 
+
+q: a function
+    returning 
+      instance of type y 
+    with parameter names
+      i
+    with parameter declarations
+      i: a signed int 
+    with body 
+      
+        Switch on condition: 
+            Name: i
+
+            Case: 
+            .... and 1 conditions 
+                Name: 0
+
+            Case: 
+            .... and 0 conditions 
+
+
Index: src/Tests/SynTree/Expected/StructMember.tst
===================================================================
--- src/Tests/SynTree/Expected/StructMember.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected/StructMember.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,69 @@
+T: a typedef for signed int 
+struct S
+    with members
+      m1: a signed int 
+      m2: a signed int 
+      signed int 
+      signed int 
+      signed int 
+      m3: a signed int 
+      m4: a signed int 
+      m5: a signed int 
+      m6: a signed int 
+      m7: a pointer to signed int 
+      m8: a pointer to signed int 
+      m9: a pointer to signed int 
+      m10: a pointer to function
+          returning 
+            signed int 
+
+      m11: a pointer to function
+          with parameters
+            signed int 
+          returning 
+            pointer to signed int 
+
+      T: a instance of type T 
+      T: a instance of type T 
+      m12: a pointer to signed int 
+      m13: a pointer to signed int 
+      m14: a pointer to function
+          with parameters
+            signed int 
+          returning 
+            pointer to signed int 
+
+      signed int 
+      signed int 
+      signed int 
+      signed int 
+      pointer to signed int 
+      signed int 
+      signed int 
+      pointer to signed int 
+      pointer to signed int 
+      pointer to signed int 
+      pointer to signed int 
+      pointer to signed int 
+      pointer to signed int 
+      pointer to function
+          returning 
+            signed int 
+
+      pointer to pointer to function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+      instance of type T 
+
+s: a instance of struct S 
+union U
+    with members
+      m1: a open array of signed int 
+      m2: a open array of signed int 
+      m3: a pointer to signed int 
+      m4: a pointer to signed int 
+
+u: a instance of union U 
Index: src/Tests/SynTree/Expected/Tuple.tst
===================================================================
--- src/Tests/SynTree/Expected/Tuple.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected/Tuple.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,104 @@
+f: a function
+    with parameters
+      signed int 
+      signed int 
+    returning 
+      signed int 
+
+g: a function
+    with parameters
+      signed int 
+      signed int 
+      signed int 
+    returning 
+      signed int 
+
+h: a static function
+    with parameters
+      a: a signed int 
+      b: a signed int 
+      c: a pointer to signed int 
+      d: a open array of char 
+    returning 
+      signed int 
+      signed int 
+      signed int 
+      signed int 
+
+struct inner
+    with members
+      f2: a signed int 
+      f3: a signed int 
+
+struct outer
+    with members
+      f1: a signed int 
+      i: a instance of struct inner 
+      f4: a double 
+
+s: a instance of struct outer 
+sp: a pointer to instance of struct outer 
+t1: a const volatile tuple of types
+    signed int 
+    signed int 
+
+t2: a static const tuple of types
+    signed int 
+    const signed int 
+
+t3: a static const tuple of types
+    signed int 
+    const signed int 
+
+printf: a function
+    with parameters
+      fmt: a pointer to char 
+      and a variable number of other arguments
+    returning 
+      rc: a signed int 
+
+printf: a function
+    with parameters
+      fmt: a pointer to char 
+      and a variable number of other arguments
+    returning 
+      signed int 
+
+f1: a function
+    with parameters
+      w: a signed int 
+    returning 
+      x: a short signed int 
+      y: a unsigned int 
+    with body 
+
+g1: a function
+    returning 
+      r: a tuple of types
+          signed int 
+          char 
+          long signed int 
+          signed int 
+
+    with body 
+      Declaration of x: a short signed int 
+      Declaration of p: a short signed int 
+      Declaration of y: a unsigned int 
+      Declaration of z: a tuple of types
+          signed int 
+          signed int 
+
+
+main: a function
+    with parameters
+      argc: a signed int 
+      argv: a pointer to pointer to char 
+    returning 
+      rc: a signed int 
+    with body 
+      Declaration of a: a signed int 
+      Declaration of b: a signed int 
+      Declaration of c: a signed int 
+      Declaration of d: a signed int 
+      Declaration of t: a instance of struct outer 
+
Index: src/Tests/SynTree/Expected/TypeGenerator.tst
===================================================================
--- src/Tests/SynTree/Expected/TypeGenerator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected/TypeGenerator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,116 @@
+context addable
+    with parameters
+      T: a type
+
+    with members
+      ?+?: a function
+          with parameters
+            instance of type T 
+            instance of type T 
+          returning 
+            instance of type T 
+
+
+struct __anonymous0
+    with members
+      data: a instance of type T 
+      next: a pointer to instance of type List 
+        with parameters
+          instance of type T 
+
+
+List: a type for pointer to instance of struct __anonymous0 
+  with parameters
+    T: a type
+      with assertions
+        instance of context addable 
+          with parameters
+            instance of type T 
+
+
+
+  with assertions
+    instance of context addable 
+      with parameters
+        instance of type T 
+
+
+ListOfIntegers: a typedef for instance of type List 
+  with parameters
+    signed int 
+
+li: a instance of type ListOfIntegers 
+f: a function
+    with parameters
+      g: a pointer to function
+          with parameters
+            signed int 
+          returning 
+            instance of type List 
+              with parameters
+                signed int 
+
+
+    returning 
+      signed int 
+
+h: a function
+    with parameters
+      p: a pointer to instance of type List 
+        with parameters
+          signed int 
+
+    returning 
+      signed int 
+
+struct node
+    with parameters
+      T: a type
+        with assertions
+          instance of context addable 
+            with parameters
+              instance of type T 
+
+
+
+    with members
+      data: a instance of type T 
+      next: a pointer to instance of struct node 
+        with parameters
+          instance of type T 
+
+
+List: a type for pointer to instance of struct node 
+  with parameters
+    instance of type T 
+
+  with parameters
+    T: a type
+
+my_list: a instance of type List 
+  with parameters
+    signed int 
+
+Complex: a type
+  with assertions
+    instance of context addable 
+      with parameters
+        instance of type Complex 
+
+
+main: a function
+    returning 
+      signed int 
+    with body 
+      
+        Expression Statement:
+          Cast of:
+            Name: my_list
+
+          to:
+            instance of struct node 
+              with parameters
+                signed int 
+
+
+
Index: src/Tests/SynTree/Expected/Typedef.tst
===================================================================
--- src/Tests/SynTree/Expected/Typedef.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected/Typedef.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,85 @@
+T: a typedef for signed int 
+f: a function
+    with parameters
+      void 
+    returning 
+      void 
+    with body 
+      Declaration of T: a function
+          with parameters
+            instance of type T 
+          returning 
+            signed int 
+
+
+struct __anonymous0
+    with members
+      T: a instance of type T 
+
+fred: a instance of struct __anonymous0 
+a: a typedef for pointer to function
+    with parameters
+      signed int 
+      char 
+    returning 
+      signed int 
+
+b: a instance of type a 
+g: a function
+    with parameters
+      void 
+    returning 
+      signed int 
+    with body 
+      Declaration of a: a double 
+
+c: a instance of type a 
+main: a function
+    returning 
+      signed int 
+    with body 
+
+arrayOf10Pointers: a typedef for open array of pointer to signed int 
+x: a instance of type arrayOf10Pointers 
+constantPointer: a typedef for const pointer to signed int 
+funcPtr: a typedef for pointer to function
+    with parameters
+      open array of signed int 
+    returning 
+      signed int 
+
+funcProto: a typedef for function
+    with parameters
+      open array of signed int 
+    returning 
+      signed int 
+
+tupleType: a typedef for tuple of types
+    signed int 
+    signed int 
+
+tupleTypePtr: a typedef for pointer to tuple of types
+    signed int 
+    signed int 
+
+a: a typedef for pointer to signed int 
+b: a typedef for pointer to signed int 
+f: a typedef for function
+    with parameters
+      pointer to signed int 
+    returning 
+      signed int 
+
+g: a typedef for function
+    with parameters
+      pointer to signed int 
+    returning 
+      signed int 
+
+t: a typedef for tuple of types
+    pointer to static open array of signed int 
+
+f: a typedef for function
+    returning 
+      x: a pointer to static open array of signed int 
+
Index: src/Tests/SynTree/Expected/TypedefDeclarator.tst
===================================================================
--- src/Tests/SynTree/Expected/TypedefDeclarator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected/TypedefDeclarator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,270 @@
+f0: a typedef for signed int 
+f1: a typedef for signed int 
+f2: a typedef for signed int 
+f3: a typedef for signed int 
+f4: a typedef for signed int 
+f5: a typedef for signed int 
+f6: a typedef for signed int 
+f7: a typedef for signed int 
+f8: a typedef for signed int 
+f9: a typedef for signed int 
+f10: a typedef for signed int 
+f11: a typedef for signed int 
+f12: a typedef for signed int 
+f13: a typedef for signed int 
+f14: a typedef for signed int 
+f15: a typedef for signed int 
+f16: a typedef for signed int 
+f17: a typedef for signed int 
+f18: a typedef for signed int 
+f19: a typedef for signed int 
+f20: a typedef for signed int 
+f21: a typedef for signed int 
+f22: a typedef for signed int 
+f23: a typedef for signed int 
+f24: a typedef for signed int 
+f25: a typedef for signed int 
+f26: a typedef for signed int 
+f27: a typedef for signed int 
+f28: a typedef for signed int 
+f29: a typedef for signed int 
+f30: a typedef for signed int 
+f31: a typedef for signed int 
+f32: a typedef for signed int 
+f33: a typedef for signed int 
+f34: a typedef for signed int 
+f35: a typedef for signed int 
+f36: a typedef for signed int 
+f37: a typedef for signed int 
+f38: a typedef for signed int 
+f39: a typedef for signed int 
+f40: a typedef for signed int 
+f41: a typedef for signed int 
+f42: a typedef for signed int 
+f43: a typedef for signed int 
+f44: a typedef for signed int 
+f45: a typedef for signed int 
+f46: a typedef for signed int 
+f47: a typedef for signed int 
+f48: a typedef for signed int 
+f49: a typedef for signed int 
+f50: a typedef for signed int 
+f51: a typedef for signed int 
+f52: a typedef for signed int 
+f53: a typedef for signed int 
+f54: a typedef for signed int 
+f55: a typedef for signed int 
+f56: a typedef for signed int 
+f57: a typedef for signed int 
+f58: a typedef for signed int 
+f59: a typedef for signed int 
+f60: a typedef for signed int 
+f61: a typedef for signed int 
+f62: a typedef for signed int 
+f63: a typedef for signed int 
+f64: a typedef for signed int 
+f65: a typedef for signed int 
+f66: a typedef for signed int 
+f67: a typedef for signed int 
+f68: a typedef for signed int 
+f69: a typedef for signed int 
+f70: a typedef for signed int 
+f71: a typedef for signed int 
+f72: a typedef for signed int 
+f73: a typedef for signed int 
+f74: a typedef for signed int 
+f75: a typedef for signed int 
+f76: a typedef for signed int 
+f77: a typedef for signed int 
+f78: a typedef for signed int 
+f79: a typedef for signed int 
+f80: a typedef for signed int 
+f81: a typedef for signed int 
+f82: a typedef for signed int 
+f83: a typedef for signed int 
+f84: a typedef for signed int 
+f85: a typedef for signed int 
+f86: a typedef for signed int 
+f87: a typedef for signed int 
+f88: a typedef for signed int 
+f89: a typedef for signed int 
+main: a function
+    returning 
+      signed int 
+    with body 
+      Declaration of f1: a signed int 
+      Declaration of f2: a signed int 
+      Declaration of f3: a pointer to signed int 
+      Declaration of f4: a pointer to pointer to signed int 
+      Declaration of f5: a pointer to const pointer to signed int 
+      Declaration of f6: a const pointer to const pointer to signed int 
+      Declaration of f7: a pointer to signed int 
+      Declaration of f8: a pointer to pointer to signed int 
+      Declaration of f9: a pointer to const pointer to signed int 
+      Declaration of f10: a const pointer to const pointer to signed int 
+      Declaration of f11: a pointer to signed int 
+      Declaration of f12: a pointer to pointer to signed int 
+      Declaration of f13: a pointer to const pointer to signed int 
+      Declaration of f14: a const pointer to const pointer to signed int 
+      Declaration of f15: a open array of signed int 
+      Declaration of f16: a open array of signed int 
+      Declaration of f17: a open array of signed int 
+      Declaration of f18: a open array of signed int 
+      Declaration of f19: a open array of pointer to signed int 
+      Declaration of f20: a open array of pointer to signed int 
+      Declaration of f21: a open array of pointer to pointer to signed int 
+      Declaration of f22: a open array of pointer to pointer to signed int 
+      Declaration of f23: a open array of pointer to const pointer to signed int 
+      Declaration of f24: a open array of pointer to const pointer to signed int 
+      Declaration of f25: a open array of const pointer to const pointer to signed int 
+      Declaration of f26: a open array of const pointer to const pointer to signed int 
+      Declaration of f27: a open array of pointer to signed int 
+      Declaration of f28: a open array of pointer to signed int 
+      Declaration of f29: a open array of pointer to pointer to signed int 
+      Declaration of f30: a open array of pointer to pointer to signed int 
+      Declaration of f31: a open array of pointer to const pointer to signed int 
+      Declaration of f32: a open array of pointer to const pointer to signed int 
+      Declaration of f33: a open array of const pointer to const pointer to signed int 
+      Declaration of f34: a open array of const pointer to const pointer to signed int 
+      Declaration of f35: a open array of pointer to signed int 
+      Declaration of f36: a open array of pointer to signed int 
+      Declaration of f37: a open array of pointer to pointer to signed int 
+      Declaration of f38: a open array of pointer to pointer to signed int 
+      Declaration of f39: a open array of pointer to const pointer to signed int 
+      Declaration of f40: a open array of pointer to const pointer to signed int 
+      Declaration of f41: a open array of const pointer to const pointer to signed int 
+      Declaration of f42: a open array of const pointer to const pointer to signed int 
+      Declaration of f43: a open array of open array of signed int 
+      Declaration of f44: a open array of open array of signed int 
+      Declaration of f45: a open array of open array of signed int 
+      Declaration of f46: a open array of open array of signed int 
+      Declaration of f47: a open array of open array of signed int 
+      Declaration of f48: a open array of open array of signed int 
+      Declaration of f49: a open array of open array of pointer to signed int 
+      Declaration of f50: a open array of open array of pointer to signed int 
+      Declaration of f51: a open array of open array of pointer to pointer to signed int 
+      Declaration of f52: a open array of open array of pointer to pointer to signed int 
+      Declaration of f53: a open array of open array of pointer to const pointer to signed int 
+      Declaration of f54: a open array of open array of pointer to const pointer to signed int 
+      Declaration of f55: a open array of open array of const pointer to const pointer to signed int 
+      Declaration of f56: a open array of open array of const pointer to const pointer to signed int 
+      Declaration of f57: a open array of open array of pointer to signed int 
+      Declaration of f58: a open array of open array of pointer to signed int 
+      Declaration of f59: a open array of open array of pointer to pointer to signed int 
+      Declaration of f60: a open array of open array of pointer to pointer to signed int 
+      Declaration of f61: a open array of open array of pointer to const pointer to signed int 
+      Declaration of f62: a open array of open array of pointer to const pointer to signed int 
+      Declaration of f63: a open array of open array of const pointer to const pointer to signed int 
+      Declaration of f64: a open array of open array of const pointer to const pointer to signed int 
+      Declaration of f65: a function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+      Declaration of f66: a function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+      Declaration of f67: a function
+          with parameters
+            signed int 
+          returning 
+            pointer to signed int 
+
+      Declaration of f68: a function
+          with parameters
+            signed int 
+          returning 
+            pointer to pointer to signed int 
+
+      Declaration of f69: a function
+          with parameters
+            signed int 
+          returning 
+            pointer to const pointer to signed int 
+
+      Declaration of f70: a function
+          with parameters
+            signed int 
+          returning 
+            const pointer to const pointer to signed int 
+
+      Declaration of f71: a function
+          with parameters
+            signed int 
+          returning 
+            pointer to signed int 
+
+      Declaration of f72: a function
+          with parameters
+            signed int 
+          returning 
+            pointer to pointer to signed int 
+
+      Declaration of f73: a function
+          with parameters
+            signed int 
+          returning 
+            pointer to const pointer to signed int 
+
+      Declaration of f74: a function
+          with parameters
+            signed int 
+          returning 
+            const pointer to const pointer to signed int 
+
+      Declaration of f75: a pointer to function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+      Declaration of f76: a pointer to pointer to function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+      Declaration of f77: a pointer to const pointer to function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+      Declaration of f78: a const pointer to const pointer to function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+      Declaration of f79: a pointer to function
+          with parameters
+            signed int 
+          returning 
+            pointer to function
+                returning 
+                  signed int 
+
+
+      Declaration of f80: a const pointer to function
+          with parameters
+            signed int 
+          returning 
+            pointer to function
+                returning 
+                  signed int 
+
+
+      Declaration of f81: a const pointer to function
+          with parameters
+            signed int 
+          returning 
+            const pointer to function
+                returning 
+                  signed int 
+
+
+
Index: src/Tests/SynTree/Expected/TypedefParamDeclarator.tst
===================================================================
--- src/Tests/SynTree/Expected/TypedefParamDeclarator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected/TypedefParamDeclarator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,378 @@
+f0: a typedef for signed int 
+f1: a typedef for signed int 
+f2: a typedef for signed int 
+f3: a typedef for signed int 
+f4: a typedef for signed int 
+f5: a typedef for signed int 
+f6: a typedef for signed int 
+f7: a typedef for signed int 
+f8: a typedef for signed int 
+f9: a typedef for signed int 
+f10: a typedef for signed int 
+f11: a typedef for signed int 
+f12: a typedef for signed int 
+f13: a typedef for signed int 
+f14: a typedef for signed int 
+f15: a typedef for signed int 
+f16: a typedef for signed int 
+f17: a typedef for signed int 
+f18: a typedef for signed int 
+f19: a typedef for signed int 
+f20: a typedef for signed int 
+f21: a typedef for signed int 
+f22: a typedef for signed int 
+f23: a typedef for signed int 
+f24: a typedef for signed int 
+f25: a typedef for signed int 
+f26: a typedef for signed int 
+f27: a typedef for signed int 
+f28: a typedef for signed int 
+f29: a typedef for signed int 
+f30: a typedef for signed int 
+f31: a typedef for signed int 
+f32: a typedef for signed int 
+f33: a typedef for signed int 
+f34: a typedef for signed int 
+f35: a typedef for signed int 
+f36: a typedef for signed int 
+f37: a typedef for signed int 
+f38: a typedef for signed int 
+f39: a typedef for signed int 
+f40: a typedef for signed int 
+f41: a typedef for signed int 
+f42: a typedef for signed int 
+f43: a typedef for signed int 
+f44: a typedef for signed int 
+f45: a typedef for signed int 
+f46: a typedef for signed int 
+f47: a typedef for signed int 
+f48: a typedef for signed int 
+f49: a typedef for signed int 
+f50: a typedef for signed int 
+f51: a typedef for signed int 
+f52: a typedef for signed int 
+f53: a typedef for signed int 
+f54: a typedef for signed int 
+f55: a typedef for signed int 
+f56: a typedef for signed int 
+f57: a typedef for signed int 
+f58: a typedef for signed int 
+f59: a typedef for signed int 
+f60: a typedef for signed int 
+f61: a typedef for signed int 
+f62: a typedef for signed int 
+f63: a typedef for signed int 
+f64: a typedef for signed int 
+f65: a typedef for signed int 
+f66: a typedef for signed int 
+f67: a typedef for signed int 
+f68: a typedef for signed int 
+f69: a typedef for signed int 
+f70: a typedef for signed int 
+f71: a typedef for signed int 
+f72: a typedef for signed int 
+f73: a typedef for signed int 
+f74: a typedef for signed int 
+f75: a typedef for signed int 
+f76: a typedef for signed int 
+f77: a typedef for signed int 
+f78: a typedef for signed int 
+f79: a typedef for signed int 
+f80: a typedef for signed int 
+f81: a typedef for signed int 
+f82: a typedef for signed int 
+f83: a typedef for signed int 
+f84: a typedef for signed int 
+f85: a typedef for signed int 
+f86: a typedef for signed int 
+f87: a typedef for signed int 
+f88: a typedef for signed int 
+f89: a typedef for signed int 
+f90: a typedef for signed int 
+f91: a typedef for signed int 
+f92: a typedef for signed int 
+f93: a typedef for signed int 
+f94: a typedef for signed int 
+f95: a typedef for signed int 
+f96: a typedef for signed int 
+f97: a typedef for signed int 
+f98: a typedef for signed int 
+f99: a typedef for signed int 
+f100: a typedef for signed int 
+f101: a typedef for signed int 
+f102: a typedef for signed int 
+f103: a typedef for signed int 
+f104: a typedef for signed int 
+f105: a typedef for signed int 
+f106: a typedef for signed int 
+f107: a typedef for signed int 
+f108: a typedef for signed int 
+f109: a typedef for signed int 
+f110: a typedef for signed int 
+f111: a typedef for signed int 
+f112: a typedef for signed int 
+f113: a typedef for signed int 
+f114: a typedef for signed int 
+f115: a typedef for signed int 
+f116: a typedef for signed int 
+f117: a typedef for signed int 
+f118: a typedef for signed int 
+f119: a typedef for signed int 
+fred: a function
+    with parameters
+      f1: a signed int 
+      f3: a pointer to signed int 
+      f4: a pointer to pointer to signed int 
+      f5: a pointer to const pointer to signed int 
+      f6: a const pointer to const pointer to signed int 
+      f11: a pointer to signed int 
+      f12: a pointer to pointer to signed int 
+      f13: a pointer to const pointer to signed int 
+      f14: a const pointer to const pointer to signed int 
+      f15: a open array of signed int 
+      f16: a open array of signed int 
+      f19: a open array of pointer to signed int 
+      f20: a open array of pointer to signed int 
+      f21: a open array of pointer to pointer to signed int 
+      f22: a open array of pointer to pointer to signed int 
+      f23: a open array of pointer to const pointer to signed int 
+      f24: a open array of pointer to const pointer to signed int 
+      f25: a open array of const pointer to const pointer to signed int 
+      f26: a open array of const pointer to const pointer to signed int 
+      f35: a open array of pointer to signed int 
+      f36: a open array of pointer to signed int 
+      f37: a open array of pointer to pointer to signed int 
+      f38: a open array of pointer to pointer to signed int 
+      f39: a open array of pointer to const pointer to signed int 
+      f40: a open array of pointer to const pointer to signed int 
+      f41: a open array of const pointer to const pointer to signed int 
+      f42: a open array of const pointer to const pointer to signed int 
+      f43: a open array of open array of signed int 
+      f44: a open array of open array of signed int 
+      f49: a open array of open array of pointer to signed int 
+      f50: a open array of open array of pointer to signed int 
+      f51: a open array of open array of pointer to pointer to signed int 
+      f52: a open array of open array of pointer to pointer to signed int 
+      f53: a open array of open array of pointer to const pointer to signed int 
+      f54: a open array of open array of pointer to const pointer to signed int 
+      f55: a open array of open array of const pointer to const pointer to signed int 
+      f56: a open array of open array of const pointer to const pointer to signed int 
+      f57: a open array of open array of pointer to signed int 
+      f58: a open array of open array of pointer to signed int 
+      f59: a open array of open array of pointer to pointer to signed int 
+      f60: a open array of open array of pointer to pointer to signed int 
+      f61: a open array of open array of pointer to const pointer to signed int 
+      f62: a open array of open array of pointer to const pointer to signed int 
+      f63: a open array of open array of const pointer to const pointer to signed int 
+      f64: a open array of open array of const pointer to const pointer to signed int 
+      f65: a function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+      f67: a function
+          with parameters
+            signed int 
+          returning 
+            pointer to signed int 
+
+      f68: a function
+          with parameters
+            signed int 
+          returning 
+            pointer to pointer to signed int 
+
+      f69: a function
+          with parameters
+            signed int 
+          returning 
+            pointer to const pointer to signed int 
+
+      f70: a function
+          with parameters
+            signed int 
+          returning 
+            const pointer to const pointer to signed int 
+
+      f75: a pointer to function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+      f76: a pointer to pointer to function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+      f77: a pointer to const pointer to function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+      f78: a const pointer to const pointer to function
+          with parameters
+            signed int 
+          returning 
+            signed int 
+
+      f79: a pointer to function
+          with parameters
+            signed int 
+          returning 
+            pointer to function
+                returning 
+                  signed int 
+
+
+      f80: a const pointer to function
+          with parameters
+            signed int 
+          returning 
+            pointer to function
+                returning 
+                  signed int 
+
+
+      f81: a const pointer to function
+          with parameters
+            signed int 
+          returning 
+            const pointer to function
+                returning 
+                  signed int 
+
+
+      f82: a const variable length array of signed int 
+      f83: a const open array of signed int 
+      f84: a static open array of signed int 
+      f85: a const static open array of signed int 
+      function
+          with parameters
+            const variable length array of instance of type f86 
+          returning 
+            signed int 
+
+      function
+          with parameters
+            const open array of instance of type f87 
+          returning 
+            signed int 
+
+      function
+          with parameters
+            static open array of instance of type f88 
+          returning 
+            signed int 
+
+      function
+          with parameters
+            const static open array of instance of type f89 
+          returning 
+            signed int 
+
+      f90: a const variable length array of pointer to signed int 
+      f91: a const open array of pointer to signed int 
+      f92: a static open array of pointer to pointer to signed int 
+      f93: a const static open array of pointer to const pointer to signed int 
+      f94: a const static open array of const pointer to const pointer to signed int 
+      function
+          with parameters
+            const variable length array of instance of type f95 
+          returning 
+            pointer to signed int 
+
+      function
+          with parameters
+            const open array of instance of type f96 
+          returning 
+            pointer to signed int 
+
+      function
+          with parameters
+            static open array of instance of type f97 
+          returning 
+            pointer to pointer to signed int 
+
+      function
+          with parameters
+            const static open array of instance of type f98 
+          returning 
+            pointer to const pointer to signed int 
+
+      function
+          with parameters
+            const static open array of instance of type f99 
+          returning 
+            const pointer to const pointer to signed int 
+
+      f100: a const variable length array of open array of signed int 
+      f101: a const open array of open array of signed int 
+      f102: a static open array of open array of signed int 
+      f103: a const static open array of open array of signed int 
+      function
+          with parameters
+            const variable length array of open array of instance of type f104 
+          returning 
+            signed int 
+
+      function
+          with parameters
+            const open array of open array of instance of type f105 
+          returning 
+            signed int 
+
+      function
+          with parameters
+            static open array of open array of instance of type f106 
+          returning 
+            signed int 
+
+      function
+          with parameters
+            const static open array of open array of instance of type f107 
+          returning 
+            signed int 
+
+      f108: a const variable length array of open array of pointer to signed int 
+      f109: a const open array of open array of pointer to signed int 
+      f110: a static open array of open array of pointer to pointer to signed int 
+      f111: a const static open array of open array of pointer to const pointer to signed int 
+      f112: a const static open array of open array of const pointer to const pointer to signed int 
+      function
+          with parameters
+            const variable length array of open array of instance of type f113 
+          returning 
+            pointer to signed int 
+
+      function
+          with parameters
+            const open array of open array of instance of type f114 
+          returning 
+            pointer to signed int 
+
+      function
+          with parameters
+            static open array of open array of instance of type f115 
+          returning 
+            pointer to pointer to signed int 
+
+      function
+          with parameters
+            const static open array of open array of instance of type f116 
+          returning 
+            pointer to const pointer to signed int 
+
+      function
+          with parameters
+            const static open array of open array of instance of type f117 
+          returning 
+            const pointer to const pointer to signed int 
+
+    returning 
+      signed int 
+    with body 
+
Index: src/Tests/SynTree/Expected/VariableDeclarator.tst
===================================================================
--- src/Tests/SynTree/Expected/VariableDeclarator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Expected/VariableDeclarator.tst	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,184 @@
+f1: a signed int 
+f2: a signed int 
+f3: a pointer to signed int 
+f4: a pointer to pointer to signed int 
+f5: a pointer to const pointer to signed int 
+f6: a const pointer to const pointer to signed int 
+f7: a pointer to signed int 
+f8: a pointer to pointer to signed int 
+f9: a pointer to const pointer to signed int 
+f10: a const pointer to const pointer to signed int 
+f11: a pointer to signed int 
+f12: a pointer to pointer to signed int 
+f13: a pointer to const pointer to signed int 
+f14: a const pointer to const pointer to signed int 
+f15: a open array of signed int 
+f16: a open array of signed int 
+f17: a open array of signed int 
+f18: a open array of signed int 
+f19: a open array of pointer to signed int 
+f20: a open array of pointer to signed int 
+f21: a open array of pointer to pointer to signed int 
+f22: a open array of pointer to pointer to signed int 
+f23: a open array of pointer to const pointer to signed int 
+f24: a open array of pointer to const pointer to signed int 
+f25: a open array of const pointer to const pointer to signed int 
+f26: a open array of const pointer to const pointer to signed int 
+f27: a open array of pointer to signed int 
+f28: a open array of pointer to signed int 
+f29: a open array of pointer to pointer to signed int 
+f30: a open array of pointer to pointer to signed int 
+f31: a open array of pointer to const pointer to signed int 
+f32: a open array of pointer to const pointer to signed int 
+f33: a open array of const pointer to const pointer to signed int 
+f34: a open array of const pointer to const pointer to signed int 
+f35: a open array of pointer to signed int 
+f36: a open array of pointer to signed int 
+f37: a open array of pointer to pointer to signed int 
+f38: a open array of pointer to pointer to signed int 
+f39: a open array of pointer to const pointer to signed int 
+f40: a open array of pointer to const pointer to signed int 
+f41: a open array of const pointer to const pointer to signed int 
+f42: a open array of const pointer to const pointer to signed int 
+f43: a open array of open array of signed int 
+f44: a open array of open array of signed int 
+f45: a open array of open array of signed int 
+f46: a open array of open array of signed int 
+f47: a open array of open array of signed int 
+f48: a open array of open array of signed int 
+f49: a open array of open array of pointer to signed int 
+f50: a open array of open array of pointer to signed int 
+f51: a open array of open array of pointer to pointer to signed int 
+f52: a open array of open array of pointer to pointer to signed int 
+f53: a open array of open array of pointer to const pointer to signed int 
+f54: a open array of open array of pointer to const pointer to signed int 
+f55: a open array of open array of const pointer to const pointer to signed int 
+f56: a open array of open array of const pointer to const pointer to signed int 
+f57: a open array of open array of pointer to signed int 
+f58: a open array of open array of pointer to signed int 
+f59: a open array of open array of pointer to pointer to signed int 
+f60: a open array of open array of pointer to pointer to signed int 
+f61: a open array of open array of pointer to const pointer to signed int 
+f62: a open array of open array of pointer to const pointer to signed int 
+f63: a open array of open array of const pointer to const pointer to signed int 
+f64: a open array of open array of const pointer to const pointer to signed int 
+f65: a function
+    with parameters
+      signed int 
+    returning 
+      signed int 
+
+f66: a function
+    with parameters
+      signed int 
+    returning 
+      signed int 
+
+f67: a function
+    with parameters
+      signed int 
+    returning 
+      pointer to signed int 
+
+f68: a function
+    with parameters
+      signed int 
+    returning 
+      pointer to pointer to signed int 
+
+f69: a function
+    with parameters
+      signed int 
+    returning 
+      pointer to const pointer to signed int 
+
+f70: a function
+    with parameters
+      signed int 
+    returning 
+      const pointer to const pointer to signed int 
+
+f71: a function
+    with parameters
+      signed int 
+    returning 
+      pointer to signed int 
+
+f72: a function
+    with parameters
+      signed int 
+    returning 
+      pointer to pointer to signed int 
+
+f73: a function
+    with parameters
+      signed int 
+    returning 
+      pointer to const pointer to signed int 
+
+f74: a function
+    with parameters
+      signed int 
+    returning 
+      const pointer to const pointer to signed int 
+
+f75: a pointer to function
+    with parameters
+      signed int 
+    returning 
+      signed int 
+
+f76: a pointer to pointer to function
+    with parameters
+      signed int 
+    returning 
+      signed int 
+
+f77: a pointer to const pointer to function
+    with parameters
+      signed int 
+    returning 
+      signed int 
+
+f78: a const pointer to const pointer to function
+    with parameters
+      signed int 
+    returning 
+      signed int 
+
+f79: a pointer to function
+    with parameters
+      signed int 
+    returning 
+      pointer to function
+          returning 
+            signed int 
+
+
+f80: a const pointer to function
+    with parameters
+      signed int 
+    returning 
+      pointer to function
+          returning 
+            signed int 
+
+
+f81: a const pointer to function
+    with parameters
+      signed int 
+    returning 
+      const pointer to function
+          returning 
+            signed int 
+
+
+z: a pointer to open array of double 
+w: a open array of pointer to char 
+v3: a pointer to open array of pointer to open array of pointer to function
+    with parameters
+      pointer to open array of pointer to open array of signed int 
+      pointer to open array of pointer to open array of signed int 
+    returning 
+      pointer to open array of pointer to open array of signed int 
+
Index: src/Tests/SynTree/Forall.c
===================================================================
--- src/Tests/SynTree/Forall.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Forall.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,51 @@
+typedef forall ( type T ) int (*f)( int );
+
+forall( type T )
+    void swap( T left, T right ) {
+	T temp = left;
+	left = right;
+	right = temp;
+    }
+
+context sumable( type T ) {
+    const T 0;
+    T ?+?(T, T);
+    T ?++(T);
+    [T] ?+=?(T,T);
+};
+
+type T1 | { const T1 0; T1 ?+?(T1, T1); T1 ?++(T1); [T1] ?+=?(T1,T1); },
+     T2(type P1, type P2 ),
+     T3 | sumable(T3);
+
+type T2(type P1, type P2) | sumable(T2(P1,P2)) = struct { P1 i; P2 j; };
+
+T2(int, int) w1;
+typedef T2(int, int) w2;
+w2 g2;
+type w3 = T2(int, int);
+w3 g3;
+
+forall( type T | sumable( T ) )
+    T sum( int n, T a[] ) {
+	T total = 0;
+	int i;
+	for ( i = 0; i < n; i += 1 )
+	    total = total + a[i];
+	return total;
+    }
+
+forall( type T | { const T 0; T ?+?(T, T); T ?++(T); [T] ?+=?(T,T); } )
+    T twice( T t ) {
+	return t + t;
+    }
+
+int main() {
+    int x = 1, y = 2, a[10];
+    float f;
+
+    swap( x, y );
+    twice( x, y );
+    f = min( 4.0, 3.0 );
+    sum( 10, a );
+}
Index: src/Tests/SynTree/Functions.c
===================================================================
--- src/Tests/SynTree/Functions.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Functions.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,163 @@
+// ANSI function definitions
+
+void h(void) {}
+
+int f (
+    int (void),
+    int (int),
+    int ((void)),
+    int ((int)),
+    void g(void)
+  ) {
+    (*g)();
+    g();
+    g = h;
+}
+
+int f1() {}
+int (f2()) {}
+int (*f3())() {}
+int *((f4())) {}
+int ((*f5()))() {}
+int *f6() {}
+int *(f7)() {}
+int **f8() {}
+int * const *(f9)() {}
+int (*f10())[] {}
+int (*f11())[][3] {}
+int ((*f12())[])[3] {}
+
+// "implicit int" type specifier (not ANSI)
+
+fII1( int i ) {}
+const fII2( int i ) {}
+extern fII3( int i ) {}
+extern const fII4( int i ) {}
+
+*fII5() {}
+const *fII6() {}
+const long *fII7() {}
+static const long *fII8() {}
+const static long *fII9() {}
+
+// K&R function definitions
+
+fO1( i ) int i; {}
+int fO2( i ) int i; {}
+const fO3( i ) int i; {}
+extern fO4( i ) int i; {}
+extern const fO5( i ) int i; {}
+
+// Cforall extensions
+
+[] f( );
+[int] f( );
+[] f(int);
+[int] f(int);
+[] f( ) {}
+[int] f( ) {}
+[] f(int) {}
+[int] f(int) {}
+
+[int x] f( );
+[] f(int x);
+[int x] f(int x);
+[int x] f( ) {}
+[] f(int x) {}
+[int x] f(int x) {}
+
+[int, int x] f( );
+[] f(int, int x);
+[int, int x] f(int, int x);
+[int, int x] f( ) {}
+[] f(int, int x) {}
+[int, int x] f(int, int x) {}
+
+[int, int x, int] f( );
+[] f(int, int x, int);
+[int, int x, int] f(int, int x, int);
+[int, int x, int] f( ) {}
+[] f(int, int x, int) {}
+[int, int x, int] f(int, int x, int) {}
+
+[int, int x, * int y] f( );
+[] f(int, int x, * int y);
+[int, int x, * int y] f(int, int x, * int y);
+[int, int x, * int y] f( ) {}
+[] f(int, int x, * int y) {}
+[int, int x, * int y] f(int, int x, * int y) {}
+
+[ int ] f11( int ), f12;  // => int f11( int ), f12( int );
+
+[int] f(
+	int ( int, int p ),
+	[int](int)
+    ) {
+    int (*(*p)[][10])[][3];
+    * [][10] * [][3] int p;
+    * [] * [int](int) p;
+}
+
+static const int *f1() {}
+static [ const int ] f2() {}
+static inline [ const * int ] f3() {}
+static inline [ const [ * int, int ] ] f4() {}
+static [ const [ * int, const int ] ] f5() {}
+
+// unnamed parameter
+
+int f(
+    int (),
+
+    int *(),
+    int **(),
+    int * const *(),
+    int * const * const (),
+
+    int ([]),
+    int ([10]),
+
+    int *([]),
+    int *([10]),
+    int **([]),
+    int **([10]),
+    int * const *([]),
+    int * const *([10]),
+    int * const * const ([]),
+    int * const * const ([10])
+    );
+
+int f(
+    int (),
+
+    int *(),
+    int **(),
+    int * const *(),
+    int * const * const (),
+
+    int ([]),
+    int ([10]),
+
+    int *([]),
+    int *([10]),
+    int **([]),
+    int **([10]),
+    int * const *([]),
+    int * const *([10]),
+    int * const * const ([]),
+    int * const * const ([10])
+    ) {
+}
+
+typedef int T;
+
+int f( T (T), T T ) {
+    T (T);
+}
+
+// errors
+
+//int f()[] {}
+//int (f[])() {}
+//int f[]() {}
+//int ((*f15())())[] {}
Index: src/Tests/SynTree/IdentFuncDeclarator.c
===================================================================
--- src/Tests/SynTree/IdentFuncDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/IdentFuncDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,105 @@
+int main() {
+    //int f0[]();
+    //int (f0[])();
+    //int f0()[];
+    //int f0()();
+    //int (*f0)()();
+    //int ((*f0())())[];
+    
+    int f1;
+    int (f2);
+
+    int *f3;
+    int **f4;
+    int * const *f5;
+    int * const * const f6;
+
+    int *(f7);
+    int **(f8);
+    int * const *(f9);
+    int * const * const (f10);
+
+    int (*f11);
+    int (**f12);
+    int (* const *f13);
+    int (* const * const f14);
+
+    int f15[];
+    int f16[10];
+    int (f17[]);
+    int (f18[10]);
+
+    int *f19[];
+    int *f20[10];
+    int **f21[];
+    int **f22[10];
+    int * const *f23[];
+    int * const *f24[10];
+    int * const * const f25[];
+    int * const * const f26[10];
+
+    int *(f27[]);
+    int *(f28[10]);
+    int **(f29[]);
+    int **(f30[10]);
+    int * const *(f31[]);
+    int * const *(f32[10]);
+    int * const * const (f33[]);
+    int * const * const (f34[10]);
+
+    int (*f35[]);
+    int (*f36[10]);
+    int (**f37[]);
+    int (**f38[10]);
+    int (* const *f39[]);
+    int (* const *f40[10]);
+    int (* const * const f41[]);
+    int (* const * const f42[10]);
+
+    int f43[][3];
+    int f44[3][3];
+    int (f45[])[3];
+    int (f46[3])[3];
+    int ((f47[]))[3];
+    int ((f48[3]))[3];
+
+    int *f49[][3];
+    int *f50[3][3];
+    int **f51[][3];
+    int **f52[3][3];
+    int * const *f53[][3];
+    int * const *f54[3][3];
+    int * const * const f55[][3];
+    int * const * const f56[3][3];
+
+    int (*f57[][3]);
+    int (*f58[3][3]);
+    int (**f59[][3]);
+    int (**f60[3][3]);
+    int (* const *f61[][3]);
+    int (* const *f62[3][3]);
+    int (* const * const f63[][3]);
+    int (* const * const f64[3][3]);
+
+    int f65(int);
+    int (f66)(int);
+
+    int *f67(int);
+    int **f68(int);
+    int * const *f69(int);
+    int * const * const f70(int);
+
+    int *(f71)(int);
+    int **(f72)(int);
+    int * const *(f73)(int);
+    int * const * const (f74)(int);
+
+    int (*f75)(int);
+    int (**f76)(int);
+    int (* const *f77)(int);
+    int (* const * const f78)(int);
+
+    int (*(*f79)(int))();
+    int (*(* const f80)(int))();
+    int (* const(* const f81)(int))();
+}
Index: src/Tests/SynTree/IdentFuncParamDeclarator.c
===================================================================
--- src/Tests/SynTree/IdentFuncParamDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/IdentFuncParamDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,150 @@
+int fred(
+    //int f0[](),
+    //int (f0[])(),
+    //int f0()[],
+    //int f0()(),
+    //int (*f0)()(),
+    //int ((*f0())())[],
+    
+    int f1,
+    int (f2),
+
+    int *f3,
+    int **f4,
+    int * const *f5,
+    int * const * const f6,
+
+    int *(f7),
+    int **(f8),
+    int * const *(f9),
+    int * const * const (f10),
+
+    int (*f11),
+    int (**f12),
+    int (* const *f13),
+    int (* const * const f14),
+
+    int f15[],
+    int f16[10],
+    int (f17[]),
+    int (f18[10]),
+
+    int *f19[],
+    int *f20[10],
+    int **f21[],
+    int **f22[10],
+    int * const *f23[],
+    int * const *f24[10],
+    int * const * const f25[],
+    int * const * const f26[10],
+
+    int *(f27[]),
+    int *(f28[10]),
+    int **(f29[]),
+    int **(f30[10]),
+    int * const *(f31[]),
+    int * const *(f32[10]),
+    int * const * const (f33[]),
+    int * const * const (f34[10]),
+
+    int (*f35[]),
+    int (*f36[10]),
+    int (**f37[]),
+    int (**f38[10]),
+    int (* const *f39[]),
+    int (* const *f40[10]),
+    int (* const * const f41[]),
+    int (* const * const f42[10]),
+
+    int f43[][3],
+    int f44[3][3],
+    int (f45[])[3],
+    int (f46[3])[3],
+    int ((f47[]))[3],
+    int ((f48[3]))[3],
+
+    int *f49[][3],
+    int *f50[3][3],
+    int **f51[][3],
+    int **f52[3][3],
+    int * const *f53[][3],
+    int * const *f54[3][3],
+    int * const * const f55[][3],
+    int * const * const f56[3][3],
+
+    int (*f57[][3]),
+    int (*f58[3][3]),
+    int (**f59[][3]),
+    int (**f60[3][3]),
+    int (* const *f61[][3]),
+    int (* const *f62[3][3]),
+    int (* const * const f63[][3]),
+    int (* const * const f64[3][3]),
+
+    int f65(int),
+    int (f66)(int),
+
+    int *f67(int),
+    int **f68(int),
+    int * const *f69(int),
+    int * const * const f70(int),
+
+    int *(f71)(int),
+    int **(f72)(int),
+    int * const *(f73)(int),
+    int * const * const (f74)(int),
+
+    int (*f75)(int),
+    int (**f76)(int),
+    int (* const *f77)(int),
+    int (* const * const f78)(int),
+
+    int (*(*f79)(int))(),
+    int (*(* const f80)(int))(),
+    int (* const(* const f81)(int))(),
+
+    int f82[const *],
+    int f83[const 3],
+    int f84[static 3],
+    int f85[static const 3],
+
+    int (f86[const *]),
+    int (f87[const 3]),
+    int (f88[static 3]),
+    int (f89[static const 3]),
+
+    int *f90[const *],
+    int *f91[const 3],
+    int **f92[static 3],
+    int * const *f93[static const 3],
+    int * const * const f94[static const 3],
+
+    int *(f95[const *]),
+    int *(f96[const 3]),
+    int **(f97[static 3]),
+    int * const *(f98[static const 3]),
+    int * const * const (f99[static const 3]),
+
+    int f100[const *][3],
+    int f101[const 3][3],
+    int f102[static 3][3],
+    int f103[static const 3][3],
+
+    int (f104[const *][3]),
+    int (f105[const 3][3]),
+    int (f106[static 3][3]),
+    int (f107[static const 3][3]),
+
+    int *f108[const *][3],
+    int *f109[const 3][3],
+    int **f110[static 3][3],
+    int * const *f111[static const 3][3],
+    int * const * const f112[static const 3][3],
+
+    int *(f113[const *][3]),
+    int *(f114[const 3][3]),
+    int **(f115[static 3][3]),
+    int * const *(f116[static const 3][3]),
+    int * const * const (f117[static const 3][3])
+    ) {
+}
Index: src/Tests/SynTree/Initialization.c
===================================================================
--- src/Tests/SynTree/Initialization.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Initialization.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,27 @@
+// Cforall extensions
+
+int * x21 = 0, x22 = 0;
+int * x21 = 0, x22 = 0;
+
+[20] int y1, y2 = { 1, 2, 3 };
+
+// designators
+
+struct {
+    [int] w;
+} a = { .w : [2] };
+
+struct { int a[3], b; } w [] = { [0].a : {1}, [0].b : 1, [1].a[0] : 2 };
+
+struct {
+    int f1, f2, f3;
+    struct { int g1, g2, g3; } f4[4];
+} v7 = {
+    .f1 : 4,
+    f2 : 3,
+    .f4[2] : {
+	.g1 : 3,
+	g3 : 0,
+    },
+    .f4[3].g3 : 7,
+};
Index: src/Tests/SynTree/Makefile
===================================================================
--- src/Tests/SynTree/Makefile	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Makefile	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,2 @@
+all:
+	sh run-tests.sh
Index: src/Tests/SynTree/Scope.c
===================================================================
--- src/Tests/SynTree/Scope.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Scope.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,69 @@
+int x;
+typedef double y;
+typedef float t;
+y z;
+type u = struct { int a; double b; };
+int f( int y );
+y q;
+
+y w(y y, u v) {
+  type x | { x t(u); };
+  u u = y;
+  x z = t(u);
+}
+
+y p;
+
+context has_u( type z )
+{
+  z u(z);
+};
+
+forall( type t | has_u( t ) )
+y q( t the_t )
+{
+  t y = u( the_t );
+}
+
+t f( y p ) {
+  int y;
+  typedef char x;
+
+  {
+    x y;
+    typedef x z;
+
+    {
+      z x;
+      typedef z y;
+      y z = x;
+    }
+
+    z x = y;
+  }
+
+  x q = y;
+}
+
+t g( void ) {
+  typedef char x;
+  try {
+    some_func();
+  } catch ( x x ) {
+    t y = x;
+  }
+  x z;
+}
+
+y q(i)
+    int i;
+{
+  switch (i) {
+    y q = i;
+  case 0:
+    return q;
+  default:
+    return i;
+  }
+}
+
Index: src/Tests/SynTree/ScopeErrors.c
===================================================================
--- src/Tests/SynTree/ScopeErrors.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/ScopeErrors.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,26 @@
+int thisIsAnError;
+int thisIsAnError;
+
+int thisIsNotAnError;
+float thisIsNotAnError;
+
+int thisIsAlsoNotAnError()
+{
+  int thisIsNotAnError;
+}
+
+int thisIsAlsoNotAnError( double x )
+{
+}
+
+double thisIsStillNotAnError( double );
+double thisIsStillNotAnError( double );
+
+double butThisIsAnError( double )
+{
+}
+
+double butThisIsAnError( double )
+{
+}
+
Index: src/Tests/SynTree/StructMember.c
===================================================================
--- src/Tests/SynTree/StructMember.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/StructMember.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,40 @@
+typedef int T;
+
+struct S {
+    int m1:3, m2:4;
+    int :2;
+    int :3, :4;
+    int m3;
+    int m4, m5, m6;
+    int *m7, *m8, *m9;
+    int (*m10)();
+    int *(*m11)(int);
+    T T;
+    T (T);
+
+// Cforall extensions
+
+    * int m12, m13;
+    * [ * int ] (int) m14;
+    int ;
+    int , , ;
+    int * , , ;
+    int *, *, *;
+    * int , , ;
+    int (*)();
+    int (**)( int );
+    T ;
+
+// errors
+
+//    void f(void);
+};
+
+struct S s;
+
+union U {
+    [5] int m1;
+    int m2[5];
+    * int m3;
+    int *m4;
+} u;
Index: src/Tests/SynTree/Tuple.c
===================================================================
--- src/Tests/SynTree/Tuple.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Tuple.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,62 @@
+int f( int, int );
+int g( int, int, int );
+static [ int, int, int, int ] h( int a, int b, * int c, [] char d );
+
+struct inner {
+    int f2, f3;
+};
+
+struct outer {
+    int f1;
+    struct inner i;
+    double f4;
+} s, *sp;
+
+const volatile [ int, int ] t1;
+static const [ int, const int ] t2;
+const static [ int, const int ] t3;
+
+[ int rc ] printf( * char fmt, ... );
+int printf( char *fmt, ... );
+
+[ short x, unsigned y ] f1( int w ) {
+    [ y, x ] = [ x, y ] = [ w, 23 ];
+}
+
+[ [ int, char, long, int ] r ] g1() {
+    short x, p;
+    unsigned int y;
+    [ int, int ] z;
+
+    [ x, y, z ] = [ p, f( 17 ), 3 ];
+    r = [ x, y, z ];
+}
+
+[ int rc ] main( int argc, ** char argv ) {
+    int a, b, c, d;
+    struct outer t = { .[ f1,f4 ] : [ 1,7.0 ] };
+    f( [ 3,5 ] );
+    g( [ 3,5 ], 3 );
+    f( t1 );
+    g( t1, 3 );
+    [ 3,5 ];
+    [ a,b ] = 3;
+    [ a,b ] = [ 4.6 ];
+    [ a,b ] = [ c,d ] = [ 3,5 ];
+    [ a,b,[ c ] ] = [ 2,[ a,b ] ];
+    [ a,b ] = 3 > 4 ? [ b,6 ] : [ 7,8 ];
+
+    t1 = [ a,b ];
+    t1 = t2 = [ a,b ];
+    [ a,b ] = [ c,d ] = d += c += 1;
+    [ a,b ] = [ c,d ] = t1;
+    [ a,b ] = t1 = [ c,d ];
+    [ a,b ] = t1 = t2 = [ c,d ];
+    t1 = [ 3,4 ] = [ 3,4 ] = t1 = [ 3,4 ];
+
+    s.[ f1, i.[ f2, f3 ], f4 ] = [ 11, 12, 13, 3.14159 ];
+    s.[ f1, i.[ f2, f3 ], f4 ] = h( 3, 3, 0, "abc" );
+    sp->[ f4,f1 ] = sp->[ f1,f4 ];
+    printf( "expecting 3, 17, 23, 4; got %d, %d, %d, %d\n", s.[ f4, i.[ f3,f2 ], f1 ] );
+    rc = 0;
+}
Index: src/Tests/SynTree/TypeGenerator.c
===================================================================
--- src/Tests/SynTree/TypeGenerator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/TypeGenerator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,19 @@
+context addable(type T) {
+   T ?+?(T,T);
+};
+
+type List(type T | addable(T) ) | addable(T) = struct { T data; List(T) *next; } *;
+typedef List(int) ListOfIntegers;
+ListOfIntegers li;
+int f( List(int) ((*g))(int) );
+[int] h( * List(int) p ); // new declaration syntax
+
+struct(type T | addable(T) ) node { T data; struct(T) node *next; };
+type List(type T) = struct(T) node *;
+List(int) my_list;
+
+type Complex | addable(Complex);
+
+int main() {
+    (struct(int) node)my_list;
+}
Index: src/Tests/SynTree/Typedef.c
===================================================================
--- src/Tests/SynTree/Typedef.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/Typedef.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,41 @@
+typedef int T;
+
+void f( void ) {
+    int T( T );
+    T( 3 );
+}
+
+struct {
+    T (T);
+} fred = { 3 };
+
+typedef int (*a)(int, char);
+a b;
+
+int g(void) {
+    double a;
+}
+a c;
+
+// typedef x = 3, y = 3;  /* GCC */
+
+// x p;
+// y q;
+
+int main() {
+//    typedef z = p = 3;
+}
+
+/* new-style function definitions */
+
+typedef [10] * int arrayOf10Pointers;
+arrayOf10Pointers x;
+typedef const * int constantPointer;
+typedef * [ int ]( [] int ) funcPtr;
+typedef [ int ] funcProto( []  int );
+typedef [ int, int ] tupleType;
+typedef * [ int, int ] tupleTypePtr;
+typedef * int a, b;
+typedef [ int ] f( * int ), g;
+typedef [ * [static 10] int ] t;
+typedef [ * [static 10] int x ] f();
Index: src/Tests/SynTree/TypedefDeclarator.c
===================================================================
--- src/Tests/SynTree/TypedefDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/TypedefDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,116 @@
+typedef int
+     f0,  f1,  f2,  f3,  f4,  f5,  f6,  f7,  f8,  f9,
+    f10, f11, f12, f13, f14, f15, f16, f17, f18, f19,
+    f20, f21, f22, f23, f24, f25, f26, f27, f28, f29,
+    f30, f31, f32, f33, f34, f35, f36, f37, f38, f39,
+    f40, f41, f42, f43, f44, f45, f46, f47, f48, f49,
+    f50, f51, f52, f53, f54, f55, f56, f57, f58, f59,
+    f60, f61, f62, f63, f64, f65, f66, f67, f68, f69,
+    f70, f71, f72, f73, f74, f75, f76, f77, f78, f79,
+    f80, f81, f82, f83, f84, f85, f86, f87, f88, f89;
+
+int main() {
+    //int f0[]();
+    //int (f0[])();
+    //int f0()[];
+    //int f0()();
+    //int (*f0)()();
+    //int ((*f0())())[];
+    
+    int f1;
+    int (f2);
+
+    int *f3;
+    int **f4;
+    int * const *f5;
+    int * const * const f6;
+
+    int *(f7);
+    int **(f8);
+    int * const *(f9);
+    int * const * const (f10);
+
+    int (*f11);
+    int (**f12);
+    int (* const *f13);
+    int (* const * const f14);
+
+    int f15[];
+    int f16[10];
+    int (f17[]);
+    int (f18[10]);
+
+    int *f19[];
+    int *f20[10];
+    int **f21[];
+    int **f22[10];
+    int * const *f23[];
+    int * const *f24[10];
+    int * const * const f25[];
+    int * const * const f26[10];
+
+    int *(f27[]);
+    int *(f28[10]);
+    int **(f29[]);
+    int **(f30[10]);
+    int * const *(f31[]);
+    int * const *(f32[10]);
+    int * const * const (f33[]);
+    int * const * const (f34[10]);
+
+    int (*f35[]);
+    int (*f36[10]);
+    int (**f37[]);
+    int (**f38[10]);
+    int (* const *f39[]);
+    int (* const *f40[10]);
+    int (* const * const f41[]);
+    int (* const * const f42[10]);
+
+    int f43[][3];
+    int f44[3][3];
+    int (f45[])[3];
+    int (f46[3])[3];
+    int ((f47[]))[3];
+    int ((f48[3]))[3];
+
+    int *f49[][3];
+    int *f50[3][3];
+    int **f51[][3];
+    int **f52[3][3];
+    int * const *f53[][3];
+    int * const *f54[3][3];
+    int * const * const f55[][3];
+    int * const * const f56[3][3];
+
+    int (*f57[][3]);
+    int (*f58[3][3]);
+    int (**f59[][3]);
+    int (**f60[3][3]);
+    int (* const *f61[][3]);
+    int (* const *f62[3][3]);
+    int (* const * const f63[][3]);
+    int (* const * const f64[3][3]);
+
+    int f65(int);
+    int (f66)(int);
+
+    int *f67(int);
+    int **f68(int);
+    int * const *f69(int);
+    int * const * const f70(int);
+
+    int *(f71)(int);
+    int **(f72)(int);
+    int * const *(f73)(int);
+    int * const * const (f74)(int);
+
+    int (*f75)(int);
+    int (**f76)(int);
+    int (* const *f77)(int);
+    int (* const * const f78)(int);
+
+    int (*(*f79)(int))();
+    int (*(* const f80)(int))();
+    int (* const(* const f81)(int))();
+}
Index: src/Tests/SynTree/TypedefParamDeclarator.c
===================================================================
--- src/Tests/SynTree/TypedefParamDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/TypedefParamDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,150 @@
+typedef int
+     f0,   f1,   f2,   f3,   f4,   f5,   f6,   f7,   f8,   f9,
+    f10,  f11,  f12,  f13,  f14,  f15,  f16,  f17,  f18,  f19,
+    f20,  f21,  f22,  f23,  f24,  f25,  f26,  f27,  f28,  f29,
+    f30,  f31,  f32,  f33,  f34,  f35,  f36,  f37,  f38,  f39,
+    f40,  f41,  f42,  f43,  f44,  f45,  f46,  f47,  f48,  f49,
+    f50,  f51,  f52,  f53,  f54,  f55,  f56,  f57,  f58,  f59,
+    f60,  f61,  f62,  f63,  f64,  f65,  f66,  f67,  f68,  f69,
+    f70,  f71,  f72,  f73,  f74,  f75,  f76,  f77,  f78,  f79,
+    f80,  f81,  f82,  f83,  f84,  f85,  f86,  f87,  f88,  f89,
+    f90,  f91,  f92,  f93,  f94,  f95,  f96,  f97,  f98,  f99,
+    f100, f101, f102, f103, f104, f105, f106, f107, f108, f109,
+    f110, f111, f112, f113, f114, f115, f116, f117, f118, f119;
+
+int fred(
+/*
+    //int f0[](),
+    //int (f0[])(),
+    //int f0()[],
+    //int f0()(),
+    //int (*f0)()(),
+    //int ((*f0())())[],
+*/
+    int f1,
+
+    int *f3,
+    int **f4,
+    int * const *f5,
+    int * const * const f6,
+
+    int (*f11),
+    int (**f12),
+    int (* const *f13),
+    int (* const * const f14),
+
+    int f15[],
+    int f16[10],
+
+    int *f19[],
+    int *f20[10],
+    int **f21[],
+    int **f22[10],
+    int * const *f23[],
+    int * const *f24[10],
+    int * const * const f25[],
+    int * const * const f26[10],
+
+    int (*f35[]),
+    int (*f36[10]),
+    int (**f37[]),
+    int (**f38[10]),
+    int (* const *f39[]),
+    int (* const *f40[10]),
+    int (* const * const f41[]),
+    int (* const * const f42[10]),
+
+    int f43[][3],
+    int f44[3][3],
+/*
+    int (f45[])[3],
+    int (f46[3])[3],
+    int ((f47[]))[3],
+    int ((f48[3]))[3],
+*/
+    int *f49[][3],
+    int *f50[3][3],
+    int **f51[][3],
+    int **f52[3][3],
+    int * const *f53[][3],
+    int * const *f54[3][3],
+    int * const * const f55[][3],
+    int * const * const f56[3][3],
+
+    int (*f57[][3]),
+    int (*f58[3][3]),
+    int (**f59[][3]),
+    int (**f60[3][3]),
+    int (* const *f61[][3]),
+    int (* const *f62[3][3]),
+    int (* const * const f63[][3]),
+    int (* const * const f64[3][3]),
+
+    int f65(int),
+/*
+    int (f66)(int),
+*/
+    int *f67(int),
+    int **f68(int),
+    int * const *f69(int),
+    int * const * const f70(int),
+/*
+    int *(f71)(int),
+    int **(f72)(int),
+    int * const *(f73)(int),
+    int * const * const (f74)(int),
+*/
+    int (*f75)(int),
+    int (**f76)(int),
+    int (* const *f77)(int),
+    int (* const * const f78)(int),
+
+    int (*(*f79)(int))(),
+    int (*(* const f80)(int))(),
+    int (* const(* const f81)(int))(),
+
+    int f82[const *],
+    int f83[const 3],
+    int f84[static 3],
+    int f85[static const 3],
+
+    int (f86[const *]),
+    int (f87[const 3]),
+    int (f88[static 3]),
+    int (f89[static const 3]),
+
+    int *f90[const *],
+    int *f91[const 3],
+    int **f92[static 3],
+    int * const *f93[static const 3],
+    int * const * const f94[static const 3],
+
+    int *(f95[const *]),
+    int *(f96[const 3]),
+    int **(f97[static 3]),
+    int * const *(f98[static const 3]),
+    int * const * const (f99[static const 3]),
+
+    int f100[const *][3],
+    int f101[const 3][3],
+    int f102[static 3][3],
+    int f103[static const 3][3],
+
+    int (f104[const *][3]),
+    int (f105[const 3][3]),
+    int (f106[static 3][3]),
+    int (f107[static const 3][3]),
+
+    int *f108[const *][3],
+    int *f109[const 3][3],
+    int **f110[static 3][3],
+    int * const *f111[static const 3][3],
+    int * const * const f112[static const 3][3],
+
+    int *(f113[const *][3]),
+    int *(f114[const 3][3]),
+    int **(f115[static 3][3]),
+    int * const *(f116[static const 3][3]),
+    int * const * const (f117[static const 3][3])
+    ) {
+}
Index: src/Tests/SynTree/VariableDeclarator.c
===================================================================
--- src/Tests/SynTree/VariableDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/VariableDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,115 @@
+int f1;
+int (f2);
+
+int *f3;
+int **f4;
+int * const *f5;
+int * const * const f6;
+
+int *(f7);
+int **(f8);
+int * const *(f9);
+int * const * const (f10);
+
+int (*f11);
+int (**f12);
+int (* const *f13);
+int (* const * const f14);
+
+int f15[];
+int f16[10];
+int (f17[]);
+int (f18[10]);
+
+int *f19[];
+int *f20[10];
+int **f21[];
+int **f22[10];
+int * const *f23[];
+int * const *f24[10];
+int * const * const f25[];
+int * const * const f26[10];
+
+int *(f27[]);
+int *(f28[10]);
+int **(f29[]);
+int **(f30[10]);
+int * const *(f31[]);
+int * const *(f32[10]);
+int * const * const (f33[]);
+int * const * const (f34[10]);
+
+int (*f35[]);
+int (*f36[10]);
+int (**f37[]);
+int (**f38[10]);
+int (* const *f39[]);
+int (* const *f40[10]);
+int (* const * const f41[]);
+int (* const * const f42[10]);
+
+int f43[][3];
+int f44[3][3];
+int (f45[])[3];
+int (f46[3])[3];
+int ((f47[]))[3];
+int ((f48[3]))[3];
+
+int *f49[][3];
+int *f50[3][3];
+int **f51[][3];
+int **f52[3][3];
+int * const *f53[][3];
+int * const *f54[3][3];
+int * const * const f55[][3];
+int * const * const f56[3][3];
+
+int (*f57[][3]);
+int (*f58[3][3]);
+int (**f59[][3]);
+int (**f60[3][3]);
+int (* const *f61[][3]);
+int (* const *f62[3][3]);
+int (* const * const f63[][3]);
+int (* const * const f64[3][3]);
+
+int f65(int);
+int (f66)(int);
+
+int *f67(int);
+int **f68(int);
+int * const *f69(int);
+int * const * const f70(int);
+
+int *(f71)(int);
+int **(f72)(int);
+int * const *(f73)(int);
+
+int * const * const (f74)(int);
+
+int (*f75)(int);
+int (**f76)(int);
+int (* const *f77)(int);
+int (* const * const f78)(int);
+
+int (*(*f79)(int))();
+int (*(* const f80)(int))();
+int (* const(* const f81)(int))();
+
+// errors
+
+//int fe0[]();				// array of functions
+//int (fe1[])();				// array of functions
+//int fe2()[];				// returning an array
+//int fe3()();				// returning a function
+//int (*fe4)()();				// returning a function
+//int ((*fe5())())[];			// returning an array
+
+// Cforall extensions
+
+* [20] double z;
+[20] * char w;
+
+// function pointer
+
+*[]*[]* [ *[]*[] int ]( *[]*[] int, *[]*[] int ) v3;
Index: src/Tests/SynTree/make-rules
===================================================================
--- src/Tests/SynTree/make-rules	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/make-rules	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,21 @@
+CFA = ../../cfa-cpp
+
+DIFF = diff#/software/gnu/bin/diff
+
+# Basic SynTree printing
+EXPECTED := ${wildcard $(EXPECTDIR)/*.tst}
+TESTS := $(EXPECTED:$(EXPECTDIR)/%=$(OUTPUTDIR)/%)
+TEST_IN := $(TESTS:.tst=.c)
+
+$(OUTPUTDIR)/%.tst:%.c $(CFA)
+	$(CFA) $(CFAOPT) < $< > $@ 2>&1
+
+$(OUTPUTDIR)/report: $(TESTS) $(EXPECTED)
+	rm -f $@
+	@for i in $(TESTS); do \
+	  echo "---"`basename $$i`"---" | tee -a $@; \
+	  $(DIFF) -B -w $(EXPECTDIR)/`basename $$i` $$i | tee -a $@; \
+	done
+
+clean:
+	rm -rf $(OUTPUTDIR)
Index: src/Tests/SynTree/run-tests.sh
===================================================================
--- src/Tests/SynTree/run-tests.sh	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/SynTree/run-tests.sh	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,10 @@
+#!/bin/sh -v
+
+dotest() {
+  mkdir -p Output$1
+  OUTPUTDIR=Output$1 EXPECTDIR=Expected$1 CFAOPT=$2 make -f make-rules $3
+}
+
+dotest "" -ns "$*"
+dotest -SymTab -nm "$*"
+#dotest -Validate -v "$*"
Index: src/Tests/Syntax/Array.c
===================================================================
--- src/Tests/Syntax/Array.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/Array.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,33 @@
+int a1[];
+int a2[*];
+int a4[3];
+
+int m1[][3];
+int m2[*][*];
+int m4[3][3];
+
+typedef int T;
+
+int fred() {
+    int a1[];
+    int a2[*];
+    int a4[3];
+    int T[3];
+}
+
+int mary( int T[3],
+	  int p1[const 3],
+	  int p2[static 3],
+	  int p3[static const 3]
+    ) {
+}
+
+int (*tom())[3] {
+}
+
+int (*(jane)())( int T[3],
+		 int p1[const 3],
+		 int p2[static 3],
+		 int p3[static const 3]
+    ) {
+}
Index: src/Tests/Syntax/AsmName.c
===================================================================
--- src/Tests/Syntax/AsmName.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/AsmName.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,14 @@
+extern int x asm( "xx" );
+
+int fred( int x ) {
+    static int y asm( "yy" );
+
+// Cforall extensions
+
+    static * int z asm( "zz" );
+}
+
+// errors
+
+//typedef int t asm( "tt" );
+//int mary( int p asm( "pp" ) ) {}
Index: src/Tests/Syntax/Attributes.c
===================================================================
--- src/Tests/Syntax/Attributes.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/Attributes.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,22 @@
+int @max = 3;
+
+int main() {
+    int x;
+    type @type(type t);		// compiler intrinsic
+    type @widest(type t);
+    @type(x) *y;		// gcc: typeof(x) *y;
+    const @widest(double) *w;	// gcc: const typeof(x) *w;
+    * @type(3 + 4) z;		// cfa declaration syntax
+    y = @max;		
+    z = @max(x) + @size(int);
+    y = @min(3 + 4);
+    if ( @const(x) ) { }
+    if ( @volatile(y) ) { }
+    if ( @extern(y) ) { }
+    if ( @static(y) ) { }
+    @max;
+}
+
+int @foo(int) {
+    return 7;
+}
Index: src/Tests/Syntax/CharStringConstants.c
===================================================================
--- src/Tests/Syntax/CharStringConstants.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/CharStringConstants.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,87 @@
+int main() {
+// character constants
+
+    ' ';
+    'a';
+    '"';
+    '_';
+
+    '\a';				// simple escape
+    '\b';
+    '\e';				// GCC
+    '\f';
+    '\n';
+    '\r';
+    '\t';
+    '\v';
+    '\'';
+    '\"';
+    '\?';
+    '\\';
+
+    '\0';				// octal escape
+
+    '\377';
+
+    '\xf';				// hex escape
+    '\xff';
+
+// warnings/errors
+
+    '';					// empty character
+    'aa';				// multi-character
+    'a\na';				// multi-character, embedded escape
+    'a\0a';
+    '\xfff';				// hex escape out of range
+    '_\377_';				// multi-character
+    '_\xff_';
+    '\xffff';				// hex escape out of range
+    'a\xff34w';
+    '\xf_f';				// multi-character
+    '\xff_ff';
+
+// string constants
+
+    " ";
+    "a";
+    "'";
+    '_';
+
+    "\a";				// simple escape
+    "\b";
+    "\e";				// GCC
+    "\f";
+    "\n";
+    "\r";
+    "\t";
+    "\v";
+    "\'";
+    "\"";
+    "\?";
+    "\\";
+
+    "\0";				// octal escape
+    "\377";
+
+    "\xf";				// hex escape
+    "\xff";
+
+    "";
+    "aa";
+    "a\na";
+    "a\0a";
+    "_\377_";
+    "_\xff_";
+    "\xf_f";
+
+// warnings/errors
+
+    "\xff_ff";
+    "\xfff";				// hex escape out of range
+    "a\xff34w";
+    "\xffff";
+}
+
+// Local Variables: //
+// compile-command: "../../../bin/cfa -std=c99 CharStringConstants.c" //
+// End: //
Index: src/Tests/Syntax/CommentMisc.c
===================================================================
--- src/Tests/Syntax/CommentMisc.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/CommentMisc.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,44 @@
+/* single line */
+// single line
+
+// single line containing */
+// single line containing /*
+// single line containing /* */
+
+/* 1st */ int i;
+int i; /* 2nd */
+/* 1st */ int i; /* 2nd */
+/* 1st */ /* 2nd */
+
+/* 1st
+   2nd */ int i;
+
+/*
+*/
+
+/*
+
+*/
+
+/*
+  1st
+*/
+
+/*
+  1st
+  2nd
+*/
+
+// ignore preprocessor directives
+
+#line 2
+ #
+ #include <fred>
+	#define mary abc
+
+// alternative ANSI99 brackets
+
+int main() <%
+    int x<:10:>;
+%>
+
Index: src/Tests/Syntax/Constant0-1.c
===================================================================
--- src/Tests/Syntax/Constant0-1.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/Constant0-1.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,73 @@
+// Cforall extension
+
+int fred() {
+
+// value
+    {
+	int 0;
+	const int 0;
+	int 1;
+	const int 1;
+    }
+    static const int 0;
+    static const int 1;
+    {
+	int 0, 1;
+	const int 0, 1;
+    }
+    {
+	int (0), (1);
+    }
+    {
+	int ((0)), ((1));
+    }
+    {
+	static const int 0, 1;
+    }
+    {
+	struct { int i; } 0;
+	const struct { int i; } 1;
+    }
+    static const struct { int i; } 1;
+
+// pointer
+
+    {
+	int *0, *1;
+    }
+    {
+	int *(0), *(1);
+    }
+    {
+	int (*0), (*1);
+    }
+    {
+	int ((*0)), ((*1));
+    }
+    {
+	int * const (0), * const 1;
+    }
+    {
+	int (* const 0), (* const 1);
+    }
+    {
+	int ((* const 0)), ((* const 1));
+    }
+    struct { int i; } *0;
+
+// Cforall style
+
+    {
+	* int x, 0;
+	const * int x, 0;
+    }
+    static const * int x, 0;
+    * struct { int i; } 0;
+    const * struct { int i; } 0;
+    static const * struct { int i; } 0;
+    {
+	static * int x, 0;
+	static const * int x, 0;
+    }
+    const * * int x, 0;
+}
Index: src/Tests/Syntax/DeclarationSpecifier.c
===================================================================
--- src/Tests/Syntax/DeclarationSpecifier.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/DeclarationSpecifier.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,97 @@
+typedef short int Int;
+
+
+const short int volatile x1;
+static const short int volatile x2;
+const static short int volatile x3;
+const short static int volatile x4;
+const static volatile short int x4;
+const short int static volatile x5;
+const short int volatile static x6;
+const short volatile int static x7;
+short int volatile static const x8;
+
+const volatile struct { int i; } x10;
+const struct { int i; } volatile x11;
+struct { int i; } const volatile x12;
+static const volatile struct { int i; } x13;
+const static struct { int i; } volatile x14;
+struct { int i; } static const volatile x15;
+struct { int i; } const static volatile x16;
+struct { int i; } const volatile static x17;
+
+const Int volatile x20;
+static const Int volatile x21;
+const static Int volatile x22;
+const static Int volatile x23;
+const Int static volatile x24;
+const Int volatile static x25;
+const volatile Int static x26;
+Int volatile static const x27;
+
+const volatile struct { Int i; } x29;
+const struct { Int i; } volatile x30;
+struct { Int i; } const volatile x31;
+static const volatile struct { Int i; } x32;
+const static struct { Int i; } volatile x33;
+struct { Int i; } static const volatile x34;
+struct { Int i; } const static volatile x35;
+struct { Int i; } const volatile static x36;
+
+
+const static inline const volatile int f01();		// duplicate const
+volatile inline const volatile static int f02();	// duplicate volatile
+const inline const volatile int static f03();		// duplicate const
+volatile inline static const volatile int f04();	// duplicate volatile
+const static const inline volatile int f05();		// duplicate const
+volatile static const volatile inline int f06();	// duplicate volatile
+const static const volatile int inline f07();		// duplicate const
+volatile static const int inline volatile f08();	// duplicate volatile
+
+static inline const volatile int f11();
+inline const volatile static int f12();
+inline const volatile int static f13();
+inline static const volatile int f14();
+static const inline volatile int f15();
+static const volatile inline int f16();
+static const volatile int inline f17();
+static const int inline volatile f18();
+
+short static inline const volatile int f21();
+inline short const volatile static int f22();
+inline const short volatile int static f23();
+inline static const short volatile int f24();
+static const inline volatile short int f25();
+static const volatile inline int short f26();
+static const volatile int inline short f27();
+static const int inline volatile short f28();
+
+static inline const volatile struct { int i; } f31();
+inline const volatile static struct { int i; } f32();
+inline const volatile struct { int i; } static f33();
+inline static const volatile struct { int i; } f34();
+static const inline volatile struct { int i; } f35();
+static const volatile inline struct { int i; } f36();
+static const volatile struct { int i; } inline f37();
+static const struct { int i; } inline volatile f38();
+
+static inline const volatile Int f41();
+inline const volatile static Int f42();
+inline const volatile Int static f43();
+inline static const volatile Int f44();
+static const inline volatile Int f45();
+static const volatile inline Int f46();
+static const volatile Int inline f47();
+static const Int inline volatile f48();
+
+long long ll;
+long long int lli;
+double _Complex dc;
+long double _Complex lfc;
+
+// errors
+
+//static short int volatile static const e1;		// duplicate static
+//struct { int i; } const static volatile static e2;	// duplicate static
+//struct { int i; } const static volatile static volatile e3; // duplicate static & volatile
+//static Int volatile static const e4;			// duplicate static
Index: src/Tests/Syntax/Exception.c
===================================================================
--- src/Tests/Syntax/Exception.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/Exception.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,24 @@
+int fred() {
+    int x;
+    throw 3;
+    throw x = 5;
+
+    try {
+    } catch( int i ) {}
+
+    try {
+	x/4;
+    } catch( int) {
+    } catch( int x ) {
+    } catch( struct { int i; } ) {
+    } catch( struct { int i; } x ) {
+    } catch( struct { int i; } *x ) {
+
+// Cforall extensions
+
+    } catch( * struct { int i; } ) {
+    } catch( * struct { int i; } x ) {
+    } catch( ... ) {
+//    } finally {
+    } // try
+}
Index: src/Tests/Syntax/Expression.c
===================================================================
--- src/Tests/Syntax/Expression.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/Expression.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,67 @@
+int fred() {
+    struct s { int i; } *p;
+    int i;
+
+    // order of evaluation (GCC is different)
+/*
+    i = sizeof( (int) {3} );
+    i = sizeof (int) {3};
+*/
+    // operators
+
+    ! i;
+    ~i;
+    +i;
+    -i;
+    *p;
+    ++p;
+    --p;
+    p++;
+    p--;
+
+    i+i;
+    i-i;
+    i*i;
+
+    i/i;
+    i%i;
+    i^i;
+    i&i;
+    i|i;
+    i<i;
+    i>i;
+    i=i;
+
+    i==i;
+    i!=i;
+    i<<i;
+    i>>i;
+    i<=i;
+    i>=i;
+    i&&i;
+    i||i;
+    p->i;
+    i+=i;
+    i-=i;
+    i*=i;
+    i/=i;
+    i%=i;
+    i&=i;
+    i|=i;
+    i^=i;
+    i<<=i;
+    i>>=i;
+
+    i?i:i;
+
+    // cast
+/*
+    double d;
+    int *ip;
+    (int *) i;
+    (* int) i;
+    ([char, int *])[d, d];
+    [i,ip,ip] = ([int, * int, int *])[1,(void *)2,(void *)3];
+    [i,ip,ip] = ([int, * int, int *])([1,(void *)2,(void *)3]);
+*/
+}
Index: src/Tests/Syntax/Forall.c
===================================================================
--- src/Tests/Syntax/Forall.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/Forall.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,56 @@
+typedef forall ( type T ) int (*f)( int );
+
+forall( type T )
+    void swap( T left, T right ) {
+	T temp = left;
+	left = right;
+	right = temp;
+    }
+
+context sumable( type T ) {
+    const T 0;
+    T ?+?(T, T);
+    T ?++(T*);
+    [T] ?+=?(T*,T);
+};
+
+type T1 | { const T1 0; T1 ?+?(T1, T1); T1 ?++(T1); [T1] ?+=?(T1,T1); },
+     T2(type P1, type P2 ) | (type Q, type W) { const Q 0; W ?+?(W, W); Q ?++(W); [Q] ?+=?(W,W); }(T1,T2(T1,f)),
+     T3 | sumable(T3);
+
+type T2(type P1, type P2) | sumable(T2(P1,P2)) = struct { P1 i; P2 j; };
+
+T2(int, int) w1;
+typedef T2(int, int) w2;
+w2 g2;
+type w3 = T2(int, int);
+w3 g3;
+
+forall( type T | sumable( T ) )
+    T sum( int n, T a[] ) {
+	T total = 0;
+	int i;
+	for ( i = 0; i < n; i += 1 )
+	    total = total + a[i];
+	return total;
+    }
+
+forall( type T | { T ?+?(T, T); T ?++(T*); [T] ?+=?(T*,T); } )
+    T twice( T t ) {
+	return t + t;
+    }
+
+forall( type T | { const T 0; int ?!=?(T, T); int ?<?(T, T); } )
+    T min( T t1, T t2 ) {
+	return t1 < t2 ? t1 : t2;
+    }
+
+int main() {
+    int x = 1, y = 2, a[10];
+    float f;
+
+    swap( x, y );
+    twice( x );
+    f = min( 4.0, 3.0 );
+    sum( 10, a );
+}
Index: src/Tests/Syntax/Functions.c
===================================================================
--- src/Tests/Syntax/Functions.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/Functions.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,165 @@
+// ANSI function definitions
+
+void h(void) {}
+
+int f (
+    int p1(void),
+    int p2(int),
+    int (p3(void)),
+    int (p4(int)),
+    void g(void)
+  ) {
+    (*g)();
+    g();
+    g = h;
+}
+
+int f1() {}
+int (f2()) {}
+int (*f3())() {}
+int *((f4())) {}
+int ((*f5()))() {}
+int *f6() {}
+int *(f7)() {}
+int **f8() {}
+int * const *(f9)() {}
+int (*f10())[] {}
+int (*f11())[][3] {}
+int ((*f12())[])[3] {}
+
+// "implicit int" type specifier (not ANSI)
+
+fII1( int i ) {}
+const fII2( int i ) {}
+extern fII3( int i ) {}
+extern const fII4( int i ) {}
+
+*fII5() {}
+const *fII6() {}
+const long *fII7() {}
+static const long *fII8() {}
+const static long *fII9() {}
+
+// K&R function definitions
+
+fO1( i ) int i; {}
+int fO2( i ) int i; {}
+const fO3( i ) int i; {}
+extern fO4( i ) int i; {}
+extern const fO5( i ) int i; {}
+
+// Cforall extensions
+#if 1
+[] f( );
+[int] f( );
+[] f(int);
+[int] f(int);
+[] f( ) {}
+[int] f( ) {}
+[] f(int) {}
+[int] f(int) {}
+
+[int x] f( );
+[] f(int x);
+[int x] f(int x);
+[int x] f( ) {}
+[] f(int x) {}
+[int x] f(int x) {}
+
+[int, int x] f( );
+[] f(int, int x);
+[int, int x] f(int, int x);
+[int, int x] f( ) {}
+[] f(int, int x) {}
+[int, int x] f(int, int x) {}
+
+[int, int x, int] f( );
+[] f(int, int x, int);
+[int, int x, int] f(int, int x, int);
+[int, int x, int] f( ) {}
+[] f(int, int x, int) {}
+[int, int x, int] f(int, int x, int) {}
+
+[int, int x, * int y] f( );
+[] f(int, int x, * int y);
+[int, int x, * int y] f(int, int x, * int y);
+[int, int x, * int y] f( ) {}
+[] f(int, int x, * int y) {}
+[int, int x, * int y] f(int, int x, * int y) {}
+
+[ int ] f11( int ), f12;  // => int f11( int ), f12( int );
+
+[int] f(
+	int ( int, int p ),
+	[int](int)
+    ) {
+    int (*(*p)[][10])[][3];
+    * [][10] * [][3] int p;
+    * [] * [int](int) p;
+}
+
+static const int *g1() {}
+static [ const int ] g2() {}
+static inline [ const * int ] g3() {}
+static inline [ const [ * int, int ] ] g4() {}
+static [ const [ * int, const int ] ] g5() {}
+#endif
+
+// unnamed parameter
+
+int g(
+    int (),
+
+    int *(),
+    int **(),
+    int * const *(),
+    int * const * const (),
+
+    int ([]),
+    int ([10]),
+
+    int *([]),
+    int *([10]),
+    int **([]),
+    int **([10]),
+    int * const *([]),
+    int * const *([10]),
+    int * const * const ([]),
+    int * const * const ([10])
+    );
+
+int g(
+    int (),
+
+    int *(),
+    int **(),
+    int * const *(),
+    int * const * const (),
+
+    int ([]),
+    int ([10]),
+
+    int *([]),
+    int *([10]),
+    int **([]),
+    int **([10]),
+    int * const *([]),
+    int * const *([10]),
+    int * const * const ([]),
+    int * const * const ([10])
+    ) {
+}
+
+typedef int T;
+
+int g( T g(T), T T ) {
+    g(T);
+    T = 3;
+}
+
+// errors
+
+//int f()[] {}
+//int (f[])() {}
+//int f[]() {}
+//int ((*f15())())[] {}
Index: src/Tests/Syntax/GccExtensions.c
===================================================================
--- src/Tests/Syntax/GccExtensions.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/GccExtensions.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,48 @@
+int fred() {
+    asm( "nop" );
+    __asm( "nop" );
+    __asm__( "nop" );
+
+    __complex__ c1;
+    _Complex c2;
+
+    const int i1;
+    __const int i2;
+    __const__ int i3;
+
+    __extension__ const int ex;
+
+    __inline int f1();
+    __inline__ int f2();
+
+    __signed s1;
+    __signed s2;
+
+    __typeof(s1) t1;
+    __typeof__(s1) t2;
+
+    __volatile int v1;
+    __volatile__ int v2;
+
+    __attribute__(()) int a1;
+    const __attribute(()) int a2;
+    const static __attribute(()) int a3;
+    const static int __attribute(()) a4;
+    const static int a5 __attribute(());
+    const static int a6, __attribute(()) a7;
+
+    int * __attribute(()) p1;
+    int (* __attribute(()) p2);
+//    int (__attribute(()) (p3));
+//    int ( __attribute(()) (* __attribute(()) p4));
+
+    struct __attribute(()) s1;
+    struct __attribute(()) s2 { int i; };
+    struct __attribute(()) s3 { int i; } x1, __attribute(()) y1;
+    struct __attribute(()) s4 { int i; } x2, y2 __attribute(());
+
+    int m1 [10] __attribute(());
+    int m2 [10][10] __attribute(());
+    int __attribute(()) m3 [10][10];
+//    int ( __attribute(()) m4 [10] )[10];
+}
Index: src/Tests/Syntax/IdentFuncDeclarator.c
===================================================================
--- src/Tests/Syntax/IdentFuncDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/IdentFuncDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,105 @@
+int main() {
+    //int f0[]();
+    //int (f0[])();
+    //int f0()[];
+    //int f0()();
+    //int (*f0)()();
+    //int ((*f0())())[];
+    
+    int f1;
+    int (f2);
+
+    int *f3;
+    int **f4;
+    int * const *f5;
+    int * const * const f6;
+
+    int *(f7);
+    int **(f8);
+    int * const *(f9);
+    int * const * const (f10);
+
+    int (*f11);
+    int (**f12);
+    int (* const *f13);
+    int (* const * const f14);
+
+    int f15[];
+    int f16[10];
+    int (f17[]);
+    int (f18[10]);
+
+    int *f19[];
+    int *f20[10];
+    int **f21[];
+    int **f22[10];
+    int * const *f23[];
+    int * const *f24[10];
+    int * const * const f25[];
+    int * const * const f26[10];
+
+    int *(f27[]);
+    int *(f28[10]);
+    int **(f29[]);
+    int **(f30[10]);
+    int * const *(f31[]);
+    int * const *(f32[10]);
+    int * const * const (f33[]);
+    int * const * const (f34[10]);
+
+    int (*f35[]);
+    int (*f36[10]);
+    int (**f37[]);
+    int (**f38[10]);
+    int (* const *f39[]);
+    int (* const *f40[10]);
+    int (* const * const f41[]);
+    int (* const * const f42[10]);
+
+    int f43[][3];
+    int f44[3][3];
+    int (f45[])[3];
+    int (f46[3])[3];
+    int ((f47[]))[3];
+    int ((f48[3]))[3];
+
+    int *f49[][3];
+    int *f50[3][3];
+    int **f51[][3];
+    int **f52[3][3];
+    int * const *f53[][3];
+    int * const *f54[3][3];
+    int * const * const f55[][3];
+    int * const * const f56[3][3];
+
+    int (*f57[][3]);
+    int (*f58[3][3]);
+    int (**f59[][3]);
+    int (**f60[3][3]);
+    int (* const *f61[][3]);
+    int (* const *f62[3][3]);
+    int (* const * const f63[][3]);
+    int (* const * const f64[3][3]);
+
+    int f65(int);
+    int (f66)(int);
+
+    int *f67(int);
+    int **f68(int);
+    int * const *f69(int);
+    int * const * const f70(int);
+
+    int *(f71)(int);
+    int **(f72)(int);
+    int * const *(f73)(int);
+    int * const * const (f74)(int);
+
+    int (*f75)(int);
+    int (**f76)(int);
+    int (* const *f77)(int);
+    int (* const * const f78)(int);
+
+    int (*(*f79)(int))();
+    int (*(* const f80)(int))();
+    int (* const(* const f81)(int))();
+}
Index: src/Tests/Syntax/IdentFuncParamDeclarator.c
===================================================================
--- src/Tests/Syntax/IdentFuncParamDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/IdentFuncParamDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,150 @@
+int fred(
+    //int f0[](),
+    //int (f0[])(),
+    //int f0()[],
+    //int f0()(),
+    //int (*f0)()(),
+    //int ((*f0())())[],
+    
+    int f1,
+    int (f2),
+
+    int *f3,
+    int **f4,
+    int * const *f5,
+    int * const * const f6,
+
+    int *(f7),
+    int **(f8),
+    int * const *(f9),
+    int * const * const (f10),
+
+    int (*f11),
+    int (**f12),
+    int (* const *f13),
+    int (* const * const f14),
+
+    int f15[],
+    int f16[10],
+    int (f17[]),
+    int (f18[10]),
+
+    int *f19[],
+    int *f20[10],
+    int **f21[],
+    int **f22[10],
+    int * const *f23[],
+    int * const *f24[10],
+    int * const * const f25[],
+    int * const * const f26[10],
+
+    int *(f27[]),
+    int *(f28[10]),
+    int **(f29[]),
+    int **(f30[10]),
+    int * const *(f31[]),
+    int * const *(f32[10]),
+    int * const * const (f33[]),
+    int * const * const (f34[10]),
+
+    int (*f35[]),
+    int (*f36[10]),
+    int (**f37[]),
+    int (**f38[10]),
+    int (* const *f39[]),
+    int (* const *f40[10]),
+    int (* const * const f41[]),
+    int (* const * const f42[10]),
+
+    int f43[][3],
+    int f44[3][3],
+    int (f45[])[3],
+    int (f46[3])[3],
+    int ((f47[]))[3],
+    int ((f48[3]))[3],
+
+    int *f49[][3],
+    int *f50[3][3],
+    int **f51[][3],
+    int **f52[3][3],
+    int * const *f53[][3],
+    int * const *f54[3][3],
+    int * const * const f55[][3],
+    int * const * const f56[3][3],
+
+    int (*f57[][3]),
+    int (*f58[3][3]),
+    int (**f59[][3]),
+    int (**f60[3][3]),
+    int (* const *f61[][3]),
+    int (* const *f62[3][3]),
+    int (* const * const f63[][3]),
+    int (* const * const f64[3][3]),
+
+    int f65(int),
+    int (f66)(int),
+
+    int *f67(int),
+    int **f68(int),
+    int * const *f69(int),
+    int * const * const f70(int),
+
+    int *(f71)(int),
+    int **(f72)(int),
+    int * const *(f73)(int),
+    int * const * const (f74)(int),
+
+    int (*f75)(int),
+    int (**f76)(int),
+    int (* const *f77)(int),
+    int (* const * const f78)(int),
+
+    int (*(*f79)(int))(),
+    int (*(* const f80)(int))(),
+    int (* const(* const f81)(int))(),
+
+    int f82[const *],
+    int f83[const 3],
+    int f84[static 3],
+    int f85[static const 3],
+
+    int (f86[const *]),
+    int (f87[const 3]),
+    int (f88[static 3]),
+    int (f89[static const 3]),
+
+    int *f90[const *],
+    int *f91[const 3],
+    int **f92[static 3],
+    int * const *f93[static const 3],
+    int * const * const f94[static const 3],
+
+    int *(f95[const *]),
+    int *(f96[const 3]),
+    int **(f97[static 3]),
+    int * const *(f98[static const 3]),
+    int * const * const (f99[static const 3]),
+
+    int f100[const *][3],
+    int f101[const 3][3],
+    int f102[static 3][3],
+    int f103[static const 3][3],
+
+    int (f104[const *][3]),
+    int (f105[const 3][3]),
+    int (f106[static 3][3]),
+    int (f107[static const 3][3]),
+
+    int *f108[const *][3],
+    int *f109[const 3][3],
+    int **f110[static 3][3],
+    int * const *f111[static const 3][3],
+    int * const * const f112[static const 3][3],
+
+    int *(f113[const *][3]),
+    int *(f114[const 3][3]),
+    int **(f115[static 3][3]),
+    int * const *(f116[static const 3][3]),
+    int * const * const (f117[static const 3][3])
+    ) {
+}
Index: src/Tests/Syntax/Initialization.c
===================================================================
--- src/Tests/Syntax/Initialization.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/Initialization.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,45 @@
+// Cforall extensions
+
+int * v1 = 0, v2 = 0;
+int * v3 = 0, v4 = 0;
+
+void fred() {
+    int y1, y2[20]  = { 1, 2, 3 };
+
+    // designators
+
+    struct {
+	[int] w;
+    } a = { .w : [2] };
+
+    struct { int a[3], b; } w [] = { [0].a : {1}, [0].b : 1, [1].a[0] : 2 };
+
+    struct {
+	int f1, f2, f3;
+	struct { int g1, g2, g3; } f4[4];
+    } v7 = {
+	.f1 : 4,
+	.f2 : 3,
+	.f4[2] : {
+	    .g1 : 3,
+	    .g3 : 0,
+	},
+	.f4[3].g3 : 7,
+    };
+}
+
+struct point { int x; int z; struct {int y1, y2, y3;} y; int w;};
+struct quintet { int v, w, x, y, z;};
+
+int foo() {
+  return 4;
+}
+
+int main() {
+  foo();
+  int i;
+  struct point p1 = { x: 3 };
+  struct point p2 = { 3, 4 };
+  struct point p3 = { .[x,z]: 5, y : { .[y3,y1] : 6, 17 } };
+  struct point p4 = { w : 5, 4 };
+}
Index: src/Tests/Syntax/LabelledExit.c
===================================================================
--- src/Tests/Syntax/LabelledExit.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/LabelledExit.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,139 @@
+int main() {
+    int i;
+    int x, y;
+
+    x = 0; y = 0;
+
+// block, labelled exits
+
+  Block: {
+	if ( x == y ) {
+	    for ( ; i < y; ) {
+		y += 1;
+		if ( y < 10 ) break Block;
+	    }
+	}
+    }
+
+// loops, labelled exits
+
+  w1: while ( y == 10 );
+
+  w2: while ( x < 10 ) {
+      while (y < 5 ) {
+	  if ( y == 3 ) break w2;
+      }
+      x += 1;
+  }
+
+  A: for ( i = 0; i < 10; i += 1 ) {
+    B: for ( i = 0; i < 10; i += 1 ) {
+      C: for ( i = 0; i < 10; i += 1 ) {
+	  goto A;
+	  goto B;
+	  goto C;
+	  continue A;
+	  continue B;
+	  continue C;
+	  continue;
+	  break A;
+	  break B;
+	  break C;
+	  break;
+      }
+    }
+  }
+
+  D: for ( ;; ) {
+      break D;
+      continue D;
+  }
+
+    Z : i += 1;
+    goto Z;
+  X: Y: for ( ;; ) {
+      i += 1;
+      if ( i > 5 ) continue X;
+      if ( i < 5 ) break X;
+      if ( i < 5 ) break Y;
+      break;
+  }
+  XX: for ( ;; ) {
+    YY: for ( ;; ) {
+      ZZ: for ( ;; ) {
+	  i += 1;
+	  if ( i > 5 ) continue XX;
+	  if ( i < 5 ) continue YY;
+	  if ( i < 5 ) continue ZZ;
+	  if ( i > 5 ) break XX;
+	  if ( i < 5 ) break YY;
+	  if ( i < 5 ) break ZZ;
+	  break;
+      }
+    }
+  }
+
+    for ( ;; ) ;
+    for ( int i = 0 ;; ) ;
+    for (  ; i < 0; ) ;
+    for (  ; ; i += 1 ) ;
+  L0:  L1:  L2:  L3:  L4:  L5:  L6:  L7:  L8:  L9:
+  L10: L11: L12: L13: L14: L15: L16: L17: L18: L19:
+  L20: L21: L22: L23: L24: L25: L26: L27: L28: L29:
+  L31: L32: L33: L34:
+    for ( ;; ) {
+	break L0;
+    }
+
+// switch/choose, labelled exits
+
+  Switch: switch ( i ) {
+    default:
+      i += 1;
+    case 0:
+      i += 1;
+      break Switch;
+    case 1:
+      switch ( i ) {
+	case 0:
+	  break Switch;
+	default:
+	  break;
+      }
+  }
+
+  Choose: choose ( i ) {
+    default:
+      i += 1;
+    case 0:
+      i += 1;
+      break Choose;
+    case 1:
+      choose ( i ) {
+	case 0:
+	  break;
+	default:
+	  break Choose;
+      }
+      fallthru;
+    case 2:
+      i += 1;
+  }
+#if 0
+// computed goto
+
+    {
+	static void *array[] = { &&foo, &&bar, &&hack };
+
+      foo: bar: hack:
+	goto *array[i];
+    }
+#endif
+#if 0
+  Q: if ( i > 5 ) {
+      i += 1;
+      break Q;
+  } else
+      i += 1;
+#endif
+}
Index: src/Tests/Syntax/Makefile
===================================================================
--- src/Tests/Syntax/Makefile	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/Makefile	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,22 @@
+CFA = ../../cfa-cpp
+
+TESTS = ${shell ls *.c}
+TEST_OUT = $(TESTS:.c=.tst)
+
+%.tst:%.c $(CFA)
+	$(CFA) -nd < $< > $@ 2>&1
+
+tests: $(TEST_OUT)
+
+clean:
+	rm -rf $(TEST_OUT)
+
+force: clean tests
+
+all: $(TESTS)
+	@for i in $(TESTS); do     \
+	  echo -n $$i "... " ;     \
+	  $(CFA) -d < $$i > $$i.log;  \
+	done
+
+
Index: src/Tests/Syntax/NamedParmArg.c
===================================================================
--- src/Tests/Syntax/NamedParmArg.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/NamedParmArg.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,14 @@
+int f1( int i = 3, int *j = 0 ) {}  /* ANSI */
+[int, int ] f2( int i = 3, * int j = 0 ) {}  /* CFA */
+
+int main() {
+    f1();		/* identical calls */
+    f1( 3 );
+    f1( 3, );
+    f1( 3, 0 );
+    f1( 3, j : 0 );
+    f1( j : 0, 3 );
+    f1( i : 3, j : 0 );
+    f1( j : 0, i : 3 );
+    f1( [j, i] : f2() );
+}
Index: src/Tests/Syntax/NumericConstants.c
===================================================================
--- src/Tests/Syntax/NumericConstants.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/NumericConstants.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,54 @@
+int main() {
+    1;							/* decimal */
+    2_1;
+    2_147_483_647;
+    37LL;
+    45ull;
+    89llu;
+    99LLu;
+    56_lu;
+    88_LLu;
+
+//    0;							/* octal */
+    0u;
+    0_3_77;
+    0_377_ul;
+
+    0x1;						/* hexadecimal */
+    0x1u;
+    0xabL;
+    0x_80000000;
+    0x_fff;
+    0x_ef3d_aa5c;
+    0x_3LL;
+
+    3.;							/* integral real */
+    3_100.;
+    1_000_000.;
+
+    3.1;						/* integral/fractional real */
+    3.141_592_654L;
+    123_456.123_456;
+
+    3E1;						/* integral/exponent real */
+    3_e1f;
+    3_E1_1_F;
+    3_E_11;
+    3_e_+11;
+    3_E_-11;
+
+    3.0E1;						/* integral/fractional/exponent real */
+    3.0_E1L;
+    3.0_e1_1;
+    3.0_E_11_l;
+    3.0_e_+11l;
+    3.0_E_-11;
+    123_456.123_456E-16;
+
+    0x_ff.ffp0;						/* hex real */
+    0x_1.ffff_ffff_p_128_l;
+}
+
+// Local Variables: //
+// compile-command: "../../../bin/cfa -std=c99 NumericConstants.c" //
+// End: //
Index: src/Tests/Syntax/Scope.c
===================================================================
--- src/Tests/Syntax/Scope.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/Scope.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,68 @@
+int x;
+typedef double y;
+typedef float t;
+y z;
+type u = struct { int a; double b; };
+int f( int y );
+y q;
+
+y w(y y, u v) {
+    type x | { x t(u); };
+    u u = y;
+    x z = t(u);
+}
+
+y p;
+
+context has_u( type z )
+{
+  forall( type t ) z u(t);
+};
+
+forall( type t | has_u( t ) )
+y q( t the_t )
+{
+    t y = u( the_t );
+}
+
+t f( y p ) {
+    int y;
+    typedef char x;
+
+    {
+	x y;
+	typedef x z;
+
+	{
+	    z x;
+	    typedef z y;
+	    y z = x;
+	}
+
+	z x = y;
+    }
+
+    x q = y;
+}
+
+t g( void ) {
+    typedef char x;
+    try {
+	some_func();
+    } catch ( x x ) {
+	t y = x;
+    }
+    x z;
+}
+
+y q(i)							/* K&R style */
+    int i;
+{
+    switch (i) {
+	y q = i;
+      case 0:
+	return q;
+      default:
+	return i;
+    }
+}
Index: src/Tests/Syntax/StructMember.c
===================================================================
--- src/Tests/Syntax/StructMember.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/StructMember.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,40 @@
+typedef int T;
+
+struct S {
+    int m1:3, m2:4;
+    int :2;
+    int :3, :4;
+    int m3;
+    int m4, m5, m6;
+    int *m7, *m8, *m9;
+    int (*m10)();
+    int *(*m11)(int);
+    T T;
+    T (T);
+
+// Cforall extensions
+
+    * int m12, m13;
+    * [ * int ] (int) m14;
+    int ;
+    int , , ;
+    int * , , ;
+    int *, *, *;
+    * int , , ;
+    int (*)();
+    int (**)( int );
+    T ;
+
+// errors
+
+//    void f(void);
+};
+
+struct S s;
+
+union U {
+    [5] int m1;
+    int m2[5];
+    * int m3;
+    int *m4;
+} u;
Index: src/Tests/Syntax/Subrange.c
===================================================================
--- src/Tests/Syntax/Subrange.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/Subrange.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,63 @@
+// A small context defining the notion of an ordered type.  (The standard
+// library should probably contain a context for this purpose.)
+context ordered(type T) {
+    int ?<?(T, T), ?<=?(T, T);
+};
+
+// A subrange type resembling an Ada subtype with a base type and a range
+// constraint.
+type subrange(type base_t | ordered(base_t), base_t low = 0, base_t high = 8) = base_t;
+
+// Note that subrange() can be applied to floating-point and pointer types, not
+// just integral types.
+//   This requires a "type generator" extension to Cforall.  Type generators
+// must accept type and non-type parameters, which is beyond what we discussed
+// previously.  Type parameters must be usable in the declaration of
+// subsequent parameters: parameter T is used to declare parameters "low"
+// and "high".
+
+// Example usage:
+subrange(unsigned, 1, 31) day_of_month;
+subrange(char, 'a', 'z')  lcase;
+subrange(int, 0, (rand() & 0xF) ) foo;
+
+// What sorts of expressions can be used as arguments of type generators?  Is
+// "subrange(int, 0, rand() & 0xF)" legal?  Probably.  The nearest C equivalent
+// to the "low" and "high" arguments is the array size in a variable-length
+// array declaration, and C allows assignment expressions there.
+
+// Convenient access to subrange bounds, for instance for iteration:
+forall (type T, T low, T high)
+T lbound( subrange(T, low, high) v) {
+    return low;
+}
+
+forall (type T, T low, T high)
+T hbound( subrange(T, low, high) v) {
+    return high;
+}
+
+// Example usage:
+unsigned lday = lbound(day_of_month);
+
+// Assignment from the base type, with bounds checking.  I'll ignore the issue
+// of exception handling here.  Inlining allows the compiler to eliminate
+// bounds checks.
+forall (type T | ordered(T), T low, T high)
+inline subrange(T, low, high) ?=?(subrange(T, low, high)* target, T source) {
+    if (low <= source && source <= high) *((T*)target) = source;
+    else abort();
+    return target;
+}
+
+// Assignment between subranges with a common base type.  The bounds check
+// compares range bounds so that the compiler can optimize checks away when the
+// ranges are known to overlap.
+forall (type T | ordered(T), T t_low, T t_high, T s_low, T s_high)
+inline subrange(T, t_low, t_high) ?=?(subrange(T, t_low, t_high)* target,
+				      subrange(T, s_low, s_high) source) {
+    if ( (t_low <= s_low || t_low <= source)
+	 && (s_high <= t_high || source <= t_high) ) *((T*)target) = source;
+    else abort();
+    return target;
+}
Index: src/Tests/Syntax/Switch.c
===================================================================
--- src/Tests/Syntax/Switch.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/Switch.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,42 @@
+int fred() {
+    int i;
+    switch ( i ) case 3 : i = 1;
+    switch ( i ) default : i = 1;
+    switch ( 3 )
+      default:
+      case 2:
+      case 3:
+	3;
+
+    switch ( i ) {
+    }
+
+    switch ( i ) {
+	int i;
+      case 8~10:
+      default:
+	i = 3;
+      case 3:
+      case 'A' ... 'Z':
+      case 5 ... 6:
+      case 2, 4:
+	i = 3;
+	break;
+    }
+
+    choose ( i ) case 3 : i = 1;
+    choose ( i ) default : i = 1;
+    choose ( i ) {
+	int i;
+      case 3:
+      case 'A' ... 'Z':
+      case 5 ... 6:
+      case 2, 4, 7:
+	i = 3;
+	fallthru;
+      default:
+	i = 3;
+      case 8~10:
+	fallthru
+    }
+}
Index: src/Tests/Syntax/Tuple.c
===================================================================
--- src/Tests/Syntax/Tuple.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/Tuple.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,66 @@
+int f( int, int );
+int g( int, int, int );
+static [ int, int, int, int ] h( int a, int b, * int c, [] char d );
+
+struct inner {
+    int f2, f3;
+};
+
+struct outer {
+    int f1;
+    struct inner i;
+    double f4;
+} s, *sp;
+
+const volatile [ int, int ] t1;
+static const [ int, const int ] t2;
+const static [ int, const int ] t3;
+
+[ int rc ] printf( * char fmt, ... );
+int printf( char *fmt, ... );
+
+[ short x, unsigned y ] f1( int w ) {
+    [ y, x ] = [ x, y ] = [ w, 23 ];
+}
+
+[ [ int, char, long, int ] r ] g1() {
+    short x, p;
+    unsigned int y;
+    [ int, int ] z;
+
+    [ x, y, z ] = [ p, f( 17 ), 3 ];
+    r = [ x, y, z ];
+}
+
+[ int rc ] main( int argc, ** char argv ) {
+    int a, b, c, d;
+    struct outer t = { .[ f1,f4 ] : [ 1,7.0 ] };
+    f( [ 3,5 ] );
+    g( [ 3,5 ], 3 );
+    f( t1 );
+    g( t1, 3 );
+
+    [ ,,, ];						/* empty tuple */
+    [ 3,5 ];
+    [ a,b ] = 3;
+    [ a,b ] = [ 4.6 ];
+    [ a,b ] = [ c,d ] = [ 3,5 ];
+    [ a,b,[ c ] ] = [ 2,[ a,b ] ];
+    [ a,b ] = 3 > 4 ? [ b,6 ] : [ 7,8 ];
+
+    t1 = [ a,b ];
+    t1 = [ a, ];					/* semantic error */
+    t1 = t2 = [ a,b ];
+    [ a,b ] = [ c,d ] = d += c += 1;
+    [ a,b ] = [ c,d ] = t1;
+    [ a,b ] = t1 = [ c,d ];
+    [ a,b ] = t1 = t2 = [ c,d ];
+    t1 = [ 3,4 ] = [ 3,4 ] = t1 = [ 3,4 ];
+
+    s.[ f1, i.[ f2, f3 ], f4 ] = [ 11, 12, 13, 3.14159 ];
+    s.[ f1, i.[ f2, f3 ], f4 ] = h( 3, 3, 0, "abc" );
+    [ a, ,b, ] = h( 3, 3, 0, "abc" );			/* ignore some results */
+    sp->[ f4,f1 ] = sp->[ f1,f4 ];
+    printf( "expecting 3, 17, 23, 4; got %d, %d, %d, %d\n", s.[ f4, i.[ f3,f2 ], f1 ] );
+    rc = 0;
+}
Index: src/Tests/Syntax/TypeGenerator.c
===================================================================
--- src/Tests/Syntax/TypeGenerator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/TypeGenerator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,25 @@
+context addable(type T) {
+   T ?+?(T,T);
+};
+
+type List(type T | addable(T) ) | addable(T) = struct { T data; List(T) *next; } *;
+typedef List(int) ListOfIntegers;
+ListOfIntegers li;
+int f( List(int) ((*g))(int) );
+[int] h( * List(int) p ); // new declaration syntax
+
+struct(type T) S1;			// forward definition
+struct(type T) S1 { T i; };		// actual definition
+struct(int) S1 v1, *p;			// expansion and instantiation
+struct(type T)(int) S2 { T i; } v2;	// actual definition, expansion and instantiation
+struct(type T)(int) { T i; } v2;	// anonymous actual definition, expansion and instantiation
+
+struct(type T | addable(T) ) node { T data; struct(T) node *next; };
+type List(type T) = struct(T) node *;
+List(int) my_list;
+
+type Complex | addable(Complex);
+
+int main() {
+    (struct(int) node)my_list;
+}
Index: src/Tests/Syntax/Typedef.c
===================================================================
--- src/Tests/Syntax/Typedef.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/Typedef.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,43 @@
+typedef int T;
+
+void f( void ) {
+    int T( T );
+    T( 3 );
+}
+
+struct {
+    T (T);
+} fred = { 3 };
+
+typedef int (*a)(int, char);
+a b;
+
+int g(void) {
+    double a;
+}
+a c;
+
+typedef typeof(3) x, y;  /* GCC */
+
+x p;
+y q;
+
+int main() {
+    typedef typeof(3) z, p;
+    z w;
+    p x;
+}
+
+/* new-style function definitions */
+
+typedef [10] * int arrayOf10Pointers;
+arrayOf10Pointers array;
+typedef const * int constantPointer;
+typedef * [ int ]( [] int ) funcPtr;
+typedef [ int ] funcProto( []  int );
+typedef [ int, int ] tupleType;
+typedef * [ int, int ] tupleTypePtr;
+typedef * int a, b;
+typedef [ int ] f( * int ), g;
+typedef [ * [static 10] int ] t;
+typedef [ * [static 10] int x ] f();
Index: src/Tests/Syntax/TypedefDeclarator.c
===================================================================
--- src/Tests/Syntax/TypedefDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/TypedefDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,116 @@
+typedef int
+     f0,  f1,  f2,  f3,  f4,  f5,  f6,  f7,  f8,  f9,
+    f10, f11, f12, f13, f14, f15, f16, f17, f18, f19,
+    f20, f21, f22, f23, f24, f25, f26, f27, f28, f29,
+    f30, f31, f32, f33, f34, f35, f36, f37, f38, f39,
+    f40, f41, f42, f43, f44, f45, f46, f47, f48, f49,
+    f50, f51, f52, f53, f54, f55, f56, f57, f58, f59,
+    f60, f61, f62, f63, f64, f65, f66, f67, f68, f69,
+    f70, f71, f72, f73, f74, f75, f76, f77, f78, f79,
+    f80, f81, f82, f83, f84, f85, f86, f87, f88, f89;
+
+int main() {
+    //int f0[]();
+    //int (f0[])();
+    //int f0()[];
+    //int f0()();
+    //int (*f0)()();
+    //int ((*f0())())[];
+    
+    int f1;
+    int (f2);
+
+    int *f3;
+    int **f4;
+    int * const *f5;
+    int * const * const f6;
+
+    int *(f7);
+    int **(f8);
+    int * const *(f9);
+    int * const * const (f10);
+
+    int (*f11);
+    int (**f12);
+    int (* const *f13);
+    int (* const * const f14);
+
+    int f15[];
+    int f16[10];
+    int (f17[]);
+    int (f18[10]);
+
+    int *f19[];
+    int *f20[10];
+    int **f21[];
+    int **f22[10];
+    int * const *f23[];
+    int * const *f24[10];
+    int * const * const f25[];
+    int * const * const f26[10];
+
+    int *(f27[]);
+    int *(f28[10]);
+    int **(f29[]);
+    int **(f30[10]);
+    int * const *(f31[]);
+    int * const *(f32[10]);
+    int * const * const (f33[]);
+    int * const * const (f34[10]);
+
+    int (*f35[]);
+    int (*f36[10]);
+    int (**f37[]);
+    int (**f38[10]);
+    int (* const *f39[]);
+    int (* const *f40[10]);
+    int (* const * const f41[]);
+    int (* const * const f42[10]);
+
+    int f43[][3];
+    int f44[3][3];
+    int (f45[])[3];
+    int (f46[3])[3];
+    int ((f47[]))[3];
+    int ((f48[3]))[3];
+
+    int *f49[][3];
+    int *f50[3][3];
+    int **f51[][3];
+    int **f52[3][3];
+    int * const *f53[][3];
+    int * const *f54[3][3];
+    int * const * const f55[][3];
+    int * const * const f56[3][3];
+
+    int (*f57[][3]);
+    int (*f58[3][3]);
+    int (**f59[][3]);
+    int (**f60[3][3]);
+    int (* const *f61[][3]);
+    int (* const *f62[3][3]);
+    int (* const * const f63[][3]);
+    int (* const * const f64[3][3]);
+
+    int f65(int);
+    int (f66)(int);
+
+    int *f67(int);
+    int **f68(int);
+    int * const *f69(int);
+    int * const * const f70(int);
+
+    int *(f71)(int);
+    int **(f72)(int);
+    int * const *(f73)(int);
+    int * const * const (f74)(int);
+
+    int (*f75)(int);
+    int (**f76)(int);
+    int (* const *f77)(int);
+    int (* const * const f78)(int);
+
+    int (*(*f79)(int))();
+    int (*(* const f80)(int))();
+    int (* const(* const f81)(int))();
+}
Index: src/Tests/Syntax/TypedefParamDeclarator.c
===================================================================
--- src/Tests/Syntax/TypedefParamDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/TypedefParamDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,150 @@
+typedef int
+     f0,   f1,   f2,   f3,   f4,   f5,   f6,   f7,   f8,   f9,
+    f10,  f11,  f12,  f13,  f14,  f15,  f16,  f17,  f18,  f19,
+    f20,  f21,  f22,  f23,  f24,  f25,  f26,  f27,  f28,  f29,
+    f30,  f31,  f32,  f33,  f34,  f35,  f36,  f37,  f38,  f39,
+    f40,  f41,  f42,  f43,  f44,  f45,  f46,  f47,  f48,  f49,
+    f50,  f51,  f52,  f53,  f54,  f55,  f56,  f57,  f58,  f59,
+    f60,  f61,  f62,  f63,  f64,  f65,  f66,  f67,  f68,  f69,
+    f70,  f71,  f72,  f73,  f74,  f75,  f76,  f77,  f78,  f79,
+    f80,  f81,  f82,  f83,  f84,  f85,  f86,  f87,  f88,  f89,
+    f90,  f91,  f92,  f93,  f94,  f95,  f96,  f97,  f98,  f99,
+    f100, f101, f102, f103, f104, f105, f106, f107, f108, f109,
+    f110, f111, f112, f113, f114, f115, f116, f117, f118, f119;
+
+int fred(
+/*
+    //int f0[](),
+    //int (f0[])(),
+    //int f0()[],
+    //int f0()(),
+    //int (*f0)()(),
+    //int ((*f0())())[],
+*/
+    int f1,
+
+    int *f3,
+    int **f4,
+    int * const *f5,
+    int * const * const f6,
+
+    int (*f11),
+    int (**f12),
+    int (* const *f13),
+    int (* const * const f14),
+
+    int f15[],
+    int f16[10],
+
+    int *f19[],
+    int *f20[10],
+    int **f21[],
+    int **f22[10],
+    int * const *f23[],
+    int * const *f24[10],
+    int * const * const f25[],
+    int * const * const f26[10],
+
+    int (*f35[]),
+    int (*f36[10]),
+    int (**f37[]),
+    int (**f38[10]),
+    int (* const *f39[]),
+    int (* const *f40[10]),
+    int (* const * const f41[]),
+    int (* const * const f42[10]),
+
+    int f43[][3],
+    int f44[3][3],
+/*
+    int (f45[])[3],
+    int (f46[3])[3],
+    int ((f47[]))[3],
+    int ((f48[3]))[3],
+*/
+    int *f49[][3],
+    int *f50[3][3],
+    int **f51[][3],
+    int **f52[3][3],
+    int * const *f53[][3],
+    int * const *f54[3][3],
+    int * const * const f55[][3],
+    int * const * const f56[3][3],
+
+    int (*f57[][3]),
+    int (*f58[3][3]),
+    int (**f59[][3]),
+    int (**f60[3][3]),
+    int (* const *f61[][3]),
+    int (* const *f62[3][3]),
+    int (* const * const f63[][3]),
+    int (* const * const f64[3][3]),
+
+    int f65(int),
+/*
+    int (f66)(int),
+*/
+    int *f67(int),
+    int **f68(int),
+    int * const *f69(int),
+    int * const * const f70(int),
+/*
+    int *(f71)(int),
+    int **(f72)(int),
+    int * const *(f73)(int),
+    int * const * const (f74)(int),
+*/
+    int (*f75)(int),
+    int (**f76)(int),
+    int (* const *f77)(int),
+    int (* const * const f78)(int),
+
+    int (*(*f79)(int))(),
+    int (*(* const f80)(int))(),
+    int (* const(* const f81)(int))(),
+
+    int f82[const *],
+    int f83[const 3],
+    int f84[static 3],
+    int f85[static const 3],
+
+    int (f86[const *]),
+    int (f87[const 3]),
+    int (f88[static 3]),
+    int (f89[static const 3]),
+
+    int *f90[const *],
+    int *f91[const 3],
+    int **f92[static 3],
+    int * const *f93[static const 3],
+    int * const * const f94[static const 3],
+
+    int *(f95[const *]),
+    int *(f96[const 3]),
+    int **(f97[static 3]),
+    int * const *(f98[static const 3]),
+    int * const * const (f99[static const 3]),
+
+    int f100[const *][3],
+    int f101[const 3][3],
+    int f102[static 3][3],
+    int f103[static const 3][3],
+
+    int (f104[const *][3]),
+    int (f105[const 3][3]),
+    int (f106[static 3][3]),
+    int (f107[static const 3][3]),
+
+    int *f108[const *][3],
+    int *f109[const 3][3],
+    int **f110[static 3][3],
+    int * const *f111[static const 3][3],
+    int * const * const f112[static const 3][3],
+
+    int *(f113[const *][3]),
+    int *(f114[const 3][3]),
+    int **(f115[static 3][3]),
+    int * const *(f116[static const 3][3]),
+    int * const * const (f117[static const 3][3])
+    ) {
+}
Index: src/Tests/Syntax/Typeof.c
===================================================================
--- src/Tests/Syntax/Typeof.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/Typeof.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,10 @@
+int main() {
+    int *v1;
+    typeof(v1) v2;
+    typeof(*v1) v3[4];
+    char *v4[4];
+    typeof(typeof(char *)[4]) v5;
+    typeof (int *) v6;
+    typeof( int ( int, int p ) ) *v7;
+    typeof( [int] ( int, int p ) ) *v8;
+}
Index: src/Tests/Syntax/VariableDeclarator.c
===================================================================
--- src/Tests/Syntax/VariableDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/Syntax/VariableDeclarator.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,162 @@
+int f1;
+int (f2);
+
+int *f3;
+int **f4;
+int * const *f5;
+int * const * const f6;
+
+int *(f7);
+int **(f8);
+int * const *(f9);
+int * const * const (f10);
+
+int (*f11);
+int (**f12);
+int (* const *f13);
+int (* const * const f14);
+
+int f15[];
+int f16[10];
+int (f17[]);
+int (f18[10]);
+
+int *f19[];
+int *f20[10];
+int **f21[];
+int **f22[10];
+int * const *f23[];
+int * const *f24[10];
+int * const * const f25[];
+int * const * const f26[10];
+
+int *(f27[]);
+int *(f28[10]);
+int **(f29[]);
+int **(f30[10]);
+int * const *(f31[]);
+int * const *(f32[10]);
+int * const * const (f33[]);
+int * const * const (f34[10]);
+
+int (*f35)[];
+int (*f36)[10];
+int (**f37)[];
+int (**f38)[10];
+int (* const *f39)[];
+int (* const *f40)[10];
+int (* const * const f41)[];
+int (* const * const f42)[10];
+
+int f43[][3];
+int f44[3][3];
+int (f45[])[3];
+int (f46[3])[3];
+int ((f47[]))[3];
+int ((f48[3]))[3];
+
+int *f49[][3];
+int *f50[3][3];
+int **f51[][3];
+int **f52[3][3];
+int * const *f53[][3];
+int * const *f54[3][3];
+int * const * const f55[][3];
+int * const * const f56[3][3];
+
+int (*f57[][3]);
+int (*f58[3][3]);
+int (**f59[][3]);
+int (**f60[3][3]);
+int (* const *f61[][3]);
+int (* const *f62[3][3]);
+int (* const * const f63[][3]);
+int (* const * const f64[3][3]);
+
+int f65(int);
+int (f66)(int);
+
+int *f67(int);
+int **f68(int);
+int * const *f69(int);
+int * const * const f70(int);
+
+int *(f71)(int);
+int **(f72)(int);
+int * const *(f73)(int);
+
+int * const * const (f74)(int);
+
+int (*f75)(int);
+int (**f76)(int);
+int (* const *f77)(int);
+int (* const * const f78)(int);
+
+int (*(*f79)(int))();
+int (*(* const f80)(int))();
+int (* const(* const f81)(int))();
+
+// errors
+
+//int fe0[]();				// array of functions
+//int (fe1[])();				// array of functions
+//int fe2()[];				// returning an array
+//int fe3()();				// returning a function
+//int (*fe4)()();				// returning a function
+//int ((*fe5())())[];			// returning an array
+
+// Cforall extensions
+
+* int cf3;
+* * int cf4;
+* const * int cf5;
+const * const * int cf6;
+
+[] int cf15;
+[10] int cf16;
+
+[] * int cf19;
+[10] * int cf20;
+int **cf21[];
+[10] * * int cf22;
+[] * const * int cf23;
+[10] * const * int cf24;
+[] const * const * int cf25;
+[10] const * const * int cf26;
+
+* [] int cf35;
+* [10] int cf36;
+* * [] int cf37;
+* * [10] int cf38;
+* const * [] int cf39;
+* const * [10] int cf40;
+const * const * [] int cf41;
+const * const * [10] int cf42;
+
+[][3] int cf43;
+[3][3] int cf44;
+
+[][3] * int cf49;
+[3][3] * int cf50;
+[][3] * * int cf51;
+[3][3] * * int cf52;
+[][3] const * int cf53;
+[3][3] * const * int cf54;
+[][3] const * const * int cf55;
+[3][3] const * const * int cf56;
+
+[int] cf65(int);
+[int] cf66(int);
+
+[* int] cf67(int);
+[* * int] cf68(int);
+[const * * int] cf69(int);
+[const * const * int] cf70(int);
+
+
+* [20] double z;
+[20] * char w;
+
+// function pointer
+
+*[]*[]* [ *[]*[] int ]( *[]*[] int, *[]*[] int ) v3;
Index: src/Tests/TupleAssign/Initialization2.c
===================================================================
--- src/Tests/TupleAssign/Initialization2.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/TupleAssign/Initialization2.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,15 @@
+int a = 3;
+struct { int x; int y; } z = { 3, 7 };      /* OK */
+struct { int x; int y; } z1 = { .[x,y]:3 }; /* OK */
+struct { int x; int y; } z2 = { y:3, x:4 }; /* OK */
+struct { int x; struct { int y1; int y2; } y; } z3 = { x:3, y:{y1:4, y2:5} };  /* OK */
+struct { int x; struct { int y1; int y2; } y; } z3 = { y:{y2:9, y1:8}, x:7 };  /* OK */
+struct { int x; struct { int y1; int y2; } y; } z3 = { x:7, {y2:9, y1:8} };  /* OK */
+struct { int x; struct { int y1; int y2; } y; } z3 = { 3, {4, 5} };   /* OK */
+//struct { int x; struct { int y1; int y2; } } z3 = {4, {5,6}};
+//struct { int x; struct { int y1; int y2; } y; } z4 = { y:{4,5}, a:3 };
+//struct { int x; struct { int y1; int y2; } y; } z5 = { a:3, {4,5}};
+//int x[20] = { [10]: 4 };
+struct t { int a, b; };
+struct t x = { b:4, a:3 };
+struct { int x; int y; } z6= {5,6,4};  /* (should be an) error */
Index: src/Tests/gcc/900407-1.c
===================================================================
--- src/Tests/gcc/900407-1.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/gcc/900407-1.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,9 @@
+foo (int a, int b, int *p)
+{
+  int c;
+  p[2] = a + 0x1000;
+  c = b + 0xffff0000;
+  if ((b + 0xffff0000) == 2)
+    c++;
+  p[2] = c;
+}
Index: src/Tests/gcc/900516-1.c
===================================================================
--- src/Tests/gcc/900516-1.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/gcc/900516-1.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,2 @@
+/* added 'int' to argument */
+f(int c) { return!(c?2.0:1.0); }
Index: src/Tests/gcc/920301-1.c
===================================================================
--- src/Tests/gcc/920301-1.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/gcc/920301-1.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,2 @@
+f() {static void*t[];/*={&&x};*/ x:y:;}
+g() {static unsigned p[5];}
Index: src/Tests/gcc/920409-1.c
===================================================================
--- src/Tests/gcc/920409-1.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/gcc/920409-1.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,1 @@
+x() {int y;y>0.0?y:y-1;}
Index: src/Tests/gcc/920409-2.c
===================================================================
--- src/Tests/gcc/920409-2.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/gcc/920409-2.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,2 @@
+double x() {int x1,x2;double v;
+if (((long)(x1-x2))<1)return -1.0;v=t(v);v=y(1,v>0.0?(int)v:((int)v-1));}
Index: src/Tests/gcc/920410-2.c
===================================================================
--- src/Tests/gcc/920410-2.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/gcc/920410-2.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,12 @@
+joe()
+  {
+    int j;
+
+    while ( 1 )
+      {
+	for ( j = 0; j < 4; j++ )
+	  ;
+	for ( j = 0; j < 4; j++ )
+	  ;
+      }
+  }
Index: src/Tests/gcc/920501-1.c
===================================================================
--- src/Tests/gcc/920501-1.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/gcc/920501-1.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,1 @@
+a() {int**b[]={&&c};c:;}
Index: src/Tests/gcc/920501-11.c
===================================================================
--- src/Tests/gcc/920501-11.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/gcc/920501-11.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,1 @@
+typedef struct{int s;}S;foo() {int i=(int)&(S) {(void*)((int)&(S) {1})};}
Index: src/Tests/gcc/920501-19.c
===================================================================
--- src/Tests/gcc/920501-19.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
+++ src/Tests/gcc/920501-19.c	(revision 843054c23fcb725d2486e5e42e91b3741bc523b8)
@@ -0,0 +1,1 @@
+long long x=0;y() {x=0;}
