Index: libcfa/src/exception.c
===================================================================
--- libcfa/src/exception.c	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ libcfa/src/exception.c	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -248,13 +248,7 @@
 }
 
-#if defined(PIC)
-#warning Exceptions not yet supported when using Position-Independent Code
-__attribute__((noinline))
-void __cfaabi_ehm__try_terminate(void (*try_block)(),
-		void (*catch_block)(int index, exception_t * except),
-		__attribute__((unused)) int (*match_block)(exception_t * except)) {
-	abort();
-}
-#else // PIC
+#pragma GCC push_options
+#pragma GCC optimize("O0")
+
 // This is our personality routine. For every stack frame annotated with
 // ".cfi_personality 0x3,__gcfa_personality_v0" this function will be called twice when unwinding.
@@ -431,6 +425,11 @@
 
 	// Setup the personality routine and exception table.
+#ifdef __PIC__
+	asm volatile (".cfi_personality 0x9b,CFA.ref.__gcfa_personality_v0");
+	asm volatile (".cfi_lsda 0x1b, .LLSDACFA2");
+#else
 	asm volatile (".cfi_personality 0x3,__gcfa_personality_v0");
 	asm volatile (".cfi_lsda 0x3, .LLSDACFA2");
+#endif
 
 	// Label which defines the start of the area for which the handler is setup.
@@ -464,4 +463,55 @@
 // have a single call to the try routine.
 
+#ifdef __PIC__
+#if defined( __i386 ) || defined( __x86_64 )
+asm (
+	// HEADER
+	".LFECFA1:\n"
+	"	.globl	__gcfa_personality_v0\n"
+	"	.section	.gcc_except_table,\"a\",@progbits\n"
+	// TABLE HEADER (important field is the BODY length at the end)
+	".LLSDACFA2:\n"
+	"	.byte	0xff\n"
+	"	.byte	0xff\n"
+	"	.byte	0x1\n"
+	"	.uleb128 .LLSDACSECFA2-.LLSDACSBCFA2\n"
+	// BODY (language specific data)
+	// This uses language specific data and can be modified arbitrarily
+	// We use handled area offset, handled area length,
+	// handler landing pad offset and 1 (action code, gcc seems to use 0).
+	".LLSDACSBCFA2:\n"
+	"	.uleb128 .TRYSTART-__cfaabi_ehm__try_terminate\n"
+	"	.uleb128 .TRYEND-.TRYSTART\n"
+	"	.uleb128 .CATCH-__cfaabi_ehm__try_terminate\n"
+	"	.uleb128 1\n"
+	".LLSDACSECFA2:\n"
+	// TABLE FOOTER
+	"	.text\n"
+	"	.size	__cfaabi_ehm__try_terminate, .-__cfaabi_ehm__try_terminate\n"
+);
+
+// Somehow this piece of helps with the resolution of debug symbols.
+__attribute__((unused)) static const int dummy = 0;
+
+asm (
+	// Add a hidden symbol which points at the function.
+	"	.hidden	CFA.ref.__gcfa_personality_v0\n"
+	"	.weak	CFA.ref.__gcfa_personality_v0\n"
+	// No clue what this does specifically
+	"	.section	.data.rel.local.CFA.ref.__gcfa_personality_v0,\"awG\",@progbits,CFA.ref.__gcfa_personality_v0,comdat\n"
+	"	.align 8\n"
+	"	.type CFA.ref.__gcfa_personality_v0, @object\n"
+	"	.size CFA.ref.__gcfa_personality_v0, 8\n"
+	"CFA.ref.__gcfa_personality_v0:\n"
+#if defined( __x86_64 )
+	"	.quad __gcfa_personality_v0\n"
+#else // then __i386
+	"   .long __gcfa_personality_v0\n"
+#endif
+);
+#else
+#error Exception Handling: unknown architecture for position independent code.
+#endif // __i386 || __x86_64
+#else // __PIC__
 #if defined( __i386 ) || defined( __x86_64 )
 asm (
@@ -491,6 +541,10 @@
 	"	.size	__cfaabi_ehm__try_terminate, .-__cfaabi_ehm__try_terminate\n"
 	"	.ident	\"GCC: (Ubuntu 6.2.0-3ubuntu11~16.04) 6.2.0 20160901\"\n"
-//	"	.section	.note.GNU-stack,\"x\",@progbits\n"
+	"	.section	.note.GNU-stack,\"x\",@progbits\n"
 );
+#else
+#error Exception Handling: unknown architecture for position dependent code.
 #endif // __i386 || __x86_64
-#endif // PIC
+#endif // __PIC__
+
+#pragma GCC pop_options
Index: libcfa/src/interpose.cfa
===================================================================
--- libcfa/src/interpose.cfa	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ libcfa/src/interpose.cfa	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -10,6 +10,6 @@
 // Created On       : Wed Mar 29 16:10:31 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Feb  8 08:40:34 2020
-// Update Count     : 163
+// Last Modified On : Mon Feb 17 10:18:53 2020
+// Update Count     : 166
 //
 
@@ -237,8 +237,8 @@
 	if ( fmt[strlen( fmt ) - 1] != '\n' ) {				// add optional newline if missing at the end of the format text
 		__cfaabi_dbg_write( "\n", 1 );
-	}
-
+	} // if
 	kernel_abort_msg( kernel_data, abort_text, abort_text_size );
-	__cfaabi_backtrace( signalAbort ? 4 : 3 );
+
+	__cfaabi_backtrace( signalAbort ? 4 : 2 );
 
 	__cabi_libc.abort();								// print stack trace in handler
Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ src/CodeGen/CodeGenerator.cc	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Dec 13 23:13:28 2019
-// Update Count     : 508
+// Last Modified On : Sun Feb 16 08:32:48 2020
+// Update Count     : 532
 //
 #include "CodeGenerator.h"
@@ -39,5 +39,5 @@
 	int CodeGenerator::tabsize = 4;
 
-	// the kinds of statements that would ideally be followed by whitespace
+	// The kinds of statements that would ideally be followed by whitespace.
 	bool wantSpacing( Statement * stmt) {
 		return dynamic_cast< IfStmt * >( stmt ) || dynamic_cast< CompoundStmt * >( stmt ) ||
@@ -78,7 +78,5 @@
 	}
 
-	/* Using updateLocation at the beginning of a node and endl
-	 * within a node should become the method of formating.
-	 */
+	// Using updateLocation at the beginning of a node and endl within a node should become the method of formating.
 	void CodeGenerator::updateLocation( CodeLocation const & to ) {
 		// skip if linemarks shouldn't appear or if codelocation is unset
@@ -95,5 +93,5 @@
 		} else {
 			output << "\n# " << to.first_line << " \"" << to.filename
-			       << "\"\n" << indent;
+				   << "\"\n" << indent;
 			currentLocation = to;
 		}
@@ -131,5 +129,5 @@
 
 	void CodeGenerator::genAttributes( list< Attribute * > & attributes ) {
-	  if ( attributes.empty() ) return;
+		if ( attributes.empty() ) return;
 		output << "__attribute__ ((";
 		for ( list< Attribute * >::iterator attr( attributes.begin() );; ) {
@@ -140,5 +138,5 @@
 				output << ")";
 			} // if
-		  if ( ++attr == attributes.end() ) break;
+			if ( ++attr == attributes.end() ) break;
 			output << ",";								// separator
 		} // for
@@ -165,8 +163,8 @@
 		previsit( (BaseSyntaxNode *)node );
 		GuardAction( [this, node](){
-			if ( options.printExprTypes && node->result ) {
-				output << " /* " << genType( node->result, "", options ) << " */ ";
-			}
-		} );
+				if ( options.printExprTypes && node->result ) {
+					output << " /* " << genType( node->result, "", options ) << " */ ";
+				}
+			} );
 	}
 
