Index: doc/generic_types/.gitignore
===================================================================
--- doc/generic_types/.gitignore	(revision 6013bd75b2059dd159f97c81e5c0ca86a9110fdf)
+++ doc/generic_types/.gitignore	(revision f20dffa2675e9a99fea8be6f3051a231662bcebb)
@@ -13,3 +13,5 @@
 *.ps
 *.toc
+*.lof
+*.lot
 *.synctex.gz
Index: doc/generic_types/generic_types.bib
===================================================================
--- doc/generic_types/generic_types.bib	(revision 6013bd75b2059dd159f97c81e5c0ca86a9110fdf)
+++ doc/generic_types/generic_types.bib	(revision f20dffa2675e9a99fea8be6f3051a231662bcebb)
@@ -20,2 +20,11 @@
     note	= {\href{http://plg.uwaterloo.ca/theses/DitchfieldThesis.pdf}{http://\-plg.uwaterloo.ca/\-theses/\-DitchfieldThesis.pdf}}
 }
+
+@mastersthesis{Schluntz17,
+    author  = {Schluntz, Robert},
+    title   = {Resource Management and Tuples in C$\mathbf{\forall}$},
+    school	= {School of Computer Science, University of Waterloo},
+    year	= 2017,
+    address	= {Waterloo, Ontario, Canada, N2L 3G1},
+    note    = {[[unpublished]]}
+}
Index: doc/generic_types/generic_types.tex
===================================================================
--- doc/generic_types/generic_types.tex	(revision 6013bd75b2059dd159f97c81e5c0ca86a9110fdf)
+++ doc/generic_types/generic_types.tex	(revision f20dffa2675e9a99fea8be6f3051a231662bcebb)
@@ -20,5 +20,5 @@
 	morekeywords={_Alignas,_Alignof,__alignof,__alignof__,asm,__asm,__asm__,_At,_Atomic,__attribute,__attribute__,auto,
 		_Bool,catch,catchResume,choose,_Complex,__complex,__complex__,__const,__const__,disable,dtype,enable,__extension__,
-		fallthrough,fallthru,finally,forall,ftype,_Generic,_Imaginary,inline,__label__,lvalue,_Noreturn,one_t,otype,restrict,_Static_assert,
+		fallthrough,fallthru,finally,forall,ftype,_Generic,_Imaginary,inline,__label__,lvalue,_Noreturn,one_t,otype,restrict,sized,_Static_assert,
 		_Thread_local,throw,throwResume,trait,try,typeof,__typeof,__typeof__,zero_t},
 }%
@@ -57,5 +57,5 @@
 \acmJournal{PACMPL}
 
-\title{Generic Types with Efficient Dynamic Layout in \CFA{}}
+\title{Generic and Tuple Types with Efficient Dynamic Layout in \CFA{}}
 
 \author{Aaron Moss}
@@ -95,6 +95,6 @@
 \email{pabuhr@uwaterloo.ca}
 
-\terms{generic, types}
-\keywords{generic types, polymorphic functions, Cforall}
+\terms{generic, tuple, types}
+\keywords{generic types, tuple types, polymorphic functions, C, Cforall}
 
 \begin{CCSXML}
@@ -132,7 +132,17 @@
 \section{Introduction \& Background}
 
-\CFA{}\footnote{Pronounced ``C-for-all'', and written \CFA{} or Cforall.} is an evolutionary extension of the C programming language which aims to add modern language features to C while maintaining both source compatibility with C and a familiar mental model for programmers. This paper describes how generic types are designed and implemented in \CFA{}, and how they interact with \CFA{}'s polymorphic functions.
+\CFA{}\footnote{Pronounced ``C-for-all'', and written \CFA{} or Cforall.} is an evolutionary extension of the C programming language which aims to add modern language features to C while maintaining both source compatibility with C and a familiar mental model for programmers. Four key design goals were set out in the original design of \CFA{} \citep{Bilson03}:
+\begin{enumerate}
+\item The behaviour of standard C code must remain the same when translated by a \CFA{} compiler as when translated by a C compiler.
+\item Standard C code must be as fast and as small when translated by a \CFA{} compiler as when translated by a C compiler.
+\item \CFA{} code must be at least as portable as standard C code.
+\item Extensions introduced by \CFA{} must be translated in the most efficient way possible.
+\end{enumerate}
+The purpose of these goals is to ensure that existing C codebases can be converted to \CFA{} incrementally and with minimal effort, and that programmers who already know C can productively produce \CFA{} code without extensive training beyond the extension features they wish to employ.
+
+\CFA{} has been previously extended with polymorphic functions and name overloading (including operator overloading) \citep{Bilson03}, and deterministically-executed constructors and destructors \citep{Schluntz17}. This paper describes how generic and tuple types are designed and implemented in \CFA{} in accordance with both the backward compatibility goals and existing features described above.
 
 \subsection{Polymorphic Functions}
