# HG changeset patch # User lindquist # Date 1193596430 -3600 # Node ID fb265a6efea1be7bc86302146b35b4ba2a52f3a2 # Parent 2b5a2eaa88bee2fd86d49c8cb070971ee7b80ab0 [svn r74] Fixed passing types with different alignment to D-style variadic functions. Fixed casting integer to pointer. diff -r 2b5a2eaa88be -r fb265a6efea1 gen/toir.c --- a/gen/toir.c Sun Oct 28 04:23:38 2007 +0100 +++ b/gen/toir.c Sun Oct 28 19:33:50 2007 +0100 @@ -1287,6 +1287,9 @@ e->val = new llvm::SIToFPInst(u->getValue(), tolltype, "tmp", p->scopebb()); } } + else if (totype->ty == Tpointer) { + e->val = p->ir->CreateIntToPtr(u->getValue(), tolltype, "tmp"); + } else { assert(0); } diff -r 2b5a2eaa88be -r fb265a6efea1 lphobos/std/stdarg.d --- a/lphobos/std/stdarg.d Sun Oct 28 04:23:38 2007 +0100 +++ b/lphobos/std/stdarg.d Sun Oct 28 19:33:50 2007 +0100 @@ -12,7 +12,8 @@ T va_arg(T)(inout va_list vp) { - va_list vptmp = vp; - vp += T.sizeof; + static assert((T.sizeof & (T.sizeof -1)) == 0); + va_list vptmp = cast(va_list)((cast(size_t)vp + T.sizeof - 1) & ~(T.sizeof - 1)); + vp = vptmp + T.sizeof; return *cast(T*)vptmp; } diff -r 2b5a2eaa88be -r fb265a6efea1 test/vararg4.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/vararg4.d Sun Oct 28 19:33:50 2007 +0100 @@ -0,0 +1,36 @@ +module vararg4; +import std.stdarg; + +void vafunc(...) +{ + foreach(i,v; _arguments) { + if (typeid(byte) == v) { + printf("byte(%d)\n", va_arg!(byte)(_argptr)); + } + else if (typeid(short) == v) { + printf("short(%d)\n", va_arg!(short)(_argptr)); + } + else if (typeid(int) == v) { + printf("int(%d)\n", va_arg!(int)(_argptr)); + } + else if (typeid(long) == v) { + printf("long(%ld)\n", va_arg!(long)(_argptr)); + } + else if (typeid(float) == v) { + printf("float(%f)\n", va_arg!(float)(_argptr)); + } + else if (typeid(double) == v) { + printf("double(%f)\n", va_arg!(double)(_argptr)); + } + else if (typeid(real) == v) { + printf("real(%f)\n", va_arg!(real)(_argptr)); + } + else + assert(0, "unsupported type"); + } +} + +void main() +{ + vafunc(byte.max,short.max,1,2,3,4L,5.0f,6.0,cast(real)7); +}