When trying to implement non-POD types for gdc some time ago I asked on the dmd mailing list what the backend is actually supposed to do for non-POD types. Walter answered that they should never be passed in registers:
-------------------------- > Wouldn't it be legal to still pass non-PODs in registers when calling > functions and only copying them back to the stack if the address is > needed? As we pass structs by value anyway, how could this be > problematic? > No, not allowed. Consider why there are copy constructors, and what they do. -------------------------- Now that's probably because of my weak C++ background, but what can you do with copy constructors that would break if the compiler passed the non-POD type in a register to a function? Note: If I interpret this assembly properly dmd does do exactly what I proposed and what's illegal according to Walter: D: https://gist.github.com/jpf91/5064703 ASM: https://gist.github.com/jpf91/5064764