+\label{sec:poly-fns}
 
 \CFA{}'s polymorphism was originally formalized by \citet{Ditchfield92}, and first implemented by \citet{Bilson03}. The signature feature of \CFA{} is parametric-polymorphic functions; such functions are written using a @forall@ clause (which gives the language its name): 
@@ -191,4 +201,5 @@
 }
 \end{lstlisting}
+This capability allows specifying the same set of assertions in multiple locations, without the repetition and likelihood of mistakes that come with manually writing them out for each function declaration.
 
 @otype@ is essentially syntactic sugar for the following trait:
@@ -198,7 +209,27 @@
 	void ?{}(T*);  // default constructor
 	void ?{}(T*, T);  // copy constructor
-	T ?=?(T*, T);  // assignment operator
+	void ?=?(T*, T);  // assignment operator
 	void ^?{}(T*);  // destructor
 };
+\end{lstlisting}
+Given this information, variables of polymorphic type can be treated as if they were a complete struct type -- they can be stack-allocated using the @alloca@ compiler builtin, default or copy-initialized, assigned, and deleted. As an example, the @abs@ function above would produce generated code something like the following (simplified for clarity and brevity):
+\begin{lstlisting}
+void abs( size_t _sizeof_M, size_t _alignof_M, 
+		void (*_ctor_M)(void*), void (*_copy_M)(void*, void*), 
+		void (*_assign_M)(void*, void*), void (*_dtor_M)(void*), 
+		bool (*_lt_M)(void*, void*), void (*_neg_M)(void*, void*), 
+    	void (*_ctor_M_zero)(void*, int), 
+		void* m, void* _rtn ) {  // polymorphic parameter and return passed as void*
+	// M zero = { 0 };
+	void* zero = alloca(_sizeof_M);  // stack allocate 0 temporary
+	_ctor_M_zero(zero, 0);  // initialize using zero_t constructor
+	// return m < zero ? -m : m;
+	void *_tmp = alloca(_sizeof_M)
+	_copy_M( _rtn,  // copy-initialize return value
+		_lt_M( m, zero ) ?  // check condition
+		 (_neg_M(m, _tmp), _tmp) :  // negate m
+		 m);
+	_dtor_M(_tmp); _dtor_M(zero);  // destroy temporaries
+}
 \end{lstlisting}
 
@@ -282,6 +313,11 @@
 \end{lstlisting}
 
