Mercurial > projects > ldc
annotate dmd/enum.c @ 1637:a6a839bcc18a
Change template linkage from weak_odr to linkonce_odr. Much better, fixes #363.
author | Matti Niemenmaa <matti.niemenmaa+hg@iki.fi> |
---|---|
date | Mon, 08 Mar 2010 19:05:12 +0200 |
parents | 44b145be2ef5 |
children |
rev | line source |
---|---|
1606
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
1 |
1630
44b145be2ef5
Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents:
1628
diff
changeset
|
2 // Copyright (c) 1999-2010 by Digital Mars |
1606
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" |
1630
44b145be2ef5
Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents:
1628
diff
changeset
|
17 #include "module.h" |
1606
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
18 #include "declaration.h" |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
19 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
20 /********************************* EnumDeclaration ****************************/ |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
21 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
22 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
|
23 : ScopeDsymbol(id) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
24 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
25 this->loc = loc; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
26 type = new TypeEnum(this); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
27 this->memtype = memtype; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
28 maxval = 0; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
29 minval = 0; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
30 defaultval = 0; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
31 #if IN_DMD |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
32 sinit = NULL; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
33 #endif |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
34 isdeprecated = 0; |
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 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
37 Dsymbol *EnumDeclaration::syntaxCopy(Dsymbol *s) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
38 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
39 Type *t = NULL; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
40 if (memtype) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
41 t = memtype->syntaxCopy(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
42 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
43 EnumDeclaration *ed; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
44 if (s) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
45 { ed = (EnumDeclaration *)s; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
46 ed->memtype = t; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
47 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
48 else |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
49 ed = new EnumDeclaration(loc, ident, t); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
50 ScopeDsymbol::syntaxCopy(ed); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
51 return ed; |
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 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
54 void EnumDeclaration::semantic(Scope *sc) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
55 { int i; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
56 uinteger_t number; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
57 Type *t; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
58 Scope *sce; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
59 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
60 //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
|
61 if (!memtype) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
62 memtype = Type::tint32; |
1623
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
63 |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
64 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
|
65 { if (isdone || !scope) |
1623
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
66 return; // semantic() already completed |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
67 } |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
68 else |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
69 symtab = new DsymbolTable(); |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
70 |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
71 Scope *scx = NULL; |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
72 if (scope) |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
73 { sc = scope; |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
74 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
|
75 scope = NULL; |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
76 } |
1d48eced441f
Merge DMD r317: bugzilla 3611 Enum forward referencing regression
Leandro Lucarella <llucax@gmail.com>
parents:
1606
diff
changeset
|
77 |
1630
44b145be2ef5
Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents:
1628
diff
changeset
|
78 unsigned dprogress_save = Module::dprogress; |
44b145be2ef5
Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents:
1628
diff
changeset
|
79 |
1606
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
80 if (sc->stc & STCdeprecated) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
81 isdeprecated = 1; |
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 parent = sc->scopesym; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
84 memtype = memtype->semantic(loc, sc); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
85 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
86 /* 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
|
87 */ |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
88 if (memtype->ty == Tenum) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
89 { EnumDeclaration *sym = (EnumDeclaration *)memtype->toDsymbol(sc); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
90 if (!sym->memtype) |
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 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
|
93 memtype = Type::tint32; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
94 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
95 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
96 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
97 if (!memtype->isintegral()) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
98 { 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
|
99 memtype = Type::tint32; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
100 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
101 |
1628
6c36e3f49b28
Merge DMD r324: bugzilla 3663 and 3664 - fwd ref regressions
Leandro Lucarella <llucax@gmail.com>
parents:
1623
diff
changeset
|
102 isdone = 1; |
1630
44b145be2ef5
Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents:
1628
diff
changeset
|
103 Module::dprogress++; |
1628
6c36e3f49b28
Merge DMD r324: bugzilla 3663 and 3664 - fwd ref regressions
Leandro Lucarella <llucax@gmail.com>
parents:
1623
diff
changeset
|
104 |
1606
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
105 t = isAnonymous() ? memtype : type; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
106 symtab = new DsymbolTable(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
107 sce = sc->push(this); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
108 sce->parent = this; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
109 number = 0; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
110 if (!members) // enum ident; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
111 return; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
112 if (members->dim == 0) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
113 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
|
114 int first = 1; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
115 for (i = 0; i < members->dim; i++) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
116 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
117 EnumMember *em = ((Dsymbol *)members->data[i])->isEnumMember(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
118 Expression *e; |
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 if (!em) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
121 /* 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
|
122 * template instances and function literals. |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
123 */ |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
124 continue; |
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 //printf("Enum member '%s'\n",em->toChars()); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
127 e = em->value; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
128 if (e) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
129 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
130 assert(e->dyncast() == DYNCAST_EXPRESSION); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
131 e = e->semantic(sce); |
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 // 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
|
134 e = e->copy(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
135 e = e->implicitCastTo(sc, memtype); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
136 e = e->optimize(WANTvalue); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
137 number = e->toInteger(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
138 e->type = t; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
139 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
140 else |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
141 { // Default is the previous number plus 1 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
142 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
143 // Check for overflow |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
144 if (!first) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
145 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
146 switch (t->toBasetype()->ty) |
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 Tbool: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
149 if (number == 2) 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 Tint8: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
153 if (number == 128) goto Loverflow; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
154 break; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
155 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
156 case Tchar: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
157 case Tuns8: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
158 if (number == 256) 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 Tint16: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
162 if (number == 0x8000) goto Loverflow; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
163 break; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
164 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
165 case Twchar: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
166 case Tuns16: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
167 if (number == 0x10000) 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 Tint32: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
171 if (number == 0x80000000) goto Loverflow; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
172 break; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
173 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
174 case Tdchar: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
175 case Tuns32: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
176 if (number == 0x100000000LL) 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 Tint64: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
180 if (number == 0x8000000000000000LL) 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 case Tuns64: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
184 if (number == 0) goto Loverflow; |
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 Loverflow: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
188 error("overflow of enum value"); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
189 break; |
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 default: |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
192 assert(0); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
193 } |
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 e = new IntegerExp(em->loc, number, t); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
196 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
197 em->value = e; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
198 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
199 // 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
|
200 if (isAnonymous()) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
201 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
202 //sce->enclosing->insert(em); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
203 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
|
204 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
205 if (scx->scopesym) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
206 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
207 if (!scx->scopesym->symtab) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
208 scx->scopesym->symtab = new DsymbolTable(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
209 em->addMember(sce, scx->scopesym, 1); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
210 break; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
211 } |
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 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
214 else |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
215 em->addMember(sc, this, 1); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
216 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
217 if (first) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
218 { first = 0; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
219 defaultval = number; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
220 minval = number; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
221 maxval = number; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
222 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
223 else if (memtype->isunsigned()) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
224 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
225 if (number < minval) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
226 minval = number; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
227 if (number > maxval) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
228 maxval = number; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
229 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
230 else |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
231 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
232 if ((sinteger_t)number < (sinteger_t)minval) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
233 minval = number; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
234 if ((sinteger_t)number > (sinteger_t)maxval) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
235 maxval = number; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
236 } |
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 number++; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
239 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
240 //printf("defaultval = %lld\n", defaultval); |
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 sce->pop(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
243 //members->print(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
244 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
245 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
246 int EnumDeclaration::oneMember(Dsymbol **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 if (isAnonymous()) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
249 return Dsymbol::oneMembers(members, ps); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
250 return Dsymbol::oneMember(ps); |
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 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
253 void EnumDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
254 { int i; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
255 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
256 buf->writestring("enum "); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
257 if (ident) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
258 { buf->writestring(ident->toChars()); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
259 buf->writeByte(' '); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
260 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
261 if (memtype) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
262 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
263 buf->writestring(": "); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
264 memtype->toCBuffer(buf, NULL, hgs); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
265 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
266 if (!members) |
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->writeByte(';'); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
269 buf->writenl(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
270 return; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
271 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
272 buf->writenl(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
273 buf->writeByte('{'); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
274 buf->writenl(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
275 for (i = 0; i < members->dim; i++) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
276 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
277 EnumMember *em = ((Dsymbol *)members->data[i])->isEnumMember(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
278 if (!em) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
279 continue; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
280 //buf->writestring(" "); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
281 em->toCBuffer(buf, hgs); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
282 buf->writeByte(','); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
283 buf->writenl(); |
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 buf->writeByte('}'); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
286 buf->writenl(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
287 } |
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 Type *EnumDeclaration::getType() |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
290 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
291 return type; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
292 } |
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 const char *EnumDeclaration::kind() |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
295 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
296 return "enum"; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
297 } |
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 int EnumDeclaration::isDeprecated() |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
300 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
301 return isdeprecated; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
302 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
303 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
304 /********************************* EnumMember ****************************/ |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
305 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
306 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
|
307 : Dsymbol(id) |
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 this->value = value; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
310 this->loc = loc; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
311 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
312 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
313 Dsymbol *EnumMember::syntaxCopy(Dsymbol *s) |
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 Expression *e = NULL; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
316 if (value) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
317 e = value->syntaxCopy(); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
318 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
319 EnumMember *em; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
320 if (s) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
321 { em = (EnumMember *)s; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
322 em->loc = loc; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
323 em->value = e; |
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 else |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
326 em = new EnumMember(loc, ident, e); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
327 return em; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
328 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
329 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
330 void EnumMember::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
331 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
332 buf->writestring(ident->toChars()); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
333 if (value) |
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 buf->writestring(" = "); |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
336 value->toCBuffer(buf, hgs); |
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 } |
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 const char *EnumMember::kind() |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
341 { |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
342 return "enum member"; |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
343 } |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
344 |
1b24e9c7cc26
Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents:
1195
diff
changeset
|
345 |