Mercurial > projects > ldc
annotate dmd/enum.c @ 1650:40bd4a0d4870
Update to work with LLVM 2.7.
Removed use of dyn_cast, llvm no compiles
without exceptions and rtti by
default. We do need exceptions for the libconfig stuff, but rtti isn't
necessary (anymore).
Debug info needs to be rewritten, as in LLVM 2.7 the format has
completely changed. To have something to look at while rewriting, the
old code has been wrapped inside #ifndef DISABLE_DEBUG_INFO , this means
that you have to define this to compile at the moment.
Updated tango 0.99.9 patch to include updated EH runtime code, which is
needed for LLVM 2.7 as well.
author | Tomas Lindquist Olsen |
---|---|
date | Wed, 19 May 2010 12:42:32 +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 |