Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision 7f0001ca4ecbf6bf7f7be2b5c60a551cd91dbe10)
+++ src/Common/PassVisitor.impl.h	(revision 30dcc47fd4b14b7304232dbdeaf02da9a7b2547b)
@@ -690,6 +690,6 @@
 	VISIT_START( node );
 
-	maybeAccept_impl( node->condition, *this );
-	maybeAccept_impl( node->message  , *this );
+	node->condition = visitExpression( node->condition );
+	maybeAccept_impl( node->message, *this );
 
 	VISIT_END( node );
@@ -700,6 +700,6 @@
 	MUTATE_START( node );
 
-	maybeMutate_impl( node->condition, *this );
-	maybeMutate_impl( node->message  , *this );
+	node->condition = mutateExpression( node->condition );
+	maybeMutate_impl( node->message, *this );
 
 	MUTATE_END( StaticAssertDecl, node );
Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision 7f0001ca4ecbf6bf7f7be2b5c60a551cd91dbe10)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision 30dcc47fd4b14b7304232dbdeaf02da9a7b2547b)
@@ -459,7 +459,7 @@
 	/// Adds type variables to the open variable set and marks their assertions
 	void makeUnifiableVars( Type *type, OpenVarSet &unifiableVars, AssertionSet &needAssertions ) {
-		for ( Type::ForallList::const_iterator tyvar = type->get_forall().begin(); tyvar != type->get_forall().end(); ++tyvar ) {
+		for ( Type::ForallList::const_iterator tyvar = type->forall.begin(); tyvar != type->forall.end(); ++tyvar ) {
 			unifiableVars[ (*tyvar)->get_name() ] = TypeDecl::Data{ *tyvar };
-			for ( std::list< DeclarationWithType* >::iterator assert = (*tyvar)->get_assertions().begin(); assert != (*tyvar)->get_assertions().end(); ++assert ) {
+			for ( std::list< DeclarationWithType* >::iterator assert = (*tyvar)->assertions.begin(); assert != (*tyvar)->assertions.end(); ++assert ) {
 				needAssertions[ *assert ].isUsed = true;
 			}
Index: src/ResolvExpr/AlternativeFinder.h
===================================================================
--- src/ResolvExpr/AlternativeFinder.h	(revision 7f0001ca4ecbf6bf7f7be2b5c60a551cd91dbe10)
+++ src/ResolvExpr/AlternativeFinder.h	(revision 30dcc47fd4b14b7304232dbdeaf02da9a7b2547b)
@@ -126,4 +126,7 @@
 	void printAlts( const AltList &list, std::ostream &os, unsigned int indentAmt = 0 );
 
+	/// Adds type variables to the open variable set and marks their assertions
+	void makeUnifiableVars( Type *type, OpenVarSet &unifiableVars, AssertionSet &needAssertions );
+
 	template< typename InputIterator >
 	void simpleCombineEnvironments( InputIterator begin, InputIterator end, TypeEnvironment &result ) {
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 7f0001ca4ecbf6bf7f7be2b5c60a551cd91dbe10)
+++ src/ResolvExpr/Resolver.cc	(revision 30dcc47fd4b14b7304232dbdeaf02da9a7b2547b)
@@ -544,5 +544,9 @@
 							OpenVarSet openVars;
 							AssertionSet resultNeed, resultHave;
-							TypeEnvironment resultEnv;
+							TypeEnvironment resultEnv( func.env );
+							makeUnifiableVars( function, openVars, resultNeed );
+							// add all type variables as open variables now so that those not used in the parameter
+							// list are still considered open.
+							resultEnv.add( function->forall );
 
 							// Load type variables from arguemnts into one shared space
Index: src/SymTab/Mangler.cc
===================================================================
--- src/SymTab/Mangler.cc	(revision 7f0001ca4ecbf6bf7f7be2b5c60a551cd91dbe10)
+++ src/SymTab/Mangler.cc	(revision 30dcc47fd4b14b7304232dbdeaf02da9a7b2547b)
@@ -178,5 +178,5 @@
 				printQualifiers( pointerType );
 				mangleName << "P";
-				maybeAccept( pointerType->get_base(), *visitor );
+				maybeAccept( pointerType->base, *visitor );
 			}
 
@@ -185,5 +185,5 @@
 				printQualifiers( arrayType );
 				mangleName << "A0";
-				maybeAccept( arrayType->get_base(), *visitor );
+				maybeAccept( arrayType->base, *visitor );
 			}
 
@@ -191,5 +191,5 @@
 				printQualifiers( refType );
 				mangleName << "R";
-				maybeAccept( refType->get_base(), *visitor );
+				maybeAccept( refType->base, *visitor );
 			}
 
Index: src/libcfa/interpose.c
===================================================================
--- src/libcfa/interpose.c	(revision 7f0001ca4ecbf6bf7f7be2b5c60a551cd91dbe10)
+++ src/libcfa/interpose.c	(revision 30dcc47fd4b14b7304232dbdeaf02da9a7b2547b)
@@ -10,6 +10,6 @@
 // Created On       : Wed Mar 29 16:10:31 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Feb  8 16:18:09 2018
-// Update Count     : 75
+// Last Modified On : Tue May  1 15:05:35 2018
+// Update Count     : 83
 //
 
@@ -95,4 +95,5 @@
 void sigHandler_fpe  ( __CFA_SIGPARMS__ );
 void sigHandler_abort( __CFA_SIGPARMS__ );
+void sigHandler_term ( __CFA_SIGPARMS__ );
 
 struct {
@@ -114,4 +115,6 @@
 		__cfaabi_sigaction( SIGFPE , sigHandler_fpe  , SA_SIGINFO ); // Failure handler
 		__cfaabi_sigaction( SIGABRT, sigHandler_abort, SA_SIGINFO ); // Failure handler
+		__cfaabi_sigaction( SIGTERM, sigHandler_term , SA_SIGINFO ); // Failure handler
+		__cfaabi_sigaction( SIGINT , sigHandler_term , SA_SIGINFO ); // Failure handler
 	}
 }
