Index: src/tests/.expect/32/extension.txt
===================================================================
--- src/tests/.expect/32/extension.txt	(revision ccb447e9609db81bd657114979c4e4e539785111)
+++ src/tests/.expect/32/extension.txt	(revision ccb447e9609db81bd657114979c4e4e539785111)
@@ -0,0 +1,114 @@
+extern void *malloc(unsigned int __size);
+extern void free(void *__ptr);
+extern void abort(void);
+extern int atexit(void (*__func)(void));
+extern void exit(int __status);
+extern int printf(const char *__restrict __format, ...);
+__extension__ int __a__i_1;
+__extension__ int __b__i_1;
+__extension__ int __c__i_1;
+__extension__ struct S {
+    __extension__ int __a__i_1;
+    __extension__ int __b__i_1;
+    __extension__ int __c__i_1;
+};
+static inline struct S ___operator_assign__F2sS_P2sS2sS_autogen___1(struct S *___dst__P2sS_1, struct S ___src__2sS_1){
+    ((void)((*___dst__P2sS_1).__a__i_1=___src__2sS_1.__a__i_1));
+    ((void)((*___dst__P2sS_1).__b__i_1=___src__2sS_1.__b__i_1));
+    ((void)((*___dst__P2sS_1).__c__i_1=___src__2sS_1.__c__i_1));
+    return ((struct S )___src__2sS_1);
+}
+static inline void ___constructor__F_P2sS_autogen___1(struct S *___dst__P2sS_1){
+    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))) /* ?{} */);
+}
+static inline void ___constructor__F_P2sS2sS_autogen___1(struct S *___dst__P2sS_1, struct S ___src__2sS_1){
+    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))=___src__2sS_1.__a__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))=___src__2sS_1.__b__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))=___src__2sS_1.__c__i_1) /* ?{} */);
+}
+static inline void ___destructor__F_P2sS_autogen___1(struct S *___dst__P2sS_1){
+    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))) /* ^?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))) /* ^?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))) /* ^?{} */);
+}
+static inline void ___constructor__F_P2sSi_autogen___1(struct S *___dst__P2sS_1, int __a__i_1){
+    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))=__a__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))) /* ?{} */);
+}
+static inline void ___constructor__F_P2sSii_autogen___1(struct S *___dst__P2sS_1, int __a__i_1, int __b__i_1){
+    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))=__a__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))=__b__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))) /* ?{} */);
+}
+static inline void ___constructor__F_P2sSiii_autogen___1(struct S *___dst__P2sS_1, int __a__i_1, int __b__i_1, int __c__i_1){
+    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))=__a__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))=__b__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))=__c__i_1) /* ?{} */);
+}
+__extension__ union U {
+    __extension__ int __a__i_1;
+    __extension__ int __b__i_1;
+    __extension__ int __c__i_1;
+};
+static inline union U ___operator_assign__F2uU_P2uU2uU_autogen___1(union U *___dst__P2uU_1, union U ___src__2uU_1){
+    void *_tmp_cp_ret0;
+    ((void)((_tmp_cp_ret0=__builtin_memcpy(((void *)___dst__P2uU_1), ((const void *)(&___src__2uU_1)), sizeof(union U ))) , _tmp_cp_ret0));
+    ((void)(_tmp_cp_ret0) /* ^?{} */);
+    return ((union U )___src__2uU_1);
+}
+static inline void ___constructor__F_P2uU_autogen___1(union U *___dst__P2uU_1){
+}
+static inline void ___constructor__F_P2uU2uU_autogen___1(union U *___dst__P2uU_1, union U ___src__2uU_1){
+    void *_tmp_cp_ret1;
+    ((void)((_tmp_cp_ret1=__builtin_memcpy(((void *)___dst__P2uU_1), ((const void *)(&___src__2uU_1)), sizeof(union U ))) , _tmp_cp_ret1));
+    ((void)(_tmp_cp_ret1) /* ^?{} */);
+    return ((void)___src__2uU_1);
+}
+static inline void ___destructor__F_P2uU_autogen___1(union U *___dst__P2uU_1){
+}
+__extension__ enum E {
+    __R__C2eE_1,
+    __G__C2eE_1,
+    __B__C2eE_1,
+};
+__extension__ int __fred__Fi_i__1(int __p__i_1){
+    __extension__ struct S {
+        __extension__ int __a__i_2;
+        __extension__ int __b__i_2;
+        __extension__ int __c__i_2;
+    };
+    int __i__i_2;
+    ((void)((*((int *)(&__i__i_2)))=(__extension__ __a__i_1+__extension__ 3)) /* ?{} */);
+    ((void)__extension__ 3);
+    ((void)__extension__ __a__i_1);
+    __extension__ int __a__i_2;
+    __extension__ int __b__i_2;
+    __extension__ int __c__i_2;
+    ((void)(__extension__ __a__i_2=(__extension__ __b__i_2+__extension__ __c__i_2)));
+    int _tmp_cp_ret2;
+    ((void)((_tmp_cp_ret2=__extension__ __fred__Fi_i__1(3)) , _tmp_cp_ret2));
+    ((void)(_tmp_cp_ret2) /* ^?{} */);
+    ((void)__extension__ sizeof(3));
+    ((void)__extension__ (((int )(3!=0)) || ((int )(4!=0))));
+    ((void)__extension__ __alignof__(__extension__ __a__i_2));
+    ((void)(((int )(__extension__ __a__i_2!=0)) || ((int )((((int )(__extension__ __b__i_2!=0)) && ((int )(__extension__ __c__i_2!=0)))!=0))));
+    ((void)(((int )((__extension__ __a__i_2>__extension__ __b__i_2)!=0)) ? __extension__ __c__i_2 : __extension__ __c__i_2));
+    ((void)(__extension__ __a__i_2=__extension__ (__extension__ __b__i_2+__extension__ __c__i_2)));
+    ((void)((__extension__ __a__i_2 , __extension__ __b__i_2) , __extension__ __c__i_2));
+}
+__attribute__ ((constructor(),)) static void _init_extension(void){
+    int _global_init0;
+    ((void)((*((int *)(&__a__i_1)))=_global_init0) /* ?{} */);
+    int _global_init1;
+    ((void)((*((int *)(&__b__i_1)))=_global_init1) /* ?{} */);
+    int _global_init2;
+    ((void)((*((int *)(&__c__i_1)))=_global_init2) /* ?{} */);
+}
+__attribute__ ((destructor(),)) static void _destroy_extension(void){
+    ((void)((*((int *)(&__c__i_1)))) /* ^?{} */);
+    ((void)((*((int *)(&__b__i_1)))) /* ^?{} */);
+    ((void)((*((int *)(&__a__i_1)))) /* ^?{} */);
+}
Index: src/tests/.expect/32/gccExtensions.txt
===================================================================
--- src/tests/.expect/32/gccExtensions.txt	(revision ccb447e9609db81bd657114979c4e4e539785111)
+++ src/tests/.expect/32/gccExtensions.txt	(revision ccb447e9609db81bd657114979c4e4e539785111)
@@ -0,0 +1,167 @@
+extern void *malloc(unsigned int __size);
+extern void free(void *__ptr);
+extern void abort(void);
+extern int atexit(void (*__func)(void));
+extern void exit(int __status);
+extern int printf(const char *__restrict __format, ...);
+int main(int __argc__i_1, const char **__argv__PPCc_1){
+    asm ( "nop" :  :  :  );
+    asm ( "nop" :  :  :  );
+    asm ( "nop" :  :  :  );
+    double _Complex __c1__Xd_2;
+    double _Complex __c2__Xd_2;
+    const int __i1__Ci_2;
+    const int __i2__Ci_2;
+    const int __i3__Ci_2;
+    __extension__ const int __ex__Ci_2;
+    struct S {
+        __extension__ int __a__i_2;
+        __extension__ int __b__i_2;
+        __extension__ int __c__i_2;
+    };
+    inline struct S ___operator_assign__F2sS_P2sS2sS_autogen___2(struct S *___dst__P2sS_2, struct S ___src__2sS_2){
+        ((void)((*___dst__P2sS_2).__a__i_2=___src__2sS_2.__a__i_2));
+        ((void)((*___dst__P2sS_2).__b__i_2=___src__2sS_2.__b__i_2));
+        ((void)((*___dst__P2sS_2).__c__i_2=___src__2sS_2.__c__i_2));
+        return ((struct S )___src__2sS_2);
+    }
+    inline void ___constructor__F_P2sS_autogen___2(struct S *___dst__P2sS_2){
+        ((void)((*((int *)(&(*___dst__P2sS_2).__a__i_2)))) /* ?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__b__i_2)))) /* ?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__c__i_2)))) /* ?{} */);
+    }
+    inline void ___constructor__F_P2sS2sS_autogen___2(struct S *___dst__P2sS_2, struct S ___src__2sS_2){
+        ((void)((*((int *)(&(*___dst__P2sS_2).__a__i_2)))=___src__2sS_2.__a__i_2) /* ?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__b__i_2)))=___src__2sS_2.__b__i_2) /* ?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__c__i_2)))=___src__2sS_2.__c__i_2) /* ?{} */);
+    }
+    inline void ___destructor__F_P2sS_autogen___2(struct S *___dst__P2sS_2){
+        ((void)((*((int *)(&(*___dst__P2sS_2).__c__i_2)))) /* ^?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__b__i_2)))) /* ^?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__a__i_2)))) /* ^?{} */);
+    }
+    inline void ___constructor__F_P2sSi_autogen___2(struct S *___dst__P2sS_2, int __a__i_2){
+        ((void)((*((int *)(&(*___dst__P2sS_2).__a__i_2)))=__a__i_2) /* ?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__b__i_2)))) /* ?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__c__i_2)))) /* ?{} */);
+    }
+    inline void ___constructor__F_P2sSii_autogen___2(struct S *___dst__P2sS_2, int __a__i_2, int __b__i_2){
+        ((void)((*((int *)(&(*___dst__P2sS_2).__a__i_2)))=__a__i_2) /* ?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__b__i_2)))=__b__i_2) /* ?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__c__i_2)))) /* ?{} */);
+    }
+    inline void ___constructor__F_P2sSiii_autogen___2(struct S *___dst__P2sS_2, int __a__i_2, int __b__i_2, int __c__i_2){
+        ((void)((*((int *)(&(*___dst__P2sS_2).__a__i_2)))=__a__i_2) /* ?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__b__i_2)))=__b__i_2) /* ?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__c__i_2)))=__c__i_2) /* ?{} */);
+    }
+    int __i__i_2;
+    ((void)((*((int *)(&__i__i_2)))=__extension__ 3) /* ?{} */);
+    __extension__ int __a__i_2;
+    __extension__ int __b__i_2;
+    __extension__ int __c__i_2;
+    ((void)((__extension__ __a__i_2 , __extension__ __b__i_2) , __extension__ __c__i_2));
+    ((void)(__extension__ __a__i_2=(__extension__ __b__i_2+__extension__ __c__i_2)));
+    ((void)(__extension__ __a__i_2=__extension__ (__extension__ __b__i_2+__extension__ __c__i_2)));
+    inline int __f1__Fi___2(){
+    }
+    inline int __f2__Fi___2(){
+    }
+    int __s1__i_2;
+    int __s2__i_2;
+    int __t1___2;
+    int __t2___2;
+    volatile int __v1__Vi_2;
+    volatile int __v2__Vi_2;
+    int __a1__i_2;
+    const int __a2__Ci_2;
+    static const int __a3__Ci_2;
+    static const int __a4__Ci_2;
+    static const int __a5__Ci_2;
+    static const int __a6__Ci_2;
+    static const int __a7__Ci_2;
+    int *__p1__Pi_2;
+    int *__p2__Pi_2;
+    struct s1;
+    struct s2 {
+        int __i__i_2;
+    };
+    inline struct s2 ___operator_assign__F3ss2_P3ss23ss2_autogen___2(struct s2 *___dst__P3ss2_2, struct s2 ___src__3ss2_2){
+        ((void)((*___dst__P3ss2_2).__i__i_2=___src__3ss2_2.__i__i_2));
+        return ((struct s2 )___src__3ss2_2);
+    }
+    inline void ___constructor__F_P3ss2_autogen___2(struct s2 *___dst__P3ss2_2){
+        ((void)((*((int *)(&(*___dst__P3ss2_2).__i__i_2)))) /* ?{} */);
+    }
+    inline void ___constructor__F_P3ss23ss2_autogen___2(struct s2 *___dst__P3ss2_2, struct s2 ___src__3ss2_2){
+        ((void)((*((int *)(&(*___dst__P3ss2_2).__i__i_2)))=___src__3ss2_2.__i__i_2) /* ?{} */);
+    }
+    inline void ___destructor__F_P3ss2_autogen___2(struct s2 *___dst__P3ss2_2){
+        ((void)((*((int *)(&(*___dst__P3ss2_2).__i__i_2)))) /* ^?{} */);
+    }
+    inline void ___constructor__F_P3ss2i_autogen___2(struct s2 *___dst__P3ss2_2, int __i__i_2){
+        ((void)((*((int *)(&(*___dst__P3ss2_2).__i__i_2)))=__i__i_2) /* ?{} */);
+    }
+    struct s3 {
+        int __i__i_2;
+    };
+    inline struct s3 ___operator_assign__F3ss3_P3ss33ss3_autogen___2(struct s3 *___dst__P3ss3_2, struct s3 ___src__3ss3_2){
+        ((void)((*___dst__P3ss3_2).__i__i_2=___src__3ss3_2.__i__i_2));
+        return ((struct s3 )___src__3ss3_2);
+    }
+    inline void ___constructor__F_P3ss3_autogen___2(struct s3 *___dst__P3ss3_2){
+        ((void)((*((int *)(&(*___dst__P3ss3_2).__i__i_2)))) /* ?{} */);
+    }
+    inline void ___constructor__F_P3ss33ss3_autogen___2(struct s3 *___dst__P3ss3_2, struct s3 ___src__3ss3_2){
+        ((void)((*((int *)(&(*___dst__P3ss3_2).__i__i_2)))=___src__3ss3_2.__i__i_2) /* ?{} */);
+    }
+    inline void ___destructor__F_P3ss3_autogen___2(struct s3 *___dst__P3ss3_2){
+        ((void)((*((int *)(&(*___dst__P3ss3_2).__i__i_2)))) /* ^?{} */);
+    }
+    inline void ___constructor__F_P3ss3i_autogen___2(struct s3 *___dst__P3ss3_2, int __i__i_2){
+        ((void)((*((int *)(&(*___dst__P3ss3_2).__i__i_2)))=__i__i_2) /* ?{} */);
+    }
+    struct s3 __x1__3ss3_2;
+    ((void)___constructor__F_P3ss3_autogen___2(((struct s3 *)(&__x1__3ss3_2))));
+    struct s3 __y1__3ss3_2;
+    ((void)___constructor__F_P3ss3_autogen___2(((struct s3 *)(&__y1__3ss3_2))));
+    struct s4 {
+        int __i__i_2;
+    };
+    inline struct s4 ___operator_assign__F3ss4_P3ss43ss4_autogen___2(struct s4 *___dst__P3ss4_2, struct s4 ___src__3ss4_2){
+        ((void)((*___dst__P3ss4_2).__i__i_2=___src__3ss4_2.__i__i_2));
+        ((void)___destructor__F_P3ss3_autogen___2(((struct s3 *)(&__y1__3ss3_2))));
+        ((void)___destructor__F_P3ss3_autogen___2(((struct s3 *)(&__x1__3ss3_2))));
+        return ((struct s4 )___src__3ss4_2);
+    }
+    inline void ___constructor__F_P3ss4_autogen___2(struct s4 *___dst__P3ss4_2){
+        ((void)((*((int *)(&(*___dst__P3ss4_2).__i__i_2)))) /* ?{} */);
+    }
+    inline void ___constructor__F_P3ss43ss4_autogen___2(struct s4 *___dst__P3ss4_2, struct s4 ___src__3ss4_2){
+        ((void)((*((int *)(&(*___dst__P3ss4_2).__i__i_2)))=___src__3ss4_2.__i__i_2) /* ?{} */);
+    }
+    inline void ___destructor__F_P3ss4_autogen___2(struct s4 *___dst__P3ss4_2){
+        ((void)((*((int *)(&(*___dst__P3ss4_2).__i__i_2)))) /* ^?{} */);
+    }
+    inline void ___constructor__F_P3ss4i_autogen___2(struct s4 *___dst__P3ss4_2, int __i__i_2){
+        ((void)((*((int *)(&(*___dst__P3ss4_2).__i__i_2)))=__i__i_2) /* ?{} */);
+    }
+    struct s4 __x2__3ss4_2;
+    ((void)___constructor__F_P3ss4_autogen___2(((struct s4 *)(&__x2__3ss4_2))));
+    struct s4 __y2__3ss4_2;
+    ((void)___constructor__F_P3ss4_autogen___2(((struct s4 *)(&__y2__3ss4_2))));
+    int __m1__A0i_2[((long unsigned int )10)];
+    int __m2__A0A0i_2[((long unsigned int )10)][((long unsigned int )10)];
+    int __m3__A0A0i_2[((long unsigned int )10)][((long unsigned int )10)];
+    int _retVal0 = { 0 };
+    ((void)(_retVal0=0) /* ?{} */);
+    ((void)___destructor__F_P3ss4_autogen___2(((struct s4 *)(&__y2__3ss4_2))));
+    ((void)___destructor__F_P3ss4_autogen___2(((struct s4 *)(&__x2__3ss4_2))));
+    ((void)___destructor__F_P3ss3_autogen___2(((struct s3 *)(&__y1__3ss3_2))));
+    ((void)___destructor__F_P3ss3_autogen___2(((struct s3 *)(&__x1__3ss3_2))));
+    return ((int )_retVal0);
+    ((void)___destructor__F_P3ss4_autogen___2(((struct s4 *)(&__y2__3ss4_2))));
+    ((void)___destructor__F_P3ss4_autogen___2(((struct s4 *)(&__x2__3ss4_2))));
+    ((void)___destructor__F_P3ss3_autogen___2(((struct s3 *)(&__y1__3ss3_2))));
+    ((void)___destructor__F_P3ss3_autogen___2(((struct s3 *)(&__x1__3ss3_2))));
+}
Index: src/tests/.expect/32/math.txt
===================================================================
--- src/tests/.expect/32/math.txt	(revision ccb447e9609db81bd657114979c4e4e539785111)
+++ src/tests/.expect/32/math.txt	(revision ccb447e9609db81bd657114979c4e4e539785111)
@@ -0,0 +1,59 @@
+fabs: 1 1 1 1.41421 1.41421356237309505 1.41421356237309505
+fmod: 1 1 1 1 1 1
+remainder: -1 -1 -1
+remquo: 7 0.0999999 7 0.1 7 0.0999999999999999999
+div: 7 0.0999999 7 0.1 7 0.0999999999999999999
+fma: -2 -2 -2
+fdim: 2 2 2
+nan: nan nan nan
+exp: 2.71828 2.71828182845905 2.71828182845904524 1.46869+2.28736i 1.46869393991589+2.28735528717884i 1.46869393991588516+2.28735528717884239i
+exp2: 2 2 2
+expm1: 1.71828 1.71828182845905 1.71828182845904524
+log: 0 0 0 0.346574+0.785398i 0.346573590279973+0.785398163397448i 0.346573590279972655+0.78539816339744831i
+log2: 3 3 3
+log10: 2 2 2
+log1p: 0.693147 0.693147180559945 0.693147180559945309
+ilogb: 0 0 0
+logb: 3 3 3
+sqrt: 1 1 1 1.09868+0.45509i 1.09868411346781+0.455089860562227i 1.09868411346780997+0.455089860562227341i
+cbrt: 3 3 3
+hypot: 1.41421 1.4142135623731 1.41421356237309505
+pow: 1 1 1 0.273957+0.583701i 0.273957253830121+0.583700758758615i 0.273957253830121071+0.583700758758614628i
+sin: 0.841471 0.841470984807897 0.841470984807896507 1.29846+0.634964i 1.29845758141598+0.634963914784736i 1.29845758141597729+0.634963914784736108i
+cos: 0.540302 0.54030230586814 0.540302305868139717 0.83373-0.988898i 0.833730025131149-0.988897705762865i 0.833730025131149049-0.988897705762865096i
+tan: 1.55741 1.5574077246549 1.55740772465490223 0.271753+1.08392i 0.271752585319512+1.08392332733869i 0.271752585319511717+1.08392332733869454i
+asin: 1.5708 1.5707963267949 1.57079632679489662 0.66624+1.06128i 0.666239432492515+1.06127506190504i 0.666239432492515255+1.06127506190503565i
+acos: 0 0 0 0.904557-1.06128i 0.904556894302381-1.06127506190504i 0.904556894302381364-1.06127506190503565i
+atan: 0.785398 0.785398163397448 0.78539816339744831 1.01722+0.402359i 1.01722196789785+0.402359478108525i 1.01722196789785137+0.402359478108525094i
+atan2: 0.785398 0.785398163397448 0.78539816339744831 atan: 0.785398 0.785398163397448 0.78539816339744831 sinh: 1.1752 1.1752011936438 1.17520119364380146 0.634964+1.29846i 0.634963914784736+1.29845758141598i 0.634963914784736108+1.29845758141597729i
+cosh: 1.54308 1.54308063481524 1.54308063481524378 0.83373+0.988898i 0.833730025131149+0.988897705762865i 0.833730025131149049+0.988897705762865096i
+tanh: 0.761594 0.761594155955765 0.761594155955764888 1.08392+0.271753i 1.08392332733869+0.271752585319512i 1.08392332733869454+0.271752585319511717i
+acosh: 0 0 0 1.06128+0.904557i 1.06127506190504+0.904556894302381i 1.06127506190503565+0.904556894302381364i
+asinh: 0.881374 0.881373587019543 0.881373587019543025 1.06128+0.666239i 1.06127506190504+0.666239432492515i 1.06127506190503565+0.666239432492515255i
+atanh: inf inf inf 0.402359+1.01722i 0.402359478108525+1.01722196789785i 0.402359478108525094+1.01722196789785137i
+erf: 0.842701 0.842700792949715 0.842700792949714869
+erfc: 0.157299 0.157299207050285 0.157299207050285131
+lgamma: 1.79176 1.79175946922805 1.791759469228055
+lgamma: 1.79176 1 1.79175946922805 1 1.791759469228055 1
+tgamma: 6 6 6
+floor: 1 1 1
+ceil: 2 2 2
+trunc: 3 3 3
+rint: 2 2 2
+rint: 2 2 2
+rint: 2 2 2
+lrint: 2 2 2
+llrint: 2 2 2
+nearbyint: 4 4 4
+round: 2 2 2
+round: 2 2 2
+round: 2 2 2
+lround: 2 2 2
+llround: 2 2 2
+copysign: -1 -1 -1
+frexp: 0.5 3 0.5 3 0.5 3
+ldexp: 8 8 8
+modf: 2 0.3 2 0.3 2 0.3 nextafter: 2 2 2
+nexttoward: 2 2 2
+scalbn: 16 16 16
+scalbln: 16 16 16
Index: src/tests/.expect/64/extension.txt
===================================================================
--- src/tests/.expect/64/extension.txt	(revision ccb447e9609db81bd657114979c4e4e539785111)
+++ src/tests/.expect/64/extension.txt	(revision ccb447e9609db81bd657114979c4e4e539785111)
@@ -0,0 +1,101 @@
+extern void *malloc(long unsigned int __size);
+extern void free(void *__ptr);
+extern void abort(void);
+extern int atexit(void (*__func)(void));
+extern void exit(int __status);
+extern int printf(const char *__restrict __format, ...);
+__extension__ int __a__i_1;
+__extension__ int __b__i_1;
+__extension__ int __c__i_1;
+__extension__ struct S {
+    __extension__ int __a__i_1;
+    __extension__ int __b__i_1;
+    __extension__ int __c__i_1;
+};
+static inline struct S ___operator_assign__F2sS_P2sS2sS_autogen___1(struct S *___dst__P2sS_1, struct S ___src__2sS_1){
+    ((void)((*___dst__P2sS_1).__a__i_1=___src__2sS_1.__a__i_1));
+    ((void)((*___dst__P2sS_1).__b__i_1=___src__2sS_1.__b__i_1));
+    ((void)((*___dst__P2sS_1).__c__i_1=___src__2sS_1.__c__i_1));
+    return ((struct S )___src__2sS_1);
+}
+static inline void ___constructor__F_P2sS_autogen___1(struct S *___dst__P2sS_1){
+    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))) /* ?{} */);
+}
+static inline void ___constructor__F_P2sS2sS_autogen___1(struct S *___dst__P2sS_1, struct S ___src__2sS_1){
+    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))=___src__2sS_1.__a__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))=___src__2sS_1.__b__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))=___src__2sS_1.__c__i_1) /* ?{} */);
+}
+static inline void ___destructor__F_P2sS_autogen___1(struct S *___dst__P2sS_1){
+    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))) /* ^?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))) /* ^?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))) /* ^?{} */);
+}
+static inline void ___constructor__F_P2sSi_autogen___1(struct S *___dst__P2sS_1, int __a__i_1){
+    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))=__a__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))) /* ?{} */);
+}
+static inline void ___constructor__F_P2sSii_autogen___1(struct S *___dst__P2sS_1, int __a__i_1, int __b__i_1){
+    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))=__a__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))=__b__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))) /* ?{} */);
+}
+static inline void ___constructor__F_P2sSiii_autogen___1(struct S *___dst__P2sS_1, int __a__i_1, int __b__i_1, int __c__i_1){
+    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))=__a__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))=__b__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))=__c__i_1) /* ?{} */);
+}
+__extension__ union U {
+    __extension__ int __a__i_1;
+    __extension__ int __b__i_1;
+    __extension__ int __c__i_1;
+};
+static inline union U ___operator_assign__F2uU_P2uU2uU_autogen___1(union U *___dst__P2uU_1, union U ___src__2uU_1){
+    void *_tmp_cp_ret0;
+    ((void)((_tmp_cp_ret0=__builtin_memcpy(((void *)___dst__P2uU_1), ((const void *)(&___src__2uU_1)), sizeof(union U ))) , _tmp_cp_ret0));
+    ((void)(_tmp_cp_ret0) /* ^?{} */);
+    return ((union U )___src__2uU_1);
+}
+static inline void ___constructor__F_P2uU_autogen___1(union U *___dst__P2uU_1){
+}
+static inline void ___constructor__F_P2uU2uU_autogen___1(union U *___dst__P2uU_1, union U ___src__2uU_1){
+    void *_tmp_cp_ret1;
+    ((void)((_tmp_cp_ret1=__builtin_memcpy(((void *)___dst__P2uU_1), ((const void *)(&___src__2uU_1)), sizeof(union U ))) , _tmp_cp_ret1));
+    ((void)(_tmp_cp_ret1) /* ^?{} */);
+    return ((void)___src__2uU_1);
+}
+static inline void ___destructor__F_P2uU_autogen___1(union U *___dst__P2uU_1){
+}
+__extension__ enum E {
+    __R__C2eE_1,
+    __G__C2eE_1,
+    __B__C2eE_1,
+};
+__extension__ int __fred__Fi_i__1(int __p__i_1){
+    __extension__ struct S {
+        __extension__ int __a__i_2;
+        __extension__ int __b__i_2;
+        __extension__ int __c__i_2;
+    };
+    int __i__i_2;
+    ((void)((*((int *)(&__i__i_2)))=(__extension__ __a__i_1+__extension__ 3)) /* ?{} */);
+    ((void)__extension__ 3);
+    ((void)__extension__ __a__i_1);
+    __extension__ int __a__i_2;
+    __extension__ int __b__i_2;
+    __extension__ int __c__i_2;
+    ((void)(__extension__ __a__i_2=(__extension__ __b__i_2+__extension__ __c__i_2)));
+    int _tmp_cp_ret2;
+    ((void)((_tmp_cp_ret2=__extension__ __fred__Fi_i__1(3)) , _tmp_cp_ret2));
+    ((void)(_tmp_cp_ret2) /* ^?{} */);
+    ((void)__extension__ sizeof(3));
+    ((void)__extension__ (((int )(3!=0)) || ((int )(4!=0))));
+    ((void)__extension__ __alignof__(__extension__ __a__i_2));
+    ((void)(((int )(__extension__ __a__i_2!=0)) || ((int )((((int )(__extension__ __b__i_2!=0)) && ((int )(__extension__ __c__i_2!=0)))!=0))));
+    ((void)(((int )((__extension__ __a__i_2>__extension__ __b__i_2)!=0)) ? __extension__ __c__i_2 : __extension__ __c__i_2));
+    ((void)(__extension__ __a__i_2=__extension__ (__extension__ __b__i_2+__extension__ __c__i_2)));
+    ((void)((__extension__ __a__i_2 , __extension__ __b__i_2) , __extension__ __c__i_2));
+}
Index: src/tests/.expect/64/gccExtensions.txt
===================================================================
--- src/tests/.expect/64/gccExtensions.txt	(revision ccb447e9609db81bd657114979c4e4e539785111)
+++ src/tests/.expect/64/gccExtensions.txt	(revision ccb447e9609db81bd657114979c4e4e539785111)
@@ -0,0 +1,167 @@
+extern void *malloc(long unsigned int __size);
+extern void free(void *__ptr);
+extern void abort(void);
+extern int atexit(void (*__func)(void));
+extern void exit(int __status);
+extern int printf(const char *__restrict __format, ...);
+int main(int __argc__i_1, const char **__argv__PPCc_1){
+    asm ( "nop" :  :  :  );
+    asm ( "nop" :  :  :  );
+    asm ( "nop" :  :  :  );
+    double _Complex __c1__Xd_2;
+    double _Complex __c2__Xd_2;
+    const int __i1__Ci_2;
+    const int __i2__Ci_2;
+    const int __i3__Ci_2;
+    __extension__ const int __ex__Ci_2;
+    struct S {
+        __extension__ int __a__i_2;
+        __extension__ int __b__i_2;
+        __extension__ int __c__i_2;
+    };
+    inline struct S ___operator_assign__F2sS_P2sS2sS_autogen___2(struct S *___dst__P2sS_2, struct S ___src__2sS_2){
+        ((void)((*___dst__P2sS_2).__a__i_2=___src__2sS_2.__a__i_2));
+        ((void)((*___dst__P2sS_2).__b__i_2=___src__2sS_2.__b__i_2));
+        ((void)((*___dst__P2sS_2).__c__i_2=___src__2sS_2.__c__i_2));
+        return ((struct S )___src__2sS_2);
+    }
+    inline void ___constructor__F_P2sS_autogen___2(struct S *___dst__P2sS_2){
+        ((void)((*((int *)(&(*___dst__P2sS_2).__a__i_2)))) /* ?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__b__i_2)))) /* ?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__c__i_2)))) /* ?{} */);
+    }
+    inline void ___constructor__F_P2sS2sS_autogen___2(struct S *___dst__P2sS_2, struct S ___src__2sS_2){
+        ((void)((*((int *)(&(*___dst__P2sS_2).__a__i_2)))=___src__2sS_2.__a__i_2) /* ?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__b__i_2)))=___src__2sS_2.__b__i_2) /* ?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__c__i_2)))=___src__2sS_2.__c__i_2) /* ?{} */);
+    }
+    inline void ___destructor__F_P2sS_autogen___2(struct S *___dst__P2sS_2){
+        ((void)((*((int *)(&(*___dst__P2sS_2).__c__i_2)))) /* ^?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__b__i_2)))) /* ^?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__a__i_2)))) /* ^?{} */);
+    }
+    inline void ___constructor__F_P2sSi_autogen___2(struct S *___dst__P2sS_2, int __a__i_2){
+        ((void)((*((int *)(&(*___dst__P2sS_2).__a__i_2)))=__a__i_2) /* ?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__b__i_2)))) /* ?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__c__i_2)))) /* ?{} */);
+    }
+    inline void ___constructor__F_P2sSii_autogen___2(struct S *___dst__P2sS_2, int __a__i_2, int __b__i_2){
+        ((void)((*((int *)(&(*___dst__P2sS_2).__a__i_2)))=__a__i_2) /* ?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__b__i_2)))=__b__i_2) /* ?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__c__i_2)))) /* ?{} */);
+    }
+    inline void ___constructor__F_P2sSiii_autogen___2(struct S *___dst__P2sS_2, int __a__i_2, int __b__i_2, int __c__i_2){
+        ((void)((*((int *)(&(*___dst__P2sS_2).__a__i_2)))=__a__i_2) /* ?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__b__i_2)))=__b__i_2) /* ?{} */);
+        ((void)((*((int *)(&(*___dst__P2sS_2).__c__i_2)))=__c__i_2) /* ?{} */);
+    }
+    int __i__i_2;
+    ((void)((*((int *)(&__i__i_2)))=__extension__ 3) /* ?{} */);
+    __extension__ int __a__i_2;
+    __extension__ int __b__i_2;
+    __extension__ int __c__i_2;
+    ((void)((__extension__ __a__i_2 , __extension__ __b__i_2) , __extension__ __c__i_2));
+    ((void)(__extension__ __a__i_2=(__extension__ __b__i_2+__extension__ __c__i_2)));
+    ((void)(__extension__ __a__i_2=__extension__ (__extension__ __b__i_2+__extension__ __c__i_2)));
+    inline int __f1__Fi___2(){
+    }
+    inline int __f2__Fi___2(){
+    }
+    int __s1__i_2;
+    int __s2__i_2;
+    int __t1___2;
+    int __t2___2;
+    volatile int __v1__Vi_2;
+    volatile int __v2__Vi_2;
+    int __a1__i_2;
+    const int __a2__Ci_2;
+    static const int __a3__Ci_2;
+    static const int __a4__Ci_2;
+    static const int __a5__Ci_2;
+    static const int __a6__Ci_2;
+    static const int __a7__Ci_2;
+    int *__p1__Pi_2;
+    int *__p2__Pi_2;
+    struct s1;
+    struct s2 {
+        int __i__i_2;
+    };
+    inline struct s2 ___operator_assign__F3ss2_P3ss23ss2_autogen___2(struct s2 *___dst__P3ss2_2, struct s2 ___src__3ss2_2){
+        ((void)((*___dst__P3ss2_2).__i__i_2=___src__3ss2_2.__i__i_2));
+        return ((struct s2 )___src__3ss2_2);
+    }
+    inline void ___constructor__F_P3ss2_autogen___2(struct s2 *___dst__P3ss2_2){
+        ((void)((*((int *)(&(*___dst__P3ss2_2).__i__i_2)))) /* ?{} */);
+    }
+    inline void ___constructor__F_P3ss23ss2_autogen___2(struct s2 *___dst__P3ss2_2, struct s2 ___src__3ss2_2){
+        ((void)((*((int *)(&(*___dst__P3ss2_2).__i__i_2)))=___src__3ss2_2.__i__i_2) /* ?{} */);
+    }
+    inline void ___destructor__F_P3ss2_autogen___2(struct s2 *___dst__P3ss2_2){
+        ((void)((*((int *)(&(*___dst__P3ss2_2).__i__i_2)))) /* ^?{} */);
+    }
+    inline void ___constructor__F_P3ss2i_autogen___2(struct s2 *___dst__P3ss2_2, int __i__i_2){
+        ((void)((*((int *)(&(*___dst__P3ss2_2).__i__i_2)))=__i__i_2) /* ?{} */);
+    }
+    struct s3 {
+        int __i__i_2;
+    };
+    inline struct s3 ___operator_assign__F3ss3_P3ss33ss3_autogen___2(struct s3 *___dst__P3ss3_2, struct s3 ___src__3ss3_2){
+        ((void)((*___dst__P3ss3_2).__i__i_2=___src__3ss3_2.__i__i_2));
+        return ((struct s3 )___src__3ss3_2);
+    }
+    inline void ___constructor__F_P3ss3_autogen___2(struct s3 *___dst__P3ss3_2){
+        ((void)((*((int *)(&(*___dst__P3ss3_2).__i__i_2)))) /* ?{} */);
+    }
+    inline void ___constructor__F_P3ss33ss3_autogen___2(struct s3 *___dst__P3ss3_2, struct s3 ___src__3ss3_2){
+        ((void)((*((int *)(&(*___dst__P3ss3_2).__i__i_2)))=___src__3ss3_2.__i__i_2) /* ?{} */);
+    }
+    inline void ___destructor__F_P3ss3_autogen___2(struct s3 *___dst__P3ss3_2){
+        ((void)((*((int *)(&(*___dst__P3ss3_2).__i__i_2)))) /* ^?{} */);
+    }
+    inline void ___constructor__F_P3ss3i_autogen___2(struct s3 *___dst__P3ss3_2, int __i__i_2){
+        ((void)((*((int *)(&(*___dst__P3ss3_2).__i__i_2)))=__i__i_2) /* ?{} */);
+    }
+    struct s3 __x1__3ss3_2;
+    ((void)___constructor__F_P3ss3_autogen___2(((struct s3 *)(&__x1__3ss3_2))));
+    struct s3 __y1__3ss3_2;
+    ((void)___constructor__F_P3ss3_autogen___2(((struct s3 *)(&__y1__3ss3_2))));
+    struct s4 {
+        int __i__i_2;
+    };
+    inline struct s4 ___operator_assign__F3ss4_P3ss43ss4_autogen___2(struct s4 *___dst__P3ss4_2, struct s4 ___src__3ss4_2){
+        ((void)((*___dst__P3ss4_2).__i__i_2=___src__3ss4_2.__i__i_2));
+        ((void)___destructor__F_P3ss3_autogen___2(((struct s3 *)(&__y1__3ss3_2))));
+        ((void)___destructor__F_P3ss3_autogen___2(((struct s3 *)(&__x1__3ss3_2))));
+        return ((struct s4 )___src__3ss4_2);
+    }
+    inline void ___constructor__F_P3ss4_autogen___2(struct s4 *___dst__P3ss4_2){
+        ((void)((*((int *)(&(*___dst__P3ss4_2).__i__i_2)))) /* ?{} */);
+    }
+    inline void ___constructor__F_P3ss43ss4_autogen___2(struct s4 *___dst__P3ss4_2, struct s4 ___src__3ss4_2){
+        ((void)((*((int *)(&(*___dst__P3ss4_2).__i__i_2)))=___src__3ss4_2.__i__i_2) /* ?{} */);
+    }
+    inline void ___destructor__F_P3ss4_autogen___2(struct s4 *___dst__P3ss4_2){
+        ((void)((*((int *)(&(*___dst__P3ss4_2).__i__i_2)))) /* ^?{} */);
+    }
+    inline void ___constructor__F_P3ss4i_autogen___2(struct s4 *___dst__P3ss4_2, int __i__i_2){
+        ((void)((*((int *)(&(*___dst__P3ss4_2).__i__i_2)))=__i__i_2) /* ?{} */);
+    }
+    struct s4 __x2__3ss4_2;
+    ((void)___constructor__F_P3ss4_autogen___2(((struct s4 *)(&__x2__3ss4_2))));
+    struct s4 __y2__3ss4_2;
+    ((void)___constructor__F_P3ss4_autogen___2(((struct s4 *)(&__y2__3ss4_2))));
+    int __m1__A0i_2[((long unsigned int )10)];
+    int __m2__A0A0i_2[((long unsigned int )10)][((long unsigned int )10)];
+    int __m3__A0A0i_2[((long unsigned int )10)][((long unsigned int )10)];
+    int _retVal0 = { 0 };
+    ((void)(_retVal0=0) /* ?{} */);
+    ((void)___destructor__F_P3ss4_autogen___2(((struct s4 *)(&__y2__3ss4_2))));
+    ((void)___destructor__F_P3ss4_autogen___2(((struct s4 *)(&__x2__3ss4_2))));
+    ((void)___destructor__F_P3ss3_autogen___2(((struct s3 *)(&__y1__3ss3_2))));
+    ((void)___destructor__F_P3ss3_autogen___2(((struct s3 *)(&__x1__3ss3_2))));
+    return ((int )_retVal0);
+    ((void)___destructor__F_P3ss4_autogen___2(((struct s4 *)(&__y2__3ss4_2))));
+    ((void)___destructor__F_P3ss4_autogen___2(((struct s4 *)(&__x2__3ss4_2))));
+    ((void)___destructor__F_P3ss3_autogen___2(((struct s3 *)(&__y1__3ss3_2))));
+    ((void)___destructor__F_P3ss3_autogen___2(((struct s3 *)(&__x1__3ss3_2))));
+}
Index: src/tests/.expect/64/math.txt
===================================================================
--- src/tests/.expect/64/math.txt	(revision ccb447e9609db81bd657114979c4e4e539785111)
+++ src/tests/.expect/64/math.txt	(revision ccb447e9609db81bd657114979c4e4e539785111)
@@ -0,0 +1,59 @@
+fabs: 1 1 1 1.41421 1.41421356237309505 1.41421356237309505
+fmod: 1 1 1 1 1 1
+remainder: -1 -1 -1
+remquo: 7 0.0999999 7 0.1 7 0.0999999999999999999
+div: 7 0.0999999 7 0.1 7 0.0999999999999999999
+fma: -2 -2 -2
+fdim: 2 2 2
+nan: nan nan nan
+exp: 2.71828 2.71828182845905 2.71828182845904524 1.46869+2.28736i 1.46869393991589+2.28735528717884i 1.46869393991588516+2.28735528717884239i
+exp2: 2 2 2
+expm1: 1.71828 1.71828182845905 1.71828182845904524
+log: 0 0 0 0.346574+0.785398i 0.346573590279973+0.785398163397448i 0.346573590279972655+0.78539816339744831i
+log2: 3 3 3
+log10: 2 2 2
+log1p: 0.693147 0.693147180559945 0.693147180559945309
+ilogb: 0 0 0
+logb: 3 3 3
+sqrt: 1 1 1 1.09868+0.45509i 1.09868411346781+0.455089860562227i 1.09868411346780997+0.455089860562227341i
+cbrt: 3 3 3
+hypot: 1.41421 1.4142135623731 1.41421356237309505
+pow: 1 1 1 0.273957+0.583701i 0.273957253830121+0.583700758758615i 0.273957253830121071+0.583700758758614628i
+sin: 0.841471 0.841470984807897 0.841470984807896507 1.29846+0.634964i 1.29845758141598+0.634963914784736i 1.29845758141597729+0.634963914784736108i
+cos: 0.540302 0.54030230586814 0.540302305868139717 0.83373-0.988898i 0.833730025131149-0.988897705762865i 0.833730025131149049-0.988897705762865096i
+tan: 1.55741 1.5574077246549 1.55740772465490223 0.271753+1.08392i 0.271752585319512+1.08392332733869i 0.271752585319511717+1.08392332733869454i
+asin: 1.5708 1.5707963267949 1.57079632679489662 0.666239+1.06128i 0.666239432492515+1.06127506190504i 0.666239432492515255+1.06127506190503565i
+acos: 0 0 0 0.904557-1.06128i 0.904556894302381-1.06127506190504i 0.904556894302381364-1.06127506190503565i
+atan: 0.785398 0.785398163397448 0.78539816339744831 1.01722+0.402359i 1.01722196789785+0.402359478108525i 1.01722196789785137+0.402359478108525094i
+atan2: 0.785398 0.785398163397448 0.78539816339744831 atan: 0.785398 0.785398163397448 0.78539816339744831 sinh: 1.1752 1.1752011936438 1.17520119364380146 0.634964+1.29846i 0.634963914784736+1.29845758141598i 0.634963914784736108+1.29845758141597729i
+cosh: 1.54308 1.54308063481524 1.54308063481524378 0.83373+0.988898i 0.833730025131149+0.988897705762865i 0.833730025131149049+0.988897705762865096i
+tanh: 0.761594 0.761594155955765 0.761594155955764888 1.08392+0.271753i 1.08392332733869+0.271752585319512i 1.08392332733869454+0.271752585319511717i
+acosh: 0 0 0 1.06128+0.904557i 1.06127506190504+0.904556894302381i 1.06127506190503565+0.904556894302381364i
+asinh: 0.881374 0.881373587019543 0.881373587019543025 1.06128+0.666239i 1.06127506190504+0.666239432492515i 1.06127506190503565+0.666239432492515255i
+atanh: inf inf inf 0.402359+1.01722i 0.402359478108525+1.01722196789785i 0.402359478108525094+1.01722196789785137i
+erf: 0.842701 0.842700792949715 0.842700792949714869
+erfc: 0.157299 0.157299207050285 0.157299207050285131
+lgamma: 1.79176 1.79175946922805 1.791759469228055
+lgamma: 1.79176 1 1.79175946922805 1 1.791759469228055 1
+tgamma: 6 6 6
+floor: 1 1 1
+ceil: 2 2 2
+trunc: 3 3 3
+rint: 2 2 2
+rint: 2 2 2
+rint: 2 2 2
+lrint: 2 2 2
+llrint: 2 2 2
+nearbyint: 4 4 4
+round: 2 2 2
+round: 2 2 2
+round: 2 2 2
+lround: 2 2 2
+llround: 2 2 2
+copysign: -1 -1 -1
+frexp: 0.5 3 0.5 3 0.5 3
+ldexp: 8 8 8
+modf: 2 0.3 2 0.3 2 0.3 nextafter: 2 2 2
+nexttoward: 2 2 2
+scalbn: 16 16 16
+scalbln: 16 16 16
Index: src/tests/.expect/declarationErrors.txt
===================================================================
--- src/tests/.expect/declarationErrors.txt	(revision 6cf27a070551542d34340180263c714585975c85)
+++ src/tests/.expect/declarationErrors.txt	(revision ccb447e9609db81bd657114979c4e4e539785111)
@@ -5,4 +5,5 @@
   with members 
     i: int 
