From 5244f47e46709b22ecefcee8e52b6dc6170ed6c9 Mon Sep 17 00:00:00 2001 From: darylm503 Date: Thu, 1 Sep 2011 21:56:45 +0000 Subject: StdLib: Fix build errors caused by differences between the minGW 4.3 and GCC 4.4 compilers. There are several significant differences between the mingw32 (gcc 4.3.0 based) compiler and the GCC 4.4 and later compilers. Mingw32 requires that types int, long, long long, unsigned { int, long, long long}, float, and double be the only types passed to va_arg(). This requires the programmer to ensure that va_arg is called with type int for arguments of any type with a size less-than or equal-to int. GCC 4.4 and later does not require this and performs the appropriate promotions for you. Mingw32 uses 32-bit long in both ia32 and x64 mode. GCC 4.4 makes long a 64-bit value when in x64 mode. Signed-off-by: darylm503 Reviewed-by: jcarsey git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12258 6f19259b-4bc3-4df7-8a09-765794883524 --- StdLib/LibC/Stdio/vfwprintf.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'StdLib/LibC') diff --git a/StdLib/LibC/Stdio/vfwprintf.c b/StdLib/LibC/Stdio/vfwprintf.c index 0554edb645..f5cf3940f9 100644 --- a/StdLib/LibC/Stdio/vfwprintf.c +++ b/StdLib/LibC/Stdio/vfwprintf.c @@ -1003,7 +1003,12 @@ reswitch: switch (ch) { mbs = initial; mbseqlen = wcrtomb(buf, - (wchar_t)GETARG(wint_t), &mbs); + /* The compiler "knows" that wint_t may be smaller than an int so + it warns about it when used as the type argument to va_arg(). + Since any type of parameter smaller than an int is promoted to an int on a + function call, we must call GETARG with type int instead of wint_t. + */ + (wchar_t)GETARG(int), &mbs); if (mbseqlen == (size_t)-1) { fp->_flags |= __SERR; goto error; @@ -1015,7 +1020,7 @@ reswitch: switch (ch) { } #else if (flags & LONGINT) - *buf = (wchar_t)GETARG(wint_t); + *buf = (wchar_t)GETARG(int); else *buf = (wchar_t)btowc(GETARG(int)); size = 1; @@ -1915,7 +1920,7 @@ done: (*argtable) [n].pvoidarg = va_arg (ap, void *); break; case T_WINT: - (*argtable) [n].wintarg = va_arg (ap, wint_t); + (*argtable) [n].wintarg = va_arg (ap, int); break; case TP_WCHAR: (*argtable) [n].pwchararg = va_arg (ap, wchar_t *); -- cgit v1.2.3