summaryrefslogtreecommitdiffstats
path: root/StdLib/LibC
diff options
context:
space:
mode:
authordarylm503 <darylm503@6f19259b-4bc3-4df7-8a09-765794883524>2011-09-01 21:56:45 +0000
committerdarylm503 <darylm503@6f19259b-4bc3-4df7-8a09-765794883524>2011-09-01 21:56:45 +0000
commit5244f47e46709b22ecefcee8e52b6dc6170ed6c9 (patch)
treebdc5e498097d72ee19390d8f6cdfebe91fcf8c64 /StdLib/LibC
parentb2824a8e1362b89285663e1ab9b88e9fbb4bc572 (diff)
downloadedk2-5244f47e46709b22ecefcee8e52b6dc6170ed6c9.tar.gz
edk2-5244f47e46709b22ecefcee8e52b6dc6170ed6c9.tar.bz2
edk2-5244f47e46709b22ecefcee8e52b6dc6170ed6c9.zip
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
Diffstat (limited to 'StdLib/LibC')
-rw-r--r--StdLib/LibC/Stdio/vfwprintf.c11
1 files changed, 8 insertions, 3 deletions
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 *);