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);