struct ir_instruction *
_mesa_ast_constructor_to_hir(const struct ast_node *n,
			     const struct ast_node *parameters,
			     struct _mesa_glsl_parse_state *state)
{
   const struct ast_type_specifier *type = (struct ast_type_specifier *) n;


   /* There are effectively three kinds of constructors.  Each has its own set
    * of rules.
    *
    * * Built-in scalar, vector, and matrix types:  For each of these the only
    *   matching requirement is that the number of values supplied is
    *   sufficient to initialize all of the fields of the type.
    * * Array types: The number of initializers must match the size of the
    *   array, if a size is specified.  Each of the initializers must
    *   exactly match the base type of the array.
    * * Structure types: These initializers must exactly match the fields of
    *   the structure in order.  This is the most restrictive type.
    *
    * In all cases the built-in promotions from integer to floating-point types
    * are applied.
    */

   if (type->is_array) {
      /* FINISHME */
   } else if ((type->type_specifier == ast_struct)
	      || (type->type_specifier == ast_type_name)) {
      /* FINISHME */
   } else {
      const struct glsl_type *ctor_type;

      /* Look-up the type, by name, in the symbol table.
       */


      /* Generate a series of assignments of constructor parameters to fields
       * of the object being initialized.
       */
   }
}