cvs <[EMAIL PROTECTED]> writes: > this probably needs a better fix. however, one some platforms, we see: > ./snprintf.c: In function `afs_vsnprintf': > ./snprintf.c:227: `short int' is promoted to `int' when passed through `...' > ./snprintf.c:227: (so you should pass `int' not `short int' to `va_arg')
> and it won't compile. are there platforms where short is correct? No. C always promotes short to int when passing through ..., so you should always pass int to va_arg and then cast the result to short when assigning it (or just assign it to a short variable, which will cast it automatically). Similarly for float and double. The text from the ISO 1999 standard in 6.5.2.2 is: 6 If the expression that denotes the called function has a type that does not include a prototype, the integer promotions are performed on each argument, and arguments that have type float are promoted to double. These are called the default argument promotions. [...] 7 If the expression that denotes the called function has a type that does include a prototype, the arguments are implicitly converted, as if by assignment, to the types of the corresponding parameters, taking the type of each parameter to be the unqualified version of its declared type. The ellipsis notation in a function prototype declarator causes argument type conversion to stop after the last declared parameter. The default argument promotions are performed on trailing arguments. where integer promotions are defined in 6.3.1.1 as: If an int can represent all values of the original type, the value is converted to an int; otherwise, it is converted to an unsigned int. These are called the integer promotions.48) All other types are unchanged by the integer promotions. -- Russ Allbery ([EMAIL PROTECTED]) <http://www.eyrie.org/~eagle/> _______________________________________________ OpenAFS-devel mailing list [EMAIL PROTECTED] https://lists.openafs.org/mailman/listinfo/openafs-devel