+   with body 
 
 
@@ -10,4 +11,5 @@
   with members 
     i: int 
+   with body 
 
 
Index: src/tests/.expect/declarationSpecifier.txt
===================================================================
--- src/tests/.expect/declarationSpecifier.txt	(revision 6cf27a070551542d34340180263c714585975c85)
+++ src/tests/.expect/declarationSpecifier.txt	(revision ccb447e9609db81bd657114979c4e4e539785111)
@@ -5,4 +5,5 @@
   with members 
     i: int 
+   with body 
 
 
@@ -10,4 +11,5 @@
   with members 
     i: int 
+   with body 
 
 
Index: src/tests/.expect/extension.txt
===================================================================
--- src/tests/.expect/extension.txt	(revision 6cf27a070551542d34340180263c714585975c85)
+++ 	(revision )
@@ -1,101 +1,0 @@
-extern void *malloc(long unsigned int __size);
-extern void free(void *__ptr);
-extern void abort(void);
-extern int atexit(void (*__func)(void));
-extern void exit(int __status);
-extern int printf(const char *__restrict __format, ...);
-__extension__ int __a__i_1;
-__extension__ int __b__i_1;
-__extension__ int __c__i_1;
-__extension__ struct S {
-    __extension__ int __a__i_1;
-    __extension__ int __b__i_1;
-    __extension__ int __c__i_1;
-};
-static inline struct S ___operator_assign__F2sS_P2sS2sS_autogen___1(struct S *___dst__P2sS_1, struct S ___src__2sS_1){
-    ((void)((*___dst__P2sS_1).__a__i_1=___src__2sS_1.__a__i_1));
-    ((void)((*___dst__P2sS_1).__b__i_1=___src__2sS_1.__b__i_1));
-    ((void)((*___dst__P2sS_1).__c__i_1=___src__2sS_1.__c__i_1));
-    return ((struct S )___src__2sS_1);
-}
-static inline void ___constructor__F_P2sS_autogen___1(struct S *___dst__P2sS_1){
-    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))) /* ?{} */);
-    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))) /* ?{} */);
-    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))) /* ?{} */);
-}
-static inline void ___constructor__F_P2sS2sS_autogen___1(struct S *___dst__P2sS_1, struct S ___src__2sS_1){
-    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))=___src__2sS_1.__a__i_1) /* ?{} */);
-    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))=___src__2sS_1.__b__i_1) /* ?{} */);
-    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))=___src__2sS_1.__c__i_1) /* ?{} */);
-}
-static inline void ___destructor__F_P2sS_autogen___1(struct S *___dst__P2sS_1){
-    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))) /* ^?{} */);
-    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))) /* ^?{} */);
-    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))) /* ^?{} */);
-}
-static inline void ___constructor__F_P2sSi_autogen___1(struct S *___dst__P2sS_1, int __a__i_1){
-    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))=__a__i_1) /* ?{} */);
-    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))) /* ?{} */);
-    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))) /* ?{} */);
-}
-static inline void ___constructor__F_P2sSii_autogen___1(struct S *___dst__P2sS_1, int __a__i_1, int __b__i_1){
-    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))=__a__i_1) /* ?{} */);
-    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))=__b__i_1) /* ?{} */);
-    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))) /* ?{} */);
-}
-static inline void ___constructor__F_P2sSiii_autogen___1(struct S *___dst__P2sS_1, int __a__i_1, int __b__i_1, int __c__i_1){
-    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))=__a__i_1) /* ?{} */);
-    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))=__b__i_1) /* ?{} */);
-    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))=__c__i_1) /* ?{} */);
-}
-__extension__ union U {
-    __extension__ int __a__i_1;
-    __extension__ int __b__i_1;
-    __extension__ int __c__i_1;
-};
-static inline union U ___operator_assign__F2uU_P2uU2uU_autogen___1(union U *___dst__P2uU_1, union U ___src__2uU_1){
-    void *_tmp_cp_ret0;
-    ((void)((_tmp_cp_ret0=__builtin_memcpy(((void *)___dst__P2uU_1), ((const void *)(&___src__2uU_1)), sizeof(union U ))) , _tmp_cp_ret0));
-    ((void)(_tmp_cp_ret0) /* ^?{} */);
-    return ((union U )___src__2uU_1);
-}
-static inline void ___constructor__F_P2uU_autogen___1(union U *___dst__P2uU_1){
-}
-static inline void ___constructor__F_P2uU2uU_autogen___1(union U *___dst__P2uU_1, union U ___src__2uU_1){
-    void *_tmp_cp_ret1;
-    ((void)((_tmp_cp_ret1=__builtin_memcpy(((void *)___dst__P2uU_1), ((const void *)(&___src__2uU_1)), sizeof(union U ))) , _tmp_cp_ret1));
-    ((void)(_tmp_cp_ret1) /* ^?{} */);
-    return ((void)___src__2uU_1);
-}
-static inline void ___destructor__F_P2uU_autogen___1(union U *___dst__P2uU_1){
-}
-__extension__ enum E {
-    __R__C2eE_1,
-    __G__C2eE_1,
-    __B__C2eE_1,
-};
-__extension__ int __fred__Fi_i__1(int __p__i_1){
-    __extension__ struct S {
-        __extension__ int __a__i_2;
-        __extension__ int __b__i_2;
-        __extension__ int __c__i_2;
-    };
-    int __i__i_2;
-    ((void)((*((int *)(&__i__i_2)))=(__extension__ __a__i_1+__extension__ 3)) /* ?{} */);
-    ((void)__extension__ 3);
-    ((void)__extension__ __a__i_1);
-    __extension__ int __a__i_2;
-    __extension__ int __b__i_2;
-    __extension__ int __c__i_2;
-    ((void)(__extension__ __a__i_2=(__extension__ __b__i_2+__extension__ __c__i_2)));
-    int _tmp_cp_ret2;
-    ((void)((_tmp_cp_ret2=__extension__ __fred__Fi_i__1(3)) , _tmp_cp_ret2));
-    ((void)(_tmp_cp_ret2) /* ^?{} */);
-    ((void)__extension__ sizeof(3));
-    ((void)__extension__ (((int )(3!=0)) || ((int )(4!=0))));
-    ((void)__extension__ __alignof__(__extension__ __a__i_2));
-    ((void)(((int )(__extension__ __a__i_2!=0)) || ((int )((((int )(__extension__ __b__i_2!=0)) && ((int )(__extension__ __c__i_2!=0)))!=0))));
-    ((void)(((int )((__extension__ __a__i_2>__extension__ __b__i_2)!=0)) ? __extension__ __c__i_2 : __extension__ __c__i_2));
-    ((void)(__extension__ __a__i_2=__extension__ (__extension__ __b__i_2+__extension__ __c__i_2)));
-    ((void)((__extension__ __a__i_2 , __extension__ __b__i_2) , __extension__ __c__i_2));
-}
Index: src/tests/.expect/gccExtensions.txt
===================================================================
--- src/tests/.expect/gccExtensions.txt	(revision 6cf27a070551542d34340180263c714585975c85)
+++ 	(revision )
@@ -1,167 +1,0 @@
-extern void *malloc(long unsigned int __size);
-extern void free(void *__ptr);
-extern void abort(void);
-extern int atexit(void (*__func)(void));
-extern void exit(int __status);
-extern int printf(const char *__restrict __format, ...);
-int main(int __argc__i_1, const char **__argv__PPCc_1){
-    asm ( "nop" :  :  :  );
-    asm ( "nop" :  :  :  );
-    asm ( "nop" :  :  :  );
-    double _Complex __c1__Xd_2;
-    double _Complex __c2__Xd_2;
-    const int __i1__Ci_2;
-    const int __i2__Ci_2;
-    const int __i3__Ci_2;
-    __extension__ const int __ex__Ci_2;
-    struct S {
-        __extension__ int __a__i_2;
-        __extension__ int __b__i_2;
-        __extension__ int __c__i_2;
-    };
-    inline struct S ___operator_assign__F2sS_P2sS2sS_autogen___2(struct S *___dst__P2sS_2, struct S ___src__2sS_2){
-        ((void)((*___dst__P2sS_2).__a__i_2=___src__2sS_2.__a__i_2));
-        ((void)((*___dst__P2sS_2).__b__i_2=___src__2sS_2.__b__i_2));
-        ((void)((*___dst__P2sS_2).__c__i_2=___src__2sS_2.__c__i_2));
-        return ((struct S )___src__2sS_2);
-    }
-    inline void ___constructor__F_P2sS_autogen___2(struct S *___dst__P2sS_2){
-        ((void)((*((int *)(&(*___dst__P2sS_2).__a__i_2)))) /* ?{} */);
-        ((void)((*((int *)(&(*___dst__P2sS_2).__b__i_2)))) /* ?{} */);
-        ((void)((*((int *)(&(*___dst__P2sS_2).__c__i_2)))) /* ?{} */);
-    }
-    inline void ___constructor__F_P2sS2sS_autogen___2(struct S *___dst__P2sS_2, struct S ___src__2sS_2){
-        ((void)((*((int *)(&(*___dst__P2sS_2).__a__i_2)))=___src__2sS_2.__a__i_2) /* ?{} */);
-        ((void)((*((int *)(&(*___dst__P2sS_2).__b__i_2)))=___src__2sS_2.__b__i_2) /* ?{} */);
-        ((void)((*((int *)(&(*___dst__P2sS_2).__c__i_2)))=___src__2sS_2.__c__i_2) /* ?{} */);
-    }
-    inline void ___destructor__F_P2sS_autogen___2(struct S *___dst__P2sS_2){
-        ((void)((*((int *)(&(*___dst__P2sS_2).__c__i_2)))) /* ^?{} */);
-        ((void)((*((int *)(&(*___dst__P2sS_2).__b__i_2)))) /* ^?{} */);
-        ((void)((*((int *)(&(*___dst__P2sS_2).__a__i_2)))) /* ^?{} */);
-    }
-    inline void ___constructor__F_P2sSi_autogen___2(struct S *___dst__P2sS_2, int __a__i_2){
-        ((void)((*((int *)(&(*___dst__P2sS_2).__a__i_2)))=__a__i_2) /* ?{} */);
-        ((void)((*((int *)(&(*___dst__P2sS_2).__b__i_2)))) /* ?{} */);
-        ((void)((*((int *)(&(*___dst__P2sS_2).__c__i_2)))) /* ?{} */);
-    }
-    inline void ___constructor__F_P2sSii_autogen___2(struct S *___dst__P2sS_2, int __a__i_2, int __b__i_2){
-        ((void)((*((int *)(&(*___dst__P2sS_2).__a__i_2)))=__a__i_2) /* ?{} */);
-        ((void)((*((int *)(&(*___dst__P2sS_2).__b__i_2)))=__b__i_2) /* ?{} */);
-        ((void)((*((int *)(&(*___dst__P2sS_2).__c__i_2)))) /* ?{} */);
-    }
-    inline void ___constructor__F_P2sSiii_autogen___2(struct S *___dst__P2sS_2, int __a__i_2, int __b__i_2, int __c__i_2){
-        ((void)((*((int *)(&(*___dst__P2sS_2).__a__i_2)))=__a__i_2) /* ?{} */);
-        ((void)((*((int *)(&(*___dst__P2sS_2).__b__i_2)))=__b__i_2) /* ?{} */);
-        ((void)((*((int *)(&(*___dst__P2sS_2).__c__i_2)))=__c__i_2) /* ?{} */);
-    }
-    int __i__i_2;
-    ((void)((*((int *)(&__i__i_2)))=__extension__ 3) /* ?{} */);
-    __extension__ int __a__i_2;
-    __extension__ int __b__i_2;
-    __extension__ int __c__i_2;
-    ((void)((__extension__ __a__i_2 , __extension__ __b__i_2) , __extension__ __c__i_2));
-    ((void)(__extension__ __a__i_2=(__extension__ __b__i_2+__extension__ __c__i_2)));
-    ((void)(__extension__ __a__i_2=__extension__ (__extension__ __b__i_2+__extension__ __c__i_2)));
-    inline int __f1__Fi___2(){
-    }
-    inline int __f2__Fi___2(){
-    }
-    int __s1__i_2;
-    int __s2__i_2;
-    int __t1___2;
-    int __t2___2;
-    volatile int __v1__Vi_2;
-    volatile int __v2__Vi_2;
-    int __a1__i_2;
-    const int __a2__Ci_2;
-    static const int __a3__Ci_2;
-    static const int __a4__Ci_2;
-    static const int __a5__Ci_2;
-    static const int __a6__Ci_2;
-    static const int __a7__Ci_2;
-    int *__p1__Pi_2;
-    int *__p2__Pi_2;
-    struct s1;
-    struct s2 {
-        int __i__i_2;
-    };
-    inline struct s2 ___operator_assign__F3ss2_P3ss23ss2_autogen___2(struct s2 *___dst__P3ss2_2, struct s2 ___src__3ss2_2){
-        ((void)((*___dst__P3ss2_2).__i__i_2=___src__3ss2_2.__i__i_2));
-        return ((struct s2 )___src__3ss2_2);
-    }
-    inline void ___constructor__F_P3ss2_autogen___2(struct s2 *___dst__P3ss2_2){
-        ((void)((*((int *)(&(*___dst__P3ss2_2).__i__i_2)))) /* ?{} */);
-    }
-    inline void ___constructor__F_P3ss23ss2_autogen___2(struct s2 *___dst__P3ss2_2, struct s2 ___src__3ss2_2){
-        ((void)((*((int *)(&(*___dst__P3ss2_2).__i__i_2)))=___src__3ss2_2.__i__i_2) /* ?{} */);
-    }
-    inline void ___destructor__F_P3ss2_autogen___2(struct s2 *___dst__P3ss2_2){
-        ((void)((*((int *)(&(*___dst__P3ss2_2).__i__i_2)))) /* ^?{} */);
-    }
-    inline void ___constructor__F_P3ss2i_autogen___2(struct s2 *___dst__P3ss2_2, int __i__i_2){
-        ((void)((*((int *)(&(*___dst__P3ss2_2).__i__i_2)))=__i__i_2) /* ?{} */);
-    }
-    struct s3 {
-        int __i__i_2;
-    };
-    inline struct s3 ___operator_assign__F3ss3_P3ss33ss3_autogen___2(struct s3 *___dst__P3ss3_2, struct s3 ___src__3ss3_2){
-        ((void)((*___dst__P3ss3_2).__i__i_2=___src__3ss3_2.__i__i_2));
-        return ((struct s3 )___src__3ss3_2);
-    }
-    inline void ___constructor__F_P3ss3_autogen___2(struct s3 *___dst__P3ss3_2){
-        ((void)((*((int *)(&(*___dst__P3ss3_2).__i__i_2)))) /* ?{} */);
-    }
-    inline void ___constructor__F_P3ss33ss3_autogen___2(struct s3 *___dst__P3ss3_2, struct s3 ___src__3ss3_2){
-        ((void)((*((int *)(&(*___dst__P3ss3_2).__i__i_2)))=___src__3ss3_2.__i__i_2) /* ?{} */);
-    }
-    inline void ___destructor__F_P3ss3_autogen___2(struct s3 *___dst__P3ss3_2){
-        ((void)((*((int *)(&(*___dst__P3ss3_2).__i__i_2)))) /* ^?{} */);
-    }
-    inline void ___constructor__F_P3ss3i_autogen___2(struct s3 *___dst__P3ss3_2, int __i__i_2){
-        ((void)((*((int *)(&(*___dst__P3ss3_2).__i__i_2)))=__i__i_2) /* ?{} */);
-    }
-    struct s3 __x1__3ss3_2;
-    ((void)___constructor__F_P3ss3_autogen___2(((struct s3 *)(&__x1__3ss3_2))));
-    struct s3 __y1__3ss3_2;
-    ((void)___constructor__F_P3ss3_autogen___2(((struct s3 *)(&__y1__3ss3_2))));
-    struct s4 {
-        int __i__i_2;
-    };
-    inline struct s4 ___operator_assign__F3ss4_P3ss43ss4_autogen___2(struct s4 *___dst__P3ss4_2, struct s4 ___src__3ss4_2){
-        ((void)((*___dst__P3ss4_2).__i__i_2=___src__3ss4_2.__i__i_2));
-        ((void)___destructor__F_P3ss3_autogen___2(((struct s3 *)(&__y1__3ss3_2))));
-        ((void)___destructor__F_P3ss3_autogen___2(((struct s3 *)(&__x1__3ss3_2))));
-        return ((struct s4 )___src__3ss4_2);
-    }
-    inline void ___constructor__F_P3ss4_autogen___2(struct s4 *___dst__P3ss4_2){
-        ((void)((*((int *)(&(*___dst__P3ss4_2).__i__i_2)))) /* ?{} */);
-    }
-    inline void ___constructor__F_P3ss43ss4_autogen___2(struct s4 *___dst__P3ss4_2, struct s4 ___src__3ss4_2){
-        ((void)((*((int *)(&(*___dst__P3ss4_2).__i__i_2)))=___src__3ss4_2.__i__i_2) /* ?{} */);
-    }
-    inline void ___destructor__F_P3ss4_autogen___2(struct s4 *___dst__P3ss4_2){
-        ((void)((*((int *)(&(*___dst__P3ss4_2).__i__i_2)))) /* ^?{} */);
-    }
-    inline void ___constructor__F_P3ss4i_autogen___2(struct s4 *___dst__P3ss4_2, int __i__i_2){
-        ((void)((*((int *)(&(*___dst__P3ss4_2).__i__i_2)))=__i__i_2) /* ?{} */);
-    }
-    struct s4 __x2__3ss4_2;
-    ((void)___constructor__F_P3ss4_autogen___2(((struct s4 *)(&__x2__3ss4_2))));
-    struct s4 __y2__3ss4_2;
-    ((void)___constructor__F_P3ss4_autogen___2(((struct s4 *)(&__y2__3ss4_2))));
-    int __m1__A0i_2[((long unsigned int )10)];
-    int __m2__A0A0i_2[((long unsigned int )10)][((long unsigned int )10)];
-    int __m3__A0A0i_2[((long unsigned int )10)][((long unsigned int )10)];
-    int _retVal0 = { 0 };
-    ((void)(_retVal0=0) /* ?{} */);
-    ((void)___destructor__F_P3ss4_autogen___2(((struct s4 *)(&__y2__3ss4_2))));
-    ((void)___destructor__F_P3ss4_autogen___2(((struct s4 *)(&__x2__3ss4_2))));
-    ((void)___destructor__F_P3ss3_autogen___2(((struct s3 *)(&__y1__3ss3_2))));
-    ((void)___destructor__F_P3ss3_autogen___2(((struct s3 *)(&__x1__3ss3_2))));
-    return ((int )_retVal0);
-    ((void)___destructor__F_P3ss4_autogen___2(((struct s4 *)(&__y2__3ss4_2))));
-    ((void)___destructor__F_P3ss4_autogen___2(((struct s4 *)(&__x2__3ss4_2))));
-    ((void)___destructor__F_P3ss3_autogen___2(((struct s3 *)(&__y1__3ss3_2))));
-    ((void)___destructor__F_P3ss3_autogen___2(((struct s3 *)(&__x1__3ss3_2))));
-}
Index: src/tests/.expect/math.txt
===================================================================
--- src/tests/.expect/math.txt	(revision 6cf27a070551542d34340180263c714585975c85)
+++ 	(revision )
@@ -1,59 +1,0 @@
-fabs: 1 1 1 1.41421 1.41421356237309505 1.41421356237309505
-fmod: 1 1 1 1 1 1
-remainder: -1 -1 -1
-remquo: 7 0.0999999 7 0.1 7 0.0999999999999999999
-div: 7 0.0999999 7 0.1 7 0.0999999999999999999
-fma: -2 -2 -2
-fdim: 2 2 2
-nan: nan nan nan
-exp: 2.71828 2.71828182845905 2.71828182845904524 1.46869+2.28736i 1.46869393991589+2.28735528717884i 1.46869393991588516+2.28735528717884239i
-exp2: 2 2 2
-expm1: 1.71828 1.71828182845905 1.71828182845904524
-log: 0 0 0 0.346574+0.785398i 0.346573590279973+0.785398163397448i 0.346573590279972655+0.78539816339744831i
-log2: 3 3 3
-log10: 2 2 2
-log1p: 0.693147 0.693147180559945 0.693147180559945309
-ilogb: 0 0 0
-logb: 3 3 3
-sqrt: 1 1 1 1.09868+0.45509i 1.09868411346781+0.455089860562227i 1.09868411346780997+0.455089860562227341i
-cbrt: 3 3 3
-hypot: 1.41421 1.4142135623731 1.41421356237309505
-pow: 1 1 1 0.273957+0.583701i 0.273957253830121+0.583700758758615i 0.273957253830121071+0.583700758758614628i
-sin: 0.841471 0.841470984807897 0.841470984807896507 1.29846+0.634964i 1.29845758141598+0.634963914784736i 1.29845758141597729+0.634963914784736108i
-cos: 0.540302 0.54030230586814 0.540302305868139717 0.83373-0.988898i 0.833730025131149-0.988897705762865i 0.833730025131149049-0.988897705762865096i
-tan: 1.55741 1.5574077246549 1.55740772465490223 0.271753+1.08392i 0.271752585319512+1.08392332733869i 0.271752585319511717+1.08392332733869454i
-asin: 1.5708 1.5707963267949 1.57079632679489662 0.666239+1.06128i 0.666239432492515+1.06127506190504i 0.666239432492515255+1.06127506190503565i
-acos: 0 0 0 0.904557-1.06128i 0.904556894302381-1.06127506190504i 0.904556894302381364-1.06127506190503565i
-atan: 0.785398 0.785398163397448 0.78539816339744831 1.01722+0.402359i 1.01722196789785+0.402359478108525i 1.01722196789785137+0.402359478108525094i
-atan2: 0.785398 0.785398163397448 0.78539816339744831 atan: 0.785398 0.785398163397448 0.78539816339744831 sinh: 1.1752 1.1752011936438 1.17520119364380146 0.634964+1.29846i 0.634963914784736+1.29845758141598i 0.634963914784736108+1.29845758141597729i
-cosh: 1.54308 1.54308063481524 1.54308063481524378 0.83373+0.988898i 0.833730025131149+0.988897705762865i 0.833730025131149049+0.988897705762865096i
-tanh: 0.761594 0.761594155955765 0.761594155955764888 1.08392+0.271753i 1.08392332733869+0.271752585319512i 1.08392332733869454+0.271752585319511717i
-acosh: 0 0 0 1.06128+0.904557i 1.06127506190504+0.904556894302381i 1.06127506190503565+0.904556894302381364i
-asinh: 0.881374 0.881373587019543 0.881373587019543025 1.06128+0.666239i 1.06127506190504+0.666239432492515i 1.06127506190503565+0.666239432492515255i
-atanh: inf inf inf 0.402359+1.01722i 0.402359478108525+1.01722196789785i 0.402359478108525094+1.01722196789785137i
-erf: 0.842701 0.842700792949715 0.842700792949714869
-erfc: 0.157299 0.157299207050285 0.157299207050285131
-lgamma: 1.79176 1.79175946922805 1.791759469228055
-lgamma: 1.79176 1 1.79175946922805 1 1.791759469228055 1
-tgamma: 6 6 6
-floor: 1 1 1
-ceil: 2 2 2
-trunc: 3 3 3
-rint: 2 2 2
-rint: 2 2 2
-rint: 2 2 2
-lrint: 2 2 2
-llrint: 2 2 2
-nearbyint: 4 4 4
-round: 2 2 2
-round: 2 2 2
-round: 2 2 2
-lround: 2 2 2
-llround: 2 2 2
-copysign: -1 -1 -1
-frexp: 0.5 3 0.5 3 0.5 3
-ldexp: 8 8 8
-modf: 2 0.3 2 0.3 2 0.3 nextafter: 2 2 2
-nexttoward: 2 2 2
-scalbn: 16 16 16
-scalbln: 16 16 16
Index: src/tests/test.py
===================================================================
--- src/tests/test.py	(revision 6cf27a070551542d34340180263c714585975c85)
+++ src/tests/test.py	(revision ccb447e9609db81bd657114979c4e4e539785111)
@@ -15,20 +15,51 @@
 #               help functions
 ################################################################################
