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.