-\TODO{} Maybe move this after the rest of the discussion.
-This re-use of dtype-static struct instantiations enables some useful programming patterns at zero runtime cost. The most important such pattern is using @forall(dtype T) T*@ as a type-checked replacement for @void*@, as in this example, which takes a @qsort@ or @bsearch@-compatible comparison routine and creates a similar lexicographic comparison for pairs of pointers:
+Though \CFA{} implements concrete generic types efficiently, it also has a fully-general system for computing with dynamic generic types. As mentioned in Section~\ref{sec:poly-fns}, @otype@ function parameters (in fact all @sized@ polymorphic parameters) come with implicit size and alignment parameters provided by the caller. Dynamic generic structs also come with an \emph{offset array} which contains the offsets of each member of the struct\footnote{Dynamic generic unions need no such offset array, as all members are at offset 0.}. Access to members\footnote{The \lstinline@offsetof@ macro is implmented similarly.} of a dynamic generic struct is provided by adding the corresponding member of the offset array to the struct pointer at runtime, essentially moving a compile-time offset calculation to runtime where neccessary.
+
+\TODO{} Discuss caller-provided versus callee-provided offset arrays, layout functions.
+
+Whether a type is concrete, dtype-static, or dynamic is decided based solely on the type parameters and @forall@ clause on the struct declaration. This allows opaque forward declarations of generic types like @forall(otype T) struct Box;@ -- like in C, all uses of @Box(T)@ can be in a separately compiled translation unit, and callers from other translation units will know the proper calling conventions to use. If the definition of a struct type was included in the determination of dynamic or concrete, some further types may be recognized as dtype-static (\eg, @forall(otype T) struct unique_ptr { T* p };@ does not depend on @T@ for its layout, but the existence of an @otype@ parameter means that it \emph{could}.), but preserving separate compilation (and the associated C compatibility) in this way is judged to be an appropriate trade-off.
+
+The re-use of dtype-static struct instantiations enables some useful programming patterns at zero runtime cost. The most important such pattern is using @forall(dtype T) T*@ as a type-checked replacement for @void*@, as in this example, which takes a @qsort@ or @bsearch@-compatible comparison routine and creates a similar lexicographic comparison for pairs of pointers:
 \begin{lstlisting}
 forall(dtype T)
@@ -311,5 +347,5 @@
 scalar(metres) marathon = half_marathon + half_marathon;
 scalar(litres) two_pools = swimming_pool + swimming_pool;
-marathon + swimming_pool; // ERRORv -- caught by compiler
+marathon + swimming_pool; // ERROR -- caught by compiler
 \end{lstlisting}
 @scalar@ is a dtype-static type, so all uses of it will use a single struct definition, containing only a single @unsigned long@, and can share the same implementations of common routines like @?+?@ -- these implementations may even be separately compiled, unlike \CC{} template functions. However, the \CFA{} type-checker will ensure that matching types are used by all calls to @?+?@, preventing nonsensical computations like adding the length of a marathon to the volume of an olympic pool.
@@ -323,9 +359,11 @@
 \section{Related Work}
 
-\TODO{} Talk about \CC{}, Cyclone, \etc{}
-
-\section{Conclusion}
-
-\TODO{}
+\TODO{} Talk about \CC{}, Cyclone, maybe D, Rust, \etc{}
+
+A major difference between the approaches of \CC{} and \CFA{} to polymorphism is that the set of assumed properties for a type is \emph{explicit} in \CFA{}. One of the major limiting factors of \CC{}'s approach is that templates cannot be separately compiled. In contrast, the explicit nature of assertions allows \CFA{}'s polymorphic functions to be separately compiled.
+
+\section{Conclusion \& Future Work}
+
+\TODO{} Among future work, talk about ideas for selectively template-expanding code (on decls for specific types, or on calls for accessible decls).
 
 \bibliographystyle{ACM-Reference-Format}
