Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision c38ae927de4734c94eb69a436cca8cc25a347b02)
+++ src/SymTab/Validate.cc	(revision c0b2364484f77c3ec26686f2b99ccd629acffc1e)
@@ -423,4 +423,12 @@
 	}
 
+	void checkGenericParameters( ReferenceToType * inst ) {
+		for ( Expression * param : inst->parameters ) {
+			if ( ! dynamic_cast< TypeExpr * >( param ) ) {
+				throw SemanticError( "Expression parameters for generic types are currently unsupported: ", inst );
+			}
+		}
+	}
+
 	void LinkReferenceToTypes::postvisit( StructInstType *structInst ) {
 		StructDecl *st = local_indexer->lookupStruct( structInst->get_name() );
@@ -434,4 +442,5 @@
 			forwardStructs[ structInst->get_name() ].push_back( structInst );
 		} // if
+		checkGenericParameters( structInst );
 	}
 
@@ -446,4 +455,5 @@
 			forwardUnions[ unionInst->get_name() ].push_back( unionInst );
 		} // if
+		checkGenericParameters( unionInst );
 	}
 
@@ -525,5 +535,8 @@
 		// need to carry over the 'sized' status of each decl in the instance
 		for ( auto p : group_iterate( traitDecl->get_parameters(), traitInst->get_parameters() ) ) {
-			TypeExpr * expr = strict_dynamic_cast< TypeExpr * >( std::get<1>(p) );
+			TypeExpr * expr = dynamic_cast< TypeExpr * >( std::get<1>(p) );
+			if ( ! expr ) {
+				throw SemanticError( "Expression parameters for trait instances are currently unsupported: ", std::get<1>(p) );
+			}
 			if ( TypeInstType * inst = dynamic_cast< TypeInstType * >( expr->get_type() ) ) {
 				TypeDecl * formalDecl = std::get<0>(p);