+
+# Test class that defines what a test is
+class Test:
+    def __init__(self, name, path):
+        self.name, self.path = name, path
+
+# parses the Makefile to find the machine type (32-bit / 64-bit)
+def getMachineType():
+	sh('echo "int main() { return 0; }" > .dummy.c')
+	sh("make .dummy", print2stdout=False)
+	_, out = sh("file .dummy", print2stdout=False)
+	sh("rm -f .dummy.c > /dev/null 2>&1")
+	sh("rm -f .dummy > /dev/null 2>&1")
+	return re.search("ELF\s([0-9]+)-bit", out).group(1)
+
+# reads the directory ./.expect and indentifies the tests
 def listTests():
-	list = [splitext(f)[0] for f in listdir('./.expect')
+	machineType = getMachineType()
+
+	print(machineType)
+
+	# tests directly in the .expect folder will always be processed
+	generic_list = map(lambda fname: Test(fname, fname),
+		[splitext(f)[0] for f in listdir('./.expect')
 		if not f.startswith('.') and f.endswith('.txt')
-		]
-
-	return list
-
+		])
+
+	# tests in the machineType folder will be ran only for the corresponding compiler
+	typed_list = map(lambda fname: Test( fname, "%s/%s" % (machineType, fname) ),
+		[splitext(f)[0] for f in listdir("./.expect/%s" % machineType)
+		if not f.startswith('.') and f.endswith('.txt')
+		])
+
+	# append both lists to get
+	return generic_list + typed_list
+
+# helper functions to run terminal commands
 def sh(cmd, dry_run = False, print2stdout = True):
