That is really cool.
Combine this with struct definitions in function bodies and I see a great teamup with variadic functions.
Take a theoretical struct_printf, which prints out non promoted data with struct packing (not variadic stack packing, which requires type promotion)
/* Only uses va_start and va_arg to*/
void struct_printf(const char* format, ...){
...
}
void print_foo(){
struct foo_t{
float f;
uint16_t u2;
uint8_t x;
} input;
struct_printf("No type promotion here: %f %hu %hhx\n",
(struct foo_t){ .f = 0.1, .u2 = 1000, .x = 0xF2});
}
Now we can actually pass what we mean to pass without the compiler changing it.
NOTE: After I wrote this I'm not actually sure what va_args does with a struct or how to get a pointer to the first member...