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