On 10/12/2017 15:52, Gao, Liming wrote:
> For 4, 'unsigned char' goes default argument promotion to int. This is CLANG compiler behavior. Does GCC and VS compiler follow this rule?
>
> Disable varargs warning is the temp solution. For long term, we expect to figure out the compatible solution. If all supported compilers follow this rule, I think this is a compatible change.

It is STD C default argument promotion.  For example, C99 document n1570

section 6.5.2.2 (Function Calls)
"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."

section 6.3.1.1 (Booleans, characters and integers)
"If an int can represent all values of the original type (as restricted by the width, for a bit-field), the value is converted to an int; otherwise, it is converted to an unsigned int. These are called the integer promotions."

section 7.16.1.4 (The va_start macro)
"If the parameter parmN is declared with the register storage class, with a function or array type, or with a type that is not compatible with the type that results after application of the default argument promotions, the behavior is undefined."

Technically, when there's a prototype that says the parameter is BOOLEAN (i.e. unsigned char), there is no "promotion" from the point of view of STDC. Instead, it tries to convert the argument to BOOLEAN (if possible.) Then the BOOLEAN is passed using whatever mechanism the implementation has to pass BOOLEANs (which is to fit them in a 4 or 8-byte granular stack). However, va_start wants a parameter type that is the outcome of a default argument promotion, and the outcome of a default argument promotion of 'unsigned char' is always int.

There's more discussion with longer quotes from the STD here
https://stackoverflow.com/questions/1255775/default-argument-promotions-in-c-function-calls
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to