Mercurial > projects > ldc
view ldc-posix-tango @ 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 | 8403fec8c34c |
children |
line wrap: on
line source
ignore=object compiler=ldc inifile=ldc.rebuild.conf exeext= objext=o version=LLVM version=LDC noversion=DigitalMars noversion=GNU testversion=linux testversion=darwin testversion=freebsd testversion=Unix testversion=Posix testversion=Windows testversion=Win32 testversion=Win64 testversion=mingw32 testversion=X86 testversion=PPC testversion=X86_64 testversion=PPC64 testversion=D_InlineAsm testversion=D_InlineAsm_X86 testversion=D_InlineAsm_PPC testversion=D_InlineAsm_X86_64 testversion=D_InlineAsm_PPC64 testversion=LLVM_InlineAsm_X86 testversion=LittleEndian testversion=BigEndian testversion=LLVM64 testversion=PIC testversion=Tango [compile] oneatatime=yes cmd=ldmd -c $i flag=$i incdir=-I$i libdir=-L-L$i optimize=-O3 version=-version=$i [link] oneatatime=yes cmd=ldc $i -of$o libdir=-L-L$i lib=-L-l$i flag=-L$i [liblink] safe=yes oneatatime=yes cmd=ar rc $o $i libdir= lib= flag= [postliblink] cmd=ranlib $i [shliblink] shlibs=no [dyliblink] dylibs=no