-	if dry_run :
+	if dry_run : 	# if this is a dry_run, only print the commands that would be ran
 		print("cmd: %s" % cmd)
 		return 0, None
-	else :
+	else :			# otherwise create a pipe and run the desired command
 		proc = Popen(cmd, stdout=None if print2stdout else PIPE, stderr=STDOUT, shell=True)
 		out, err = proc.communicate()
 		return proc.returncode, out
 
+# helper function to replace patterns in a file
 def file_replace(fname, pat, s_after):
     # first, see if the pattern is even in the file.
@@ -46,19 +77,18 @@
         os.rename(out_fname, fname)
 
+# tests output may differ depending on the depth of the makefile
 def fix_MakeLevel(file) :
 	if environ.get('MAKELEVEL') :
 		file_replace(file, "make\[%i\]" % int(environ.get('MAKELEVEL')), 'make' )
 
+# helper function to check if a files contains only a spacific string
 def fileContainsOnly(file, text) :
 	with open(file) as f:
 		ff = f.read().strip()
 		result = ff == text.strip()
-		#
-		# print("Comparing :\n\t'%s'\nWith:\n\t'%s'" % (ff, text))
-		# print("Result is : \n\t", end="")
-		# print(result)
 
 		return result;
 
+# check whether or not a file is executable
 def fileIsExecutable(file) :
 	try :
