noreturn as attribute looks wrong to me. Consider:
void __attribute(noreturn) error(string msg) int __attribute(noreturn) error(string msg)
For noreturn I would vote for a new keyword and do
noreturn error(string msg)
Otherwise I think I would favor method number two, but the way you show it looks very wrong. I would find string(sprintf_format) or type(string, sprintf_format) more natural.
I'm not sure it is a good idea to implement this for 7.7.