Mercurial > projects > ldc
comparison dmd/declaration.h @ 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 | d9c5f5a43403 |
children | 05c235309d6f |
comparison
equal
deleted
inserted
replaced
1498:899a928ac905 | 1499:df11cdec45a2 |
---|---|
133 int isScope() { return storage_class & (STCscope | STCauto); } | 133 int isScope() { return storage_class & (STCscope | STCauto); } |
134 int isSynchronized() { return storage_class & STCsynchronized; } | 134 int isSynchronized() { return storage_class & STCsynchronized; } |
135 int isParameter() { return storage_class & STCparameter; } | 135 int isParameter() { return storage_class & STCparameter; } |
136 int isDeprecated() { return storage_class & STCdeprecated; } | 136 int isDeprecated() { return storage_class & STCdeprecated; } |
137 int isOverride() { return storage_class & STCoverride; } | 137 int isOverride() { return storage_class & STCoverride; } |
138 | |
139 virtual int isSameAsInitializer() { return isConst(); }; | |
138 | 140 |
139 int isIn() { return storage_class & STCin; } | 141 int isIn() { return storage_class & STCin; } |
140 int isOut() { return storage_class & STCout; } | 142 int isOut() { return storage_class & STCout; } |
141 int isRef() { return storage_class & STCref; } | 143 int isRef() { return storage_class & STCref; } |
142 | 144 |
280 Expression *callAutoDtor(); | 282 Expression *callAutoDtor(); |
281 ExpInitializer *getExpInitializer(); | 283 ExpInitializer *getExpInitializer(); |
282 void checkCtorConstInit(); | 284 void checkCtorConstInit(); |
283 void checkNestedReference(Scope *sc, Loc loc); | 285 void checkNestedReference(Scope *sc, Loc loc); |
284 Dsymbol *toAlias(); | 286 Dsymbol *toAlias(); |
287 | |
288 virtual int isSameAsInitializer(); | |
285 | 289 |
286 #if IN_DMD | 290 #if IN_DMD |
287 void toObjFile(int multiobj); // compile to .obj file | 291 void toObjFile(int multiobj); // compile to .obj file |
288 Symbol *toSymbol(); | 292 Symbol *toSymbol(); |
289 int cvMember(unsigned char *p); | 293 int cvMember(unsigned char *p); |