Seconded. ICE's are either codegen bugs for valid code, or bad codegen that should have been stopped at semantic passes. I'd probably put this into the former. While the code: *&S.init.i = 42; Looks as though you are trying to alter the default initialiser, this is not actually the case. .init is a getter @property, not a field. It should compile to some sort of code resembling this: (*&(_tmp = S.init)).i = 42; Which is a noop under optimisations as the _tmp variable is not used (read).