Index: doc/theses/fangren_yu_COOP_S20/Report.tex
===================================================================
--- doc/theses/fangren_yu_COOP_S20/Report.tex	(revision 341e2523af1d849989e4392150ee2ff385c4c602)
+++ doc/theses/fangren_yu_COOP_S20/Report.tex	(revision 6b93634e41101dad8c5ca2fcded69c9b671b129f)
@@ -1,3 +1,3 @@
-\documentclass[twoside,12pt]{article}
+\documentclass[twoside,11pt]{article}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -11,7 +11,8 @@
 \usepackage[labelformat=simple,aboveskip=0pt,farskip=0pt]{subfig}
 \renewcommand{\thesubfigure}{\alph{subfigure})}
+\usepackage[flushmargin]{footmisc}						% support label/reference in footnote
 \usepackage{latexsym}                                   % \Box glyph
 \usepackage{mathptmx}                                   % better math font with "times"
-\usepackage{appendix}
+\usepackage[toc]{appendix}								% article does not have appendix
 \usepackage[usenames]{color}
 \input{common}                                          % common CFA document macros
@@ -381,7 +382,4 @@
 \subsubsection{Source: \lstinline{AST/SymbolTable.hpp}}
 
-
-\subsubsection{Source: \lstinline{SymTab/Indexer.h}}
-
 Function
 \begin{C++}
@@ -612,35 +610,35 @@
 
 
-\begin{appendices}[toc,titletoc]
+\appendix
 \section{Appendix}
-
 
 \subsection{Kinds of Type Parameters}
 \label{s:KindsTypeParameters}
 
-A type parameter in a @forall@ clause has three possible kinds:
+A type parameter in a @forall@ clause has 3 kinds:
 \begin{enumerate}[listparindent=0pt]
 \item
-@dtype@: any data type (built-in or user defined).
-
-There is also a difference between opaque types (incomplete types, \ie those with only a forward declaration) and concrete types.
-Only concrete types can be directly used as a variable type.
-
-\CFA provides the @otype@ shorthand to require a type parameter be concrete, which also implicitly asserts the existence of its default and copy constructors, assignment, and destructor\footnote{\CFA implements the same automatic resource management (RAII) semantics as \CC.}.
-\item
-@ftype@: any function type.
-
-@ftype@ provides two purposes:
-\begin{itemize}
-\item
-Differentiate function pointer from data pointer because (in theory) some systems have different sizes for these pointers.
-\item
-Disallow a function pointer to match an overloaded data pointer, since variables and functions can have the same names.
-\end{itemize}
+@dtype@: any data type (built-in or user defined) that is not a concrete type.
+
+A non-concrete type is an incomplete type such as an opaque type or pointer/reference with an implicit (pointer) size and implicitly generated reference and dereference operations.
+\item
+@otype@: any data type (built-in or user defined) that is concrete type.
+
+A concrete type is a complete type, \ie types that can be used to create a variable, which also implicitly asserts the existence of default and copy constructors, assignment, and destructor\footnote{\CFA implements the same automatic resource management (RAII) semantics as \CC.}.
+% \item
+% @ftype@: any function type.
+% 
+% @ftype@ provides two purposes:
+% \begin{itemize}
+% \item
+% Differentiate function pointer from data pointer because (in theory) some systems have different sizes for these pointers.
+% \item
+% Disallow a function pointer to match an overloaded data pointer, since variables and functions can have the same names.
+% \end{itemize}
 
 \item
 @ttype@: tuple (variadic) type.
 
-@ttype@ parameter may only appear as type of the last parameter in a function, and it provides a type-safe way to implement variadic functions.
+Restricted to the type for the last parameter in a function, it provides a type-safe way to implement variadic functions.
 Note however, that it has certain restrictions, as described in the implementation section below.
 \end{enumerate}
@@ -673,10 +671,7 @@
 \begin{enumerate}
 \item
-All types are function declarations are candidates of implicit parameters.
+All types, variables, and functions are candidates of implicit parameters
 \item
 The parameter (assertion) name must match the actual declarations.
-\item
-Currently, assertions are all functions.
-Note that since \CFA has variable overloading, implicit value parameters might also be supported in the future.
 \end{enumerate}
 
