Mercurial > projects > ldc
annotate dmd/enum.c @ 1628:6c36e3f49b28
Merge DMD r324: bugzilla 3663 and 3664 - fwd ref regressions
---
dmd/class.c | 2 +-
dmd/enum.c | 4 +++-
dmd/enum.h | 2 ++
dmd/mars.c | 2 +-
dmd/struct.c | 5 ++++-
5 files changed, 11 insertions(+), 4 deletions(-)
author | Leandro Lucarella <llucax@gmail.com> |
---|---|
date | Wed, 06 Jan 2010 15:18:23 -0300 |
parents | 1d48eced441f |
children | 44b145be2ef5 |
rev | line source |
---|---|
1606
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
1 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
2 // Copyright (c) 1999-2009 by Digital Mars |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
3 // All Rights Reserved |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
4 // written by Walter Bright |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
5 // http://www.digitalmars.com |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
6 // License for redistribution is by either the Artistic License |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
7 // in artistic.txt, or the GNU General Public License in gnu.txt. |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
8 // See the included readme.txt for details. |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
9 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
10 #include <stdio.h> |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
11 #include <assert.h> |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
12 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
13 #include "root.h" |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
14 #include "enum.h" |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
15 #include "mtype.h" |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
16 #include "scope.h" |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
17 #include "declaration.h" |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
18 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
19 /********************************* EnumDeclaration ****************************/ |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
20 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
21 EnumDeclaration::EnumDeclaration(Loc loc, Identifier *id, Type *memtype) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
22 : ScopeDsymbol(id) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
23 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
24 this->loc = loc; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
25 type = new TypeEnum(this); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
26 this->memtype = memtype; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
27 maxval = 0; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
28 minval = 0; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
29 defaultval = 0; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
30 #if IN_DMD |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
31 sinit = NULL; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
32 #endif |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
33 isdeprecated = 0; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
34 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
35 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
36 Dsymbol *EnumDeclaration::syntaxCopy(Dsymbol *s) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
37 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
38 Type *t = NULL; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
39 if (memtype) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
40 t = memtype->syntaxCopy(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
41 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
42 EnumDeclaration *ed; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
43 if (s) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
44 { ed = (EnumDeclaration *)s; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
45 ed->memtype = t; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
46 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
47 else |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
48 ed = new EnumDeclaration(loc, ident, t); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
49 ScopeDsymbol::syntaxCopy(ed); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
50 return ed; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
51 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
52 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
53 void EnumDeclaration::semantic(Scope *sc) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
54 { int i; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
55 uinteger_t number; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
56 Type *t; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
57 Scope *sce; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
58 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
59 //printf("EnumDeclaration::semantic(sd = %p, '%s')\n", sc->scopesym, sc->scopesym->toChars()); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
60 if (!memtype) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
61 memtype = Type::tint32; |
1623
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
62 |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
63 if (symtab) // if already done |
1628
6c36e3f49b28
Merge DMD r324: bugzilla 3663 and 3664 - fwd ref regressions
Leandro Lucarella <llucax@gmail.com>
parents:
1623
diff
changeset
|
64 { if (isdone || !scope) |
1623
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
65 return; // semantic() already completed |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
66 } |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
67 else |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
68 symtab = new DsymbolTable(); |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
69 |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
70 Scope *scx = NULL; |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
71 if (scope) |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
72 { sc = scope; |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
73 scx = scope; // save so we don't make redundant copies |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
74 scope = NULL; |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
75 } |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
76 |
1606
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
77 if (sc->stc & STCdeprecated) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
78 isdeprecated = 1; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
79 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
80 parent = sc->scopesym; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
81 memtype = memtype->semantic(loc, sc); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
82 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
83 /* Check to see if memtype is forward referenced |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
84 */ |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
85 if (memtype->ty == Tenum) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
86 { EnumDeclaration *sym = (EnumDeclaration *)memtype->toDsymbol(sc); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
87 if (!sym->memtype) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
88 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
89 error("base enum %s is forward referenced", sym->toChars()); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
90 memtype = Type::tint32; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
91 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
92 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
93 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
94 if (!memtype->isintegral()) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
95 { error("base type must be of integral type, not %s", memtype->toChars()); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
96 memtype = Type::tint32; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
97 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
98 |
1628
6c36e3f49b28
Merge DMD r324: bugzilla 3663 and 3664 - fwd ref regressions
Leandro Lucarella <llucax@gmail.com>
parents:
1623
diff
changeset
|
99 isdone = 1; |
6c36e3f49b28
Merge DMD r324: bugzilla 3663 and 3664 - fwd ref regressions
Leandro Lucarella <llucax@gmail.com>
parents:
1623
diff
changeset
|
100 |
1606
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
101 t = isAnonymous() ? memtype : type; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
102 symtab = new DsymbolTable(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
103 sce = sc->push(this); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
104 sce->parent = this; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
105 number = 0; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
106 if (!members) // enum ident; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
107 return; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
108 if (members->dim == 0) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
109 error("enum %s must have at least one member", toChars()); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
110 int first = 1; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
111 for (i = 0; i < members->dim; i++) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
112 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
113 EnumMember *em = ((Dsymbol *)members->data[i])->isEnumMember(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
114 Expression *e; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
115 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
116 if (!em) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
117 /* The e->semantic(sce) can insert other symbols, such as |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
118 * template instances and function literals. |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
119 */ |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
120 continue; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
121 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
122 //printf("Enum member '%s'\n",em->toChars()); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
123 e = em->value; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
124 if (e) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
125 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
126 assert(e->dyncast() == DYNCAST_EXPRESSION); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
127 e = e->semantic(sce); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
128 e = e->optimize(WANTvalue); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
129 // Need to copy it because we're going to change the type |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
130 e = e->copy(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
131 e = e->implicitCastTo(sc, memtype); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
132 e = e->optimize(WANTvalue); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
133 number = e->toInteger(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
134 e->type = t; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
135 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
136 else |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
137 { // Default is the previous number plus 1 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
138 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
139 // Check for overflow |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
140 if (!first) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
141 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
142 switch (t->toBasetype()->ty) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
143 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
144 case Tbool: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
145 if (number == 2) goto Loverflow; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
146 break; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
147 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
148 case Tint8: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
149 if (number == 128) goto Loverflow; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
150 break; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
151 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
152 case Tchar: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
153 case Tuns8: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
154 if (number == 256) goto Loverflow; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
155 break; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
156 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
157 case Tint16: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
158 if (number == 0x8000) goto Loverflow; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
159 break; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
160 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
161 case Twchar: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
162 case Tuns16: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
163 if (number == 0x10000) goto Loverflow; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
164 break; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
165 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
166 case Tint32: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
167 if (number == 0x80000000) goto Loverflow; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
168 break; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
169 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
170 case Tdchar: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
171 case Tuns32: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
172 if (number == 0x100000000LL) goto Loverflow; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
173 break; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
174 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
175 case Tint64: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
176 if (number == 0x8000000000000000LL) goto Loverflow; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
177 break; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
178 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
179 case Tuns64: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
180 if (number == 0) goto Loverflow; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
181 break; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
182 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
183 Loverflow: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
184 error("overflow of enum value"); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
185 break; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
186 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
187 default: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
188 assert(0); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
189 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
190 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
191 e = new IntegerExp(em->loc, number, t); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
192 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
193 em->value = e; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
194 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
195 // Add to symbol table only after evaluating 'value' |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
196 if (isAnonymous()) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
197 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
198 //sce->enclosing->insert(em); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
199 for (Scope *scx = sce->enclosing; scx; scx = scx->enclosing) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
200 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
201 if (scx->scopesym) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
202 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
203 if (!scx->scopesym->symtab) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
204 scx->scopesym->symtab = new DsymbolTable(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
205 em->addMember(sce, scx->scopesym, 1); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
206 break; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
207 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
208 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
209 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
210 else |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
211 em->addMember(sc, this, 1); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
212 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
213 if (first) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
214 { first = 0; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
215 defaultval = number; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
216 minval = number; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
217 maxval = number; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
218 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
219 else if (memtype->isunsigned()) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
220 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
221 if (number < minval) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
222 minval = number; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
223 if (number > maxval) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
224 maxval = number; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
225 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
226 else |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
227 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
228 if ((sinteger_t)number < (sinteger_t)minval) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
229 minval = number; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
230 if ((sinteger_t)number > (sinteger_t)maxval) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
231 maxval = number; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
232 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
233 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
234 number++; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
235 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
236 //printf("defaultval = %lld\n", defaultval); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
237 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
238 sce->pop(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
239 //members->print(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
240 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
241 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
242 int EnumDeclaration::oneMember(Dsymbol **ps) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
243 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
244 if (isAnonymous()) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
245 return Dsymbol::oneMembers(members, ps); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
246 return Dsymbol::oneMember(ps); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
247 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
248 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
249 void EnumDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
250 { int i; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
251 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
252 buf->writestring("enum "); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
253 if (ident) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
254 { buf->writestring(ident->toChars()); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
255 buf->writeByte(' '); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
256 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
257 if (memtype) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
258 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
259 buf->writestring(": "); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
260 memtype->toCBuffer(buf, NULL, hgs); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
261 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
262 if (!members) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
263 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
264 buf->writeByte(';'); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
265 buf->writenl(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
266 return; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
267 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
268 buf->writenl(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
269 buf->writeByte('{'); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
270 buf->writenl(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
271 for (i = 0; i < members->dim; i++) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
272 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
273 EnumMember *em = ((Dsymbol *)members->data[i])->isEnumMember(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
274 if (!em) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
275 continue; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
276 //buf->writestring(" "); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
277 em->toCBuffer(buf, hgs); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
278 buf->writeByte(','); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
279 buf->writenl(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
280 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
281 buf->writeByte('}'); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
282 buf->writenl(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
283 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
284 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
285 Type *EnumDeclaration::getType() |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
286 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
287 return type; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
288 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
289 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
290 const char *EnumDeclaration::kind() |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
291 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
292 return "enum"; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
293 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
294 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
295 int EnumDeclaration::isDeprecated() |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
296 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
297 return isdeprecated; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
298 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
299 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
300 /********************************* EnumMember ****************************/ |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
301 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
302 EnumMember::EnumMember(Loc loc, Identifier *id, Expression *value) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
303 : Dsymbol(id) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
304 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
305 this->value = value; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
306 this->loc = loc; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
307 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
308 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
309 Dsymbol *EnumMember::syntaxCopy(Dsymbol *s) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
310 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
311 Expression *e = NULL; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
312 if (value) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
313 e = value->syntaxCopy(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
314 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
315 EnumMember *em; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
316 if (s) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
317 { em = (EnumMember *)s; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
318 em->loc = loc; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
319 em->value = e; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
320 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
321 else |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
322 em = new EnumMember(loc, ident, e); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
323 return em; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
324 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
325 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
326 void EnumMember::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
327 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
328 buf->writestring(ident->toChars()); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
329 if (value) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
330 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
331 buf->writestring(" = "); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
332 value->toCBuffer(buf, hgs); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
333 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
334 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
335 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
336 const char *EnumMember::kind() |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
337 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
338 return "enum member"; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
339 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
340 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
341 |