@@ -71,4 +101,9 @@
 		return False
 
+# find the test data for a given test name
+def filterTests(testname) :
+	found = [test for test in allTests if test.name == testname]
+	return (found[0] if len(found) == 1 else Test(testname, testname) )
+
 ################################################################################
 #               running test functions
@@ -76,30 +111,35 @@
 def run_test_instance(test, generate, dry_run):
 
-	out_file = (".out/%s.log" % test) if not generate else (".expect/%s.txt" % test)
-
+	# find the output file based on the test name and options flag
+	out_file = (".out/%s.log" % test.name) if not generate else (".expect/%s.txt" % test.path)
+
+	# remove any outputs from the previous tests to prevent side effects
 	sh("rm -f %s" % out_file, dry_run)
-	sh("rm -f %s > /dev/null 2>&1" % test, dry_run)
+	sh("rm -f %s > /dev/null 2>&1" % test.name, dry_run)
 
 	# build, skipping to next test on error
-	make_ret, _ = sh("%s %s 2> %s 1> /dev/null" % (make_cmd, test, out_file), dry_run)
-
+	make_ret, _ = sh("%s %s 2> %s 1> /dev/null" % (make_cmd, test.name, out_file), dry_run)
+
+	# if the make command succeds continue otherwise skip to diff
 	if make_ret == 0 :
 		# fetch optional input