@@ -399,8 +397,8 @@
 		extension( applicationExpr );
 		if ( VariableExpr * varExpr = dynamic_cast< VariableExpr* >( applicationExpr->get_function() ) ) {
-			OperatorInfo opInfo;
-			if ( varExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && operatorLookup( varExpr->get_var()->get_name(), opInfo ) ) {
+			const OperatorInfo * opInfo;
+			if ( varExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && ( opInfo = operatorLookup( varExpr->get_var()->get_name() ) ) ) {
 				std::list< Expression* >::iterator arg = applicationExpr->get_args().begin();
-				switch ( opInfo.type ) {
+				switch ( opInfo->type ) {
 				  case OT_INDEX:
 					assert( applicationExpr->get_args().size() == 2 );
@@ -423,12 +421,12 @@
 						output << "(";
 						(*arg++)->accept( *visitor );
-						output << ") /* " << opInfo.inputName << " */";
+						output << ") /* " << opInfo->inputName << " */";
 					} else if ( applicationExpr->get_args().size() == 2 ) {
 						// intrinsic two parameter constructors are essentially bitwise assignment
 						output << "(";
 						(*arg++)->accept( *visitor );
-						output << opInfo.symbol;
+						output << opInfo->symbol;
 						(*arg)->accept( *visitor );
-						output << ") /* " << opInfo.inputName << " */";
+						output << ") /* " << opInfo->inputName << " */";
 					} else {
 						// no constructors with 0 or more than 2 parameters
@@ -441,5 +439,5 @@
 					assert( applicationExpr->get_args().size() == 1 );
 					output << "(";
-					output << opInfo.symbol;
+					output << opInfo->symbol;
 					(*arg)->accept( *visitor );
 					output << ")";
@@ -450,5 +448,5 @@
 					assert( applicationExpr->get_args().size() == 1 );
 					(*arg)->accept( *visitor );
-					output << opInfo.symbol;
+					output << opInfo->symbol;
 					break;
 
@@ -459,5 +457,5 @@
 					output << "(";
 					(*arg++)->accept( *visitor );
-					output << opInfo.symbol;
+					output << opInfo->symbol;
 					(*arg)->accept( *visitor );
 					output << ")";
@@ -486,8 +484,8 @@
 		extension( untypedExpr );
 		if ( NameExpr * nameExpr = dynamic_cast< NameExpr* >( untypedExpr->function ) ) {
-			OperatorInfo opInfo;
-			if ( operatorLookup( nameExpr->name, opInfo ) ) {
+			const OperatorInfo * opInfo = operatorLookup( nameExpr->name );
+			if ( opInfo ) {
 				std::list< Expression* >::iterator arg = untypedExpr->args.begin();
-				switch ( opInfo.type ) {
+				switch ( opInfo->type ) {
 				  case OT_INDEX:
 					assert( untypedExpr->args.size() == 2 );
@@ -508,12 +506,12 @@
 						output << "(";
 						(*arg++)->accept( *visitor );
-						output << ") /* " << opInfo.inputName << " */";
+						output << ") /* " << opInfo->inputName << " */";
 					} else if ( untypedExpr->get_args().size() == 2 ) {
 						// intrinsic two parameter constructors are essentially bitwise assignment
 						output << "(";
 						(*arg++)->accept( *visitor );
-						output << opInfo.symbol;
+						output << opInfo->symbol;
 						(*arg)->accept( *visitor );
-						output << ") /* " << opInfo.inputName << " */";
+						output << ") /* " << opInfo->inputName << " */";
 					} else {
 						// no constructors with 0 or more than 2 parameters
@@ -521,7 +519,7 @@
 						output << "(";
 						(*arg++)->accept( *visitor );
-						output << opInfo.symbol << "{ ";
+						output << opInfo->symbol << "{ ";
 						genCommaList( arg, untypedExpr->args.end() );
-						output << "}) /* " << opInfo.inputName << " */";
+						output << "}) /* " << opInfo->inputName << " */";
 					} // if
 					break;
@@ -532,5 +530,5 @@
 					assert( untypedExpr->args.size() == 1 );
 					output << "(";
-					output << opInfo.symbol;
+					output << opInfo->symbol;
 					(*arg)->accept( *visitor );
 					output << ")";
@@ -541,5 +539,5 @@
 					assert( untypedExpr->args.size() == 1 );
 					(*arg)->accept( *visitor );
-					output << opInfo.symbol;
+					output << opInfo->symbol;
 					break;
 
@@ -549,5 +547,5 @@
 					output << "(";
 					(*arg++)->accept( *visitor );
-					output << opInfo.symbol;
+					output << opInfo->symbol;
 					(*arg)->accept( *visitor );
 					output << ")";
@@ -581,10 +579,10 @@
 	void CodeGenerator::postvisit( NameExpr * nameExpr ) {
 		extension( nameExpr );
-		OperatorInfo opInfo;
-		if ( operatorLookup( nameExpr->name, opInfo ) ) {
-			if ( opInfo.type == OT_CONSTANT ) {
-				output << opInfo.symbol;
+		const OperatorInfo * opInfo = operatorLookup( nameExpr->name );
+		if ( opInfo ) {
+			if ( opInfo->type == OT_CONSTANT ) {
+				output << opInfo->symbol;
 			} else {
-				output << opInfo.outputName;
+				output << opInfo->outputName;
 			}
 		} else {
@@ -654,7 +652,7 @@
 	void CodeGenerator::postvisit( VariableExpr * variableExpr ) {
 		extension( variableExpr );
-		OperatorInfo opInfo;
-		if ( variableExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && operatorLookup( variableExpr->get_var()->get_name(), opInfo ) && opInfo.type == OT_CONSTANT ) {
-			output << opInfo.symbol;
+		const OperatorInfo * opInfo;
+		if ( variableExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && (opInfo = operatorLookup( variableExpr->get_var()->get_name() )) && opInfo->type == OT_CONSTANT ) {
+			output << opInfo->symbol;
 		} else {
 			output << mangleName( variableExpr->get_var() );
@@ -1011,5 +1009,5 @@
 		  case BranchStmt::FallThroughDefault:
 			assertf( ! options.genC, "fallthru should not reach code generation." );
-		  output << "fallthru";
+			output << "fallthru";
 			break;
 		} // switch
@@ -1035,5 +1033,5 @@
 
 		output << ((throwStmt->get_kind() == ThrowStmt::Terminate) ?
-		           "throw" : "throwResume");
+				   "throw" : "throwResume");
 		if (throwStmt->get_expr()) {
 			output << " ";
@@ -1050,5 +1048,5 @@
 
 		output << ((stmt->get_kind() == CatchStmt::Terminate) ?
-		"catch" : "catchResume");
+				   "catch" : "catchResume");
 		output << "( ";
 		stmt->decl->accept( *visitor );
@@ -1187,7 +1185,7 @@
 
 	std::string genName( DeclarationWithType * decl ) {
-		CodeGen::OperatorInfo opInfo;
-		if ( operatorLookup( decl->get_name(), opInfo ) ) {
-			return opInfo.outputName;
+		const OperatorInfo * opInfo = operatorLookup( decl->get_name() );
+		if ( opInfo ) {
+			return opInfo->outputName;
 		} else {
 			return decl->get_name();
Index: src/CodeGen/CodeGenerator.h
===================================================================
--- src/CodeGen/CodeGenerator.h	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ src/CodeGen/CodeGenerator.h	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Tue Apr 30 12:01:00 2019
-// Update Count     : 57
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sun Feb 16 03:58:31 2020
+// Update Count     : 62
 //
 
@@ -29,5 +29,5 @@
 namespace CodeGen {
 	struct CodeGenerator : public WithShortCircuiting, public WithGuards, public WithVisitorRef<CodeGenerator> {
-	  static int tabsize;
+		static int tabsize;
 
 		CodeGenerator( std::ostream &os, bool pretty = false, bool genC = false, bool lineMarks = false, bool printExprTypes = false );
@@ -104,5 +104,5 @@
 		void postvisit( AsmStmt * );
 		void postvisit( DirectiveStmt * );
-		void postvisit( AsmDecl * );				// special: statement in declaration context
+		void postvisit( AsmDecl * );					// special: statement in declaration context
 		void postvisit( IfStmt * );
 		void postvisit( SwitchStmt * );
@@ -147,7 +147,7 @@
 		LabelPrinter printLabels;
 		Options options;
-	public:
+	  public:
 		LineEnder endl;
-	private:
+	  private:
 
 		CodeLocation currentLocation;
@@ -162,8 +162,8 @@
 	template< class Iterator >
 	void CodeGenerator::genCommaList( Iterator begin, Iterator end ) {
-	  if ( begin == end ) return;
+		if ( begin == end ) return;
 		for ( ;; ) {
 			(*begin++)->accept( *visitor );
-		  if ( begin == end ) break;
+			if ( begin == end ) break;
 			output << ", ";								// separator
 		} // for
Index: src/CodeGen/FixMain.h
===================================================================
--- src/CodeGen/FixMain.h	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ src/CodeGen/FixMain.h	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -10,6 +10,6 @@
 // Created On       : Thr Jan 12 14:11:09 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Dec 13 23:12:21 2019
-// Update Count     : 3
+// Last Modified On : Sun Feb 16 03:24:32 2020
+// Update Count     : 5
 //
 
@@ -42,3 +42,3 @@
 		static std::unique_ptr<FunctionDecl> main_signature;
 	};
-};
+} // namespace CodeGen
Index: src/CodeGen/GenType.h
===================================================================
--- src/CodeGen/GenType.h	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ src/CodeGen/GenType.h	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Tue Apr 30 11:47:00 2019
-// Update Count     : 3
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sun Feb 16 04:11:40 2020
+// Update Count     : 5
 //
 
@@ -25,5 +25,5 @@
 	std::string genType( Type *type, const std::string &baseString, const Options &options );
 	std::string genType( Type *type, const std::string &baseString, bool pretty = false, bool genC = false, bool lineMarks = false );
-  std::string genPrettyType( Type * type, const std::string & baseString );
+	std::string genPrettyType( Type * type, const std::string & baseString );
 } // namespace CodeGen
 
Index: src/CodeGen/Generate.cc
===================================================================
--- src/CodeGen/Generate.cc	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ src/CodeGen/Generate.cc	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Dec 13 23:38:56 2019
-// Update Count     : 8
+// Last Modified On : Sun Feb 16 03:01:51 2020
+// Update Count     : 9
 //
 #include "Generate.h"
@@ -64,5 +64,5 @@
 	void generate( BaseSyntaxNode * node, std::ostream & os ) {
 		if ( Type * type = dynamic_cast< Type * >( node ) ) {
-			os << CodeGen::genPrettyType( type, "" );
+			os << genPrettyType( type, "" );
 		} else {
 			PassVisitor<CodeGenerator> cgv( os, true, false, false, false );
Index: src/CodeGen/OperatorTable.cc
===================================================================
--- src/CodeGen/OperatorTable.cc	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ src/CodeGen/OperatorTable.cc	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Feb 10 18:12:12 2020
-// Update Count     : 17
+// Last Modified On : Tue Feb 18 15:55:01 2020
+// Update Count     : 55
 //
 
@@ -17,4 +17,5 @@
 #include <map>        // for map, _Rb_tree_const_iterator, map<>::const_iterator
 #include <utility>    // for pair
+using namespace std;
 
 #include "OperatorTable.h"
@@ -22,135 +23,110 @@
 
 namespace CodeGen {
-	namespace {
-		const OperatorInfo tableValues[] = {
-			{	"?[?]",   "",     "_operator_index",             "Index",                      OT_INDEX          },
-			{	"?{}",    "=",    "_constructor",                "Constructor",                OT_CTOR           },
-			{	"^?{}",   "",     "_destructor",                 "Destructor",                 OT_DTOR           },
-			{	"?()",    "",     "_operator_call",              "Call Operator",              OT_CALL           },
-			{	"?++",    "++",   "_operator_postincr",          "Postfix Increment",          OT_POSTFIXASSIGN  },
-			{	"?--",    "--",   "_operator_postdecr",          "Postfix Decrement",          OT_POSTFIXASSIGN  },
-			{	"*?",     "*",    "_operator_deref",             "Dereference",                OT_PREFIX         },
-			{	"+?",     "+",    "_operator_unaryplus",         "Plus",                       OT_PREFIX         },
-			{	"-?",     "-",    "_operator_unaryminus",        "Minus",                      OT_PREFIX         },
-			{	"~?",     "~",    "_operator_bitnot",            "Bitwise Not",                OT_PREFIX         },
-			{	"!?",     "!",    "_operator_lognot",            "Logical Not",                OT_PREFIX         },
-			{	"++?",    "++",   "_operator_preincr",           "Prefix Increment",           OT_PREFIXASSIGN   },
-			{	"--?",    "--",   "_operator_predecr",           "Prefix Decrement",           OT_PREFIXASSIGN   },
-			{	"?\\?",   "\\",   "_operator_exponential",       "Exponentiation",             OT_INFIX          },
-			{	"?*?",    "*",    "_operator_multiply",          "Multiplication",             OT_INFIX          },
-			{	"?/?",    "/",    "_operator_divide",            "Division",                   OT_INFIX          },
-			{	"?%?",    "%",    "_operator_modulus",           "Modulo",                     OT_INFIX          },
-			{	"?+?",    "+",    "_operator_add",               "Addition",                   OT_INFIX          },
-			{	"?-?",    "-",    "_operator_subtract",          "Substraction",               OT_INFIX          },
-			{	"?<<?",   "<<",   "_operator_shiftleft",         "Shift Left",                 OT_INFIX          },
-			{	"?>>?",   ">>",   "_operator_shiftright",        "Shift Right",                OT_INFIX          },
-			{	"?<?",    "<",    "_operator_less",              "Less-than",                  OT_INFIX          },
-			{	"?>?",    ">",    "_operator_greater",           "Greater-than",               OT_INFIX          },
-			{	"?<=?",   "<=",   "_operator_lessequal",         "Less-than-or-Equal",         OT_INFIX          },
-			{	"?>=?",   ">=",   "_operator_greaterequal",      "Greater-than-or-Equal",      OT_INFIX          },
-			{	"?==?",   "==",   "_operator_equal",             "Equality",                   OT_INFIX          },
-			{	"?!=?",   "!=",   "_operator_notequal",          "Not-Equal",                  OT_INFIX          },
-			{	"?&?",    "&",    "_operator_bitand",            "Bitwise And",                OT_INFIX          },
-			{	"?^?",    "^",    "_operator_bitxor",            "Bitwise Xor",                OT_INFIX          },
-			{	"?|?",    "|",    "_operator_bitor",             "Bitwise Or",                 OT_INFIX          },
-			{	"?=?",    "=",    "_operator_assign",            "Assignment",                 OT_INFIXASSIGN    },
-			{	"?\\=?",  "\\=",  "_operator_expassign",         "Exponentiation Assignment",  OT_INFIXASSIGN    },
-			{	"?*=?",   "*=",   "_operator_multassign",        "Multiplication Assignment",  OT_INFIXASSIGN    },
-			{	"?/=?",   "/=",   "_operator_divassign",         "Division Assignment",        OT_INFIXASSIGN    },
-			{	"?%=?",   "%=",   "_operator_modassign",         "Modulo Assignment",          OT_INFIXASSIGN    },
-			{	"?+=?",   "+=",   "_operator_addassign",         "Addition Assignment",        OT_INFIXASSIGN    },
-			{	"?-=?",   "-=",   "_operator_subassign",         "Substrction Assignment",     OT_INFIXASSIGN    },
-			{	"?<<=?",  "<<=",  "_operator_shiftleftassign",   "Shift Left Assignment",      OT_INFIXASSIGN    },
-			{	"?>>=?",  ">>=",  "_operator_shiftrightassign",  "Shift Right Assignment",     OT_INFIXASSIGN    },
-			{	"?&=?",   "&=",   "_operator_bitandassign",      "Bitwise And Assignment",     OT_INFIXASSIGN    },
-			{	"?^=?",   "^=",   "_operator_bitxorassign",      "Bitwise Xor Assignment",     OT_INFIXASSIGN    },
-			{	"?|=?",   "|=",   "_operator_bitorassign",       "Bitwise Or Assignment",      OT_INFIXASSIGN    },
-		};
+	const OperatorInfo CodeGen::tableValues[] = {
+		// inputName symbol   outputName                     friendlyName                  type
+		{	"?[?]",   "",     "_operator_index",             "Index",                      OT_INDEX          },
+		{	"?{}",    "=",    "_constructor",                "Constructor",                OT_CTOR           },
+		{	"^?{}",   "",     "_destructor",                 "Destructor",                 OT_DTOR           },
+		{	"?()",    "",     "_operator_call",              "Call Operator",              OT_CALL           },
+		{	"?++",    "++",   "_operator_postincr",          "Postfix Increment",          OT_POSTFIXASSIGN  },
+		{	"?--",    "--",   "_operator_postdecr",          "Postfix Decrement",          OT_POSTFIXASSIGN  },
+		{	"*?",     "*",    "_operator_deref",             "Dereference",                OT_PREFIX         },
+		{	"+?",     "+",    "_operator_unaryplus",         "Plus",                       OT_PREFIX         },
+		{	"-?",     "-",    "_operator_unaryminus",        "Minus",                      OT_PREFIX         },
+		{	"~?",     "~",    "_operator_bitnot",            "Bitwise Not",                OT_PREFIX         },
+		{	"!?",     "!",    "_operator_lognot",            "Logical Not",                OT_PREFIX         },
+		{	"++?",    "++",   "_operator_preincr",           "Prefix Increment",           OT_PREFIXASSIGN   },
+		{	"--?",    "--",   "_operator_predecr",           "Prefix Decrement",           OT_PREFIXASSIGN   },
+		{	"?\\?",   "\\",   "_operator_exponential",       "Exponentiation",             OT_INFIX          },
+		{	"?*?",    "*",    "_operator_multiply",          "Multiplication",             OT_INFIX          },
+		{	"?/?",    "/",    "_operator_divide",            "Division",                   OT_INFIX          },
+		{	"?%?",    "%",    "_operator_modulus",           "Modulo",                     OT_INFIX          },
+		{	"?+?",    "+",    "_operator_add",               "Addition",                   OT_INFIX          },
+		{	"?-?",    "-",    "_operator_subtract",          "Substraction",               OT_INFIX          },
+		{	"?<<?",   "<<",   "_operator_shiftleft",         "Shift Left",                 OT_INFIX          },
+		{	"?>>?",   ">>",   "_operator_shiftright",        "Shift Right",                OT_INFIX          },
+		{	"?<?",    "<",    "_operator_less",              "Less-than",                  OT_INFIX          },
+		{	"?>?",    ">",    "_operator_greater",           "Greater-than",               OT_INFIX          },
+		{	"?<=?",   "<=",   "_operator_lessequal",         "Less-than-or-Equal",         OT_INFIX          },
+		{	"?>=?",   ">=",   "_operator_greaterequal",      "Greater-than-or-Equal",      OT_INFIX          },
+		{	"?==?",   "==",   "_operator_equal",             "Equality",                   OT_INFIX          },
+		{	"?!=?",   "!=",   "_operator_notequal",          "Not-Equal",                  OT_INFIX          },
+		{	"?&?",    "&",    "_operator_bitand",            "Bitwise And",                OT_INFIX          },
+		{	"?^?",    "^",    "_operator_bitxor",            "Bitwise Xor",                OT_INFIX          },
+		{	"?|?",    "|",    "_operator_bitor",             "Bitwise Or",                 OT_INFIX          },
+		{	"?=?",    "=",    "_operator_assign",            "Assignment",                 OT_INFIXASSIGN    },
+		{	"?\\=?",  "\\=",  "_operator_expassign",         "Exponentiation Assignment",  OT_INFIXASSIGN    },
+		{	"?*=?",   "*=",   "_operator_multassign",        "Multiplication Assignment",  OT_INFIXASSIGN    },
+		{	"?/=?",   "/=",   "_operator_divassign",         "Division Assignment",        OT_INFIXASSIGN    },
+		{	"?%=?",   "%=",   "_operator_modassign",         "Modulo Assignment",          OT_INFIXASSIGN    },
+		{	"?+=?",   "+=",   "_operator_addassign",         "Addition Assignment",        OT_INFIXASSIGN    },
+		{	"?-=?",   "-=",   "_operator_subassign",         "Substrction Assignment",     OT_INFIXASSIGN    },
+		{	"?<<=?",  "<<=",  "_operator_shiftleftassign",   "Shift Left Assignment",      OT_INFIXASSIGN    },
+		{	"?>>=?",  ">>=",  "_operator_shiftrightassign",  "Shift Right Assignment",     OT_INFIXASSIGN    },
+		{	"?&=?",   "&=",   "_operator_bitandassign",      "Bitwise And Assignment",     OT_INFIXASSIGN    },
+		{	"?^=?",   "^=",   "_operator_bitxorassign",      "Bitwise Xor Assignment",     OT_INFIXASSIGN    },
+		{	"?|=?",   "|=",   "_operator_bitorassign",       "Bitwise Or Assignment",      OT_INFIXASSIGN    },
+	}; // tableValues
 
-		const int numOps = sizeof( tableValues ) / sizeof( OperatorInfo );
+	std::map< std::string, OperatorInfo > CodeGen::table;
 
-		std::map< std::string, OperatorInfo > table;
-
-		void initialize() {
-			for ( int i = 0; i < numOps; ++i ) {
-				table[ tableValues[i].inputName ] = tableValues[i];
-			} // for
-		}
-	} // namespace
-
-	bool operatorLookup( const std::string & funcName, OperatorInfo & info ) {
-		static bool init = false;
-		if ( ! init ) {
-			initialize();
-		} // if
-
-		std::map< std::string, OperatorInfo >::const_iterator i = table.find( funcName );
-		if ( i == table.end() ) {
-			if ( isPrefix( funcName, "?`" ) ) {			// user-defined postfix operator ?
-				info.inputName = funcName;
-				info.symbol = funcName.substr(2);
-				info.outputName = toString( "__postfix_call_", info.symbol );
-				info.type = OT_POSTFIX;
-				return true;
-			}
-			return false;
-		} else {
-			info = i->second;
-			return true;
-		} // if
+	CodeGen::CodeGen() {
+		enum { numOps = sizeof( tableValues ) / sizeof( OperatorInfo ) };
+		for ( int i = 0; i < numOps; i += 1 ) {
+			table[ tableValues[i].inputName ] = tableValues[i];
+		} // for
 	}
 
-	bool isOperator( const std::string & funcName ) {
-		OperatorInfo info;
-		return operatorLookup( funcName, info );
+	const OperatorInfo * operatorLookup( const string & funcName ) {
+		if ( funcName.find_first_of( "?^*+-!", 0, 1 ) == string::npos ) return nullptr; // prefilter
+		const OperatorInfo * ret = &CodeGen::table.find( funcName )->second; // must be in the table
+		assert( ret );
+		return ret;
 	}
 
-	std::string operatorFriendlyName( const std::string & funcName ) {
-		OperatorInfo info;
-		if( operatorLookup( funcName, info ) ) {
-			return info.friendlyName;
-		}
+	bool isOperator( const string & funcName ) {
+		return operatorLookup( funcName ) != nullptr;
+	}
+
+	string operatorFriendlyName( const string & funcName ) {
+		const OperatorInfo * info = operatorLookup( funcName );
+		if ( info ) return info->friendlyName;
 		return "";
 	}
 
-	/// determines if a given function name is one of the operator types between [begin, end)
-	template<typename Iterator>
-	bool isOperatorType( const std::string & funcName, Iterator begin, Iterator end ) {
-		OperatorInfo info;
-		if ( operatorLookup( funcName, info ) ) {
-			return std::find( begin, end, info.type ) != end;
-		}
+	bool isConstructor( const string & funcName ) {
+		const OperatorInfo * info = operatorLookup( funcName );
+		if ( info ) return info->type == OT_CTOR;
 		return false;
 	}
 
-	bool isConstructor( const std::string & funcName ) {
-		static OperatorType types[] = { OT_CTOR };
-		return isOperatorType( funcName, std::begin(types), std::end(types) );
+	bool isDestructor( const string & funcName ) {
+		const OperatorInfo * info = operatorLookup( funcName );
+		if ( info ) return info->type == OT_DTOR;
+		return false;
 	}
 
-	bool isDestructor( const std::string & funcName ) {
-		static OperatorType types[] = { OT_DTOR };
-		return isOperatorType( funcName, std::begin(types), std::end(types) );
+	bool isCtorDtor( const string & funcName ) {
+		const OperatorInfo * info = operatorLookup( funcName );
+		if ( info ) return info->type <= OT_CONSTRUCTOR;
+		return false;
 	}
 
-	bool isAssignment( const std::string & funcName ) {
-		static OperatorType types[] = { OT_PREFIXASSIGN, OT_POSTFIXASSIGN, OT_INFIXASSIGN };
-		return isOperatorType( funcName, std::begin(types), std::end(types) );
+	bool isAssignment( const string & funcName ) {
+		const OperatorInfo * info = operatorLookup( funcName );
+		if ( info ) return info->type > OT_CONSTRUCTOR && info->type <= OT_ASSIGNMENT;
+		return false;
 	}
 
-	bool isCtorDtor( const std::string & funcName ) {
-		static OperatorType types[] = { OT_CTOR, OT_DTOR };
-		return isOperatorType( funcName, std::begin(types), std::end(types) );
+	bool isCtorDtorAssign( const string & funcName ) {
+		const OperatorInfo * info = operatorLookup( funcName );
+		if ( info ) return info->type <= OT_ASSIGNMENT;
+		return false;
 	}
 
-	bool isCtorDtorAssign( const std::string & funcName ) {
-		static OperatorType types[] = { OT_CTOR, OT_DTOR, OT_PREFIXASSIGN, OT_POSTFIXASSIGN, OT_INFIXASSIGN };
-		return isOperatorType( funcName, std::begin(types), std::end(types) );
-	}
+	CodeGen codegen;									// initialize singleton package
 } // namespace CodeGen
 
 // Local Variables: //
 // tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
 // End: //
Index: src/CodeGen/OperatorTable.h
===================================================================
--- src/CodeGen/OperatorTable.h	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ src/CodeGen/OperatorTable.h	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 21 22:17:11 2017
-// Update Count     : 6
+// Last Modified On : Sun Feb 16 08:13:34 2020
+// Update Count     : 26
 //
 
@@ -17,17 +17,20 @@
 
 #include <string>
+#include <map>
 
 namespace CodeGen {
 	enum OperatorType {
-		OT_INDEX,
 		OT_CTOR,
 		OT_DTOR,
-		OT_CALL,
-		OT_PREFIX,
-		OT_POSTFIX,
-		OT_INFIX,
+		OT_CONSTRUCTOR = OT_DTOR,
 		OT_PREFIXASSIGN,
 		OT_POSTFIXASSIGN,
 		OT_INFIXASSIGN,
+		OT_ASSIGNMENT = OT_INFIXASSIGN,
+		OT_CALL,
+		OT_PREFIX,
+		OT_INFIX,
+		OT_POSTFIX,
+		OT_INDEX,
 		OT_LABELADDRESS,
 		OT_CONSTANT
@@ -42,6 +45,15 @@
 	};
 
+	class CodeGen {
+		friend const OperatorInfo * operatorLookup( const std::string & funcName );
+
+		static const OperatorInfo tableValues[];
+		static std::map< std::string, OperatorInfo > table;
+	  public:
+		CodeGen();
+	}; // CodeGen
+
 	bool isOperator( const std::string & funcName );
-	bool operatorLookup( const std::string & funcName, OperatorInfo & info );
+	const OperatorInfo * operatorLookup( const std::string & funcName );
 	std::string operatorFriendlyName( const std::string & funcName );
 
Index: src/CodeGen/Options.h
===================================================================
--- src/CodeGen/Options.h	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ src/CodeGen/Options.h	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -9,27 +9,25 @@
 // Author           : Andrew Beach
 // Created On       : Tue Apr 30 11:36:00 2019
-// Last Modified By : Andrew Beach
-// Last Modified On : Thr May  2 10:45:00 2019
-// Update Count     : 2
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sat Feb 15 18:37:06 2020
+// Update Count     : 3
 //
 
 #pragma once
 
-namespace CodeGen {
-	struct Options {
-		// External Options: Same thoughout a pass.
-		bool pretty;
-		bool genC;
-		bool lineMarks;
-		bool printExprTypes;
+struct Options {
+	// External Options: Same thoughout a pass.
+	bool pretty;
+	bool genC;
+	bool lineMarks;
+	bool printExprTypes;
 
-		// Internal Options: Changed on some recurisive calls.
-		bool anonymousUnused = false;
+	// Internal Options: Changed on some recurisive calls.
+	bool anonymousUnused = false;
 
-		Options(bool pretty, bool genC, bool lineMarks, bool printExprTypes) :
-			pretty(pretty), genC(genC), lineMarks(lineMarks), printExprTypes(printExprTypes)
+	Options(bool pretty, bool genC, bool lineMarks, bool printExprTypes) :
+		pretty(pretty), genC(genC), lineMarks(lineMarks), printExprTypes(printExprTypes)
 		{}
-	};
-} // namespace CodeGen
+};
 
 // Local Variables: //
Index: src/CodeTools/ResolvProtoDump.cc
===================================================================
--- src/CodeTools/ResolvProtoDump.cc	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ src/CodeTools/ResolvProtoDump.cc	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -9,7 +9,7 @@
 // Author           : Aaron Moss
 // Created On       : Tue Sep 11 09:04:00 2018
-// Last Modified By : Aaron Moss
-// Last Modified On : Tue Sep 11 09:04:00 2018
-// Update Count     : 1
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sat Feb 15 13:50:11 2020
+// Update Count     : 3
 //
 
@@ -182,8 +182,8 @@
 
 			// replace operator names
-			CodeGen::OperatorInfo info;
-			if ( CodeGen::operatorLookup( name, info ) ) {
+			const CodeGen::OperatorInfo * opInfo = CodeGen::operatorLookup( name );
+			if ( opInfo ) {
 				ss << new_prefix(pre, "");
-				op_name( info.outputName, ss );
+				op_name( opInfo->outputName, ss );
 				return;
 			}
Index: src/ControlStruct/Mutate.cc
===================================================================
--- src/ControlStruct/Mutate.cc	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ src/ControlStruct/Mutate.cc	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug  4 11:39:08 2016
-// Update Count     : 9
+// Last Modified On : Sun Feb 16 03:22:07 2020
+// Update Count     : 10
 //
 
@@ -37,5 +37,5 @@
 		mutateAll( translationUnit, formut );
 	}
-} // namespace CodeGen
+} // namespace ControlStruct
 
 // Local Variables: //
Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ src/InitTweak/FixInit.cc	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -10,6 +10,6 @@
 // Created On       : Wed Jan 13 16:29:30 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Dec 13 23:41:27 2019
-// Update Count     : 77
+// Last Modified On : Sun Feb 16 04:17:07 2020
+// Update Count     : 82
 //
 #include "FixInit.h"
@@ -745,5 +745,5 @@
 		}
 
-		// to prevent warnings (‘_unq0’ may be used uninitialized in this function),
+		// to prevent warnings ('_unq0' may be used uninitialized in this function),
 		// insert an appropriate zero initializer for UniqueExpr temporaries.
 		Initializer * makeInit( Type * t ) {
Index: src/InitTweak/FixInit.h
===================================================================
--- src/InitTweak/FixInit.h	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ src/InitTweak/FixInit.h	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -10,6 +10,6 @@
 // Created On       : Wed Jan 13 16:29:30 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 22 09:31:06 2017
-// Update Count     : 6
+// Last Modified On : Sun Feb 16 07:54:50 2020
+// Update Count     : 8
 //
 
@@ -22,6 +22,5 @@
 
 namespace InitTweak {
-  /// replace constructor initializers with expression statements
-  /// and unwrap basic C-style initializers
+	/// replace constructor initializers with expression statements and unwrap basic C-style initializers
 	void fix( std::list< Declaration * > & translationUnit, bool inLibrary );
 } // namespace
Index: src/MakeLibCfa.cc
===================================================================
--- src/MakeLibCfa.cc	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ src/MakeLibCfa.cc	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 10:33:33 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Dec 13 23:41:40 2019
-// Update Count     : 42
+// Last Modified On : Sun Feb 16 03:49:49 2020
+// Update Count     : 45
 //
 
@@ -96,7 +96,7 @@
 
 			FunctionDecl *funcDecl = origFuncDecl->clone();
-			CodeGen::OperatorInfo opInfo;
-			bool lookResult = CodeGen::operatorLookup( funcDecl->get_name(), opInfo );
-			assert( lookResult );
+			const CodeGen::OperatorInfo * opInfo;
+			opInfo = CodeGen::operatorLookup( funcDecl->get_name() );
+			assert( opInfo );
 			assert( ! funcDecl->get_statements() );
 			// build a recursive call - this is okay, as the call will actually be codegen'd using operator syntax
@@ -120,5 +120,5 @@
 
 			Statement * stmt = nullptr;
-			switch ( opInfo.type ) {
+			switch ( opInfo->type ) {
 			  case CodeGen::OT_INDEX:
 			  case CodeGen::OT_CALL:
Index: src/Parser/ParserTypes.h
===================================================================
--- src/Parser/ParserTypes.h	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ src/Parser/ParserTypes.h	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep 22 08:58:10 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 22 09:33:28 2017
-// Update Count     : 350
+// Last Modified On : Sat Feb 15 11:04:40 2020
+// Update Count     : 351
 //
 
@@ -27,13 +27,13 @@
 // current location in the input
 extern int yylineno;
-extern char *yyfilename;
+extern char * yyfilename;
 
 struct Location {
-    char *file;
+    char * file;
     int line;
 }; // Location
 
 struct Token {
-    std::string *str;									// must be pointer as used in union
+    std::string * str;									// must be pointer as used in union
     Location loc;
 
Index: src/Parser/TypedefTable.cc
===================================================================
--- src/Parser/TypedefTable.cc	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ src/Parser/TypedefTable.cc	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:20:13 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jul 25 15:32:35 2018
-// Update Count     : 258
+// Last Modified On : Sat Feb 15 08:06:36 2020
+// Update Count     : 259
 //
 
@@ -47,9 +47,9 @@
 } // TypedefTable::~TypedefTable
 
-bool TypedefTable::exists( const string & identifier ) {
+bool TypedefTable::exists( const string & identifier ) const {
 	return kindTable.find( identifier ) != kindTable.end();
 } // TypedefTable::exists
 
-bool TypedefTable::existsCurr( const string & identifier ) {
+bool TypedefTable::existsCurr( const string & identifier ) const {
 	return kindTable.findAt( kindTable.currentScope() - 1, identifier ) != kindTable.end();
 } // TypedefTable::exists
Index: src/Parser/TypedefTable.h
===================================================================
--- src/Parser/TypedefTable.h	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ src/Parser/TypedefTable.h	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:24:36 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jul 25 15:33:55 2018
-// Update Count     : 114
+// Last Modified On : Sat Feb 15 08:06:37 2020
+// Update Count     : 117
 //
 
@@ -30,6 +30,6 @@
 	~TypedefTable();
 
-	bool exists( const std::string & identifier );
-	bool existsCurr( const std::string & identifier );
+	bool exists( const std::string & identifier ) const;
+	bool existsCurr( const std::string & identifier ) const;
 	int isKind( const std::string & identifier ) const;
 	void makeTypedef( const std::string & name, int kind = TYPEDEFname );
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ src/Parser/lex.ll	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -10,6 +10,6 @@
  * Created On       : Sat Sep 22 08:58:10 2001
  * Last Modified By : Peter A. Buhr
- * Last Modified On : Fri Feb  7 19:02:43 2020
- * Update Count     : 725
+ * Last Modified On : Sat Feb 15 11:05:50 2020
+ * Update Count     : 737
  */
 
@@ -42,4 +42,6 @@
 #include "ParseNode.h"
 #include "TypedefTable.h"
+
+string * build_postfix_name( string * name );
 
 char *yyfilename;
@@ -432,5 +434,9 @@
 "?"({op_unary_pre_post}|"()"|"[?]"|"{}") { IDENTIFIER_RETURN(); }
 "^?{}"			{ IDENTIFIER_RETURN(); }
-"?`"{identifier} { IDENTIFIER_RETURN(); }				// postfix operator
+"?`"{identifier} {										// postfix operator
+	yylval.tok.str = new string( &yytext[2] );			// remove ?`
+	yylval.tok.str = build_postfix_name( yylval.tok.str ); // add prefix
+	RETURN_LOCN( typedefTable.isKind( *yylval.tok.str ) );
+}
 "?"{op_binary_over}"?"	{ IDENTIFIER_RETURN(); }		// binary
 	/*
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ src/Parser/parser.yy	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Feb  1 10:04:40 2020
-// Update Count     : 4440
+// Last Modified On : Sun Feb 16 08:22:14 2020
+// Update Count     : 4461
 //
 
@@ -166,8 +166,7 @@
 } // rebindForall
 
-NameExpr * build_postfix_name( const string * name ) {
-	NameExpr * new_name = build_varref( new string( "?`" + *name ) );
-	delete name;
-	return new_name;
+string * build_postfix_name( string * name ) {
+	*name = string("__postfix_func_") + *name;
+	return name;
 } // build_postfix_name
 
@@ -633,9 +632,9 @@
 		{ $$ = new ExpressionNode( build_func( $1, $3 ) ); }
 	| postfix_expression '`' identifier					// CFA, postfix call
-		{ $$ = new ExpressionNode( build_func( new ExpressionNode( build_postfix_name( $3 ) ), $1 ) ); }
+		{ $$ = new ExpressionNode( build_func( new ExpressionNode( build_varref( build_postfix_name( $3 ) ) ), $1 ) ); }
 	| constant '`' identifier							// CFA, postfix call
-		{ $$ = new ExpressionNode( build_func( new ExpressionNode( build_postfix_name( $3 ) ), $1 ) ); }
+		{ $$ = new ExpressionNode( build_func( new ExpressionNode( build_varref( build_postfix_name( $3 ) ) ), $1 ) ); }
 	| string_literal '`' identifier						// CFA, postfix call
-		{ $$ = new ExpressionNode( build_func( new ExpressionNode( build_postfix_name( $3 ) ), new ExpressionNode( $1 ) ) ); }
+		{ $$ = new ExpressionNode( build_func( new ExpressionNode( build_varref( build_postfix_name( $3 ) ) ), new ExpressionNode( $1 ) ) ); }
 	| postfix_expression '.' identifier
 		{ $$ = new ExpressionNode( build_fieldSel( $1, build_varref( $3 ) ) ); }
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ src/ResolvExpr/Resolver.cc	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -84,4 +84,5 @@
 		void previsit( ThrowStmt * throwStmt );
 		void previsit( CatchStmt * catchStmt );
+		void postvisit( CatchStmt * catchStmt );
 		void previsit( WaitForStmt * stmt );
 
@@ -567,6 +568,28 @@
 
 	void Resolver_old::previsit( CatchStmt * catchStmt ) {
+		// Until we are very sure this invarent (ifs that move between passes have thenPart)
+		// holds, check it. This allows a check for when to decode the mangling.
+		if ( IfStmt * ifStmt = dynamic_cast<IfStmt *>( catchStmt->body ) ) {
+			assert( ifStmt->thenPart );
+		}
+		// Encode the catchStmt so the condition can see the declaration.
 		if ( catchStmt->cond ) {
-			findSingleExpression( catchStmt->cond, new BasicType( noQualifiers, BasicType::Bool ), indexer );
+			IfStmt * ifStmt = new IfStmt( catchStmt->cond, nullptr, catchStmt->body );
+			catchStmt->cond = nullptr;
+			catchStmt->body = ifStmt;
+		}
+	}
+
+	void Resolver_old::postvisit( CatchStmt * catchStmt ) {
+		// Decode the catchStmt so everything is stored properly.
+		IfStmt * ifStmt = dynamic_cast<IfStmt *>( catchStmt->body );
+		if ( nullptr != ifStmt && nullptr == ifStmt->thenPart ) {
+			assert( ifStmt->condition );
+			assert( ifStmt->elsePart );
+			catchStmt->cond = ifStmt->condition;
+			catchStmt->body = ifStmt->elsePart;
+			ifStmt->condition = nullptr;
+			ifStmt->elsePart = nullptr;
+			delete ifStmt;
 		}
 	}
@@ -1466,4 +1489,5 @@
 
 	const ast::CatchStmt * Resolver_new::previsit( const ast::CatchStmt * catchStmt ) {
+		// TODO: This will need a fix for the decl/cond scoping problem.
 		if ( catchStmt->cond ) {
 			ast::ptr< ast::Type > boolType = new ast::BasicType{ ast::BasicType::Bool };
Index: src/SymTab/Mangler.cc
===================================================================
--- src/SymTab/Mangler.cc	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ src/SymTab/Mangler.cc	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 21:40:29 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Dec 13 23:43:49 2019
-// Update Count     : 28
+// Last Modified On : Sat Feb 15 13:55:12 2020
+// Update Count     : 33
 //
 #include "Mangler.h"
@@ -128,7 +128,7 @@
 				} // if
 				mangleName << Encoding::manglePrefix;
-				CodeGen::OperatorInfo opInfo;
-				if ( operatorLookup( declaration->get_name(), opInfo ) ) {
-					mangleName << opInfo.outputName.size() << opInfo.outputName;
+				const CodeGen::OperatorInfo * opInfo = CodeGen::operatorLookup( declaration->get_name() );
+				if ( opInfo ) {
+					mangleName << opInfo->outputName.size() << opInfo->outputName;
 				} else {
 					mangleName << declaration->name.size() << declaration->name;
@@ -471,7 +471,7 @@
 			} // if
 			mangleName << Encoding::manglePrefix;
-			CodeGen::OperatorInfo opInfo;
-			if ( operatorLookup( decl->name, opInfo ) ) {
-				mangleName << opInfo.outputName.size() << opInfo.outputName;
+			const CodeGen::OperatorInfo * opInfo = CodeGen::operatorLookup( decl->name );
+			if ( opInfo ) {
+				mangleName << opInfo->outputName.size() << opInfo->outputName;
 			} else {
 				mangleName << decl->name.size() << decl->name;
Index: src/SynTree/Attribute.h
===================================================================
--- src/SynTree/Attribute.h	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ src/SynTree/Attribute.h	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 22 09:54:14 2017
-// Update Count     : 39
+// Last Modified On : Thu Feb 13 21:34:08 2020
+// Update Count     : 40
 //
 
@@ -38,5 +38,5 @@
 	virtual ~Attribute();
 
-	std::string get_name() const { return name; }
+	const std::string & get_name() const { return name; }
 	void set_name( const std::string & newValue ) { name = newValue; }
 	std::list< Expression * > & get_parameters() { return parameters; }
Index: tests/.expect/alloc-ERROR.txt
===================================================================
--- tests/.expect/alloc-ERROR.txt	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ tests/.expect/alloc-ERROR.txt	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -1,3 +1,3 @@
-alloc.cfa:311:1 error: No reasonable alternatives for expression Applying untyped:
+alloc.cfa:310:1 error: No reasonable alternatives for expression Applying untyped:
   Name: ?=?
 ...to:
@@ -19,5 +19,5 @@
 
 
-alloc.cfa:312:1 error: No reasonable alternatives for expression Applying untyped:
+alloc.cfa:311:1 error: No reasonable alternatives for expression Applying untyped:
   Name: ?=?
 ...to:
@@ -39,5 +39,5 @@
 
 
-alloc.cfa:313:1 error: No reasonable alternatives for expression Applying untyped:
+alloc.cfa:312:1 error: No reasonable alternatives for expression Applying untyped:
   Name: ?=?
 ...to:
@@ -50,5 +50,5 @@
 
 
-alloc.cfa:314:1 error: No reasonable alternatives for expression Applying untyped:
+alloc.cfa:313:1 error: No reasonable alternatives for expression Applying untyped:
   Name: ?=?
 ...to:
Index: tests/.expect/alloc.txt
===================================================================
--- tests/.expect/alloc.txt	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ tests/.expect/alloc.txt	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -2,5 +2,4 @@
 CFA malloc 0xdeadbeef
 CFA alloc 0xdeadbeef
-CFA array alloc, fill 0xde
 CFA alloc, fill dededede
 CFA alloc, fill 3
Index: tests/.expect/nested-types-ERR1.txt
===================================================================
--- tests/.expect/nested-types-ERR1.txt	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ tests/.expect/nested-types-ERR1.txt	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -1,1 +1,1 @@
-nested-types.cfa:70:1 error: Use of undefined type T
+nested-types.cfa:83:1 error: Use of undefined type T
Index: tests/.expect/nested-types-ERR2.txt
===================================================================
--- tests/.expect/nested-types-ERR2.txt	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ tests/.expect/nested-types-ERR2.txt	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -1,5 +1,5 @@
-nested-types.cfa:73:1 error: Use of undefined global type Z
-nested-types.cfa:74:1 error: Qualified type requires an aggregate on the left, but has: signed int
-nested-types.cfa:75:1 error: Undefined type in qualified type: Qualified Type:
+nested-types.cfa:86:1 error: Use of undefined global type Z
+nested-types.cfa:87:1 error: Qualified type requires an aggregate on the left, but has: signed int
+nested-types.cfa:88:1 error: Undefined type in qualified type: Qualified Type:
   instance of struct S with body 1
   instance of type Z (not function type)
Index: tests/.expect/userLiterals.txt
===================================================================
--- tests/.expect/userLiterals.txt	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
+++ tests/.expect/userLiterals.txt	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -0,0 +1,26 @@
+11.1
+15.0
+11.1
+24.8
+11.2
+11.1
+28.1
+secs 0
+secs 1
+secs 23
+mins 23
+hours 23
+_A_ 23
+_thingy_ 1234
+secs 65535
+mins 65535
+hours 65535
+_A_ 65535
+_thingy_ 65535
+secs 10
+hours 10
+mins 10
+_A_ 10
+_thingy_ 10
+s abc
+_thingy_ abc
Index: tests/alloc.cfa
===================================================================
--- tests/alloc.cfa	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ tests/alloc.cfa	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -10,6 +10,6 @@
 // Created On       : Wed Feb  3 07:56:22 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Nov 22 15:34:19 2019
-// Update Count     : 404
+// Last Modified On : Sun Feb 16 09:21:13 2020
+// Update Count     : 405
 //
 
@@ -48,5 +48,4 @@
 
 	p = alloc_set( fill );								// CFA alloc, fill
-	printf( "CFA array alloc, fill %#hhx\n", fill );
 	printf( "CFA alloc, fill %08x\n", *p );
 	free( p );
Index: tests/exceptions/.expect/except-0.txt
===================================================================
--- tests/exceptions/.expect/except-0.txt	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
+++ tests/exceptions/.expect/except-0.txt	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -0,0 +1,51 @@
+Exiting: terminate function
+Exiting: bar function
+foo caught exception zen.
+Exiting: foo function
+
+alpha caught exception zen
+resume returned
+Exiting: resume function
+Exiting: beta function
+Exiting: alpha function
+
+walk out of farewell
+See you next time
+leaving farewell
+
+jump out of farewell
+See you next time
+leaving farewell
+
+Exiting: resume function
+fallback caught termination zen
+
+Exiting: terminate function
+Exiting: terminate function
+Exiting: terminate_swap
+terminate_swapped caught exception yang
+Exiting: terminate_swapped
+
+resume_swapped caught exception yang
+resume returned
+Exiting: resume function
+resume returned
+Exiting: resume function
+Exiting: resume_swap
+
+Exiting: terminate function
+reterminate zen caught and will rethrow exception zen
+reterminate 1 caught exception zen
+
+reresume zen caught and rethrows exception zen
+reresume 1 caught exception zen
+resume returned
+Exiting: resume function
+
+Exiting: terminate function
+fy caught exception zen
+fee caught exception zen
+resume returned
+Exiting: resume function
+
+Exiting: main function
Index: tests/exceptions/.expect/except-1.txt
===================================================================
--- tests/exceptions/.expect/except-1.txt	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
+++ tests/exceptions/.expect/except-1.txt	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -0,0 +1,13 @@
+First Caught
+Both Caught
+Part A Complete
+First Catch and rethrow
+Second Catch
+Part B Complete
+Throw before cleanup
+Catch after cleanup
+Part C Complete
+Caught initial throw.
+Caught intermediate throw.
+Caught final throw.
+Part D Complete
Index: tests/exceptions/.expect/except-2.txt
===================================================================
--- tests/exceptions/.expect/except-2.txt	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
+++ tests/exceptions/.expect/except-2.txt	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -0,0 +1,3 @@
+throw yin caught.
+throwResume yang caught <> throwResume returned.
+Should be printed.
Index: tests/exceptions/.expect/except-3.txt
===================================================================
--- tests/exceptions/.expect/except-3.txt	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
+++ tests/exceptions/.expect/except-3.txt	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -0,0 +1,1 @@
+throw [] unwind <> catch
Index: tests/exceptions/except-0.cfa
===================================================================
--- tests/exceptions/except-0.cfa	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ tests/exceptions/except-0.cfa	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -19,10 +19,10 @@
 };
 
-void ?{}(signal_exit * this, const char * area) {
-	this->area = area;
-}
-
-void ^?{}(signal_exit * this) {
-	printf("Exiting: %s\n", this->area);
+void ?{}(signal_exit & this, const char * area) {
+	this.area = area;
+}
+
+void ^?{}(signal_exit & this) {
+	printf("Exiting: %s\n", this.area);
 //	sout | "Exiting:" | this->area;
 }
@@ -242,6 +242,8 @@
 
 	// Uncaught termination test.
+	/* Removed due to non-deterministic output.
 	printf("Throw uncaught.\n");
 	yang z;
 	terminate(&z);
-}
+	*/
+}
Index: tests/exceptions/except-2.cfa
===================================================================
--- tests/exceptions/except-2.cfa	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ tests/exceptions/except-2.cfa	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -12,6 +12,6 @@
 	struct TABLE(BASE_EXCEPT) const * parent;
 	size_t size;
-	void (*copy)(num_error *this, num_error * other);
-	void (*free)(num_error *this);
+	void (*copy)(num_error &this, num_error & other);
+	void (*free)(num_error &this);
 	const char * (*msg)(num_error *this);
 	int (*code)(num_error *this);
@@ -28,5 +28,5 @@
 	if ( ! this->msg ) {
 		static const char * base = "Num Error with code: X";
-		this->msg = malloc(22);
+		this->msg = (char *)malloc(22);
 		for (int i = 0 ; (this->msg[i] = base[i]) ; ++i);
 	}
@@ -34,16 +34,16 @@
 	return this->msg;
 }
-void ?{}(num_error * this, int num) {
-	this->virtual_table = &INSTANCE(num_error);
-	this->msg = 0;
-	this->num = num;
+void ?{}(num_error & this, int num) {
+	this.virtual_table = &INSTANCE(num_error);
+	this.msg = 0;
+	this.num = num;
 }
-void ?{}(num_error * this, num_error * other) {
-	this->virtual_table = other->virtual_table;
-	this->msg = 0;
-	this->num = other->num;
+void ?{}(num_error & this, num_error & other) {
+	this.virtual_table = other.virtual_table;
+	this.msg = 0;
+	this.num = other.num;
 }
-void ^?{}(num_error * this) {
-	if( this->msg ) free( this->msg );
+void ^?{}(num_error & this) {
+	if( this.msg ) free( this.msg );
 }
 int num_error_code( num_error * this ) {
Index: tests/nested-types.cfa
===================================================================
--- tests/nested-types.cfa	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ tests/nested-types.cfa	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -10,6 +10,6 @@
 // Created On       : Mon Jul 9 10:20:03 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 17:59:40 2018
-// Update Count     : 2
+// Last Modified On : Wed Feb 12 18:21:15 2020
+// Update Count     : 3
 //
 
@@ -50,4 +50,17 @@
 //   double d;
 // };
+
+// struct S {
+//     enum C { R, G, B };
+//     int i;
+//     struct T {
+// 	int i;
+//     };
+//     T t;
+// };
+
+// S s;
+// S.C c;
+// S.T t;
 
 int main() {
Index: tests/test.py
===================================================================
--- tests/test.py	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ tests/test.py	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -152,5 +152,5 @@
 	# run everything in a temp directory to make sure core file are handled properly
 	with tempdir():
-		# if the make command succeds continue otherwise skip to diff
+		# if the make command succeeds continue otherwise skip to diff
 		if success(make_ret):
 			with Timed() as run_dur:
Index: tests/userLiterals.cfa
===================================================================
--- tests/userLiterals.cfa	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
+++ tests/userLiterals.cfa	(revision 32ce9b73c8ff89b3c60f7819746410aa129acd20)
@@ -0,0 +1,95 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// userLiterals.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Wed Sep  6 21:40:50 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Feb 19 07:48:45 2020
+// Update Count     : 74
+//
+
+#include <fstream.hfa>
+#include <wchar.h>
+#include <uchar.h>
+
+int ?`s( int s ) { sout | "secs" | s; return s; }
+int ?`m( int m ) { sout | "mins" | m; return m * 60; }
+int ?`h( int h ) { sout | "hours" | h; return h * 3600; }
+int ?`_A_( int x ) { sout | "_A_" | x; return x; }
+int ?`__thingy_( int x ) { sout | "_thingy_" | x; return x; }
+
+int ?`s( const char * s ) { sout | "s" | s; return 0; }
+int ?`m( const char16_t * m ) { sout | "m" | m; return 0;}
+int ?`h( const char32_t * h ) { sout | "h" | h; return 0; }
+int ?`_A_( const wchar_t * str ) { sout | "_A_" | str; return 0; }
+int ?`__thingy_( const char * str ) { sout | "_thingy_" | str; return 0; }
+
+
+struct Weight { double stones; };
+void ?{}( Weight & w ) { w.stones = 0; }
+void ?{}( Weight & w, double w ) { w.stones = w; }
+Weight ?+?( Weight l, Weight r ) {
+	return (Weight){ l.stones + r.stones };
+}
+ofstream & ?|?( ofstream & os, Weight w ) { return os | wd(1,1, w.stones); }
+void ?|?( ofstream & os, Weight w ) { (ofstream)(os | w); ends( os ); }
+
+Weight ?`st( double w ) { return (Weight){ w }; }		// backquote for user literals
+Weight ?`lb( double w ) { return (Weight){ w / 14.0 }; }
+Weight ?`kg( double w ) { return (Weight) { w * 0.16 }; }
+
+int main() {
+	Weight w, heavy = { 20 };							// 20 stone
+	w = 155`lb;
+	sout | w;
+	w = 0b_1111`st;
+	sout | w;
+	w = 0_233`lb;										// octal weight (155)
+	sout | w;
+	w = 0x_9b_u`kg;
+	sout | w;
+	w = 70.3`kg;
+	sout | w;
+	w = 11`st + 1`lb;
+	sout | w;
+	w = 5`st + 8`kg + 25`lb + heavy;
+	sout | w;
+
+	0`s;
+	1`s;
+	23`s;
+	23u`m;
+	23l`h;
+	23_ul`_A_;
+	1_234_LL`__thingy_;
+
+	0xff_ffl;
+	0xff_ff`s;
+	0xff_ffu`m;
+	0xff_ffl`h;
+	0xff_fful`_A_;
+	0xff_ffLL`__thingy_;
+
+	'\n'`s;
+	L'\n'`h;
+	u'\n'`m;
+	L_'\n'`_A_;
+	U_'\n'`__thingy_;
+
+	"abc"`s;
+	// FIX ME: requires char16_t, char32_t, and wchar_t be unique types
+	// u"abc"`m;
+	// U_"abc"`h;
+	// L"abc"`_A_;
+	u8_"abc"`__thingy_;
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa userLiterals.cfa" //
+// End: //
Index: sts/zombies/abort.cfa
===================================================================
--- tests/zombies/abort.cfa	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ 	(revision )
@@ -1,18 +1,0 @@
-#include <stdlib.h>
-
-int level3() {
-	abort();
-	return 0;
-}
-
-int level2() {
-	return level3();
-}
-
-int level1() {
-	return level2();
-}
-
-int main() {
-	return level1();
-}
Index: sts/zombies/userLiterals.cfa
===================================================================
--- tests/zombies/userLiterals.cfa	(revision 4aac9ffe1aa65f199a4072676c0db437b8fa5539)
+++ 	(revision )
@@ -1,93 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// user_literals.cfa --
-//
-// Author           : Peter A. Buhr
-// Created On       : Wed Sep  6 21:40:50 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Dec  4 22:03:10 2018
-// Update Count     : 56
-//
-
-#include <fstream.hfa>
-#include <wchar.h>
-#include <uchar.h>
-
-int ?`s( int s ) { sout | "secs" | s; return s; }
-int ?`m( int m ) { sout | "mins" | m; return m * 60; }
-int ?`h( int h ) { sout | "hours" | h; return h * 3600; }
-int ?`_A_( int x ) { sout | "_A_" | x; return x; }
-int ?`__thingy_( int x ) { sout | "_thingy_" | x; return x; }
-
-int ?`s( const char * s ) { sout | "secs" | s; return 0; }
-int ?`m( const char16_t * m ) { sout | "mins" | m; return 0;}
-int ?`h( const char32_t * h ) { sout | "hours" | h; return 0; }
-int ?`_A_( const wchar_t * str ) { sout | "_A_" | str; return 0; }
-int ?`__thingy_( const char * str ) { sout | "_thingy_" | str; return 0; }
-
-
-struct Weight { double stones; };
-void ?{}( Weight & w ) { w.stones = 0; }
-void ?{}( Weight & w, double w ) { w.stones = w; }
-Weight ?+?( Weight l, Weight r ) {
-	return (Weight){ l.stones + r.stones };
-}
-ofstream & ?|?( ofstream & os, Weight w ) { return os | w.stones; }
-
-Weight ?`st( double w ) { return (Weight){ w }; }		// backquote for user literals
-Weight ?`lb( double w ) { return (Weight){ w / 14.0 }; }
-Weight ?`kg( double w ) { return (Weight) { w * 0.16 }; }
-
-int main() {
-	Weight w, heavy = { 20 };							// 20 stone
-	w = 155`lb;
-	sout | w;
-	w = 0b_1111`st;
-	sout | w;
-	w = 0_233`lb;										// octal weight (155)
-	sout | w;
-	w = 0x_9b_u`kg;
-	sout | w;
-	w = 70.3`kg;
-	sout | w;
-	w = 11`st + 1`lb;
-	sout | w;
-	w = 5`st + 8`kg + 25`lb + heavy;
-	sout | w;
-
-//	0`secs;
-	1`s;
-	23`s;
-	23u`m;
-	23l`h;
-	23_ul`_A_;
-	1_234_LL`__thingy_;
-
-	0xff_ffl;
-	0xff_ff`s;
-	0xff_ffu`m;
-	0xff_ffl`h;
-	0xff_fful`_A_;
-	0xff_ffLL`__thingy_;
-
-	'\n'`s;
-	L'\n'`h;
-	u'\n'`m;
-	L_'\n'`_A_;
-	U_'\n'`__thingy_;
-
-	"abc"`s;
-//	u"abc"`m;
-//	U_"abc"`h;
-//	L"abc"`_A_;
-	u8_"abc"`__thingy_;
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa user_literals.cfa" //
-// End: //
