Mercurial > projects > ldc
annotate 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 |
rev | line source |
---|---|
65 | 1 |
2 /* | |
3 * Placed in public domain. | |
4 * Written by Hauke Duden and Walter Bright | |
5 */ | |
6 | |
7 /* This is for use with variable argument lists with extern(D) linkage. */ | |
8 | |
9 module std.stdarg; | |
10 | |
11 alias void* va_list; | |
12 | |
13 T va_arg(T)(inout va_list vp) | |
14 { | |
70
fb265a6efea1
[svn r74] Fixed passing types with different alignment to D-style variadic functions.
lindquist
parents:
65
diff
changeset
|
15 static assert((T.sizeof & (T.sizeof -1)) == 0); |
fb265a6efea1
[svn r74] Fixed passing types with different alignment to D-style variadic functions.
lindquist
parents:
65
diff
changeset
|
16 va_list vptmp = cast(va_list)((cast(size_t)vp + T.sizeof - 1) & ~(T.sizeof - 1)); |
fb265a6efea1
[svn r74] Fixed passing types with different alignment to D-style variadic functions.
lindquist
parents:
65
diff
changeset
|
17 vp = vptmp + T.sizeof; |
65 | 18 return *cast(T*)vptmp; |
19 } |