Index: doc/rob_thesis/.gitignore
===================================================================
--- doc/rob_thesis/.gitignore	(revision f20dffa2675e9a99fea8be6f3051a231662bcebb)
+++ doc/rob_thesis/.gitignore	(revision f20dffa2675e9a99fea8be6f3051a231662bcebb)
@@ -0,0 +1,17 @@
+# generated by latex
+*.aux
+*.bbl
+*.blg
+*.brf
+*.dvi
+*.idx
+*.ilg
+*.ind
+*.log
+*.out
+*.pdf
+*.ps
+*.toc
+*.lof
+*.lot
+*.synctex.gz
Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 6013bd75b2059dd159f97c81e5c0ca86a9110fdf)
+++ src/CodeGen/CodeGenerator.cc	(revision f20dffa2675e9a99fea8be6f3051a231662bcebb)
@@ -147,4 +147,9 @@
 
 	void CodeGenerator::visit( ObjectDecl * objectDecl ) {
+		if (objectDecl->get_name().empty()) {
+			static UniqueName name = { "__anonymous_object" };
+			objectDecl->set_name( name.newName() );
+		}
+
 		extension( objectDecl );
 		genAttributes( objectDecl->get_attributes() );
Index: src/libcfa/Makefile.am
===================================================================
--- src/libcfa/Makefile.am	(revision 6013bd75b2059dd159f97c81e5c0ca86a9110fdf)
+++ src/libcfa/Makefile.am	(revision f20dffa2675e9a99fea8be6f3051a231662bcebb)
@@ -35,5 +35,5 @@
 	 ${AM_V_GEN}@BACKEND_CC@ @CFA_FLAGS@ -D__CFA_DEBUG__ -O0 -c -o $@ $<
 
-EXTRA_FLAGS = -g -Wall -Wno-unused-function -I${abs_top_srcdir}/src/libcfa/libhdr -imacros libcfa-prelude.c @CFA_FLAGS@
+EXTRA_FLAGS = -g -Wall -Werror -Wno-unused-function -I${abs_top_srcdir}/src/libcfa/libhdr -imacros libcfa-prelude.c @CFA_FLAGS@
 
 AM_CCASFLAGS = @CFA_FLAGS@
Index: src/libcfa/Makefile.in
===================================================================
--- src/libcfa/Makefile.in	(revision 6013bd75b2059dd159f97c81e5c0ca86a9110fdf)
+++ src/libcfa/Makefile.in	(revision f20dffa2675e9a99fea8be6f3051a231662bcebb)
@@ -305,5 +305,5 @@
 AUTOMAKE_OPTIONS = subdir-objects
 lib_LIBRARIES = $(am__append_1) $(am__append_2)
-EXTRA_FLAGS = -g -Wall -Wno-unused-function -I${abs_top_srcdir}/src/libcfa/libhdr -imacros libcfa-prelude.c @CFA_FLAGS@
+EXTRA_FLAGS = -g -Wall -Werror -Wno-unused-function -I${abs_top_srcdir}/src/libcfa/libhdr -imacros libcfa-prelude.c @CFA_FLAGS@
 AM_CCASFLAGS = @CFA_FLAGS@
 headers = limits stdlib math iostream fstream iterator rational assert \
Index: src/tests/.expect/32/KRfunctions.txt
===================================================================
--- src/tests/.expect/32/KRfunctions.txt	(revision 6013bd75b2059dd159f97c81e5c0ca86a9110fdf)
+++ src/tests/.expect/32/KRfunctions.txt	(revision f20dffa2675e9a99fea8be6f3051a231662bcebb)
@@ -47,6 +47,6 @@
     int ___retval_f5__i_1;
 }
