Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision 732357362caa4a5fd1565cff6758e1e1608d6f47)
+++ src/Common/PassVisitor.impl.h	(revision 5f95b5f4ad5b5cb1706c61b047264b342ceaaaa8)
@@ -998,10 +998,18 @@
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( FinallyStmt * node ) {
-	VISIT_BODY( node );
+	VISIT_START( node );
+
+	maybeAccept_impl( node->block, *this );
+
+	VISIT_END( node );
 }
 
 template< typename pass_type >
 Statement * PassVisitor< pass_type >::mutate( FinallyStmt * node ) {
-	MUTATE_BODY( Statement, node );
+	MUTATE_START( node );
+
+	maybeMutate_impl( node->block, *this );
+
+	MUTATE_END( Statement, node );
 }
 
Index: src/GenPoly/Box.cc
===================================================================
--- src/GenPoly/Box.cc	(revision 732357362caa4a5fd1565cff6758e1e1608d6f47)
+++ src/GenPoly/Box.cc	(revision 5f95b5f4ad5b5cb1706c61b047264b342ceaaaa8)
@@ -988,11 +988,11 @@
 
 		Expression *Pass1::handleIntrinsics( ApplicationExpr *appExpr ) {
-			if ( VariableExpr *varExpr = dynamic_cast< VariableExpr *>( appExpr->get_function() ) ) {
-				if ( varExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic ) {
-					if ( varExpr->get_var()->get_name() == "?[?]" ) {
+			if ( VariableExpr *varExpr = dynamic_cast< VariableExpr *>( appExpr->function ) ) {
+				if ( varExpr->var->linkage == LinkageSpec::Intrinsic ) {
+					if ( varExpr->var->name == "?[?]" ) {
 						assert( appExpr->result );
 						assert( appExpr->get_args().size() == 2 );
-						Type *baseType1 = isPolyPtr( appExpr->get_args().front()->get_result(), scopeTyVars, env );
-						Type *baseType2 = isPolyPtr( appExpr->get_args().back()->get_result(), scopeTyVars, env );
+						Type *baseType1 = isPolyPtr( appExpr->args.front()->result, scopeTyVars, env );
+						Type *baseType2 = isPolyPtr( appExpr->args.back()->result, scopeTyVars, env );
 						assert( ! baseType1 || ! baseType2 ); // the arguments cannot both be polymorphic pointers
 						UntypedExpr *ret = 0;
@@ -1555,35 +1555,35 @@
 			// only mutate member expressions for polymorphic types
 			int tyDepth;
-			Type *objectType = hasPolyBase( memberExpr->get_aggregate()->get_result(), scopeTyVars, &tyDepth );
+			Type *objectType = hasPolyBase( memberExpr->aggregate->result, scopeTyVars, &tyDepth );
 			if ( ! objectType ) return memberExpr;
 			findGeneric( objectType ); // ensure layout for this type is available
 
 			// replace member expression with dynamically-computed layout expression
-			Expression *newMemberExpr = 0;
+			Expression *newMemberExpr = nullptr;
 			if ( StructInstType *structType = dynamic_cast< StructInstType* >( objectType ) ) {
 				// look up offset index
-				long i = findMember( memberExpr->get_member(), structType->get_baseStruct()->get_members() );
+				long i = findMember( memberExpr->member, structType->baseStruct->members );
 				if ( i == -1 ) return memberExpr;
 
 				// replace member expression with pointer to base plus offset
 				UntypedExpr *fieldLoc = new UntypedExpr( new NameExpr( "?+?" ) );
-				Expression * aggr = memberExpr->get_aggregate()->clone();
-				delete aggr->get_env(); // xxx - there's a problem with keeping the env for some reason, so for now just get rid of it
-				aggr->set_env( nullptr );
+				Expression * aggr = memberExpr->aggregate->clone();
+				delete aggr->env; // xxx - there's a problem with keeping the env for some reason, so for now just get rid of it
+				aggr->env = nullptr;
 				fieldLoc->get_args().push_back( aggr );
 				fieldLoc->get_args().push_back( makeOffsetIndex( objectType, i ) );
-				fieldLoc->set_result( memberExpr->get_result()->clone() );
+				fieldLoc->set_result( memberExpr->result->clone() );
 				newMemberExpr = fieldLoc;
 			} else if ( dynamic_cast< UnionInstType* >( objectType ) ) {
 				// union members are all at offset zero, so just use the aggregate expr
-				Expression * aggr = memberExpr->get_aggregate()->clone();
-				delete aggr->get_env(); // xxx - there's a problem with keeping the env for some reason, so for now just get rid of it
-				aggr->set_env( nullptr );
+				Expression * aggr = memberExpr->aggregate->clone();
+				delete aggr->env; // xxx - there's a problem with keeping the env for some reason, so for now just get rid of it
+				aggr->env= nullptr;
 				newMemberExpr = aggr;
-				newMemberExpr->set_result( memberExpr->get_result()->clone() );
+				newMemberExpr->result = memberExpr->result->clone();
 			} else return memberExpr;
 			assert( newMemberExpr );
 
-			Type *memberType = memberExpr->get_member()->get_type();
+			Type *memberType = memberExpr->member->get_type();
 			if ( ! isPolyType( memberType, scopeTyVars ) ) {
 				// Not all members of a polymorphic type are themselves of polymorphic type; in this case the member expression should be wrapped and dereferenced to form an lvalue
@@ -1598,5 +1598,5 @@
 
 		ObjectDecl *PolyGenericCalculator::makeVar( const std::string &name, Type *type, Initializer *init ) {
-			ObjectDecl *newObj = new ObjectDecl( name, Type::StorageClasses(), LinkageSpec::C, 0, type, init );
+			ObjectDecl *newObj = new ObjectDecl( name, Type::StorageClasses(), LinkageSpec::C, nullptr, type, init );
 			stmtsToAddBefore.push_back( new DeclStmt( newObj ) );
 			return newObj;
Index: src/GenPoly/InstantiateGeneric.cc
===================================================================
--- src/GenPoly/InstantiateGeneric.cc	(revision 732357362caa4a5fd1565cff6758e1e1608d6f47)
+++ src/GenPoly/InstantiateGeneric.cc	(revision 5f95b5f4ad5b5cb1706c61b047264b342ceaaaa8)
@@ -476,4 +476,5 @@
 			DeclarationWithType * field = strict_dynamic_cast< DeclarationWithType * >( member );
 			MemberExpr * ret = new MemberExpr( field, memberExpr->aggregate->clone() );
+			ResolvExpr::adjustExprType( ret->result ); // pointer decay
 			std::swap( ret->env, memberExpr->env );
 			delete memberExpr;
Index: src/ResolvExpr/AdjustExprType.cc
===================================================================
--- src/ResolvExpr/AdjustExprType.cc	(revision 732357362caa4a5fd1565cff6758e1e1608d6f47)
+++ src/ResolvExpr/AdjustExprType.cc	(revision 5f95b5f4ad5b5cb1706c61b047264b342ceaaaa8)
@@ -24,5 +24,5 @@
 	class AdjustExprType : public WithShortCircuiting {
 	  public:
-		AdjustExprType( const TypeEnvironment &env, const SymTab::Indexer &indexer );
+		AdjustExprType( const TypeEnvironment & env, const SymTab::Indexer & indexer );
 		void premutate( VoidType * ) { visit_children = false; }
 		void premutate( BasicType * ) { visit_children = false; }
@@ -45,6 +45,6 @@
 
 	  private:
-		const TypeEnvironment &env;
-		const SymTab::Indexer &indexer;
+		const TypeEnvironment & env;
+		const SymTab::Indexer & indexer;
 	};
 
@@ -53,4 +53,10 @@
 		Type *newType = type->acceptMutator( adjuster );
 		type = newType;
+	}
+
+	void adjustExprType( Type *& type ) {
+		TypeEnvironment env;
+		SymTab::Indexer indexer;
+		adjustExprType( type, env, indexer );
 	}
 
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 732357362caa4a5fd1565cff6758e1e1608d6f47)
+++ src/ResolvExpr/Resolver.cc	(revision 5f95b5f4ad5b5cb1706c61b047264b342ceaaaa8)
@@ -280,5 +280,9 @@
 			std::list< Statement * > newStmts;
 			resolveWithExprs( functionDecl->withExprs, newStmts );
-			functionDecl->statements->kids.splice( functionDecl->statements->kids.begin(), newStmts );
+			if ( functionDecl->statements ) {
+				functionDecl->statements->kids.splice( functionDecl->statements->kids.begin(), newStmts );
+			} else {
+				assertf( functionDecl->withExprs.empty() && newStmts.empty(), "Function %s without a body has with-clause and/or generated with declarations.", functionDecl->name.c_str() );
+			}
 		}
 	}
Index: src/ResolvExpr/typeops.h
===================================================================
--- src/ResolvExpr/typeops.h	(revision 732357362caa4a5fd1565cff6758e1e1608d6f47)
+++ src/ResolvExpr/typeops.h	(revision 5f95b5f4ad5b5cb1706c61b047264b342ceaaaa8)
@@ -55,4 +55,7 @@
 	/// Replaces array types with the equivalent pointer, and function types with a pointer-to-function
 	void adjustExprType( Type *&type, const TypeEnvironment &env, const SymTab::Indexer &indexer );
+
+	/// Replaces array types with the equivalent pointer, and function types with a pointer-to-function using empty TypeEnvironment and Indexer
+	void adjustExprType( Type *& type );
 
 	template< typename ForwardIterator >
Index: src/driver/cfa.cc
===================================================================
--- src/driver/cfa.cc	(revision 732357362caa4a5fd1565cff6758e1e1608d6f47)
+++ src/driver/cfa.cc	(revision 5f95b5f4ad5b5cb1706c61b047264b342ceaaaa8)
@@ -10,6 +10,6 @@
 // Created On       : Tue Aug 20 13:44:49 2002
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Feb  1 22:26:10 2018
-// Update Count     : 163
+// Last Modified On : Mon Feb  5 22:05:28 2018
+// Update Count     : 166
 //
 
@@ -258,4 +258,13 @@
 		#endif
 
+		args[nargs] = "-Xlinker";
+		nargs += 1;
+		args[nargs] = "--undefined=__cfaabi_dbg_bits_write";
+		nargs += 1;
+		args[nargs] = "-Xlinker";
+		nargs += 1;
+		args[nargs] = "--undefined=__cfaabi_interpose_startup";
+		nargs += 1;
+
 		// include the cfa library in case it's needed
 		args[nargs] = "-L" CFA_LIBDIR;
@@ -273,15 +282,6 @@
 		args[nargs] = "-lrt";
 		nargs += 1;
-		args[nargs] = "-Xlinker";
-		nargs += 1;
-		args[nargs] = "--undefined=__cfaabi_dbg_bits_write";
-		nargs += 1;
-		args[nargs] = "-Xlinker";
-		nargs += 1;
-		args[nargs] = "--undefined=__cfaabi_interpose_startup";
-		nargs += 1;
-
-	} // if
-#endif //HAVE_LIBCFA
+	} // if
+#endif // HAVE_LIBCFA
 
 	// Add exception flags (unconditionally)
@@ -333,4 +333,9 @@
 		nargs += 1;
 	} // if
+
+    args[nargs] = "-Xlinker";							// used by backtrace
+    nargs += 1;
+    args[nargs] = "-export-dynamic";
+    nargs += 1;
 
 	// execute the compilation command
Index: src/libcfa/interpose.c
===================================================================
--- src/libcfa/interpose.c	(revision 732357362caa4a5fd1565cff6758e1e1608d6f47)
+++ src/libcfa/interpose.c	(revision 5f95b5f4ad5b5cb1706c61b047264b342ceaaaa8)
@@ -10,6 +10,6 @@
 // Created On       : Wed Mar 29 16:10:31 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 21 22:27:33 2017
-// Update Count     : 1
+// Last Modified On : Mon Feb  5 23:40:04 2018
+// Update Count     : 17
 //
 
@@ -32,6 +32,4 @@
 #include "bits/signal.h"
 #include "startup.h"
-
-void __cfaabi_interpose_startup(void)  __attribute__(( constructor( STARTUP_PRIORITY_CORE ) ));
 
 typedef void (*generic_fptr_t)(void);
@@ -92,13 +90,16 @@
 void sigHandler_abort( __CFA_SIGPARMS__ );
 
-void __cfaabi_interpose_startup() {
-	const char *version = NULL;
-
-	INIT_REALRTN( abort, version );
-	INIT_REALRTN( exit, version );
-
-	__kernel_sigaction( SIGSEGV, sigHandler_segv , SA_SIGINFO );      // Failure handler
-	__kernel_sigaction( SIGBUS , sigHandler_segv , SA_SIGINFO );      // Failure handler
-	__kernel_sigaction( SIGABRT, sigHandler_abort, SA_SIGINFO );      // Failure handler
+extern "C" {
+	void __cfaabi_interpose_startup(void)  __attribute__(( constructor( STARTUP_PRIORITY_CORE ) ));
+	void __cfaabi_interpose_startup( void ) {
+		const char *version = NULL;
+
+		INIT_REALRTN( abort, version );
+		INIT_REALRTN( exit, version );
+
+		__kernel_sigaction( SIGSEGV, sigHandler_segv , SA_SIGINFO ); // Failure handler
+		__kernel_sigaction( SIGBUS , sigHandler_segv , SA_SIGINFO ); // Failure handler
+		__kernel_sigaction( SIGABRT, sigHandler_abort, SA_SIGINFO ); // Failure handler
+	}
 }
 
@@ -108,9 +109,9 @@
 
 extern "C" {
-	void abort (void) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) {
+	void abort( void ) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) {
 		abortf( NULL );
 	}
 
-	void exit (int __status) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) {
+	void exit( int __status ) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) {
 		libc_exit(__status);
 	}
@@ -121,6 +122,6 @@
 }
 
-void * kernel_abort    (void) __attribute__ ((__nothrow__, __leaf__, __weak__)) { return NULL; }
-void   kernel_abort_msg(void * data, char * buffer, int size) __attribute__ ((__nothrow__, __leaf__, __weak__)) {}
+void * kernel_abort    ( void ) __attribute__ ((__nothrow__, __leaf__, __weak__)) { return NULL; }
+void   kernel_abort_msg( void * data, char * buffer, int size ) __attribute__ ((__nothrow__, __leaf__, __weak__)) {}
 
 enum { abort_text_size = 1024 };
@@ -133,5 +134,5 @@
 		int len;
 
-		if( fmt ) {
+		if ( fmt ) {
 			va_list args;
 			va_start( args, fmt );
@@ -142,5 +143,5 @@
 
 			__cfaabi_dbg_bits_write( abort_text, len );
-			__cfaabi_dbg_bits_write( "\n", 1 );
+			//__cfaabi_dbg_bits_write( "\n", 1 );
 		}
 
@@ -162,5 +163,5 @@
 	enum { Frames = 50 };
 	void * array[Frames];
-	int size = backtrace( array, Frames );
+	size_t size = backtrace( array, Frames );
 	char ** messages = backtrace_symbols( array, size );
 
@@ -176,4 +177,5 @@
 
 		for ( char *p = messages[i]; *p; ++p ) {
+			//__cfaabi_dbg_bits_print_nolock( "X %s\n", p);
 			// find parantheses and +offset
 			if ( *p == '(' ) {
