With gcc version 4.3.0 20071024 (experimental) [trunk revision 129615] configured:
../trunk/configure --enable-languages=c,c++,java --disable-static --enable-__cxa_atexit --prefix=/home/daney/mvl_ti/gcj --with-gmp=/home/daney/mp --with-mpfr=/home/daney/mp --with-sysroot=/home/daney/mvl_ti/mv_pro_4.0/montavista/pro/devkit/arm/v5t_le/target --with-float=soft --disable-java-awt --without-x --disable-jvmpi --disable-sjlj-exceptions --target=armv5tl-montavista-linuxeabi If the last fixed argument in a va_arg function is 64 bits bad things happen. Here is the test program: --------8<--------- #include <stdio.h> #include <stdarg.h> #include <stdint.h> class A { private: int foo; public: A(int a) { foo = a; } void f(int64_t j,...); void f2(int64_t j, int l,...); void f1(int64_t j); void g(int j,...); void h(int j, va_list ap); }; void A::f(int64_t j,...) { va_list ap; va_start(ap, j); int k = va_arg(ap, int); h(5, ap); va_end(ap); printf("A::f %d %lld, sizeof(j) = %d\n", k, j, sizeof(j)); } void A::f2(int64_t j, int l, ...) { va_list ap; va_start(ap, l); int k = va_arg(ap, int); h(5, ap); va_end(ap); printf("A::f2 %d %lld, sizeof(j) = %d\n", k, j, sizeof(j)); } void A::f1(int64_t j) { printf("A::f1 %lld, sizeof(j) = %d\n", j, sizeof(j)); } void A::g(int j,...) { va_list ap; va_start(ap, j); int k = va_arg(ap, int); h(7, ap); va_end(ap); printf("A::f %d %d\n", k, j); } void A::h(int j, va_list ap) { int k; do { k = va_arg(ap, int); printf(" A::h %d - %d\n", j, k); } while (k >= 0); } int main(int argc, char *argv[]) { A *a = new A(9); a->f(300, 4,6,8,10,-1); a->f2(300, 99, 4,6,8,10,-1); a->g(400, 3,5,7,9,11,13,-1); a->f1(500); } -------8<---------- Expected output: $ ./vargs A::h 5 - 6 A::h 5 - 8 A::h 5 - 10 A::h 5 - -1 A::f 4 300, sizeof(j) = 8 A::h 5 - 6 A::h 5 - 8 A::h 5 - 10 A::h 5 - -1 A::f2 4 300, sizeof(j) = 8 A::h 7 - 5 A::h 7 - 7 A::h 7 - 9 A::h 7 - 11 A::h 7 - 13 A::h 7 - -1 A::f 3 400 A::f1 500, sizeof(j) = 8 Output on armv5tl-none-linuxeabi: # ./vargs A::h 5 - 4 A::h 5 - 6 A::h 5 - 8 A::h 5 - 10 A::h 5 - -1 A::f 0 1288490188809, sizeof(j) = 8 A::h 5 - 6 A::h 5 - 8 A::h 5 - 10 A::h 5 - -1 A::f2 4 300, sizeof(j) = 8 A::h 7 - 5 A::h 7 - 7 A::h 7 - 9 A::h 7 - 11 A::h 7 - 13 A::h 7 - -1 A::f 3 400 A::f1 500, sizeof(j) = 8 Note that output 'A::f 0 1288490188809,...' is incorrect. -- Summary: [arm] varargs broken with 64bit parameters. Product: gcc Version: 4.3.0 Status: UNCONFIRMED Keywords: wrong-code Severity: normal Priority: P3 Component: target AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: daney at gcc dot gnu dot org GCC target triplet: armv5tl-none-linuxeabi http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34281