Mercurial > projects > ldc
view druntime/import/std/stdarg.di @ 1499:df11cdec45a2
Another shot at fixing the issues with (constant) struct literals and their addresses. See DMD2682, #218, #324.
The idea is to separate the notion of const from 'this variable can always be
replaced with its initializer' in the frontend. To do that, I introduced
Declaration::isSameAsInitializer, which is overridden in VarDeclaration to
return false for constants that have a struct literal initializer.
So
{{{
const S s = S(5);
void foo() { auto ps = &s; }
// is no longer replaced by
void foo() { auto ps = &(S(5)); }
}}}
To make taking the address of a struct constant with a struct-initializer
outside of function scope possible, I made sure that AddrExp::optimize doesn't
try to run the argument's optimization with WANTinterpret - that'd again
replace the constant with a struct literal temporary.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Sun, 14 Jun 2009 19:49:58 +0200 |
parents | 6f33b427bfd1 |
children |
line wrap: on
line source
/** * These functions are built-in intrinsics to the compiler. * * Copyright: Public Domain * License: Public Domain * Authors: David Friedman */ module std.stdarg; version( GNU ) { private import gcc.builtins; alias __builtin_va_list va_list; alias __builtin_va_end va_end; alias __builtin_va_copy va_copy; } template va_start(T) { void va_start( out va_list ap, inout T parmn ) { } } template va_arg(T) { T va_arg( inout va_list ap ) { return T.init; } }