@@ -732,5 +727,4 @@
 In particular, polymorphic variadic recursion must be structural (\ie the number of arguments decreases in any possible recursive calls), otherwise code generation gets into an infinite loop.
 The \CFA compiler sets a limit on assertion depth and reports an error if assertion resolution does not terminate within the limit (as for \lstinline[language=C++]@templates@ in \CC).
-\end{appendices}
 
 \bibliographystyle{plain}
Index: sts/.expect/poly-cycle.txt
===================================================================
--- tests/.expect/poly-cycle.txt	(revision 341e2523af1d849989e4392150ee2ff385c4c602)
+++ 	(revision )
@@ -1,1 +1,0 @@
-Success!
Index: tests/.expect/poly-d-cycle.txt
===================================================================
--- tests/.expect/poly-d-cycle.txt	(revision 6b93634e41101dad8c5ca2fcded69c9b671b129f)
+++ tests/.expect/poly-d-cycle.txt	(revision 6b93634e41101dad8c5ca2fcded69c9b671b129f)
@@ -0,0 +1,1 @@
+Success!
Index: tests/.expect/poly-o-cycle.txt
===================================================================
--- tests/.expect/poly-o-cycle.txt	(revision 6b93634e41101dad8c5ca2fcded69c9b671b129f)
+++ tests/.expect/poly-o-cycle.txt	(revision 6b93634e41101dad8c5ca2fcded69c9b671b129f)
@@ -0,0 +1,1 @@
+Success!
Index: sts/poly-cycle.cfa
===================================================================
--- tests/poly-cycle.cfa	(revision 341e2523af1d849989e4392150ee2ff385c4c602)
+++ 	(revision )
@@ -1,28 +1,0 @@
-// Check that a cycle of polymorphic data structures can be instancated.
-
-#include <stdio.h>
-
-forall(otype T)
-struct func_table;
-
-forall(otype U)
-struct object {
-	func_table(U) * virtual_table;
-};
-
-forall(otype T)
-struct func_table {
-	void (*object_func)(object(T) *);
-};
-
-void func(object(int) *) {
-	printf("Success!\n");
-}
-
-func_table(int) an_instance = { func };
-
-int main(int argc, char * argv[]) {
-	object(int) x = { 0p };
-	an_instance.object_func( &x );
-	return 0;
-}
Index: tests/poly-d-cycle.cfa
===================================================================
--- tests/poly-d-cycle.cfa	(revision 6b93634e41101dad8c5ca2fcded69c9b671b129f)
+++ tests/poly-d-cycle.cfa	(revision 6b93634e41101dad8c5ca2fcded69c9b671b129f)
@@ -0,0 +1,28 @@
+// Check that a cycle of polymorphic dtype structures can be instancated.
+
+#include <stdio.h>
+
+forall(dtype T)
+struct func_table;
+
+forall(dtype U)
+struct object {
+	func_table(U) * virtual_table;
+};
+
+forall(dtype T)
+struct func_table {
+	void (*object_func)(object(T) *);
+};
+
+void func(object(int) *) {
+	printf("Success!\n");
+}
+
+func_table(int) an_instance = { func };
+
+int main(int argc, char * argv[]) {
+	object(int) x = { 0p };
+	an_instance.object_func( &x );
+	return 0;
+}
Index: tests/poly-o-cycle.cfa
===================================================================
--- tests/poly-o-cycle.cfa	(revision 6b93634e41101dad8c5ca2fcded69c9b671b129f)
+++ tests/poly-o-cycle.cfa	(revision 6b93634e41101dad8c5ca2fcded69c9b671b129f)
@@ -0,0 +1,28 @@
+// Check that a cycle of polymorphic otype structures can be instancated.
+
+#include <stdio.h>
+
+forall(otype T)
+struct func_table;
+
+forall(otype U)
+struct object {
+	func_table(U) * virtual_table;
+};
+
+forall(otype T)
+struct func_table {
+	void (*object_func)(object(T) *);
+};
+
+void func(object(int) *) {
+	printf("Success!\n");
+}
+
+func_table(int) an_instance = { func };
+
+int main(int argc, char * argv[]) {
+	object(int) x = { 0p };
+	an_instance.object_func( &x );
+	return 0;
+}
