diff lphobos/std/stdarg.d @ 70:fb265a6efea1 trunk

[svn r74] Fixed passing types with different alignment to D-style variadic functions. Fixed casting integer to pointer.
author lindquist
date Sun, 28 Oct 2007 19:33:50 +0100
parents d4a678905d5e
children 5825d48b27d1
line wrap: on
line diff
--- 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;
 }