Cast expressions can throw, so if they're the default value for a field, wrap them in a function.
Fix using RuntimeType as a cast target or cast source.
Optimizing the struct allocation hoister to create less temporaries caused it to change behavior in certain code, so undo that and add a test.