Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 1b0020a936c9eda0e3b3c47045c62fc5c51b82ce)
+++ src/ResolvExpr/Resolver.cc	(revision 242d4587f77845aedb54424e5c82b19ce6fc14ab)
@@ -446,7 +446,18 @@
 		} else if ( StructInstType * st = dynamic_cast< StructInstType * >( initContext ) ) {
 			resolveAggrInit( st->get_baseStruct(), iter, end );
-		} else if ( UnionInstType *st = dynamic_cast< UnionInstType * >( initContext ) ) {
+		} else if ( UnionInstType * st = dynamic_cast< UnionInstType * >( initContext ) ) {
 			resolveAggrInit( st->get_baseUnion(), iter, end );
+		} else if ( TypeInstType * tt = dynamic_cast< TypeInstType * >( initContext ) ) {
+			Type * base = tt->get_baseType()->get_base();
+			if ( base ) {
+				// know the implementation type, so try using that as the initContext
+				initContext = base;
+				visit( listInit );
+			} else {
+				// missing implementation type -- might be an unknown type variable, so try proceeding with the current init context
+				Visitor::visit( listInit );
+			}
 		} else {
+			assert( dynamic_cast< BasicType * >( initContext ) || dynamic_cast< PointerType * >( initContext ) );
 			// basic types are handled here
 			Visitor::visit( listInit );
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 1b0020a936c9eda0e3b3c47045c62fc5c51b82ce)
+++ src/SymTab/Validate.cc	(revision 242d4587f77845aedb54424e5c82b19ce6fc14ab)
@@ -162,5 +162,7 @@
 
 		typedef std::map< std::string, std::pair< TypedefDecl *, int > > TypedefMap;
+		typedef std::map< std::string, TypeDecl * > TypeDeclMap;
 		TypedefMap typedefNames;
+		TypeDeclMap typedeclNames;
 		int scopeLevel;
 	};
@@ -521,4 +523,8 @@
 			delete typeInst;
 			return ret;
+		} else {
+			TypeDeclMap::const_iterator base = typedeclNames.find( typeInst->get_name() );
+			assert( base != typedeclNames.end() );
+			typeInst->set_baseType( base->second->clone() );
 		} // if
 		return typeInst;
@@ -565,4 +571,6 @@
 			typedefNames.erase( i ) ;
 		} // if
+
+		typedeclNames[ typeDecl->get_name() ] = typeDecl;
 		return typeDecl;
 	}
