From the refrat (5.5) we have our specification:

    \section{Initialization} An expression that is used as an
    \nonterm{initializer} is treated as being cast to the type of the
    object being initialized.  An expression used in an
    \nonterm{initializer-list} is treated as being cast to the type of
    the aggregate member that it initializes.  In either case the cast
    must have a single unambiguous
    interpretation\index{interpretations}.

Steps:

- add a member function "void Resolver::visit( SynTree::DeclStmt
*declStmt )"; for each DeclStmt:

- do what you need to do to establish correspondences between
expressions in the initializer and pieces of the object to be
initialized

- for each initializer expression, construct a cast expression that
casts the value of the expression to the type of the corresponding
sub-object

- invoke the resolver recursively on each cast expression; it's an invariant
of the resolver that attempting to resolve a cast expression results either
in a single resolved expression (corresponding to the unambiguous interpretation
referred to above) or a thrown SemanticError.

- construct a new initializer from the resolved expressions

You'll undoubtedly have to play with the CodeGen stuff a bit; I
hacked it to spit out unresolved initializers for file-scope
declarations so that real programs would compile.  You'll want to make
sure that resolved initializers for all declarations are being
generated.
