Bug 000083
When Created: 05/09/1996 18:59:01
Against DJGPP version: 2.00
By whom: lehmann@mathematik.th-darmstadt.de
Abstract: stdarg doesn't work with last argument char
When using a variable length argument list with the last argument e.g. char,
the pointers used by va_arg are incorrect, since a copy of the variable value is
created in the local variable area. Since the va pointer is calculated relative
to this pointer, this doesn't work.
Solution added: 05/09/1996 19:13:57
By whom: lehmann@mathematik.th-darmstadt.de
Change the definition of va_start to use __builtin_next_arg, like
is used in the stdarg.h from gcc 2.7.2.
The same should probably be done for vararg (unless I misread it, it's
currently broken anyway).
Note added: 05/11/1996 13:29:41
By whom: lehmann@mathematik.th-darmstadt.de
OK, the current vararg implementation is not broken. But neverthess, I would
say it should be synced with the one in gcc 2.7.2, since it uses a builtin
that may tell the compiler that varargs is used and maybe turn off some
optimizations and it uses the ... syntax instead of a dummy argument, which
is probably preferable.
Note added: 07/19/1996 11:23:37
By whom: kor@cs.mcgill.ca
The following code fails as well:
#include <stdio.h>
#include <stdarg.h>
#define ENUM short unsigned int
void PrintBarAddress(ENUM, ...);
void main(void)
{
char * bar;
printf("Passing bar address: %d
\n", (long) &bar);
PrintBarAddress(1, (&bar));
}
void PrintBarAddress
(
ENUM foo,
...
)
{
va_list Arg;
char ** barAddress;
va_start(Arg, foo);
barAddress = va_arg(Arg, char **);
printf("Bar address: %d
\n", (long) barAddress);
}
Fixed in version 2.01 on 07/26/1996 00:19:38
By whom: dj@delorie.com