Mercurial > projects > ldc
view lphobos/phobos.d @ 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 | 373489eeaf90 |
children |
line wrap: on
line source
module phobos; import std.array, std.base64, std.ctype, std.format, std.intrinsic, std.math, std.moduleinit, std.outofmemory, std.stdarg, std.stdint, std.stdio, std.string, std.thread, std.traits, std.uni, std.utf, std.c.fenv, std.c.locale, std.c.math, std.c.process, std.c.stdarg, std.c.stddef, std.c.stdio, std.c.stdlib, std.c.string, std.c.time, std.file, std.date, std.socket, std.zlib, std.cstream; version(linux) { import std.c.linux.linux, std.c.linux.linuxextern, std.c.linux.pthread, std.c.linux.socket; }