-		stdinput = "< .in/%s.txt" % test if isfile(".in/%s.txt" % test) else ""
-
-		if fileIsExecutable(test) :
+		stdinput = "< .in/%s.txt" % test.name if isfile(".in/%s.txt" % test.path) else ""
+
+		if fileIsExecutable(test.name) :
 			# run test
-			sh("./%s %s > %s 2>&1" % (test, stdinput, out_file), dry_run)
+			sh("./%s %s > %s 2>&1" % (test.name, stdinput, out_file), dry_run)
 		else :
 			# simply cat the result into the output
-			sh("cat %s > %s" % (test, out_file), dry_run)
+			sh("cat %s > %s" % (test.name, out_file), dry_run)
 
 	retcode = 0
 	error = None
 
+	# fix output to prevent make depth to cause issues
 	fix_MakeLevel(out_file)
 
 	if generate :
-		if not dry_run and fileContainsOnly(out_file, "make: *** No rule to make target `%s'.  Stop." % test) :
+		# if we are ounly generating the output we still need to check that the test actually exists
+		if not dry_run and fileContainsOnly(out_file, "make: *** No rule to make target `%s'.  Stop." % test.name) :
 			retcode = 1;
 			error = "\t\tNo make target for test %s!" % test
@@ -122,13 +162,18 @@
 					".expect/%s.txt .out/%s.log")
 