-int (*__f6__FPFi_i__iPiPi__1(int __a__i_1, int *__b__Pi_1, int *__c__Pi_1))(int ){
-    int (*___retval_f6__PFi_i__1)(int );
+int (*__f6__FPFi_i__iPiPi__1(int __a__i_1, int *__b__Pi_1, int *__c__Pi_1))(int __anonymous_object0){
+    int (*___retval_f6__PFi_i__1)(int __anonymous_object1);
 }
 int (*__f7__FPFi_ii__iPiPi__1(int __a__i_1, int *__b__Pi_1, int *__c__Pi_1))(int __a__i_1, int __b__i_1){
@@ -61,5 +61,5 @@
 int *(*__f10__FPFPi_ii__iPiPid__1(int __a__i_1, int *__b__Pi_1, int *__c__Pi_1, double __y__d_1))(int __x__i_1, int __y__i_1){
     int *(*___retval_f10__PFPi_ii__1)(int __x__i_1, int __y__i_1);
-    int *__x__FPi_ii__2(int , int );
+    int *__x__FPi_ii__2(int __anonymous_object2, int __anonymous_object3);
     ((void)(___retval_f10__PFPi_ii__1=__x__FPi_ii__2) /* ?{} */);
     return ((int *(*)(int __x__i_1, int __y__i_1))___retval_f10__PFPi_ii__1);
@@ -79,5 +79,5 @@
 const int __fred__FCi___1(){
     const int ___retval_fred__Ci_1;
-    int *(*__x__PFPi_ii__2)(int , int );
+    int *(*__x__PFPi_ii__2)(int __anonymous_object4, int __anonymous_object5);
     int __a__i_2;
     int __b__i_2;
Index: src/tests/.expect/32/attributes.txt
===================================================================
--- src/tests/.expect/32/attributes.txt	(revision f20dffa2675e9a99fea8be6f3051a231662bcebb)
+++ src/tests/.expect/32/attributes.txt	(revision f20dffa2675e9a99fea8be6f3051a231662bcebb)
@@ -0,0 +1,3 @@
+attributes.c:74 error: cannot redefine typedef: ptrdiff_t
+attributes.c:75 error: cannot redefine typedef: size_t
+make: *** [attributes] Error 1
Index: src/tests/.expect/64/KRfunctions.txt
===================================================================
--- src/tests/.expect/64/KRfunctions.txt	(revision 6013bd75b2059dd159f97c81e5c0ca86a9110fdf)
+++ src/tests/.expect/64/KRfunctions.txt	(revision f20dffa2675e9a99fea8be6f3051a231662bcebb)
@@ -47,6 +47,6 @@
     int ___retval_f5__i_1;
 }
-int (*__f6__FPFi_i__iPiPi__1(int __a__i_1, int *__b__Pi_1, int *__c__Pi_1))(int ){
-    int (*___retval_f6__PFi_i__1)(int );
+int (*__f6__FPFi_i__iPiPi__1(int __a__i_1, int *__b__Pi_1, int *__c__Pi_1))(int __anonymous_object0){
+    int (*___retval_f6__PFi_i__1)(int __anonymous_object1);
 }
 int (*__f7__FPFi_ii__iPiPi__1(int __a__i_1, int *__b__Pi_1, int *__c__Pi_1))(int __a__i_1, int __b__i_1){
@@ -61,5 +61,5 @@
 int *(*__f10__FPFPi_ii__iPiPid__1(int __a__i_1, int *__b__Pi_1, int *__c__Pi_1, double __y__d_1))(int __x__i_1, int __y__i_1){
     int *(*___retval_f10__PFPi_ii__1)(int __x__i_1, int __y__i_1);
-    int *__x__FPi_ii__2(int , int );
+    int *__x__FPi_ii__2(int __anonymous_object2, int __anonymous_object3);
     ((void)(___retval_f10__PFPi_ii__1=__x__FPi_ii__2) /* ?{} */);
     return ((int *(*)(int __x__i_1, int __y__i_1))___retval_f10__PFPi_ii__1);
@@ -79,5 +79,5 @@
 const int __fred__FCi___1(){
     const int ___retval_fred__Ci_1;
-    int *(*__x__PFPi_ii__2)(int , int );
+    int *(*__x__PFPi_ii__2)(int __anonymous_object4, int __anonymous_object5);
     int __a__i_2;
     int __b__i_2;
Index: src/tests/.expect/64/attributes.txt
===================================================================
--- src/tests/.expect/64/attributes.txt	(revision 6013bd75b2059dd159f97c81e5c0ca86a9110fdf)
+++ src/tests/.expect/64/attributes.txt	(revision f20dffa2675e9a99fea8be6f3051a231662bcebb)
@@ -58,5 +58,5 @@
     __attribute__ ((used,unused,unused)) int __f7__i_1;
     __attribute__ ((used,used,unused)) int __f8__i_1;
-    __attribute__ ((unused)) int ;
+    __attribute__ ((unused)) int __anonymous_object0;
     __attribute__ ((unused,unused)) int *__f9__Pi_1;
 };
@@ -226,16 +226,16 @@
     int **const ___retval_f2__CPPi_1;
 }
-__attribute__ ((unused,used,unused)) int (*__f3__FPA0i_i__1(int ))[];
+__attribute__ ((unused,used,unused)) int (*__f3__FPA0i_i__1(int __anonymous_object1))[];
 __attribute__ ((unused,unused)) int (*__f3__FPA0i_i__1(int __p__i_1))[]{
     int (*___retval_f3__PA0i_1)[];
 }
-__attribute__ ((unused,used,unused)) int (*__f4__FPFi_i____1())(int );
-__attribute__ ((unused,unused)) int (*__f4__FPFi_i____1())(int ){
-    int (*___retval_f4__PFi_i__1)(int );
+__attribute__ ((unused,used,unused)) int (*__f4__FPFi_i____1())(int __anonymous_object2);
+__attribute__ ((unused,unused)) int (*__f4__FPFi_i____1())(int __anonymous_object3){
+    int (*___retval_f4__PFi_i__1)(int __anonymous_object4);
 }
 __attribute__ ((__nothrow__,__leaf__,__malloc__)) extern void *malloc(long unsigned int __size);
 __attribute__ ((__nothrow__,__leaf__)) extern void free(void *__ptr);
 __attribute__ ((__nothrow__,__leaf__,__noreturn__)) extern void abort(void);
-__attribute__ ((__nothrow__,__leaf__,__nonnull__(1))) extern int atexit0(void (*__func)(void), void *, void *);
+__attribute__ ((__nothrow__,__leaf__,__nonnull__(1))) extern int atexit0(void (*__func)(void), void *__anonymous_object5, void *__anonymous_object6);
 __attribute__ ((__nothrow__,__leaf__,__noreturn__)) extern void exit(int __status);
 __attribute__ ((format(printf, 1, 2))) extern int printf(const char *__restrict __format, ...);
@@ -268,8 +268,8 @@
 int __tpr2__Fi_PPi__1(__attribute__ ((unused,unused,unused,unused,unused,unused)) int **__Foo__PPi_1);
 int __tpr3__Fi_Pi__1(__attribute__ ((unused,unused,unused)) int *__Foo__Pi_1);
-int __tpr4__Fi_PFi_Pi___1(__attribute__ ((unused,unused)) int (*)(__attribute__ ((unused,unused)) int [((long unsigned int )5)]));
+int __tpr4__Fi_PFi_Pi___1(__attribute__ ((unused,unused)) int (*__anonymous_object7)(__attribute__ ((unused,unused)) int __anonymous_object8[((long unsigned int )5)]));
 int __tpr5__Fi_PFi____1(__attribute__ ((unused,unused,unused)) int (*__Foo__PFi___1)());
 int __tpr6__Fi_PFi____1(__attribute__ ((unused,unused,unused)) int (*__Foo__PFi___1)());
-int __tpr7__Fi_PFi_PFi_i____1(__attribute__ ((unused,unused)) int (*)(__attribute__ ((unused)) int (*)(__attribute__ ((unused,unused)) int )));
+int __tpr7__Fi_PFi_PFi_i____1(__attribute__ ((unused,unused)) int (*__anonymous_object9)(__attribute__ ((unused)) int (*__anonymous_object10)(__attribute__ ((unused,unused)) int __anonymous_object11)));
 int __ad__Fi___1(){
     int ___retval_ad__i_1;
@@ -320,16 +320,16 @@
     ((void)sizeof(enum __anonymous5 ));
 }
-int __apd1__Fi_PiPi__1(__attribute__ ((unused,unused,unused)) int *, __attribute__ ((unused,unused,unused)) int *);
-int __apd2__Fi_PPiPPi__1(__attribute__ ((unused,unused,unused,unused)) int **, __attribute__ ((unused,unused,unused,unused)) int **);
-int __apd3__Fi_PiPi__1(__attribute__ ((unused,unused,unused)) int *, __attribute__ ((unused,unused,unused)) int *);
-int __apd4__Fi_PFi__PFi____1(__attribute__ ((unused,unused,unused)) int (*)(), __attribute__ ((unused,unused,unused)) int (*)());
-int __apd5__Fi_PFi_i_PFi_i___1(__attribute__ ((unused,unused,unused)) int (*)(__attribute__ ((unused)) int ), __attribute__ ((unused,unused,unused)) int (*)(__attribute__ ((unused)) int ));
-int __apd6__Fi_PFi__PFi____1(__attribute__ ((unused,unused,unused)) int (*)(), __attribute__ ((unused,unused,unused)) int (*)());
-int __apd7__Fi_PFi_i_PFi_i___1(__attribute__ ((unused,unused,unused)) int (*)(__attribute__ ((unused)) int ), __attribute__ ((unused,unused,unused)) int (*)(__attribute__ ((unused)) int ));
+int __apd1__Fi_PiPi__1(__attribute__ ((unused,unused,unused)) int *__anonymous_object12, __attribute__ ((unused,unused,unused)) int *__anonymous_object13);
+int __apd2__Fi_PPiPPi__1(__attribute__ ((unused,unused,unused,unused)) int **__anonymous_object14, __attribute__ ((unused,unused,unused,unused)) int **__anonymous_object15);
+int __apd3__Fi_PiPi__1(__attribute__ ((unused,unused,unused)) int *__anonymous_object16, __attribute__ ((unused,unused,unused)) int *__anonymous_object17);
+int __apd4__Fi_PFi__PFi____1(__attribute__ ((unused,unused,unused)) int (*__anonymous_object18)(), __attribute__ ((unused,unused,unused)) int (*__anonymous_object19)());
+int __apd5__Fi_PFi_i_PFi_i___1(__attribute__ ((unused,unused,unused)) int (*__anonymous_object20)(__attribute__ ((unused)) int __anonymous_object21), __attribute__ ((unused,unused,unused)) int (*__anonymous_object22)(__attribute__ ((unused)) int __anonymous_object23));
+int __apd6__Fi_PFi__PFi____1(__attribute__ ((unused,unused,unused)) int (*__anonymous_object24)(), __attribute__ ((unused,unused,unused)) int (*__anonymous_object25)());
+int __apd7__Fi_PFi_i_PFi_i___1(__attribute__ ((unused,unused,unused)) int (*__anonymous_object26)(__attribute__ ((unused)) int __anonymous_object27), __attribute__ ((unused,unused,unused)) int (*__anonymous_object28)(__attribute__ ((unused)) int __anonymous_object29));
 struct Vad {
-    __attribute__ ((unused)) int ;
-    __attribute__ ((unused,unused)) int *;
-    __attribute__ ((unused,unused)) int [((long unsigned int )10)];
-    __attribute__ ((unused,unused)) int (*)();
+    __attribute__ ((unused)) int __anonymous_object30;
+    __attribute__ ((unused,unused)) int *__anonymous_object31;
+    __attribute__ ((unused,unused)) int __anonymous_object32[((long unsigned int )10)];
+    __attribute__ ((unused,unused)) int (*__anonymous_object33)();
 };
 static inline void ___constructor__F_P4sVad_autogen___1(struct Vad *___dst__P4sVad_1);
Index: src/tests/Makefile.am
===================================================================
--- src/tests/Makefile.am	(revision 6013bd75b2059dd159f97c81e5c0ca86a9110fdf)
+++ src/tests/Makefile.am	(revision f20dffa2675e9a99fea8be6f3051a231662bcebb)
@@ -51,4 +51,7 @@
 	@+python test.py --list --concurrent=${concurrent}
 
+.dummy : .dummy.c
+	${CC} ${CFLAGS} -XCFA -n ${<} -o ${@}
+
 constant0-1DP : constant0-1.c
 	${CC} ${CFLAGS} -DDUPS ${<} -o ${@}
Index: src/tests/Makefile.in
===================================================================
--- src/tests/Makefile.in	(revision 6013bd75b2059dd159f97c81e5c0ca86a9110fdf)
+++ src/tests/Makefile.in	(revision f20dffa2675e9a99fea8be6f3051a231662bcebb)
@@ -669,4 +669,7 @@
 	@+python test.py --list --concurrent=${concurrent}
 
+.dummy : .dummy.c
+	${CC} ${CFLAGS} -XCFA -n ${<} -o ${@}
+
 constant0-1DP : constant0-1.c
 	${CC} ${CFLAGS} -DDUPS ${<} -o ${@}
Index: src/tests/test.py
===================================================================
--- src/tests/test.py	(revision 6013bd75b2059dd159f97c81e5c0ca86a9110fdf)
+++ src/tests/test.py	(revision f20dffa2675e9a99fea8be6f3051a231662bcebb)
@@ -25,5 +25,5 @@
 # parses the Makefile to find the machine type (32-bit / 64-bit)
 def getMachineType():
-	sh('echo "int main() { return 0; }" > .dummy.c')
+	sh('echo "void ?{}(int*a,int b){}int main(){return 0;}" > .dummy.c')
 	sh("make .dummy", print2stdout=False)
 	_, out = sh("file .dummy", print2stdout=False)
