As you all probably know, I've been tinkering with the type system in Pike 7.7 for a while now, and I've now reached the point of implementing attributed types.
The question once again is "which syntax do you prefer?":
GCC-style:
void __attribute(noreturn) error(string msg); string werror(string __attribute(sprintf_format) fmt, mixed __attribute(sprintf_args) ... args);
or (analogous with other pike types):
__attribute(noreturn, void) throw(mixed); string werror(__attribute(sprintf_format, string) fmt, __attribute(sprintf_args, mixed) ... args);
One alternative way would be to implement it via typedef.
Either without syntax change, and go via the type name (a bit too magic for my taste):
typedef void noreturn; typedef string sprintf_format; typedef mixed sprintf_args;
noreturn error(string msg); string werror(sprintf_format fmt, sprintf_args ... args);
Or with some extended syntax:
typedef void noreturn::noreturn; typedef string sprintf_format::sprintf_format; typedef mixed sprintf_args::sprintf_args;
noreturn error(string msg); string werror(sprintf_format fmt, sprintf_args ... args);
These alternatives have the advantage of not needing any extra keywords.