-		retcode, error = sh(diff_cmd % (test, test), dry_run, False)
+		# fetch return code and error from the diff command
+		retcode, error = sh(diff_cmd % (test.path, test.name), dry_run, False)
 
 	# clean the executable
-	sh("rm -f %s > /dev/null 2>&1" % test, dry_run)
+	sh("rm -f %s > /dev/null 2>&1" % test.name, dry_run)
 
 	return retcode, error
 
-def run_tests(tests, generate, dry_run) :
+# run the given list of tests with the given parameters
+def run_tests(tests, generate, dry_run, jobs) :
+	# clean the sandbox from previous commands
 	sh("%s clean > /dev/null 2>&1" % make_cmd, dry_run)
+
+	#make sure the required folder are present
 	sh('mkdir -p .out .expect', dry_run)
 
@@ -137,10 +182,16 @@
 
 	failed = False;
+	# for eeach test to run
 	for t in tests:
-		print("%20s  " % t, end="")
-		sys.stdout.flush()
+		# print formated name
+		name_txt = "%20s  " % t.name
+
+		#run the test instance and collect the result
 		test_failed, error = run_test_instance(t, generate, dry_run)
+
+		# aggregate test suite result
 		failed = test_failed or failed
 
+		# update output based on current action
 		if generate :
 			failed_txt = "ERROR"
