Mercurial > projects > ddmd
view dmd/StorageClassDeclaration.d @ 92:0c891ec48515
Fixed another bug related to copy ctor
author | korDen |
---|---|
date | Mon, 30 Aug 2010 23:43:38 +0400 |
parents | 7e0d548de9e6 |
children | e28b18c23469 |
line wrap: on
line source
module dmd.StorageClassDeclaration; import dmd.AttribDeclaration; import dmd.Array; import dmd.TOK; import dmd.Token; import dmd.Scope; import dmd.Dsymbol; import dmd.OutBuffer; import dmd.HdrGenState; import dmd.STC; class StorageClassDeclaration: AttribDeclaration { STC stc; this(STC stc, Dsymbols decl) { super(decl); this.stc = stc; } override Dsymbol syntaxCopy(Dsymbol s) { StorageClassDeclaration scd; assert(!s); scd = new StorageClassDeclaration(stc, Dsymbol.arraySyntaxCopy(decl)); return scd; } override void setScope(Scope sc) { if (decl) { STC scstc = sc.stc; /* These sets of storage classes are mutually exclusive, * so choose the innermost or most recent one. */ if (stc & (STC.STCauto | STC.STCscope | STC.STCstatic | STC.STCextern | STC.STCmanifest)) scstc &= ~(STC.STCauto | STC.STCscope | STC.STCstatic | STC.STCextern | STC.STCmanifest); if (stc & (STC.STCauto | STC.STCscope | STC.STCstatic | STC.STCtls | STC.STCmanifest | STC.STCgshared)) scstc &= ~(STC.STCauto | STC.STCscope | STC.STCstatic | STC.STCtls | STC.STCmanifest | STC.STCgshared); if (stc & (STC.STCconst | STC.STCimmutable | STC.STCmanifest)) scstc &= ~(STC.STCconst | STC.STCimmutable | STC.STCmanifest); if (stc & (STC.STCgshared | STC.STCshared | STC.STCtls)) scstc &= ~(STC.STCgshared | STC.STCshared | STC.STCtls); scstc |= stc; setScopeNewSc(sc, scstc, sc.linkage, sc.protection, sc.explicitProtection, sc.structalign); } } override void semantic(Scope sc) { if (decl) { STC scstc = sc.stc; /* These sets of storage classes are mutually exclusive, * so choose the innermost or most recent one. */ if (stc & (STC.STCauto | STC.STCscope | STC.STCstatic | STC.STCextern | STC.STCmanifest)) scstc &= ~(STC.STCauto | STC.STCscope | STC.STCstatic | STC.STCextern | STC.STCmanifest); if (stc & (STC.STCauto | STC.STCscope | STC.STCstatic | STC.STCtls | STC.STCmanifest | STC.STCgshared)) scstc &= ~(STC.STCauto | STC.STCscope | STC.STCstatic | STC.STCtls | STC.STCmanifest | STC.STCgshared); if (stc & (STC.STCconst | STC.STCimmutable | STC.STCmanifest)) scstc &= ~(STC.STCconst | STC.STCimmutable | STC.STCmanifest); if (stc & (STC.STCgshared | STC.STCshared | STC.STCtls)) scstc &= ~(STC.STCgshared | STC.STCshared | STC.STCtls); scstc |= stc; semanticNewSc(sc, scstc, sc.linkage, sc.protection, sc.explicitProtection, sc.structalign); } } override void toCBuffer(OutBuffer buf, HdrGenState* hgs) { assert(false); } static void stcToCBuffer(OutBuffer buf, int stc) { struct SCstring { int stc; TOK tok; }; static SCstring[] table = [ { STCauto, TOKauto }, { STCscope, TOKscope }, { STCstatic, TOKstatic }, { STCextern, TOKextern }, { STCconst, TOKconst }, { STCfinal, TOKfinal }, { STCabstract, TOKabstract }, { STCsynchronized, TOKsynchronized }, { STCdeprecated, TOKdeprecated }, { STCoverride, TOKoverride }, { STClazy, TOKlazy }, { STCalias, TOKalias }, { STCout, TOKout }, { STCin, TOKin }, /// version (DMDV2) { /// { STCimmutable, TOKimmutable }, /// { STCshared, TOKshared }, /// { STCnothrow, TOKnothrow }, /// { STCpure, TOKpure }, /// { STCref, TOKref }, /// { STCtls, TOKtls }, /// { STCgshared, TOKgshared }, /// } ]; for (int i = 0; i < table.length; i++) { if (stc & table[i].stc) { buf.writestring(Token.toChars(table[i].tok)); buf.writeByte(' '); } } } }