Message-ID: <3EA26C19.81D82449@acm.org> From: Eric Sosman X-Mailer: Mozilla 4.72 [en] (Win95; U) X-Accept-Language: en MIME-Version: 1.0 Newsgroups: comp.os.msdos.djgpp Subject: Re: __builtin_va_list bug? References: <0ab801c306bf$4dacb430$0600000a AT broadpark DOT no> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Lines: 26 Date: Sun, 20 Apr 2003 14:44:30 GMT NNTP-Posting-Host: 12.91.3.234 X-Complaints-To: abuse AT worldnet DOT att DOT net X-Trace: bgtnsc05-news.ops.worldnet.att.net 1050849870 12.91.3.234 (Sun, 20 Apr 2003 14:44:30 GMT) NNTP-Posting-Date: Sun, 20 Apr 2003 14:44:30 GMT Organization: AT&T Worldnet To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com Gisle Vanem wrote: > > I'm porting some code from Watcom to gcc/djgpp and encountered > tons of warnings on illegal use of va_arg(). So I cooked up a little > test: > > #include > char x; > void foo (va_list arg) Hold on; stop right there. You've included , but you're using the argument list declaration from the pre-Standard (or with some compilers). The two are not the same, they are not interchangeable, and they are *definitely* not miscible. > x = va_arg (arg, char); This will be wrong with either or , since the actual type of the parameter is not `char' but whatever `char' gets promoted to: `int' on most machines, but perhaps `unsigned int' on some oddball architectures. You must specify the promoted type, not the type to which you will later "demote" it. -- Eric Sosman esosman AT acm DOT org