@@ -150,8 +201,17 @@
 			success_txt = "PASSED"
 
-		print(failed_txt if test_failed else success_txt)
+		#print result with error if needed
+		text = name_txt + (failed_txt if test_failed else success_txt)
+		out = sys.stdout
 		if error :
-			print(error, file=sys.stderr)
-
+			text = text + "\n" + error
+			out = sys.stderr
+
+		print(text, file = out);
+		sys.stdout.flush()
+		sys.stderr.flush()
+
+
+	#clean the workspace
 	sh("%s clean > /dev/null 2>&1" % make_cmd, dry_run)
 
@@ -161,4 +221,5 @@
 #               main loop
 ################################################################################
+# create a parser with the arguments for the tests script
 parser = argparse.ArgumentParser(description='Script which runs cforall tests')
 parser.add_argument('--dry-run', help='Don\'t run the tests, only output the commands', action='store_true')
@@ -166,8 +227,11 @@
 parser.add_argument('--all', help='Run all test available', action='store_true')
 parser.add_argument('--regenerate-expected', help='Regenerate the .expect by running the specified tets, can be used with --all option', action='store_true')
+parser.add_argument('-j', '--jobs', help='Number of tests to run simultaneously', type=int, default='8')
 parser.add_argument('tests', metavar='test', type=str, nargs='*', help='a list of tests to run')
 
+# parse the command line arguments
 options = parser.parse_args()
 
+# script must have at least some tests to run
 if (len(options.tests) > 0  and     options.all and not options.list) \
 or (len(options.tests) == 0 and not options.all and not options.list) :
@@ -176,28 +240,55 @@
 	sys.exit(1)
 
+# fetch the liest of all valid tests
 allTests = listTests()
 
+# if user wants all tests than no other treatement of the test list is required
 if options.all or options.list :
 	tests = allTests
 
 else :
+	#otherwise we need to validate that the test list that was entered is valid
 	tests = []
-	for test in options.tests:
-		if test in allTests or options.regenerate_expected :
-			tests.append(test)
-		else :
-			print('ERROR: No expected file for test %s, ignoring it' % test, file=sys.stderr)
-
+
+	# if we are regenerating the tests we need to find the information of the
+	# already existing tests and create new info for the new tests
+	if options.regenerate_expected :
+		tests = map(filterTests, options.tests)
+
+	else :
+		# otherwise we only need to validate that all tests are present in the complete list
+		for testname in options.tests:
+			test = [t for t in allTests if t.name == testname]
+
+			if len(test) != 0 :
+				tests.append( test[0] )
+			else :
+				print('ERROR: No expected file for test %s, ignoring it' % testname, file=sys.stderr)
+
+	# make sure we have at least some test to run
 	if len(tests) == 0 :
 		print('ERROR: No valid test to run', file=sys.stderr)
 		sys.exit(1)
 
-tests.sort()
+# sort the test alphabetically for convenience
+tests.sort(key=lambda t: t.name)
+
+# check if the user already passed in a number of jobs for multi-threading
 make_flags = environ.get('MAKEFLAGS')
+make_has_max_jobs = re.search("(-j|--jobs)\s*([0-9]+)", make_flags) if make_flags else None
+make_max_jobs = make_has_max_jobs.group(2) if make_has_max_jobs else None
 make_cmd = "make" if make_flags and "-j" in make_flags else "make -j8"
 
+# make sure we have a valid number of jobs that corresponds to user input
+options.jobs = int(make_max_jobs) if make_max_jobs else options.jobs
+if options.jobs <= 0 :
+	print('ERROR: Invalid number of jobs', file=sys.stderr)
+	sys.exit(1)
+
+# users may want to simply list the tests
 if options.list :
-	print("\n".join(tests))
+	print("\n".join(map(lambda t: "%s (%s)" % (t.name, t.path), tests)))
 
 else :
-	sys.exit( run_tests(tests, options.regenerate_expected, options.dry_run) )
+	# otherwise run all tests and make sure to return the correct error code
+	sys.exit( run_tests(tests, options.regenerate_expected, options.dry_run, options.jobs) )