@@ -268,4 +271,8 @@
 }
 
+void sigHandler_term( __CFA_SIGPARMS__ ) {
+	abort( "Application stopped by %s signal.", sig == SIGINT ? "an interrupt (SIGINT)" : "a terminate (SIGTERM)" );
+}
+
 // Local Variables: //
 // mode: c //
Index: src/tests/references.c
===================================================================
--- src/tests/references.c	(revision 7f0001ca4ecbf6bf7f7be2b5c60a551cd91dbe10)
+++ src/tests/references.c	(revision 30dcc47fd4b14b7304232dbdeaf02da9a7b2547b)
@@ -45,4 +45,18 @@
 }
 
+// --- temporary code needed to make array of references subscript work.
+extern "C" {
+  void ** __index(__attribute__ ((unused)) size_t sizeof_T, __attribute__ ((unused)) size_t alignof_T, void **x, ptrdiff_t y) {
+    return (void **)((char *)x+y*sizeof(void *));
+  }
+  void __ctor(void ***dst, void **src) {
+    *dst = src;
+  }
+}
+__attribute__((alias("__index"))) forall( dtype T | sized(T) ) T && ?[?]( T & * x, ptrdiff_t y );
+__attribute__((alias("__ctor"))) forall( dtype DT ) void ?{}( DT & * & dst, DT & * src);
+forall( dtype DT ) void ^?{}( DT & * & ) {}
+// --- end of temporary code
+
 int main() {
 	int x = 123456, x2 = 789, *p1 = &x, **p2 = &p1, ***p3 = &p2,
@@ -52,9 +66,9 @@
 	*p3 = &p1;                          // change p2
 	int y = 0, z = 11, & ar[3] = { x, y, z };    // initialize array of references
-	// &ar[1] = &z;                        // change reference array element
-	// typeof( ar[1] ) p;                  // is int, i.e., the type of referenced object
-	// typeof( &ar[1] ) q;                 // is int &, i.e., the type of reference
-	// sizeof( ar[1] ) == sizeof( int );   // is true, i.e., the size of referenced object
-	// sizeof( &ar[1] ) == sizeof( int *); // is true, i.e., the size of a reference
+	&ar[1] = &z;                        // change reference array element
+	typeof( ar[1] ) p = 3;              // is int, i.e., the type of referenced object
+	typeof( &ar[1] ) q = &x;            // is int *, i.e., the type of pointer
+	_Static_assert( sizeof( ar[1] ) == sizeof( int ), "Array type should be int." );   // is true, i.e., the size of referenced object
+	_Static_assert( sizeof( &ar[1] ) == sizeof( int *), "Address of array should be int *." ); // is true, i.e., the size of a reference
 
 	((int*&)&r3) = &x;                  // change r1, (&*)**r3
